@uipath/skills 1.200.0 → 1.201.0-preview.433

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.
Files changed (205) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/.cursor-plugin/plugin.json +32 -0
  4. package/CODEOWNERS +25 -4
  5. package/README.md +1 -0
  6. package/assets/skill-status.json +8 -0
  7. package/assets/uip-catalog-snapshot.json +113 -41
  8. package/assets/uipath-icon.png +0 -0
  9. package/commands/install-permissions.md +1 -0
  10. package/package.json +3 -2
  11. package/skills/uipath-admin/SKILL.md +1 -1
  12. package/skills/uipath-admin/references/authorization/permission-catalog.md +61 -1
  13. package/skills/uipath-admin/references/authorization/role-management.md +3 -1
  14. package/skills/uipath-admin/references/diagnose/references/failure-modes.md +29 -4
  15. package/skills/uipath-admin/references/diagnose/references/troubleshooting-guide.md +13 -0
  16. package/skills/uipath-agents/SKILL.md +1 -0
  17. package/skills/uipath-agents/references/coded/capabilities/context-grounding.md +3 -3
  18. package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails-recommend.md +6 -1
  19. package/skills/uipath-agents/references/coded/capabilities/guardrails/guardrails.md +89 -1
  20. package/skills/uipath-agents/references/coded/embedding-in-flows.md +17 -1
  21. package/skills/uipath-agents/references/coded/frameworks/llamaindex-integration.md +64 -2
  22. package/skills/uipath-agents/references/coded/lifecycle/deployment.md +3 -0
  23. package/skills/uipath-agents/references/coded/lifecycle/environment-variables.md +90 -0
  24. package/skills/uipath-agents/references/coded/lifecycle/file-sync.md +3 -1
  25. package/skills/uipath-agents/references/coded/quickstart.md +10 -6
  26. package/skills/uipath-agents/references/lowcode/capabilities/guardrails/guardrails-recommend.md +20 -5
  27. package/skills/uipath-agents/references/lowcode/capabilities/guardrails/guardrails.md +13 -0
  28. package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +1 -3
  29. package/skills/uipath-api-workflow/references/operating-published-workflows.md +17 -6
  30. package/skills/uipath-automationhub/SKILL.md +58 -0
  31. package/skills/uipath-automationhub/references/api-endpoints.md +140 -0
  32. package/skills/uipath-automationhub/references/get-process.md +69 -0
  33. package/skills/uipath-automationhub/references/publish-process.md +171 -0
  34. package/skills/uipath-coded-apps/SKILL.md +24 -11
  35. package/skills/uipath-coded-apps/references/commands-reference.md +29 -29
  36. package/skills/uipath-coded-apps/references/create-action-app.md +4 -0
  37. package/skills/uipath-coded-apps/references/create-web-app.md +10 -0
  38. package/skills/uipath-coded-apps/references/debug.md +16 -0
  39. package/skills/uipath-coded-apps/references/oauth-client-setup.md +3 -1
  40. package/skills/uipath-coded-apps/references/oauth-scopes.md +39 -4
  41. package/skills/uipath-coded-apps/references/pack-publish-deploy.md +37 -21
  42. package/skills/uipath-coded-apps/references/sdk/conversational-agent.md +2 -0
  43. package/skills/uipath-coded-apps/references/sdk/data-fabric.md +2 -0
  44. package/skills/uipath-coded-apps/references/sdk/orchestrator.md +2 -0
  45. package/skills/uipath-coded-apps/references/widgets/conversational-agent-chat.md +90 -0
  46. package/skills/uipath-coded-apps/references/widgets/datatable.md +97 -0
  47. package/skills/uipath-coded-apps/references/widgets/external-auth.md +97 -0
  48. package/skills/uipath-coded-apps/references/widgets/multi-file-upload.md +98 -0
  49. package/skills/uipath-coded-apps/references/widgets/pdf-viewer.md +122 -0
  50. package/skills/uipath-coded-apps/references/widgets/validation-station.md +1 -1
  51. package/skills/uipath-functions/SKILL.md +11 -0
  52. package/skills/uipath-insights/SKILL.md +52 -247
  53. package/skills/uipath-insights/references/filter-discovery-guide.md +106 -0
  54. package/skills/uipath-insights/references/investigation-playbook-guide.md +24 -16
  55. package/skills/uipath-insights/references/jobs-commands-guide.md +196 -53
  56. package/skills/uipath-ixp/SKILL.md +10 -4
  57. package/skills/uipath-ixp/references/cli-reference.md +59 -5
  58. package/skills/uipath-ixp/references/label-documents-guide.md +12 -5
  59. package/skills/uipath-maestro-bpmn/SKILL.md +27 -9
  60. package/skills/uipath-maestro-bpmn/references/diagnose/references/failure-modes.md +6 -3
  61. package/skills/uipath-maestro-bpmn/references/operate/CAPABILITY.md +1 -1
  62. package/skills/uipath-maestro-bpmn/references/operate/references/ship.md +9 -3
  63. package/skills/uipath-maestro-bpmn/references/registry-workflow.md +1 -1
  64. package/skills/uipath-maestro-bpmn/references/shared/local-metadata-regeneration-guide.md +18 -11
  65. package/skills/uipath-maestro-bpmn/references/structural-bpmn.md +13 -7
  66. package/skills/uipath-maestro-case/SKILL.md +138 -170
  67. package/skills/uipath-maestro-case/references/bindings-and-expressions.md +14 -1
  68. package/skills/uipath-maestro-case/references/bindings-v2-sync.md +25 -1
  69. package/skills/uipath-maestro-case/references/brownfield.md +7 -3
  70. package/skills/uipath-maestro-case/references/case-commands.md +63 -8
  71. package/skills/uipath-maestro-case/references/case-editing-operations.md +11 -8
  72. package/skills/uipath-maestro-case/references/case-schema.md +5 -3
  73. package/skills/uipath-maestro-case/references/case-spec-input-details.md +4 -0
  74. package/skills/uipath-maestro-case/references/connector-integration.md +3 -1
  75. package/skills/uipath-maestro-case/references/connector-trigger-impl.md +236 -0
  76. package/skills/uipath-maestro-case/references/connector-trigger-planning.md +300 -0
  77. package/skills/uipath-maestro-case/references/entry-points-sync.md +2 -0
  78. package/skills/uipath-maestro-case/references/evals/evals.json +33 -40
  79. package/skills/uipath-maestro-case/references/implementation.md +58 -13
  80. package/skills/uipath-maestro-case/references/phased-execution.md +87 -20
  81. package/skills/uipath-maestro-case/references/placeholder-tasks.md +3 -1
  82. package/skills/uipath-maestro-case/references/planning.md +26 -16
  83. package/skills/uipath-maestro-case/references/plugins/case/impl-json.md +2 -5
  84. package/skills/uipath-maestro-case/references/plugins/case/planning.md +3 -1
  85. package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/impl-json.md +3 -1
  86. package/skills/uipath-maestro-case/references/plugins/conditions/case-exit-conditions/planning.md +5 -3
  87. package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/impl-json.md +4 -2
  88. package/skills/uipath-maestro-case/references/plugins/conditions/stage-entry-conditions/planning.md +6 -4
  89. package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/impl-json.md +6 -4
  90. package/skills/uipath-maestro-case/references/plugins/conditions/stage-exit-conditions/planning.md +6 -4
  91. package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/impl-json.md +42 -3
  92. package/skills/uipath-maestro-case/references/plugins/conditions/task-entry-conditions/planning.md +6 -4
  93. package/skills/uipath-maestro-case/references/plugins/logging/impl-json.md +50 -32
  94. package/skills/uipath-maestro-case/references/plugins/sla/impl-json.md +2 -4
  95. package/skills/uipath-maestro-case/references/plugins/sla/planning.md +3 -1
  96. package/skills/uipath-maestro-case/references/plugins/stages/impl-json.md +1 -4
  97. package/skills/uipath-maestro-case/references/plugins/stages/planning.md +2 -0
  98. package/skills/uipath-maestro-case/references/plugins/tasks/action/impl-json.md +2 -0
  99. package/skills/uipath-maestro-case/references/plugins/tasks/action/planning.md +2 -0
  100. package/skills/uipath-maestro-case/references/plugins/tasks/agent/impl-json.md +2 -0
  101. package/skills/uipath-maestro-case/references/plugins/tasks/agent/planning.md +2 -0
  102. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/impl-json.md +2 -0
  103. package/skills/uipath-maestro-case/references/plugins/tasks/api-workflow/planning.md +5 -3
  104. package/skills/uipath-maestro-case/references/plugins/tasks/case-management/impl-json.md +2 -0
  105. package/skills/uipath-maestro-case/references/plugins/tasks/case-management/planning.md +2 -0
  106. package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/impl-json.md +43 -13
  107. package/skills/uipath-maestro-case/references/plugins/tasks/connector-activity/planning.md +4 -2
  108. package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/impl-json.md +10 -7
  109. package/skills/uipath-maestro-case/references/plugins/tasks/connector-trigger/planning.md +5 -3
  110. package/skills/uipath-maestro-case/references/plugins/tasks/create-inline-common.md +3 -1
  111. package/skills/uipath-maestro-case/references/plugins/tasks/process/impl-json.md +2 -0
  112. package/skills/uipath-maestro-case/references/plugins/tasks/process/planning.md +2 -0
  113. package/skills/uipath-maestro-case/references/plugins/tasks/rpa/impl-json.md +2 -0
  114. package/skills/uipath-maestro-case/references/plugins/tasks/rpa/planning.md +2 -0
  115. package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/impl-json.md +2 -0
  116. package/skills/uipath-maestro-case/references/plugins/tasks/wait-for-timer/planning.md +2 -0
  117. package/skills/uipath-maestro-case/references/plugins/triggers/event/impl-json.md +9 -6
  118. package/skills/uipath-maestro-case/references/plugins/triggers/event/planning.md +5 -3
  119. package/skills/uipath-maestro-case/references/plugins/triggers/manual/impl-json.md +1 -4
  120. package/skills/uipath-maestro-case/references/plugins/triggers/manual/planning.md +2 -0
  121. package/skills/uipath-maestro-case/references/plugins/triggers/timer/impl-json.md +1 -4
  122. package/skills/uipath-maestro-case/references/plugins/triggers/timer/planning.md +2 -0
  123. package/skills/uipath-maestro-case/references/plugins/variables/bindings/impl-json.md +3 -1
  124. package/skills/uipath-maestro-case/references/plugins/variables/global-vars/impl-json.md +40 -2
  125. package/skills/uipath-maestro-case/references/plugins/variables/global-vars/planning.md +12 -2
  126. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/impl-json.md +8 -6
  127. package/skills/uipath-maestro-case/references/plugins/variables/io-binding/planning.md +17 -3
  128. package/skills/uipath-maestro-case/references/registry-discovery.md +9 -5
  129. package/skills/uipath-maestro-case/references/sla-response-shapes.md +3 -1
  130. package/skills/uipath-maestro-case/references/troubleshooting-guide.md +2 -0
  131. package/skills/uipath-maestro-case/scripts/audit_plan.py +231 -0
  132. package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +8 -4
  133. package/skills/uipath-maestro-flow/references/author/references/editing-operations-cli.md +5 -3
  134. package/skills/uipath-maestro-flow/references/author/references/editing-operations-json.md +14 -4
  135. package/skills/uipath-maestro-flow/references/author/references/editing-operations.md +3 -3
  136. package/skills/uipath-maestro-flow/references/author/references/greenfield.md +12 -3
  137. package/skills/uipath-maestro-flow/references/author/references/planning-arch.md +17 -13
  138. package/skills/uipath-maestro-flow/references/author/references/planning-impl.md +1 -1
  139. package/skills/uipath-maestro-flow/references/author/references/plugins/agent/impl.md +49 -4
  140. package/skills/uipath-maestro-flow/references/author/references/plugins/connector/impl.md +59 -17
  141. package/skills/uipath-maestro-flow/references/author/references/plugins/connector-trigger/impl.md +3 -3
  142. package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl-connector.md +3 -1
  143. package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl-manual.md +3 -1
  144. package/skills/uipath-maestro-flow/references/author/references/plugins/http/impl.md +5 -2
  145. package/skills/uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md +31 -16
  146. package/skills/uipath-maestro-flow/references/author/references/plugins/ixp/impl.md +13 -4
  147. package/skills/uipath-maestro-flow/references/author/references/plugins/loop/impl.md +185 -25
  148. package/skills/uipath-maestro-flow/references/author/references/plugins/loop/planning.md +18 -10
  149. package/skills/uipath-maestro-flow/references/author/references/plugins/rpa/impl.md +9 -3
  150. package/skills/uipath-maestro-flow/references/author/references/plugins/terminate/impl.md +6 -3
  151. package/skills/uipath-maestro-flow/references/diagnose/references/failure-modes.md +68 -0
  152. package/skills/uipath-maestro-flow/references/shared/cli-commands.md +2 -1
  153. package/skills/uipath-maestro-flow/references/shared/file-format.md +36 -9
  154. package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +1 -1
  155. package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +1 -1
  156. package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +77 -20
  157. package/skills/uipath-planner/SKILL.md +30 -12
  158. package/skills/{uipath-maestro-case/assets/templates/sdd-template-examples.md → uipath-planner/assets/templates/case-sdd-examples.md} +18 -32
  159. package/skills/uipath-planner/assets/templates/case-sdd-template.md +289 -309
  160. package/skills/uipath-planner/references/case-design-lane-guide.md +288 -0
  161. package/skills/uipath-planner/references/multi-skill-patterns-guide.md +1 -1
  162. package/skills/uipath-planner/references/package-selection-guide.md +2 -2
  163. package/skills/uipath-planner/references/pdd-driven-lane-guide.md +5 -1
  164. package/skills/uipath-planner/references/product-selection-guide.md +2 -2
  165. package/skills/uipath-planner/references/sdd-generation-guide.md +16 -15
  166. package/skills/uipath-planner/scripts/audit_sdd.py +437 -0
  167. package/skills/uipath-platform/SKILL.md +7 -2
  168. package/skills/uipath-platform/references/data-fabric/choice-sets.md +1 -1
  169. package/skills/uipath-platform/references/data-fabric/data-fabric.md +1 -1
  170. package/skills/uipath-platform/references/data-fabric/entity-schema.md +37 -21
  171. package/skills/uipath-platform/references/data-fabric/file-attachments.md +1 -1
  172. package/skills/uipath-platform/references/guardrails/byo-configurations.md +205 -0
  173. package/skills/uipath-platform/references/traces/feedback.md +4 -2
  174. package/skills/uipath-platform/references/uip-commands.md +2 -2
  175. package/skills/uipath-review/SKILL.md +55 -52
  176. package/skills/uipath-review/references/agents/agent-grading-rubric.md +62 -40
  177. package/skills/uipath-review/references/agents/agents-coded-rules.md +7 -1
  178. package/skills/uipath-review/references/agents/agents-lowcode-rules.md +21 -2
  179. package/skills/uipath-review/references/agents/guardrails/coded-guardrails-review.md +78 -13
  180. package/skills/uipath-review/references/agents/guardrails/guardrails-review.md +11 -4
  181. package/skills/uipath-review/references/architecture-assessment-guide.md +1 -1
  182. package/skills/uipath-review/references/review-workflow-guide.md +19 -10
  183. package/skills/uipath-review/references/rule-catalog-workflow.md +6 -6
  184. package/skills/uipath-review/references/rule-format.md +1 -1
  185. package/skills/uipath-rpa/SKILL.md +1 -1
  186. package/skills/uipath-solution/SKILL.md +4 -4
  187. package/skills/uipath-solution/references/solution-overview.md +7 -2
  188. package/skills/uipath-tasks/SKILL.md +27 -1
  189. package/skills/uipath-tasks/references/task-catalogs.md +79 -0
  190. package/skills/uipath-tasks/references/task-data.md +45 -0
  191. package/skills/uipath-tasks/references/task-metadata.md +69 -0
  192. package/skills/uipath-test/SKILL.md +3 -3
  193. package/skills/uipath-test/references/test-result-report-guide.md +16 -1
  194. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/ambiguous-selector.md +1 -1
  195. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/scope-container-wrong-page.md +1 -1
  196. package/skills/uipath-troubleshoot/references/activity-packages/ui-automation/playbooks/verify-execution-failure.md +2 -2
  197. package/skills/uipath-troubleshoot/references/products/agents/playbooks/guardrail-violation.md +12 -0
  198. package/version-manifest.json +2 -2
  199. package/skills/uipath-maestro-case/assets/templates/sdd-template.md +0 -667
  200. package/skills/uipath-maestro-case/references/connector-trigger-common.md +0 -511
  201. package/skills/uipath-maestro-case/references/phase-0-interview.md +0 -279
  202. package/skills/uipath-maestro-case/references/sdd-generation-rules.md +0 -1026
  203. package/skills/uipath-review/references/agents/agent-common-issues.md +0 -401
  204. package/skills/uipath-review/references/agents/agent-review-checklist.md +0 -379
  205. /package/skills/{uipath-maestro-case → uipath-planner}/assets/templates/sdd-viewer.html +0 -0
@@ -44,6 +44,7 @@ Determine the agent mode before proceeding:
44
44
  | Create/build/deploy coded agent | Coded | [coded/quickstart.md](references/coded/quickstart.md) | `coded/lifecycle/*`, `coded/frameworks/*` |
45
45
  | Select coded framework | Coded | [coded/quickstart.md](references/coded/quickstart.md) § Framework Selection | |
46
46
  | Add coded capabilities (HITL, RAG, tracing) | Coded | [coded/quickstart.md](references/coded/quickstart.md) | `coded/capabilities/*` |
47
+ | Set a coded agent's environment variables, or reference an Orchestrator asset from one (`%ASSETS/<ASSET_NAME>%`) | Coded | [coded/lifecycle/environment-variables.md](references/coded/lifecycle/environment-variables.md) | `coded/lifecycle/file-sync.md` for what `.env` does and does not carry |
47
48
  | Call an Integration Service connector (Slack, Jira, Web Search) from a coded agent | Coded | [coded/capabilities/integration-service.md](references/coded/capabilities/integration-service.md) **+ then immediately read** [`uipath-platform/references/integration-service/agent-workflow.md`](../uipath-platform/references/integration-service/agent-workflow.md) — discovery lives there, not in `uipath-agents` | `coded/capabilities/sdk-services.md` § Connections |
48
49
  | Run coded evaluations | Coded | [coded/quickstart.md](references/coded/quickstart.md) § Evaluate | `coded/lifecycle/evaluate.md` |
49
50
  | Create or scaffold a new low-code agent project | Low-code | [lowcode/lowcode.md](references/lowcode/lowcode.md) § Quick Start | `lowcode/project-lifecycle.md`, `lowcode/agent-definition.md` |
@@ -21,16 +21,16 @@ To create, ingest, poll, search, or delete the index from the CLI instead of the
21
21
 
22
22
  ## Folder Targeting
23
23
 
24
- Context Grounding indexes live in Orchestrator folders. Pass a folder identifier whenever the index is not in the default folder resolved from your auth context — otherwise the service may return `400 FolderKey required`. `ContextGroundingRetriever` accepts `folder_path` or `folder_key`; `ContextGroundingVectorStore` accepts `folder_path`.
24
+ Context Grounding indexes live in Orchestrator folders. Always pass a folder identifier, even when the index lives in the execution folder resolved from your auth context — omitting it can leave the `index` binding incorrectly applied, and the service may return `400 FolderKey required`. `ContextGroundingRetriever` accepts `folder_path` or `folder_key`; `ContextGroundingVectorStore` accepts `folder_path`.
25
25
 
26
26
  ```python
27
27
  retriever = ContextGroundingRetriever(index_name="my_index", folder_path="Shared/Knowledge")
28
28
  ```
29
29
 
30
- Add the supported folder argument for the component you use when cross-folder access is needed.
31
-
32
30
  ## Core Components
33
31
 
32
+ Import paths below are LangChain/LangGraph (`uipath_langchain.*`). For LlamaIndex agents, use `uipath_llamaindex.retrievers.ContextGroundingRetriever` / `uipath_llamaindex.query_engines.ContextGroundingQueryEngine` — see [frameworks/llamaindex-integration.md](../frameworks/llamaindex-integration.md) § Context Grounding (RAG).
33
+
34
34
  ### ContextGroundingRetriever
35
35
 
36
36
  A document retrieval system using vector search to find relevant information based on natural language queries.
@@ -54,6 +54,8 @@ uip agent guardrails list --output json
54
54
 
55
55
  Build a lookup of `{ validatorId: status }` from the `Data` array. You will use this to filter recommendations.
56
56
 
57
+ > **`Validator` is not unique — key on `(Validator, IsByo)`, not `Validator` alone.** A tenant with a bring-your-own (BYOG) configuration for a validator has two entries sharing the same `Validator` name — one built-in, one BYO (`IsByo: true`, carrying `ByoValidatorName`/`ByoConnectionId`/`ByoConfigurationId`). Collapsing them loses the distinction and can point the discovery/wiring flow at the wrong entry. See [guardrails.md § BYO (bring-your-own) validators](guardrails.md#byo-bring-your-own-validators).
58
+
57
59
  > **Catalog vs. list — the key distinction:** The catalog lists all guardrails that exist on the platform (with rich metadata for reasoning). The guardrails list returns only those accessible to this tenant. Only recommend validators where `Status == "Available"` in the list.
58
60
 
59
61
  ### SDK Documentation (NEVER skipped — Python class names)
@@ -115,6 +117,8 @@ For **each entry** in the catalog (`guardrails[]` array from the cached JSON):
115
117
 
116
118
  Do **not** apply predetermined knowledge about which guardrail maps to which schema field. Let the catalog entry's authored fields drive every recommendation decision.
117
119
 
120
+ > **Built-in vs. BYO — default to built-in.** When a matched validator has both a built-in entry and one or more `Available` BYO (`IsByo: true`) entries, recommend the standard SDK validator/middleware (built-in) by default, and mention a BYO alternative exists. Only wire in a specific BYO configuration when the user names it or asks for BYO explicitly — see [guardrails.md § BYO (bring-your-own) validators](guardrails.md#byo-bring-your-own-validators) for how that's actually referenced in code.
121
+
118
122
  ### Step 3 — De-duplicate Overlapping Validators
119
123
 
120
124
  Several catalog validators address the same threat. Recommending more than one of them at the same scope and stage is redundant — it doubles latency and cost on every call for marginal benefit (the canonical case is `prompt_injection` and `user_prompt_attacks`: both have `security_category: "adversarial_input"` and both run at LLM · PRE).
@@ -235,7 +239,7 @@ For each existing guardrail discovered in the Python file (Step 1 from Recommend
235
239
 
236
240
  ### Correctness Check
237
241
 
238
- From the SDK docs and the catalog, look up the validator class referenced in the code:
242
+ From the SDK docs and the catalog, look up the validator class referenced in the code. **If the guardrails list has more than one entry sharing the referenced `Validator` name** (built-in plus BYOG), disambiguate by whether the code wires a BYO validator construct (`ByoValidator(...)` or `UiPathByoGuardrailMiddleware(...)`, identified by its `validator_name`) or the plain SDK validator/middleware class — match against the corresponding list entry's `IsByo` before reading `Parameters`/scopes for that entry.
239
243
 
240
244
  | Aspect | What to check |
241
245
  |--------|---------------|
@@ -295,3 +299,4 @@ python3 -c "import ast; ast.parse(open('graph.py').read())"
295
299
  13. **Class names and enum names come from the SDK docs** — never invent them. The SDK evolves; relying on memory produces stale code. For **import paths**, use the `langchain/guardrails/` page when the agent is LangChain (paths live in `uipath_langchain.guardrails`); for every other framework use the `core/guardrails/` page (paths live in `uipath.platform.guardrails`). See Rule 8.
296
300
  14. **Read [guardrails.md](guardrails.md) before writing any Python** — the middleware spread (`*`), decorator placement above `@tool` / factory, factory refactor, and import-source rules are specified there and cannot be safely inferred.
297
301
  15. **`EscalateAction` is the human-in-the-loop option only when the SDK docs expose it** — recommend it when the user wants a person to review/approve a flagged item rather than hard-block it. It requires a **deployed Action App** declared in `bindings.json` (`app_name` / `app_folder_path`) through the coded-agent bindings sync workflow; if the docs, app, or binding prerequisite is unavailable, fall back to Block/Log and say so — never silently drop the requested escalation. See Step 6 and [guardrails.md § Escalation action (HITL)](guardrails.md#escalation-action-human-in-the-loop).
302
+ 16. **`Validator` is not unique — disambiguate built-in vs. BYO by `IsByo` before matching on name.** A tenant can have both a built-in and one or more BYOG entries sharing the same `Validator` name. Key any lookup on `(Validator, IsByo)`, and default recommendations/wiring to the built-in SDK validator/middleware unless the user names a BYO configuration or asks for BYO. Never fabricate the BYO validator construct from memory — see [guardrails.md § BYO (bring-your-own) validators](guardrails.md#byo-bring-your-own-validators).
@@ -57,6 +57,87 @@ If the requested validator has `Status != "Available"` → tell the user and sto
57
57
 
58
58
  ---
59
59
 
60
+ ## BYO (bring-your-own) validators
61
+
62
+ A validator can be fulfilled by a tenant-registered **external** provider (a "BYOG" configuration — e.g. Azure AI Content Safety, Databricks AI Guardrails) instead of UiPath's own built-in implementation. Registration is admin-side — Admin → AI Trust Layer → Guardrails Configurations, or `uip guardrails byo-configurations create` (see [uipath-platform § BYO Guardrail Configurations](/uipath:uipath-platform)); this section covers wiring an already-registered BYOG configuration into agent code.
63
+
64
+ **Same rule as [Step 0](#step-0--fetch-official-documentation): confirm the constructor signature against the fetched SDK docs before writing code, and never invent arguments.** The two constructs below exist today; if a future fetch shows one missing or renamed, follow the fetched page and say so rather than writing what's here from memory.
65
+
66
+ ### Which construct exists where
67
+
68
+ | Construct | Style | Ships in | Notes |
69
+ |---|---|---|---|
70
+ | `UiPathByoGuardrailMiddleware` | middleware | `uipath_langchain.guardrails` **only** | LangChain/LangGraph agents only — there is no framework-agnostic middleware. |
71
+ | `ByoValidator` | decorator | `uipath.platform.guardrails` (**core**), re-exported by `uipath_langchain.guardrails` | Framework-agnostic class, so BYO is **not** LangChain-only. |
72
+
73
+ > **BYO is not LangChain-only** — a common wrong inference, because the core SDK docs page historically omitted `ByoValidator`. The class is in core. What *is* LangChain-only is the middleware.
74
+ >
75
+ > The usual [Imports Pattern](#imports-pattern) rule still governs which module you import from: a LangChain agent imports from `uipath_langchain.guardrails` (adapter registration — see Critical Rule 8), everything else from `uipath.platform.guardrails`. And on a framework with no published adapter, the decorator carries the same silent-no-op risk it does for every other validator — that caveat belongs to the decorator *mechanism*, not to BYO.
76
+
77
+ **Wire format** — both coded styles emit `validatorType: "byo"` plus `byoValidatorName: "<name>"`. The only field shared with low-code is `byoValidatorName`: a low-code `agent.json` pins the same BYOG configuration by adding `byoValidatorName` while keeping `validatorType` = the real validator id (e.g. `pii_detection`). `validatorType: "byo"` is the coded SDK wire format — never write it in a low-code `agent.json`.
78
+
79
+ Discovery steps (in addition to the fetched docs):
80
+
81
+ 1. Confirm a BYOG configuration exists for the desired validator and get its identifying value:
82
+ ```bash
83
+ uip agent guardrails list --byo --output json
84
+ ```
85
+ Read `ByoValidatorName` from the matching entry — the validator name is the **only** value the code passes; it is unique across the tenant, and the platform resolves the underlying connection server-side from the stored configuration. Do not pass a connection id, and never guess or fabricate the name.
86
+ 2. Before wiring it in, cross-check the configuration's health on the admin side:
87
+ ```bash
88
+ uip guardrails byo-configurations list --output json
89
+ ```
90
+ Confirm `Enabled: true` and `ValidConnection: true` for the matching `ValidatorName`. A disabled configuration or a broken connection means the guardrail will fail at runtime (or silently fall back, depending on `FallbackOnUiPath`) — tell the user rather than wiring it in anyway. The admin-side fix (re-enable via `update <id> --enabled`, repoint the connection via `update <id> --connection-id`) is covered by [uipath-platform § BYO Guardrail Configurations](/uipath:uipath-platform).
91
+
92
+ ### BYO middleware (LangChain only)
93
+
94
+ `validator_name`, `scopes`, and `action` are all required. `validator_parameters` is optional passthrough — BYO parameter schemas are connector-defined, so read the ids and allowed values from that entry's `Parameters` array in the discovery output rather than guessing. Spread with `*` like every other middleware.
95
+
96
+ ```python
97
+ from uipath_langchain.guardrails import (
98
+ BlockAction,
99
+ UiPathByoGuardrailMiddleware,
100
+ )
101
+ from uipath.core.guardrails import GuardrailScope
102
+
103
+ *UiPathByoGuardrailMiddleware(
104
+ validator_name="my-pii-guardrail", # ByoValidatorName from `guardrails list --byo`
105
+ scopes=[GuardrailScope.AGENT],
106
+ action=BlockAction(),
107
+ ),
108
+ ```
109
+
110
+ For Tool scope, pass the tool objects as usual:
111
+
112
+ ```python
113
+ *UiPathByoGuardrailMiddleware(
114
+ validator_name="my-pii-guardrail",
115
+ scopes=[GuardrailScope.TOOL],
116
+ action=BlockAction(),
117
+ tools=[lookup_account_info], # required whenever TOOL is in scopes
118
+ ),
119
+ ```
120
+
121
+ ### BYO decorator (any framework)
122
+
123
+ The validator name is the **first positional argument**; `parameters` is keyword-only. Scope comes from the decorated target (`@tool` → Tool, LLM factory → Llm, agent factory → Agent), exactly as for the built-in validators.
124
+
125
+ ```python
126
+ from uipath_langchain.guardrails import BlockAction, ByoValidator, guardrail
127
+
128
+ byog_pii = ByoValidator("my-pii-guardrail")
129
+
130
+ @guardrail(validator=byog_pii, action=BlockAction())
131
+ def create_support_agent():
132
+ return create_agent(model=llm, tools=[lookup_account_info])
133
+ ```
134
+
135
+ On a non-LangChain framework the same code works with `from uipath.platform.guardrails import BlockAction, ByoValidator, guardrail` — subject to the adapter caveat above.
136
+
137
+ **Stages:** BYO validator capabilities are connector-defined and can't be known statically, so no stage restriction is applied — all stages are supported, and the middleware defaults to `PRE_AND_POST`.
138
+
139
+ ---
140
+
60
141
  ## Step 1 — Style Choice
61
142
 
62
143
  If the user has not specified **middleware** or **decorator**, ask before generating any code. Do not implement both unless explicitly asked.
@@ -178,7 +259,11 @@ Pass `scopes=[GuardrailScope.LLM]` or `[GuardrailScope.AGENT]`. No `tools=`.
178
259
 
179
260
  ### Stage is fixed by the validator — no `stage=` on middleware
180
261
 
181
- Middleware classes take **no `stage` argument**. Each validator's stage is fixed: input validators (`user_prompt_attacks`, `prompt_injection`, input PII) run PRE; `intellectual_property` runs POST (output-only). Adding `stage=GuardrailExecutionStage....` to a middleware call raises `TypeError`. Only the **decorator** (`@guardrail`) accepts `stage=`.
262
+ Middleware classes for the **fixed-stage** validators take no `stage` argument: `UiPathUserPromptAttacksMiddleware`, `UiPathPromptInjectionMiddleware` (both PRE-only) and `UiPathIntellectualPropertyMiddleware` (POST-only). Passing `stage=` to those raises `TypeError` — their stage is a property of the validator, not a choice.
263
+
264
+ > Validators whose stage genuinely varies **do** accept `stage=` on the middleware (defaulting to `PRE_AND_POST`) — PII, harmful content, LLM-as-judge, deterministic, and BYO. Confirm against the fetched `langchain/guardrails/` page for the validator you're wiring rather than assuming either way.
265
+
266
+ For BYO middleware specifically, see [BYO (bring-your-own) validators](#byo-bring-your-own-validators).
182
267
 
183
268
  ### Intellectual property (output-only) middleware
184
269
 
@@ -211,6 +296,8 @@ Runs at POST (checks the LLM's output) — fixed by the validator, not a paramet
211
296
 
212
297
  Full documentation and examples: [Core Guardrails](https://uipath.github.io/uipath-python/core/guardrails/)
213
298
 
299
+ For a bring-your-own (BYOG) validator, see [BYO (bring-your-own) validators](#byo-bring-your-own-validators) — `ByoValidator` slots into the same `@guardrail(validator=..., action=...)` shape as the built-ins.
300
+
214
301
  ### Tool scope — decorate the `@tool` function
215
302
 
216
303
  Place `@guardrail` **above** `@tool`:
@@ -398,3 +485,4 @@ For non-LangChain frameworks, there is no published adapter yet, so the decorato
398
485
  15. **`EscalateAction` requires a deployed Action App** referenced by `app_name` + `app_folder_path` and declared as an `app` resource in **`bindings.json`** — discover it with `uip solution resources list --kind App`, resolve duplicate names by folder, pass the literal name/folder in code (not env vars), and sync bindings with [../../lifecycle/bindings-reference.md](../../lifecycle/bindings-reference.md). Route the task with `TaskRecipient` when the user names a reviewer. See [Escalation action (HITL)](#escalation-action-human-in-the-loop).
399
486
  16. **Verify the escalation app schema when tenant access is available** — the app must expose the guardrail review inputs/outputs/outcomes listed in the prerequisite section. If the schema cannot be verified in a local smoke task, say that runtime readiness is unverified.
400
487
  17. **A HITL guardrail suspends, it doesn't block.** On violation `EscalateAction` suspends via `interrupt(CreateEscalation(...))`; it terminates **only on Reject** (Approve resumes). Verify by confirming the run suspends + a task is created — never expect a "block" for an escalation guardrail (Rule for the [verification step](#verify-guardrails-are-actually-wired-mandatory-after-writing-for-langchain-ml-guardrails)).
488
+ 18. **BYO: pass the validator name and nothing else, and get that name from discovery — never from memory.** `ByoValidatorName` comes from `uip agent guardrails list --byo`; there is **no connection-id argument** in either construct (the platform resolves the connection server-side from the configuration). Pick the construct by style, not by framework: `UiPathByoGuardrailMiddleware` is LangChain-only, while `ByoValidator` is a **core** class (`uipath.platform.guardrails`) re-exported by `uipath_langchain.guardrails` — so **BYO is not LangChain-only**, and a subagent or stale doc claiming otherwise is wrong. Import per Rule 8 regardless. Cross-check `Enabled`/`ValidConnection` via `uip guardrails byo-configurations list` before wiring one in. See [BYO (bring-your-own) validators](#byo-bring-your-own-validators).
@@ -98,6 +98,22 @@ Without `--local`, `registry list`/`get` query the tenant registry (Orchestrator
98
98
 
99
99
  ## Wiring the Agent's Inputs
100
100
 
101
- For inputs that reference flow variables, use `{ "type": "literal", "expression": "{{ $vars.X }}", "fieldType": "string" }` — NOT `=js:...` expressions. `=js:` ships as a literal string to the agent activity and fails at runtime with `Cannot find name '<identifier>'`.
101
+ One `inputs.<field>` entry per property in the agent's input schema (`entry-points.json`, mirrored in the definition's `inputDefinition.properties`). Two valid value shapes, same binding:
102
+
103
+ ```json
104
+ "inputs": {
105
+ "<INPUT_FIELD>": {
106
+ "type": "jsExpression",
107
+ "expression": "$vars.<UPSTREAM_NODE_ID>.output.<FIELD>",
108
+ "fieldType": "<FIELD_TYPE>"
109
+ }
110
+ }
111
+ ```
112
+
113
+ - `jsExpression` — bare `$vars...` expression, no `=js:` prefix. Upstream values read as `$vars.<nodeId>.output.<field>`; flow globals as `$vars.<global>`.
114
+ - `literal` — text template; static text mixable with `{{ }}` interpolations: `{ "type": "literal", "expression": "{{ $vars.<UPSTREAM_NODE_ID>.output.<FIELD> }}", "fieldType": "<FIELD_TYPE>" }`.
115
+ - `<FIELD_TYPE>` is the property's JSON-schema type from the agent's input schema (e.g. `string`, `boolean`, `number`) — read it from there, do not invent it.
116
+
117
+ NEVER a plain `"=js:..."` string value — it ships as a literal string to the agent activity and fails at runtime with `Cannot find name '<identifier>'`. Complete worked example (trigger → agent → end): uipath-maestro-flow skill, agent-plugin reference § Wiring Inputs.
102
118
 
103
119
  Input-only rule. Mapping the agent's output back to a flow-level global on an End node DOES use `=js:` — see [variables-and-expressions.md § Variable Updates](../../../uipath-maestro-flow/references/shared/variables-and-expressions.md#variable-updates-variableupdates).
@@ -268,15 +268,41 @@ See `../capabilities/conversational-agents.md` § Running Locally for the `--kee
268
268
 
269
269
  ### Context Grounding (RAG)
270
270
 
271
+ Two RAG primitives ship in `uipath-llamaindex`. Pick by workflow shape:
272
+
273
+ | Primitive | Import | Use when |
274
+ |-----------|--------|----------|
275
+ | `ContextGroundingQueryEngine` | `uipath_llamaindex.query_engines` | Retrieval + LLM synthesis in one call, or exposing the index as a `QueryEngineTool` in an agentic workflow. Constructor REQUIRES `response_synthesizer` (no default). |
276
+ | `ContextGroundingRetriever` | `uipath_llamaindex.retrievers` | Deterministic workflow RAG — retrieve raw passages in a `@step`, then synthesize the answer with your own prompt and LLM call. |
277
+
278
+ The query engine wraps `ContextGroundingRetriever` + your synthesizer internally — use the retriever directly when the workflow already has its own synthesis step.
279
+
280
+ > **Prefer using these primitives — not raw `sdk.context_grounding.search()` / `search_async()`.** They return LlamaIndex `NodeWithScore` objects that plug into synthesizers and tools, and declare `index_name` + `folder_path` at one call site — the exact shape of the `index` binding entry (see [../lifecycle/bindings-reference.md](../lifecycle/bindings-reference.md)). `index` bindings have no virtual fallback: the index must exist in Orchestrator before `uip codedagent push`.
281
+
282
+ Both accept `index_name`, `folder_path` (or `folder_key`), and `number_of_results` (default 10). Always pass `folder_path`, even when the index lives in the execution folder resolved from your auth context — omitting it can leave the `index` binding incorrectly applied. Instantiate both inside a `@step` — never at module level (same lazy-client rule as LLMs, § UiPathOpenAI above).
283
+
284
+ #### ContextGroundingQueryEngine
285
+
286
+ Build the required `response_synthesizer` with `get_response_synthesizer(llm=UiPathOpenAI())` — omitting it raises a constructor error:
287
+
271
288
  ```python
289
+ from llama_index.core.response_synthesizers import get_response_synthesizer
290
+ from uipath_llamaindex.llms import UiPathOpenAI
272
291
  from uipath_llamaindex.query_engines import ContextGroundingQueryEngine
273
- from llama_index.core.tools import QueryEngineTool, ToolMetadata
274
292
 
293
+ # Inside a @step:
275
294
  query_engine = ContextGroundingQueryEngine(
276
295
  index_name="my_knowledge_base",
277
296
  folder_path="Shared",
278
- response_synthesizer=response_synthesizer,
297
+ response_synthesizer=get_response_synthesizer(llm=UiPathOpenAI()),
279
298
  )
299
+ response = await query_engine.aquery(ev.question)
300
+ ```
301
+
302
+ As an agent tool:
303
+
304
+ ```python
305
+ from llama_index.core.tools import QueryEngineTool, ToolMetadata
280
306
 
281
307
  tools = [
282
308
  QueryEngineTool(
@@ -289,6 +315,42 @@ tools = [
289
315
  ]
290
316
  ```
291
317
 
318
+ #### Workflow RAG with ContextGroundingRetriever
319
+
320
+ ```python
321
+ from llama_index.core.workflow import StartEvent, StopEvent, Workflow, step
322
+ from uipath_llamaindex.llms import UiPathOpenAI
323
+ from uipath_llamaindex.retrievers import ContextGroundingRetriever
324
+
325
+ class QuestionEvent(StartEvent):
326
+ question: str
327
+
328
+ class AnswerEvent(StopEvent):
329
+ answer: str
330
+
331
+ class RagAgent(Workflow):
332
+ @step
333
+ async def answer(self, ev: QuestionEvent) -> AnswerEvent:
334
+ retriever = ContextGroundingRetriever(
335
+ index_name="my_knowledge_base",
336
+ folder_path="Shared",
337
+ number_of_results=5,
338
+ )
339
+ nodes = await retriever.aretrieve(ev.question)
340
+ if not nodes:
341
+ return AnswerEvent(answer="No relevant passages found in the knowledge base.")
342
+ passages = "\n\n".join(n.node.get_content() for n in nodes)
343
+ llm = UiPathOpenAI()
344
+ response = await llm.acomplete(
345
+ "Answer the question using ONLY the passages below. "
346
+ "If they do not answer it, say so.\n\n"
347
+ f"Passages:\n{passages}\n\nQuestion: {ev.question}"
348
+ )
349
+ return AnswerEvent(answer=str(response))
350
+
351
+ workflow = RagAgent(timeout=60)
352
+ ```
353
+
292
354
  ### Human-in-the-Loop
293
355
 
294
356
  ```python
@@ -122,9 +122,12 @@ In all three cases, when the downstream goal is consumption rather than upgrade:
122
122
  | `pyproject.toml` | You | Project name, version, dependencies |
123
123
  | `entry-points.json` | `uip codedagent init` | Entry points and input/output schemas |
124
124
  | `bindings.json` | `uip codedagent init` | Runtime bindings |
125
+ | `.env` | You | Local-run environment variables + `UIPATH_PROJECT_ID`. Neither packaged nor pushed — see [environment-variables.md](environment-variables.md) |
125
126
 
126
127
  `uip codedagent deploy` and `invoke` read credentials (`UIPATH_URL`, `UIPATH_ACCESS_TOKEN`, org/tenant identifiers) from your active `uip login` session — no manual `.env` wiring is required.
127
128
 
129
+ A deployed agent's environment variables come from Orchestrator (process- or job-level), not `.env`. To supply one from an asset instead of a literal, set its value to `%ASSETS/<ASSET_NAME>%` — resolved against the **job's** folder at dispatch. See [environment-variables.md](environment-variables.md).
130
+
128
131
  ## Typical Flow
129
132
 
130
133
  1. `uip codedagent run <ENTRYPOINT> '<input>'` — verify locally.
@@ -0,0 +1,90 @@
1
+ # Coded Agent Environment Variables
2
+
3
+ Where a coded agent's environment variables are stored, which store the runtime reads, and how to pull a value from an Orchestrator asset instead of hardcoding it.
4
+
5
+ ## Three stores, one variable
6
+
7
+ Not the same store. Only one is what the cloud runtime reads.
8
+
9
+ | Store | Read by | Authored with |
10
+ |-------|---------|---------------|
11
+ | `<PROJECT_DIR>/.env` | Local runs only (`uip codedagent run`, `uipath run`) | Edit file directly |
12
+ | Project configuration (AgentHub) | Cloud runtime, every debug and Studio Web run | Studio Web → agent properties → **Coded agent environment variables**. VS Code extension mirrors `.env` here on debug |
13
+ | Orchestrator process / job environment variables | Published agent started as an Orchestrator job | `uip or processes update --environment-variables`, or per job on `jobs start` — see [`uipath-platform` run-jobs](../../../../uipath-platform/references/orchestrator/run-jobs.md) |
14
+
15
+ Consequences:
16
+
17
+ 1. **`.env` is not pushed.** `uip codedagent push` excludes it — see [file-sync](file-sync.md) § Files Involved. Editing `.env` alone changes nothing in the cloud.
18
+ 2. **Local and cloud runs can disagree.** Different stores. Diagnose a cloud-only failure by comparing both, not by trusting `.env`.
19
+ 3. **No credentials in `.env`.** `UIPATH_URL`, `UIPATH_ACCESS_TOKEN`, org/tenant identifiers come from the `uip login` session. `UIPATH_PROJECT_ID` is the one identity value that belongs there.
20
+
21
+ ## Referencing an Orchestrator asset
22
+
23
+ Set a variable's whole value to `%ASSETS/<ASSET_NAME>%`. The platform substitutes the asset's value before the agent process starts; the agent reads an ordinary environment variable and never calls the Assets API.
24
+
25
+ ```env
26
+ MY_API_KEY=%ASSETS/ServiceApiKey%
27
+ DATABASE_HOST=%ASSETS/DbHost%
28
+ ```
29
+
30
+ ```python
31
+ import os
32
+
33
+ api_key = os.getenv("MY_API_KEY")
34
+ ```
35
+
36
+ The asset name stays out of the code, so it can be re-pointed per environment without a code change.
37
+
38
+ ### Format rules
39
+
40
+ 1. **Whole value only.** `%ASSETS/Name%` resolves. `https://%ASSETS/Host%/api` does not — passed through as literal text, no error.
41
+ 2. **Uppercase prefix: `%ASSETS/`.** One parser in the chain compares the prefix case-sensitively, so `%assets/Name%` silently fails to resolve on the published path even though the design-time editor accepts it.
42
+ 3. **Asset name matched case-insensitively.** Name only between the slash and closing `%` — no folder path.
43
+ 4. **One asset per variable.** No concatenation, no default value.
44
+
45
+ ### Lookup folder
46
+
47
+ The reference carries no folder, so the folder comes from the launch path. Most common reason a reference resolves in one place but not another:
48
+
49
+ | Launch path | Lookup folder |
50
+ |-------------|---------------|
51
+ | Debug run (Studio Web or VS Code extension) | User's **personal workspace** |
52
+ | Published agent started as an Orchestrator job | The **job's** folder — not the agent's, not where the package was published |
53
+
54
+ An asset that exists only in a solution folder resolves for the deployed agent but not while debugging. Create it in the personal workspace too when both paths are needed.
55
+
56
+ ### Asset value types
57
+
58
+ `Text`, `Bool`, `Integer`, `Secret` resolve. `KeyValueList` and connection-string types have no single-string form and never resolve. Credential types behave differently across the debug and published paths — do not reference them from an environment variable.
59
+
60
+ ### Failures are silent
61
+
62
+ > An unresolvable reference — asset missing from the lookup folder, no permission, unsupported value type, lowercase prefix — does NOT fail the job and does NOT log a user-visible error. The value resolves to empty and the variable is then dropped from the process environment, so the agent sees it as unset. Nothing anywhere reports why.
63
+
64
+ Fail loudly in agent code instead:
65
+
66
+ ```python
67
+ api_key = os.getenv("MY_API_KEY")
68
+ if not api_key:
69
+ raise ValueError("MY_API_KEY is not set — check the referenced asset exists in the job's folder")
70
+ ```
71
+
72
+ ## Solution resources
73
+
74
+ Saving env vars in Studio Web also registers each referenced asset as a resource on the surrounding solution.
75
+
76
+ ## Anti-patterns
77
+
78
+ 1. **Do not expect `%ASSETS/...%` to resolve locally.** Substitution is server-side. `uip codedagent run` reads `.env` verbatim, so `os.getenv` returns the literal `%ASSETS/Name%`. Put a real value in `.env` for local testing.
79
+ 2. **Do not embed a reference in a larger string.** Format rule 1 — no substitution, no warning.
80
+ 3. **Do not add a variable to `.env` and expect a cloud run to see it.** `.env` is not pushed. Update the project configuration, or debug from the VS Code extension, which mirrors the file.
81
+ 4. **Do not log a resolved secret.** After substitution it is an ordinary string in the process environment; dumping the environment exposes it.
82
+
83
+ ## Troubleshooting
84
+
85
+ | Symptom | Cause | Fix |
86
+ |---------|-------|-----|
87
+ | Agent prints literal `%ASSETS/Name%` | Local run | Expected. Put a real value in `.env`. For a cloud run, check the project configuration, not `.env` |
88
+ | Variable unset in a cloud run | Reference did not resolve, variable dropped | Confirm the asset exists in the lookup folder for that launch path: `uip or assets list --folder-path "<FOLDER_PATH>" --output json` |
89
+ | Resolves when deployed, not when debugging | Asset is in the solution folder; debug looks in the personal workspace | Create the asset in the personal workspace too |
90
+ | Stored with lowercase prefix | `%assets/` fails the case-sensitive prefix check on the published path | Rewrite as `%ASSETS/` |
@@ -35,6 +35,8 @@ UIPATH_PROJECT_ID=12345
35
35
 
36
36
  `UIPATH_URL`, `UIPATH_ACCESS_TOKEN`, and org/tenant identifiers come from the `uip login` session automatically — do not add them to `.env`.
37
37
 
38
+ `.env` may also hold the agent's own runtime environment variables, but it is **not** pushed (see [Files Involved](#files-involved)) — editing it does not change what a cloud run sees. For the store the cloud runtime reads, and for referencing an Orchestrator asset with `%ASSETS/<ASSET_NAME>%`, see [environment-variables.md](environment-variables.md).
39
+
38
40
  ## Pull
39
41
 
40
42
  Downloads all files from the remote Studio Web project to your local workspace, preserving directory structure.
@@ -94,7 +96,7 @@ uip codedagent push --overwrite
94
96
  | `pyproject.toml`, `main.py`, `.py`, `.json`, `.yaml` | yes | Project source and metadata |
95
97
  | `uipath.json`, `entry-points.json`, `bindings.json` | yes | UiPath project configuration |
96
98
  | `uv.lock` | yes (skip with `--nolock`) | Dependency lockfile |
97
- | `__pycache__/`, `.git/`, `.uipath/`, `.env` | no | Build artifacts, VCS, secrets |
99
+ | `__pycache__/`, `.git/`, `.uipath/`, `.env` | no | Build artifacts, VCS, secrets — for `.env` see [environment-variables.md](environment-variables.md) |
98
100
 
99
101
  Use `packOptions` in `uipath.json` to refine what gets included.
100
102
 
@@ -59,6 +59,7 @@ Each stage has a reference file with detailed instructions. Read **only** the re
59
59
  | **Setup** | [lifecycle/setup.md](lifecycle/setup.md) | `uv venv --python 3.13`, `source .venv/bin/activate`, `uip codedagent setup --force`, `uip codedagent new <name>`, `uv add <framework-package>`, `uv add uipath-dev --dev`, `uv sync`, `uip codedagent init` |
60
60
  | **Build** | [lifecycle/build.md](lifecycle/build.md) | Code agent logic with framework patterns |
61
61
  | **Bindings** | [lifecycle/bindings-reference.md](lifecycle/bindings-reference.md) | Sync resource overrides in `bindings.json` |
62
+ | **Env vars** | [lifecycle/environment-variables.md](lifecycle/environment-variables.md) | Which store the cloud runtime reads (not `.env`); `%ASSETS/<ASSET_NAME>%` to pull a value from an Orchestrator asset |
62
63
  | **Run** | [lifecycle/running-agents.md](lifecycle/running-agents.md) | `uip codedagent run` |
63
64
  | **Evaluate** | [lifecycle/evaluate.md](lifecycle/evaluate.md) | `uip codedagent eval` |
64
65
  | **Deploy** | [lifecycle/deployment.md](lifecycle/deployment.md) | `uip codedagent deploy`, `uip codedagent invoke` |
@@ -250,24 +251,27 @@ Execute the following in order, end-to-end, in one pass — do not pause for con
250
251
 
251
252
  This auto-registers the flow as a project in the solution.
252
253
 
253
- 3. **Scaffold the coded agent as a sibling folder.** From the solution root (still inside `<SolutionName>/`):
254
+ 3. **Scaffold the coded agent as a sibling folder.** From the solution root (still inside `<SolutionName>/`) — `uip codedagent new` scaffolds into the **current directory**, it does NOT create a subfolder, so create the agent folder first and run everything inside it:
254
255
 
255
256
  ```bash
257
+ mkdir "<AgentName>"
258
+ cd "<AgentName>"
256
259
  uv venv --python 3.13
257
260
  source .venv/bin/activate # .venv\Scripts\activate on Windows
258
- uv add <framework-package> # e.g. uipath-langchain for LangGraph
259
- uv add uipath-dev --dev
260
- uv sync
261
+ uv pip install <framework-package> # e.g. uipath-langchain for LangGraph
261
262
  uip codedagent setup --force
262
263
  uip codedagent new "<AgentName>"
264
+ uv add uipath-dev --dev
265
+ uv sync
263
266
  ```
264
267
 
268
+ `uv add` requires the `pyproject.toml` that `codedagent new` generates — run it only after `new`, never at the solution root.
269
+
265
270
  Result: `<SolutionName>/<AgentName>/` sibling to `<SolutionName>/<FlowName>/`.
266
271
 
267
- 4. **Implement the agent's `main.py`** with lazy LLM initialization (LLM clients inside graph nodes only — never at module top level), then regenerate entry-points / bindings:
272
+ 4. **Implement the agent's `main.py`** with lazy LLM initialization (LLM clients inside graph nodes only — never at module top level), then regenerate entry-points / bindings (still inside `<AgentName>/`):
268
273
 
269
274
  ```bash
270
- cd "<AgentName>"
271
275
  uip codedagent init
272
276
  ```
273
277
 
@@ -33,7 +33,9 @@ else:
33
33
  uip agent guardrails catalog --output json > .guardrails-catalog-cache.json
34
34
  ```
35
35
 
36
- Inspect the saved JSON. If the output contains `"Code": "GuardrailCatalogUnavailable"`, surface the message to the user and **stop** — do not fall back to guessing. This means the catalog endpoint is not yet available for this tenant. Note: the CLI writes all structured output (both success and error JSON) to stdout, so the redirect captures error responses correctly — do not add `2>&1`.
36
+ Inspect the saved JSON. **Only stop for the specific, structured signal that the catalog endpoint itself is unavailable:** the output contains `"Code": "GuardrailCatalogUnavailable"`. In that exact case, surface the message to the user and **stop** — do not fall back to guessing. Note: the CLI writes all structured output (both success and error JSON) to stdout, so the redirect captures error responses correctly — do not add `2>&1`.
37
+
38
+ **A generic CLI parse error is a different signal — do not stop for it.** If the output is instead something like `"Message": "error: unknown command 'catalog'"` (a `ValidationError`/parse error, not `GuardrailCatalogUnavailable`), that means this CLI build predates the `catalog` subcommand — it is an older/local build, not a tenant-side unavailability. Do not halt the whole workflow on this. Fall back to `uip agent guardrails list` plus built-in reasoning about the request, note in the report that the catalog command wasn't available on this CLI build, and continue.
37
39
 
38
40
  The cache file is `.guardrails-catalog-cache.json` in the current working directory. Add it to `.gitignore` if one exists.
39
41
 
@@ -47,6 +49,8 @@ uip agent guardrails list --output json
47
49
 
48
50
  Build a lookup of `{ validatorId: status }` from the `Data` array. You will use this in Steps 2 and 5 to filter recommendations.
49
51
 
52
+ > **`Validator` is not unique — key the lookup on `(Validator, IsByo)`, not `Validator` alone.** A tenant with a bring-your-own (BYOG) configuration for a validator sees two entries sharing the same `Validator` name — one built-in (`IsByo` absent/false), one BYO (`IsByo: true`, carrying `ByoValidatorName`/`ByoConfigurationId`/etc.). Collapsing them into a single `{ validatorId: status }` key silently picks whichever entry happens to win the collision and can validate against the wrong `Parameters`/`AllowedScopes`. See [guardrails.md § BYO (bring-your-own) guardrails](guardrails.md#byo-bring-your-own-guardrails).
53
+
50
54
  > **Catalog vs. list — the key distinction:** The catalog lists all guardrails that exist on the platform (with rich metadata for reasoning). The guardrails list returns only those accessible to this tenant. Only recommend validators where `Status == "Available"` in the list.
51
55
 
52
56
  ---
@@ -73,6 +77,11 @@ its input or output (literal word/phrase, regex, number, boolean, or always),
73
77
  use the custom deterministic recipe below. This decision happens before
74
78
  built-in catalog candidate ranking:
75
79
 
80
+ 0. **Run the Step 0 catalog and guardrails-list fetches now, even though this
81
+ branch does not use their content to pick a validator.** They are still
82
+ mandatory discovery/audit steps before writing any guardrail — this branch
83
+ only skips catalog-driven *ranking* (step 2 below), not the Step 0 calls
84
+ themselves.
76
85
  1. Treat quoted text and a distinct all-caps token such as `CONFIDENTIAL` as
77
86
  an exact literal predicate, even when the surrounding request is phrased
78
87
  semantically (for example, "worried it might publish CONFIDENTIAL content"
@@ -92,8 +101,8 @@ built-in catalog candidate ranking:
92
101
  Broad semantic threats without an exact mechanical predicate continue through
93
102
  the built-in catalog ranking in Step 2.
94
103
 
95
- Once this deterministic branch matches, the catalog/list calls remain
96
- mandatory discovery steps but cannot replace or override the custom rule with
104
+ Once this deterministic branch matches, the Step 0 catalog/list calls (already
105
+ run per step 0 above) cannot replace or override the custom rule with
97
106
  `llm_as_judge`, PII detection, or any other built-in validator.
98
107
 
99
108
  ### Step 2 — Catalog-Driven Recommendation Analysis
@@ -114,6 +123,8 @@ For **each entry** in the catalog (`guardrails[]` array from the cached JSON):
114
123
 
115
124
  Do **not** apply predetermined knowledge about which guardrail maps to which schema field. Let the catalog entry's authored fields drive every recommendation decision.
116
125
 
126
+ > **Built-in vs. BYO — default to built-in.** When a matched validator has both a built-in entry and one or more `Available` BYO (`IsByo: true`) entries in the guardrails list, recommend the built-in implementation (omit `byoValidatorName`) by default, and mention that a BYO alternative exists. Only recommend a specific BYO configuration when the user names it or asks for BYO explicitly.
127
+
117
128
  ### Step 3 — De-duplicate Overlapping Validators
118
129
 
119
130
  Several catalog validators address the same threat. Recommending more than one of them at the same scope and stage is redundant — it doubles latency and cost on every call for marginal benefit (the canonical case is `prompt_injection` and `user_prompt_attacks`: both have `security_category: "adversarial_input"` and both run at Llm · PRE).
@@ -183,9 +194,12 @@ Generate a fresh UUID for each guardrail `id`.
183
194
  Write the new guardrail blocks to `agent.json`'s `guardrails[]` array. Then run:
184
195
 
185
196
  ```bash
197
+ uip agent refresh "<AgentName>" --output json
186
198
  uip agent validate "<AgentName>" --output json
187
199
  ```
188
200
 
201
+ `refresh` regenerates `entry-points.json` and `bindings_v2.json` so Studio Web sees the updated guardrails — always run it before `validate`, matching [guardrails.md](guardrails.md)'s base walkthrough.
202
+
189
203
  **Deterministic completion gate:** when the request matched the exact
190
204
  named-Tool branch, re-read `agent.json` before validation and confirm the
191
205
  written entry has `$guardrailType: "custom"`, Tool scope, the exact Tool name,
@@ -211,7 +225,7 @@ For each existing guardrail in `agent.json`'s `guardrails[]`:
211
225
 
212
226
  ### Correctness Check
213
227
 
214
- Run `uip agent guardrails list --output json` (from Step 0) and find the matching validator by `Validator` name. The `Parameters` array is the authoritative source for all validation rules:
228
+ Run `uip agent guardrails list --output json` (from Step 0) and find the matching validator by `Validator` name. **If more than one entry shares that `Validator` name** (a built-in plus one or more BYOG entries), disambiguate before reading `Parameters`: the guardrail JSON carries `byoValidatorName` when it targets a specific BYO configuration — match on that against the list entries' `ByoValidatorName`; if the guardrail JSON has no `byoValidatorName`, it targets the built-in entry (`IsByo` absent/false). Validating against the wrong entry's `Parameters` produces false correctness findings. The `Parameters` array (of the correctly matched entry) is the authoritative source for all validation rules:
215
229
 
216
230
  | CLI field | What to check |
217
231
  |-----------|---------------|
@@ -252,7 +266,7 @@ If the user asks to fix identified issues: apply corrections to `agent.json`, ru
252
266
  ## Critical Rules
253
267
 
254
268
  1. **Always fetch catalog first** (use cache if fresh); **always fetch guardrails list second** (no cache). Both are required before any analysis.
255
- 2. **If `GuardrailCatalogUnavailable`** → surface the message and stop. Do not fall back to guessing or hardcoded recommendations.
269
+ 2. **If the catalog call returns `"Code": "GuardrailCatalogUnavailable"`** → surface the message and stop. Do not fall back to guessing or hardcoded recommendations. **A generic CLI error (e.g. `"unknown command 'catalog'"`) is not this signal** — that means an older CLI build, not tenant unavailability; fall back to `guardrails list` + built-in reasoning and note the limitation in the report instead of halting.
256
270
  3. **Only recommend `Available` validators**. Mention `Unauthorised` ones to the user so they can contact their administrator.
257
271
  4. **Every recommendation must cite** the catalog entry's `when_to_use` or a specific `use_cases` item that matched the agent's context. Do not recommend a guardrail without explaining why it applies.
258
272
  5. **Never recommend two validators with the same `security_category` at the same scope and stage** (e.g. `prompt_injection` + `user_prompt_attacks` at Llm PRE). De-duplicate per Step 3: drop catalog-deprecated entries, keep the best fit, mention the alternative. Derive the grouping and deprecation from the catalog's own fields — do not hardcode validator names.
@@ -265,3 +279,4 @@ If the user asks to fix identified issues: apply corrections to `agent.json`, ru
265
279
  12. **All map-enum keys must exactly match the corresponding enum-list values** — no extra or missing keys. This is the most common correctness error.
266
280
  13. **Read [guardrails.md](guardrails.md) before writing any JSON** — discriminator fields, PascalCase constraints, and parameter shapes are specified there and cannot be safely inferred.
267
281
  14. **Do NOT use TaskCreate, TaskUpdate, or other task-tracking tools for guardrail edits.** Edit `agent.json` directly — task management tools add bookkeeping turns without benefit and push runs over their turn budget.
282
+ 15. **`Validator` is not unique — disambiguate built-in vs. BYO by `IsByo` before matching on name.** A tenant can have both a built-in and one or more BYOG entries sharing the same `Validator` name. Key any lookup on `(Validator, IsByo)`, and when an existing guardrail carries `byoValidatorName`, match it against `ByoValidatorName` — not `Validator` alone — before reading `Parameters`/`AllowedScopes` for correctness or recommendation. Default recommendations to the built-in entry unless the user asks for BYO. See [guardrails.md § BYO (bring-your-own) guardrails](guardrails.md#byo-bring-your-own-guardrails).
@@ -625,9 +625,21 @@ Run `uip agent guardrails list --output json` to get the authoritative list. Onl
625
625
  | `GuardrailStages[scope]` | Valid execution stages for that scope |
626
626
  | `Parameters[].Id` | `validatorParameters[].id` |
627
627
  | `Parameters[].Type` | `validatorParameters[].$parameterType` |
628
+ | `IsByo` | Disambiguates a bring-your-own (BYOG) entry from a built-in one — see [BYO (bring-your-own) guardrails](#byo-bring-your-own-guardrails) below. Not itself a JSON field. |
629
+ | `ByoValidatorName` | `byoValidatorName` value — include this field to pin the guardrail to this exact BYO configuration. Required whenever more than one entry shares this `Validator` name (a built-in plus one or more BYOG configurations). |
628
630
 
629
631
  > **Important:** PII entity names use PascalCase (`"Email"`, not `"email_address"`). Harmful content categories use PascalCase (`"Hate"`, not `"hate"`). Scope values use PascalCase (`"Agent"`, `"Llm"`, `"Tool"`).
630
632
 
633
+ ## BYO (bring-your-own) guardrails
634
+
635
+ A validator can be fulfilled by a tenant-registered **external** provider (a "BYOG" configuration — e.g. Azure AI Content Safety, Databricks AI Guardrails) instead of, or alongside, UiPath's own built-in implementation. A tenant admin registers these at Admin → AI Trust Layer → Guardrails Configurations or via `uip guardrails byo-configurations create`; see [uipath-platform § BYO Guardrail Configurations](/uipath:uipath-platform) for the admin-side lifecycle commands (`uip guardrails byo-configurations list|create|update|delete`).
636
+
637
+ - **`Validator` is not unique.** A tenant with a BYOG `harmful_content` configuration sees **two** entries named `harmful_content` in `uip agent guardrails list` output — one built-in, one BYO. Use `IsByo` to tell them apart; never assume a single match.
638
+ - **Filter to BYO-only entries** with `uip agent guardrails list --byo --output json` when the user specifically wants to see or target a BYO-backed validator.
639
+ - **BYO entries carry extra fields**: `ByoValidatorName`, `ByoConnectionId`, `ByoConfigurationId`, `ByoConnectorName`, `ByoConnectorKey`, `FolderKey` — alongside the same `Parameters`/`AllowedScopes`/`GuardrailStages`/`Status` shape a built-in entry has.
640
+ - **To author a guardrail against a specific BYO configuration**, build the `builtInValidator` guardrail exactly as for a built-in validator (same `validatorType`, same `validatorParameters` from that entry's `Parameters`), and add `byoValidatorName` set to that entry's `ByoValidatorName`. Omit it to use the built-in implementation. (`ByoConfigurationId` is the configuration's own admin-side id — useful for cross-referencing `uip guardrails byo-configurations list`, but it is not what the guardrail JSON carries; `ByoValidatorName` is unique per tenant and is the value that pins it.)
641
+ - **`Status: "Disabled"` on a BYO entry** means the tenant switched that specific configuration off — the entry still shows (it doesn't vanish), so a disabled BYOG configuration is distinguishable from one that was never set up. Do not author a guardrail against a `Disabled` BYO entry; treat it the same as `Unauthorised` (skip, tell the user).
642
+
631
643
  ## Full Examples
632
644
 
633
645
  ### Example 1: Block PII in Agent and Tool Outputs
@@ -1030,6 +1042,7 @@ Add the `guardrails` array at the agent.json root level alongside `settings`, `m
1030
1042
  18. **Do not attempt OR logic within a single guardrail** — all rules and all fields within a guardrail are combined with AND. OR is not supported. To achieve OR behavior, create separate guardrails — one per condition branch.
1031
1043
  19. **Do not generate guardrails targeting unsupported tool types** — `matchNames` can only reference tools of supported types: agent, process, activity, builtInTool, ixpTool, or Integration Service connector. Do not generate guardrails with `matchNames` targeting other tool types.
1032
1044
  20. **Do not omit `matchNames` to target "all tools"** — always explicitly list every tool resource name in `matchNames`. Read the agent's `resources/` directory first. If the agent has no tool resources, do not add the guardrail.
1045
+ 21. **Do not assume `Validator` is unique** — a tenant can have both a built-in and one or more bring-your-own (BYOG) entries sharing the same `Validator` name. Always check `IsByo` before treating two same-named entries as a duplicate or conflict, and set `byoValidatorName` when targeting a specific BYO entry. See [BYO (bring-your-own) guardrails](#byo-bring-your-own-guardrails).
1033
1046
 
1034
1047
  ## Walkthrough
1035
1048
 
@@ -213,8 +213,6 @@ Resource body shape is identical to the standalone-agent docs — only the folde
213
213
  "typeVersion": "1.0",
214
214
  "display": { "label": "Autonomous Agent" },
215
215
  "inputs": {
216
- "systemPrompt": "You are an agentic assistant.",
217
- "userPrompt": "What is the current date?",
218
216
  "source": "<projectId-uuid>", // UUID linking to the inline agent directory
219
217
  "agentInputVariables": [],
220
218
  "agentOutputVariables": [
@@ -240,7 +238,7 @@ Resource body shape is identical to the standalone-agent docs — only the folde
240
238
 
241
239
  **Critical fields:**
242
240
  - `inputs.source` — The inline agent's `projectId` UUID. Must match the subdirectory name and `agent.json.projectId` inside the flow project. The definition still declares `model.source: true`, but flow-core hoists that identity field onto `inputs.source` for the `uipath.agent.autonomous` node instance.
243
- - `inputs.systemPrompt` / `inputs.userPrompt` — Current flow validation requires non-empty placeholders on the node. The canonical prompts still live in `agent.json.messages[]`.
241
+ - `inputs.systemPrompt` / `inputs.userPrompt` — **do not write these keys.** A prompt string on the node makes the flow converter drop every `agentInputVariables[]` entry the prompt text does not reference. Empty strings fail `uip maestro flow validate`. The canonical prompts live in `agent.json.messages[]`. Validator behavior and the older-CLI fallback: [inline-agent guide § Refresh and Validate](../../../../../uipath-maestro-flow/references/author/references/plugins/inline-agent/impl.md#refresh-and-validate).
244
242
  - `definitions[]` — The `uipath.agent.autonomous` definition copied from the flow registry supplies `model.serviceType: "Orchestrator.StartInlineAgentJob"`, BPMN type, version, and context. Do not copy those fields into the node instance.
245
243
  - No node instance `model` block — the inline-agent source lives at `inputs.source`.
246
244