@uipath/skills 1.204.0 → 1.204.1
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.
- package/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/.cursor-plugin/plugin.json +1 -1
- package/CODEOWNERS +12 -14
- package/package.json +1 -1
- package/skills/uipath-agents/references/coded/embedding-in-flows.md +1 -3
- package/skills/uipath-agents/references/coded/quickstart.md +0 -2
- package/skills/uipath-agents/references/lowcode/capabilities/inline-in-flow/inline-in-flow.md +10 -8
- package/skills/uipath-agents/references/lowcode/prompting/autonomous-agent-prompting-guide.md +1 -1
- package/skills/uipath-human-in-the-loop/SKILL.md +1 -3
- package/skills/uipath-human-in-the-loop/references/hitl-node-apptask.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-coded-action-app.md +0 -2
- package/skills/uipath-human-in-the-loop/references/hitl-node-quickform.md +2 -2
- package/skills/uipath-maestro-flow/.maintenance/README.md +265 -0
- package/skills/uipath-maestro-flow/.maintenance/check-all.sh +40 -0
- package/skills/uipath-maestro-flow/.maintenance/check-anchors.sh +101 -0
- package/skills/uipath-maestro-flow/.maintenance/check-depth.sh +132 -0
- package/skills/uipath-maestro-flow/.maintenance/check-link-text.sh +123 -0
- package/skills/uipath-maestro-flow/.maintenance/check-links.sh +73 -0
- package/skills/uipath-maestro-flow/.maintenance/check-orphans.sh +93 -0
- package/skills/uipath-maestro-flow/.maintenance/check-plugin-pairs.sh +39 -0
- package/skills/uipath-maestro-flow/.maintenance/check-template.sh +42 -0
- package/skills/uipath-maestro-flow/.maintenance/check-uip-commands.sh +270 -0
- package/skills/uipath-maestro-flow/.maintenance/check-versions.sh +160 -0
- package/skills/uipath-maestro-flow/SKILL.md +69 -886
- package/skills/uipath-maestro-flow/references/author/CAPABILITY.md +207 -0
- package/skills/uipath-maestro-flow/references/author/brownfield.md +91 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-cli.md +190 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations-json.md +374 -0
- package/skills/uipath-maestro-flow/references/author/editing-operations.md +104 -0
- package/skills/uipath-maestro-flow/references/author/greenfield.md +420 -0
- package/skills/uipath-maestro-flow/references/author/planning-arch.md +364 -0
- package/skills/uipath-maestro-flow/references/author/planning-impl.md +291 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/impl.md +237 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agent/planning.md +97 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/agentic-process/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/impl.md +108 -0
- package/skills/uipath-maestro-flow/references/author/plugins/api-workflow/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/impl.md +171 -0
- package/skills/uipath-maestro-flow/references/author/plugins/batch-transform/planning.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl-inline.md +120 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/impl.md +463 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector/planning.md +186 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/impl.md +517 -0
- package/skills/uipath-maestro-flow/references/author/plugins/connector-trigger/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/impl.md +309 -0
- package/skills/uipath-maestro-flow/references/author/plugins/conversational-agent/planning.md +133 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/impl.md +428 -0
- package/skills/uipath-maestro-flow/references/author/plugins/data-fabric/planning.md +188 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/impl.md +83 -0
- package/skills/uipath-maestro-flow/references/author/plugins/decision/planning.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/impl.md +38 -0
- package/skills/uipath-maestro-flow/references/author/plugins/delay/planning.md +53 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/end/planning.md +28 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/impl.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/flow/planning.md +58 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/impl.md +181 -0
- package/skills/uipath-maestro-flow/references/author/plugins/hitl/planning.md +166 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-connector.md +86 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl-manual.md +68 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/impl.md +173 -0
- package/skills/uipath-maestro-flow/references/author/plugins/http/planning.md +107 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/impl.md +540 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-agent/planning.md +115 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/impl.md +269 -0
- package/skills/uipath-maestro-flow/references/author/plugins/inline-voice-agent/planning.md +128 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/impl.md +424 -0
- package/skills/uipath-maestro-flow/references/author/plugins/ixp/planning.md +95 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/impl.md +403 -0
- package/skills/uipath-maestro-flow/references/author/plugins/loop/planning.md +60 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/impl.md +43 -0
- package/skills/uipath-maestro-flow/references/author/plugins/merge/planning.md +24 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/impl.md +82 -0
- package/skills/uipath-maestro-flow/references/author/plugins/queue/planning.md +44 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/impl.md +117 -0
- package/skills/uipath-maestro-flow/references/author/plugins/rpa/planning.md +61 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/impl.md +56 -0
- package/skills/uipath-maestro-flow/references/author/plugins/scheduled-trigger/planning.md +93 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/impl.md +98 -0
- package/skills/uipath-maestro-flow/references/author/plugins/script/planning.md +42 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/impl.md +164 -0
- package/skills/uipath-maestro-flow/references/author/plugins/subflow/planning.md +35 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/impl.md +189 -0
- package/skills/uipath-maestro-flow/references/author/plugins/summarize/planning.md +66 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/impl.md +72 -0
- package/skills/uipath-maestro-flow/references/author/plugins/switch/planning.md +34 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/impl.md +48 -0
- package/skills/uipath-maestro-flow/references/author/plugins/terminate/planning.md +29 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/impl.md +252 -0
- package/skills/uipath-maestro-flow/references/author/plugins/transform/planning.md +47 -0
- package/skills/uipath-maestro-flow/references/diagnose/CAPABILITY.md +73 -0
- package/skills/uipath-maestro-flow/references/diagnose/failure-modes.md +353 -0
- package/skills/uipath-maestro-flow/references/diagnose/troubleshooting-guide.md +174 -0
- package/skills/uipath-maestro-flow/references/evaluate/CAPABILITY.md +134 -0
- package/skills/uipath-maestro-flow/references/evaluate/commands-reference.md +376 -0
- package/skills/uipath-maestro-flow/references/evaluate/eval-sets-guide.md +227 -0
- package/skills/uipath-maestro-flow/references/evaluate/evaluators-guide.md +143 -0
- package/skills/uipath-maestro-flow/references/evaluate/running-guide.md +215 -0
- package/skills/uipath-maestro-flow/references/evaluate/upload-safety.md +94 -0
- package/skills/uipath-maestro-flow/references/operate/CAPABILITY.md +77 -0
- package/skills/uipath-maestro-flow/references/operate/manage.md +39 -0
- package/skills/uipath-maestro-flow/references/operate/run.md +121 -0
- package/skills/uipath-maestro-flow/references/operate/ship.md +57 -0
- package/skills/uipath-maestro-flow/references/shared/action-nodes.md +100 -0
- package/skills/uipath-maestro-flow/references/shared/cli-commands.md +269 -0
- package/skills/uipath-maestro-flow/references/shared/cli-conventions.md +178 -0
- package/skills/uipath-maestro-flow/references/shared/file-format.md +582 -0
- package/skills/uipath-maestro-flow/references/shared/node-output-wiring.md +86 -0
- package/skills/uipath-maestro-flow/references/shared/ux-narration-and-todos.md +113 -0
- package/skills/uipath-maestro-flow/references/shared/variables-and-expressions.md +787 -0
- package/skills/uipath-platform/references/integration-service/activities.md +2 -2
- package/skills/uipath-platform/references/integration-service/activity-generation.md +8 -1
- package/skills/uipath-platform/references/integration-service/triggers.md +1 -3
- package/version-manifest.json +1 -1
- package/skills/uipath-maestro-flow/examples/AquariumSafetyStop.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/ArchiveCardExtract.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/BakeOffEntryForm.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/BeeHiveLedger.flow.ts +0 -61
- package/skills/uipath-maestro-flow/examples/BeltProgression.flow.ts +0 -53
- package/skills/uipath-maestro-flow/examples/BirdCountLookup.flow.ts +0 -24
- package/skills/uipath-maestro-flow/examples/ClubDirectory.flow.ts +0 -56
- package/skills/uipath-maestro-flow/examples/ConcertSoundcheck.flow.ts +0 -59
- package/skills/uipath-maestro-flow/examples/DoorbellLog.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FestivalMapScaffold.flow.ts +0 -22
- package/skills/uipath-maestro-flow/examples/FieldTripQuickForm.flow.ts +0 -45
- package/skills/uipath-maestro-flow/examples/FossilCatalogEnrich.flow.ts +0 -26
- package/skills/uipath-maestro-flow/examples/GallerySubmission.flow.ts +0 -67
- package/skills/uipath-maestro-flow/examples/GreenhouseWatering.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/HarbourRadioLine.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/HerbariumDispatch.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/KilnReview.flow.ts +0 -38
- package/skills/uipath-maestro-flow/examples/LibraryDeskChat.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/LighthouseSignal.flow.ts +0 -30
- package/skills/uipath-maestro-flow/examples/MeteorShowerPages.flow.ts +0 -39
- package/skills/uipath-maestro-flow/examples/NeighborhoodWalkPlanner.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/ObservatorySeeing.flow.ts +0 -51
- package/skills/uipath-maestro-flow/examples/OralHistoryDigest.flow.ts +0 -31
- package/skills/uipath-maestro-flow/examples/PlanetariumConfirmation.flow.ts +0 -34
- package/skills/uipath-maestro-flow/examples/PlantNameAdvisor.flow.ts +0 -28
- package/skills/uipath-maestro-flow/examples/PostcardCaption.flow.ts +0 -44
- package/skills/uipath-maestro-flow/examples/PotteryStudioCallback.flow.ts +0 -41
- package/skills/uipath-maestro-flow/examples/RecipeScaler.flow.ts +0 -62
- package/skills/uipath-maestro-flow/examples/SeedPacketReader.flow.ts +0 -49
- package/skills/uipath-maestro-flow/examples/TideTableConverter.flow.ts +0 -35
- package/skills/uipath-maestro-flow/examples/TrailLogSummary.flow.ts +0 -75
- package/skills/uipath-maestro-flow/examples/WorkshopInventory.flow.ts +0 -27
- package/skills/uipath-maestro-flow/examples/bindings.json +0 -85
- package/skills/uipath-maestro-flow/references/CLI-LOOP.md +0 -309
- package/skills/uipath-maestro-flow/references/agent-resources.md +0 -74
- package/skills/uipath-maestro-flow/references/agent.md +0 -175
- package/skills/uipath-maestro-flow/references/agentic-process.md +0 -41
- package/skills/uipath-maestro-flow/references/api-workflow.md +0 -29
- package/skills/uipath-maestro-flow/references/author.md +0 -178
- package/skills/uipath-maestro-flow/references/batch-transform.md +0 -23
- package/skills/uipath-maestro-flow/references/bindings.md +0 -178
- package/skills/uipath-maestro-flow/references/branch.md +0 -18
- package/skills/uipath-maestro-flow/references/brownfield.md +0 -152
- package/skills/uipath-maestro-flow/references/connector-params.md +0 -624
- package/skills/uipath-maestro-flow/references/conversational.md +0 -77
- package/skills/uipath-maestro-flow/references/data-fabric.md +0 -268
- package/skills/uipath-maestro-flow/references/delay.md +0 -26
- package/skills/uipath-maestro-flow/references/diagnose.md +0 -141
- package/skills/uipath-maestro-flow/references/document-pipeline.md +0 -47
- package/skills/uipath-maestro-flow/references/error-handling.md +0 -75
- package/skills/uipath-maestro-flow/references/evaluate.md +0 -168
- package/skills/uipath-maestro-flow/references/event-trigger.md +0 -155
- package/skills/uipath-maestro-flow/references/form-trigger.md +0 -41
- package/skills/uipath-maestro-flow/references/hitl.md +0 -169
- package/skills/uipath-maestro-flow/references/http.md +0 -105
- package/skills/uipath-maestro-flow/references/inline-agent.md +0 -132
- package/skills/uipath-maestro-flow/references/ixp.md +0 -167
- package/skills/uipath-maestro-flow/references/loops.md +0 -77
- package/skills/uipath-maestro-flow/references/manual-trigger.md +0 -39
- package/skills/uipath-maestro-flow/references/operate.md +0 -204
- package/skills/uipath-maestro-flow/references/or-processes.md +0 -91
- package/skills/uipath-maestro-flow/references/parallel-merge.md +0 -21
- package/skills/uipath-maestro-flow/references/placeholder.md +0 -70
- package/skills/uipath-maestro-flow/references/published-function.md +0 -66
- package/skills/uipath-maestro-flow/references/queue.md +0 -53
- package/skills/uipath-maestro-flow/references/return.md +0 -20
- package/skills/uipath-maestro-flow/references/rpa-workflow.md +0 -27
- package/skills/uipath-maestro-flow/references/scheduled-trigger.md +0 -34
- package/skills/uipath-maestro-flow/references/script.md +0 -52
- package/skills/uipath-maestro-flow/references/subflow.md +0 -33
- package/skills/uipath-maestro-flow/references/summarize.md +0 -20
- package/skills/uipath-maestro-flow/references/switch.md +0 -20
- package/skills/uipath-maestro-flow/references/terminate.md +0 -22
- package/skills/uipath-maestro-flow/references/transform.md +0 -32
- package/skills/uipath-maestro-flow/references/voice.md +0 -70
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
# HITL Node — Planning
|
|
2
|
+
|
|
3
|
+
The flow needs to pause for a human to review, approve, or fill in data. Two node types serve this need — choose based on form complexity and whether an app already exists.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Which HITL Node to Use
|
|
8
|
+
|
|
9
|
+
| Use case | Node type | Form source |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| Inline form designed right now (fields + outcomes defined in the flow) | `uipath.human-in-the-loop.quick-form` | Schema embedded in node inputs — no app needed |
|
|
12
|
+
| Existing coded app or Action Center app | `uipath.human-in-the-loop.coded-action-app` | Deployed app from Orchestrator |
|
|
13
|
+
|
|
14
|
+
**Prefer `uipath.human-in-the-loop.quick-form`** for new flows. It is an OOTB node — no registry discovery, no app publishing, no tenant dependency.
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Option 1 — `uipath.human-in-the-loop.quick-form` (Inline Schema — OOTB)
|
|
19
|
+
|
|
20
|
+
Node type: `uipath.human-in-the-loop.quick-form`
|
|
21
|
+
Available: always — no `uip login` or registry pull required.
|
|
22
|
+
|
|
23
|
+
### When to Select
|
|
24
|
+
|
|
25
|
+
| Situation | Select? |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| Manager approval before processing | Yes |
|
|
28
|
+
| Human reviews extracted data before submission | Yes |
|
|
29
|
+
| Human resolves exceptions the automation cannot handle | Yes |
|
|
30
|
+
| Need a quick form with specific fields and outcomes | Yes |
|
|
31
|
+
| Existing coded/Action Center app should be used | No — use Option 2 |
|
|
32
|
+
| Fully automated processing, no human involvement | No |
|
|
33
|
+
| The user wants to **see** a value the flow produced | Only if a human will open the task — see below |
|
|
34
|
+
|
|
35
|
+
**A HITL node blocks until a human completes its task, so place one only where a human actually will.** The task appears in Action Center; if it has no assignee, or the run is unattended (a schedule, a `flow debug`, an eval), nobody opens it and the flow never reaches its End node. The instance stays `Running` until the caller's timeout, with no output. Every outcome port can be wired correctly and this still happens, so it does not present as the unwired-port failure below.
|
|
36
|
+
|
|
37
|
+
**"Show me the result" does not by itself mean a form.** The mechanisms differ in who can consume them, so ask what *seeing it* means before choosing:
|
|
38
|
+
|
|
39
|
+
| Mechanism | Reaches | Completes unattended |
|
|
40
|
+
| --- | --- | --- |
|
|
41
|
+
| HITL form | a person who opens Action Center | No — blocks until submitted |
|
|
42
|
+
| Message to a channel or mailbox (connector node) | a person wherever they already are | Yes |
|
|
43
|
+
| `out` variable mapped on the End node | whoever or whatever invoked the flow | Yes |
|
|
44
|
+
|
|
45
|
+
With no user to ask, pick one that terminates unattended and record which you chose and why. Do not reach for a form because the request said "display" — that word describes the goal, not the node.
|
|
46
|
+
|
|
47
|
+
### Ports
|
|
48
|
+
|
|
49
|
+
| Input port | Output port(s) |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| `input` | one per outcome — `outcome-<outcome.id>`, derived verbatim from `inputs.schema.outcomes[].id` |
|
|
52
|
+
|
|
53
|
+
**Every outcome gets its own port — wire one edge per outcome, not a single shared port.** A schema with `outcomes: [Approve, Reject]` (ids `approve`, `reject`) produces two ports, `outcome-approve` and `outcome-reject`; each needs its own edge. Every outcome needs a non-empty string `id` — one without gets no handle at all, so an edge drawn to a guessed port name is a no-op, not a working branch. A node with any outcome port left unwired blocks the flow indefinitely on that branch.
|
|
54
|
+
|
|
55
|
+
> **`outcome-completed` is the port for a zero-outcome node, or for a real outcome whose `id` is literally `completed`.** It is an ordinary string, not a reserved one, so it can be a genuine outcome port. The instant `inputs.schema.outcomes` has one or more entries with a different `id` — including the shipped default `Submit` (id `submit`) — its port becomes `outcome-submit`, not `outcome-completed`. Never wire `outcome-completed` standing in for several different outcomes.
|
|
56
|
+
|
|
57
|
+
### Output Variables
|
|
58
|
+
|
|
59
|
+
- `$vars.{nodeId}.output` — object containing all output and inOut fields the human filled in
|
|
60
|
+
- `$vars.{nodeId}.output.{fieldName}` — individual field value
|
|
61
|
+
- `$vars.{nodeId}.status` — selected outcome's action value (`"Continue"` or `"End"`)
|
|
62
|
+
|
|
63
|
+
### Schema Design
|
|
64
|
+
|
|
65
|
+
The schema defines what the human sees and provides. Three field categories:
|
|
66
|
+
|
|
67
|
+
| Category | Human can… | Use for |
|
|
68
|
+
| --- | --- | --- |
|
|
69
|
+
| `inputs` | Read only | Context the human needs to decide |
|
|
70
|
+
| `outputs` | Write | Data the automation needs back |
|
|
71
|
+
| `inOuts` | Read + modify | Fields the human can see and optionally correct |
|
|
72
|
+
|
|
73
|
+
Outcomes are the action buttons (e.g., Approve/Reject). First outcome is primary.
|
|
74
|
+
|
|
75
|
+
**In the architectural plan**, describe the schema:
|
|
76
|
+
```
|
|
77
|
+
inputs: [invoiceId (string), amount (number)]
|
|
78
|
+
outputs: [decision (string, required)]
|
|
79
|
+
outcomes: [Approve, Reject]
|
|
80
|
+
priority: Low
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Full JSON format and conversion examples: see [`uipath-human-in-the-loop` skill](../../../../../uipath-human-in-the-loop/references/hitl-node-quickform.md).
|
|
84
|
+
|
|
85
|
+
> **Note:** Skills are self-contained — cross-skill references are for documentation context only. The agent uses the `uipath-human-in-the-loop` skill to implement HITL nodes; this planning guide is for topology selection only.
|
|
86
|
+
|
|
87
|
+
### Wiring Pattern
|
|
88
|
+
|
|
89
|
+
```
|
|
90
|
+
[Upstream] -> [HITL] ->|outcome-approve| [Continue]
|
|
91
|
+
->|outcome-reject| [End]
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Each outcome branches directly off its own handle — no separate Decision node needed to re-derive the branch from `$vars.{nodeId}.status`.
|
|
95
|
+
|
|
96
|
+
### Common Topology Patterns
|
|
97
|
+
|
|
98
|
+
**Approval gate:**
|
|
99
|
+
```
|
|
100
|
+
Trigger -> Fetch Data -> HITL (review, outcomes: Approve/Reject) ->
|
|
101
|
+
outcome-approve: Script (process) -> End
|
|
102
|
+
outcome-reject: Script (log rejection) -> End
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
**Exception escalation:**
|
|
106
|
+
```
|
|
107
|
+
Trigger -> Process -> Decision (confidence ok?) ->
|
|
108
|
+
true: Continue -> End
|
|
109
|
+
false: HITL (exception review, outcomes: Retry/Escalate) ->
|
|
110
|
+
outcome-retry: Script (retry with human input) -> End
|
|
111
|
+
outcome-escalate: End
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
**Do not insert a Decision node after a HITL node to re-branch on outcome.** Each outcome already has its own wired handle — that handle IS the branch point. Reach for a Decision node only where the branch is on something other than the HITL outcome itself (e.g., the confidence check above, which runs before any HITL node).
|
|
115
|
+
|
|
116
|
+
### Planning Annotation
|
|
117
|
+
|
|
118
|
+
In the node table:
|
|
119
|
+
```
|
|
120
|
+
| hitlReview | Invoice Review | human-task | uipath.human-in-the-loop.quick-form | inputs: [invoiceId, amount] outputs: [decision] outcomes: [Approve, Reject] | output, status |
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## Option 2 — `uipath.core.human-task.{key}` (App-Based)
|
|
126
|
+
|
|
127
|
+
Node type: `uipath.core.human-task.{key}`
|
|
128
|
+
Available: tenant-specific resource — requires `uip login` + `uip maestro flow registry pull`.
|
|
129
|
+
|
|
130
|
+
### When to Select
|
|
131
|
+
|
|
132
|
+
Use when there is an existing coded app or Action Center app that should be the task form.
|
|
133
|
+
|
|
134
|
+
### Ports
|
|
135
|
+
|
|
136
|
+
| Input port | Output port |
|
|
137
|
+
| --- | --- |
|
|
138
|
+
| `input` | `output` |
|
|
139
|
+
|
|
140
|
+
### Output Variables
|
|
141
|
+
|
|
142
|
+
- `$vars.{nodeId}.output` — form data submitted by the user
|
|
143
|
+
- `$vars.{nodeId}.error` — error details if execution fails
|
|
144
|
+
|
|
145
|
+
### Discovery
|
|
146
|
+
|
|
147
|
+
**Published (tenant registry):**
|
|
148
|
+
|
|
149
|
+
```bash
|
|
150
|
+
uip maestro flow registry pull --force
|
|
151
|
+
uip maestro flow registry search "uipath.core.human-task" --output json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**In-solution (local, no login required):**
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
uip maestro flow registry list --local --output json
|
|
158
|
+
uip maestro flow registry get "<node-type>" --local --output json
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Run from inside the flow project directory. Discovers sibling projects in the same `.uipx` solution.
|
|
162
|
+
|
|
163
|
+
### Planning Annotation
|
|
164
|
+
|
|
165
|
+
- If the app exists: note as `resource: <name> (human-task)`
|
|
166
|
+
- If it does not exist: note as `[CREATE NEW] <description>` with skill `uipath-coded-apps`, use `core.logic.mock` placeholder
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# HTTP Request Node — Connector Mode
|
|
2
|
+
|
|
3
|
+
Use this walkthrough when the target service has an IS connector and you want managed auth (OAuth / API key) handled by an existing IS connection.
|
|
4
|
+
|
|
5
|
+
**Prerequisite:** a healthy IS connection for the target connector. Step 2 verifies this. If none exists, propose manual mode as the fallback and confirm the switch with the user before finalizing — do not switch modes without that confirmation.
|
|
6
|
+
|
|
7
|
+
Before starting, read [impl.md](impl.md) for the node type, registry validation, and the "always use `node configure`" rule. Follow Steps 1–5 in order.
|
|
8
|
+
|
|
9
|
+
## Step 1 — Add the node
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
uip maestro flow node add <ProjectName>.flow core.action.http.v2 \
|
|
13
|
+
--label "<HTTP node label>" --output json
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
> **Inside a loop body?** Add `--parent <LOOP_NODE_ID>` to set `parentId`. Without it, the node runs outside the loop context and outputs are null. See [loop/impl.md](../loop/impl.md).
|
|
17
|
+
|
|
18
|
+
The CLI copies the manifest into `definitions[]`, adds the node instance, registers `variables.nodes`, and inserts a `layout.nodes` placeholder — byte-for-byte from the registry. Save the returned `<nodeId>` — Steps 2 and 3 reuse it. Leave `inputs` empty; Step 3 populates `inputs.detail`. Do not hand-author the definition — see [impl.md — Add the node](impl.md#add-the-node).
|
|
19
|
+
|
|
20
|
+
## Step 2 — Identify target connection
|
|
21
|
+
|
|
22
|
+
**Connector mode only works if the connector supports the HTTP request activity** — verify by running `uip is connectors get "<target-connector-key>"` and checking the `HasHttpRequest` flag. If the flag is false, **STOP** — a connection cannot help. Use the recovery question below (switch to manual mode / skip / something else; the create-a-connection option does not apply) and do not switch modes without confirmation.
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
uip is connections list "<target-connector-key>" --all-folders --output json
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
`--all-folders` is mandatory for discovery. Selection rules, empty-result recovery, and ping verification live in the platform skill — do not duplicate them here.
|
|
29
|
+
|
|
30
|
+
> **MUST READ before any `uip is connections ...` call:** [/uipath:uipath-platform — connections.md](../../../../../uipath-platform/references/integration-service/connections.md).
|
|
31
|
+
|
|
32
|
+
Record the chosen connection's `Id` and `FolderKey` — Step 3 needs both.
|
|
33
|
+
|
|
34
|
+
> **HTTP-specific recovery — no usable connection.** If platform-skill recovery yields nothing (empty after `--all-folders` + `--refresh`, user declines to create one), the HTTP node has unique fallback options. Ask the user to confirm the path — **manual mode is the recommended auto-fallback**, pre-selected, since it unblocks the node without a connection:
|
|
35
|
+
>
|
|
36
|
+
> - **Switch this node to manual mode** *(recommended)* — abandon this walkthrough and follow [impl-manual.md](impl-manual.md). Manual changes the auth model (you supply auth yourself), so this needs explicit confirmation.
|
|
37
|
+
> - **Create a new connection now** — `uip is connections create "<target-connector-key>"` starts the OAuth flow. User completes browser auth themselves, then re-run `uip is connections list` to pick up the new connection.
|
|
38
|
+
> - **Skip this node**.
|
|
39
|
+
> - **Something else**.
|
|
40
|
+
>
|
|
41
|
+
> Auto-try the fallback, but do not finalize a mode switch without the user's confirmation; do not invent a placeholder ID; do not skip the node without explicit selection. See the dropdown question rule in [SKILL.md](../../../../SKILL.md).
|
|
42
|
+
|
|
43
|
+
## Step 3 — Configure the node
|
|
44
|
+
|
|
45
|
+
> **STOP — open the platform skill before configuring.** Before composing `url` / `query` / `body`, read [/uipath:uipath-platform — http-request.md](../../../../../uipath-platform/references/integration-service/http-request.md) and resolve every value you don't already have (IDs from names, required body fields, endpoint path, response shape).
|
|
46
|
+
>
|
|
47
|
+
> - **If the target connector is listed in that skill's `vendor-docs-registry.json`:** you MUST follow its **Step 0 (Ground Against the Vendor's API Docs)** — read the `docsUrl` + `notes` and confirm the exact endpoint with the `http-request` probe before running `node configure`. Pass the endpoint path verbatim: vendor method names can contain literal dots (Slack ``chat.postMessage`) — the dot is part of the path segment.
|
|
48
|
+
> - **If the connector is NOT listed:** the registry-grounding step does not apply — resolve missing values via the `http-request` probe / vendor docs as usual.
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
uip maestro flow node configure <ProjectName>.flow <nodeId> \
|
|
52
|
+
--detail '{
|
|
53
|
+
"authentication": "connector",
|
|
54
|
+
"targetConnector": "<target-connector-key>",
|
|
55
|
+
"connectionId": "<target-connection-id>",
|
|
56
|
+
"folderKey": "<folder-key>",
|
|
57
|
+
"method": "GET",
|
|
58
|
+
"url": "/api/endpoint",
|
|
59
|
+
"query": {"param1": "value1"}
|
|
60
|
+
}' --output json
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
> **Connector mode supports `application/json` request and response bodies only.**
|
|
64
|
+
|
|
65
|
+
The CLI:
|
|
66
|
+
|
|
67
|
+
- Builds the full `inputs.detail` (connector, connectionId, bodyParameters, essentialConfiguration)
|
|
68
|
+
- Auto-fills both `bodyParameters.path` and `bodyParameters.url` from the single `url` value you pass
|
|
69
|
+
- Generates `bindings_v2.json`
|
|
70
|
+
- Creates a connection resource file under `resources/solution_folder/connection/`
|
|
71
|
+
|
|
72
|
+
**Dynamic values:** connector input fields do not resolve `{$vars.x}` brace-templates — use `=js:` expressions for any dynamic `url` / `headers` / `body` / `query`. Pass the `=js:` string verbatim in `--detail`. Full rationale and examples: [impl.md — Dynamic values](impl.md#dynamic-values-in-url--headers--body--query).
|
|
73
|
+
|
|
74
|
+
## Step 4 — (Optional) Response branches
|
|
75
|
+
|
|
76
|
+
Skip unless you need to route downstream paths based on response content (e.g., `items.length > 0` vs empty). For generic call-failure handling use the `error` port in Step 5 instead. Full syntax and rules: [impl.md — Conditional branches](impl.md#conditional-branches).
|
|
77
|
+
|
|
78
|
+
## Step 5 — Wire edges
|
|
79
|
+
|
|
80
|
+
The HTTP node's target port is `input`. Source ports: `default` (success), `error` (network/non-2xx), `branch-{id}` (one per Step 4 entry). Wire `default` to the next node. Wire `error` to a handler **only when the requirements say what a failed call should do** — with no `error` edge the call faults the flow, which is the correct default, and setting `inputs.errorHandlingEnabled: true` without the edge swallows the failure into a run that reports success. See [file-format.md — Default: off](../../../shared/file-format.md#default-off--enable-only-for-a-failure-the-flow-actually-handles).
|
|
81
|
+
|
|
82
|
+
Edge JSON shapes and all four examples (upstream→node, default→downstream, error→handler, branch→downstream): [impl.md — Wire edges](impl.md#wire-edges).
|
|
83
|
+
|
|
84
|
+
## Debug
|
|
85
|
+
|
|
86
|
+
See [impl.md — Debug](impl.md#debug). For connector mode, the most common errors are `not_authed` / 401/403 (expired connection — ping it) and `Connection not found` (wrong connector key or connection ID — re-list).
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# HTTP Request Node — Manual Mode
|
|
2
|
+
|
|
3
|
+
Use this walkthrough when no IS connector exists, the API needs no auth (or auth passed in headers), or you are prototyping against an arbitrary REST endpoint. For connector-managed auth, use [impl-connector.md](impl-connector.md).
|
|
4
|
+
|
|
5
|
+
**No connection lookup is required.** Manual mode uses `ImplicitConnection`; there are no IS bindings.
|
|
6
|
+
|
|
7
|
+
Before starting, read [impl.md](impl.md) for the node type, registry validation, and the **always use `node configure`** rule. Follow Steps 1–4 in order.
|
|
8
|
+
|
|
9
|
+
## Step 1 — Add the node
|
|
10
|
+
|
|
11
|
+
Run:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
uip maestro flow node add <ProjectName>.flow core.action.http.v2 \
|
|
15
|
+
--label "<HTTP node label>" --output json
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
> **Inside a loop body?** Add `--parent <LOOP_NODE_ID>` to set `parentId`. Without it, the node runs outside the loop context and outputs are null. See [loop/impl.md](../loop/impl.md).
|
|
19
|
+
|
|
20
|
+
Save `<nodeId>` for Step 2. Leave `inputs` empty; Step 2 populates `inputs.detail`. Do not hand-author the definition. The CLI copies the manifest byte-for-byte from the registry into `definitions[]`, adds the node instance, registers `variables.nodes`, and inserts a `layout.nodes` placeholder. See [impl.md — Add the node](impl.md#add-the-node).
|
|
21
|
+
|
|
22
|
+
## Step 2 — Configure the node
|
|
23
|
+
|
|
24
|
+
Resolve missing values before composing `url`, `query`, or `body`, including IDs from names, required body fields, and the response shape. See [/uipath:uipath-platform — http-request.md](../../../../../uipath-platform/references/integration-service/http-request.md).
|
|
25
|
+
|
|
26
|
+
Run:
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
uip maestro flow node configure <ProjectName>.flow <nodeId> \
|
|
30
|
+
--detail '{
|
|
31
|
+
"authentication": "manual",
|
|
32
|
+
"method": "GET",
|
|
33
|
+
"url": "https://api.example.com/endpoint",
|
|
34
|
+
"query": {"param1": "value1"}
|
|
35
|
+
}' --output json
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The CLI builds `inputs.detail` with manual auth, `ImplicitConnection`, `bodyParameters`, and `essentialConfiguration`. It does **not** generate `bindings_v2.json` or a connection resource file; manual mode needs neither.
|
|
39
|
+
|
|
40
|
+
Set `url` to a full URL (scheme + host + path). Pass controlled auth headers under `headers`; for example, run:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
uip maestro flow node configure <ProjectName>.flow <nodeId> \
|
|
44
|
+
--detail '{
|
|
45
|
+
"authentication": "manual",
|
|
46
|
+
"method": "GET",
|
|
47
|
+
"url": "https://api.example.com/me",
|
|
48
|
+
"headers": {"Authorization": "=js:`Bearer ${$vars.apiToken}`"}
|
|
49
|
+
}' --output json
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
HTTP input fields do not resolve `{$vars.x}` brace-templates. Use `=js:` expressions for dynamic `url`, `headers`, `body`, or `query`, and pass each `=js:` string verbatim in `--detail`. See [impl.md — Dynamic values](impl.md#dynamic-values-in-url--headers--body--query).
|
|
53
|
+
|
|
54
|
+
## Step 3 — (Optional) Response branches
|
|
55
|
+
|
|
56
|
+
Skip this step unless downstream paths must be routed from response content, such as `items.length > 0` versus empty. Use the `error` port in Step 4 for generic call-failure handling. See [impl.md — Conditional branches](impl.md#conditional-branches).
|
|
57
|
+
|
|
58
|
+
## Step 4 — Wire edges
|
|
59
|
+
|
|
60
|
+
The HTTP node's target port is `input`. Source ports are `default` (success), `error` (network/non-2xx), and `branch-{id}` (one per Step 3 entry).
|
|
61
|
+
|
|
62
|
+
Wire `default` to the next node. Wire `error` to a handler **only when the requirements specify what a failed call should do**. Without an `error` edge, the call faults the flow, which is the correct default. Do not set `inputs.errorHandlingEnabled: true` without an `error` edge: that swallows the failure into a run that reports success. See [file-format.md — Default: off](../../../shared/file-format.md#default-off--enable-only-for-a-failure-the-flow-actually-handles).
|
|
63
|
+
|
|
64
|
+
See [impl.md — Wire edges](impl.md#wire-edges) for edge JSON shapes and all four examples: upstream→node, default→downstream, error→handler, and branch→downstream.
|
|
65
|
+
|
|
66
|
+
## Debug
|
|
67
|
+
|
|
68
|
+
See [impl.md — Debug](impl.md#debug). In manual mode, watch for `ImplicitConnection` errors; they indicate a missing `authentication: "manual"` flag or a non-URL `url` value.
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# HTTP Request Node — Implementation
|
|
2
|
+
|
|
3
|
+
Implement managed HTTP requests with `core.action.http.v2`: choose a mode, add the node with the CLI, configure it with `node configure`, wire its ports, and validate it.
|
|
4
|
+
|
|
5
|
+
## Node type and mode
|
|
6
|
+
|
|
7
|
+
Use `core.action.http.v2` for every HTTP request. `core.action.http` (v1) is deprecated.
|
|
8
|
+
|
|
9
|
+
| Mode | Use when | Walkthrough |
|
|
10
|
+
| --- | --- | --- |
|
|
11
|
+
| **Connector** | The target system has an IS connector and authentication uses an existing IS connection (OAuth/API key). | [impl-connector.md](impl-connector.md) |
|
|
12
|
+
| **Manual** | No connector exists, the API is public/no-auth, or quick prototyping is required. | [impl-manual.md](impl-manual.md) |
|
|
13
|
+
|
|
14
|
+
Prefer a curated connector activity. If none exists, try connector mode. If it cannot be configured because the connector lacks HTTP request support (`HasHttpRequest` false) or no usable IS connection exists, fall through to manual mode automatically. Confirm the switch with the user before finalizing because manual mode changes authentication. See [impl-connector.md — Step 2](impl-connector.md#step-2--identify-target-connection).
|
|
15
|
+
|
|
16
|
+
The `--detail` payload differs by mode only in `authentication` (`"connector"` or `"manual"`) and connector-only fields `targetConnector`, `connectionId`, and `folderKey`. Connector-mode `url` is relative to the connector base; manual-mode `url` is absolute. Node creation, dynamic values, branches, edges, and debugging are shared.
|
|
17
|
+
|
|
18
|
+
<a id="critical-use-node-configure"></a>
|
|
19
|
+
## Configure through the CLI
|
|
20
|
+
|
|
21
|
+
Do not hand-write `inputs.detail`, `bindings_v2.json`, or connection resource files. Run `uip maestro flow node configure`; it builds the required configuration from `--detail`, including `essentialConfiguration`. `core.action.http.v2` is CLI-owned per [Author capability — Node ownership](../../CAPABILITY.md#node-ownership--who-authors-the-node), with the same envelope rules as connector activities.
|
|
22
|
+
|
|
23
|
+
## Validate the registry
|
|
24
|
+
|
|
25
|
+
Run:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
uip maestro flow registry get core.action.http.v2 --output json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Confirm `Data.Node.handleConfiguration` has target port `input` and source ports `branch-{item.id}` (dynamic, `repeat: inputs.branches`) and `default`; `Data.Node.supportsErrorHandling: true`; and model `serviceType` is `Intsvc.UnifiedHttpRequest`. HTTP v2 uses the implicit `error` port pattern shared by action nodes (see [Action Node Structure](../../../shared/action-nodes.md)).
|
|
32
|
+
|
|
33
|
+
<a id="add-the-node"></a>
|
|
34
|
+
## Add and configure
|
|
35
|
+
|
|
36
|
+
Run:
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
uip maestro flow node add <ProjectName>.flow core.action.http.v2 \
|
|
40
|
+
--label "<HTTP node label>" --output json
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Save the returned node ID. The CLI copies the manifest into `definitions[]`, adds the node to `nodes[]`, registers `variables.nodes`, inserts a `layout.nodes` placeholder byte-for-byte from the registry, and obtains `typeVersion` from the manifest's `version`; do not hardcode it.
|
|
44
|
+
|
|
45
|
+
The CLI initializes:
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
"inputs": {
|
|
49
|
+
"branches": [],
|
|
50
|
+
"timeout": "PT15M",
|
|
51
|
+
"retryCount": 0,
|
|
52
|
+
"swaggerDefinition": null,
|
|
53
|
+
"detail": {}
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Set `branches`, `timeout`, and `retryCount` during `node add` with `--input`; populate `inputs.detail` only with `node configure --detail`:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
uip maestro flow node add <ProjectName>.flow core.action.http.v2 \
|
|
61
|
+
--label "<HTTP node label>" \
|
|
62
|
+
--input '{
|
|
63
|
+
"timeout": "PT30M",
|
|
64
|
+
"retryCount": 3,
|
|
65
|
+
"branches": [
|
|
66
|
+
{ "id": "hasItems", "name": "Has Items", "conditionExpression": "$self.output.body.items.length > 0" },
|
|
67
|
+
{ "id": "empty", "name": "Empty", "conditionExpression": "$self.output.body.items.length == 0" }
|
|
68
|
+
]
|
|
69
|
+
}' --output json
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
`timeout` is an ISO 8601 duration such as `PT15M`, `PT1H`, or `P1D` and defaults to `PT15M`. `retryCount` is an integer and defaults to `0`. `branches` is optional and belongs at `inputs.branches`, not `inputs.detail.branches`. Do not edit `inputs.*` afterward or hand-author the definition; run `uip maestro flow node add` and `uip maestro flow node configure`.
|
|
73
|
+
|
|
74
|
+
<a id="dynamic-values-in-url--headers--body--query"></a>
|
|
75
|
+
## Dynamic values
|
|
76
|
+
|
|
77
|
+
Do not use `{$vars.x}` brace templates in IS activity inputs. Runtime `{...}` interpolation applies to native flow fields, not `inputs.detail.bodyParameters` on HTTP v2 or `uipath.connector.*` activities; such templates can be sent literally and cause a 400 response.
|
|
78
|
+
|
|
79
|
+
Use `=js:` expressions for dynamic URL, header, body, and query values. `$vars` is available in the JavaScript context:
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
"bodyParameters": {
|
|
83
|
+
"url": "=js:`https://api.example.com/users/${$vars.userId}/orders`",
|
|
84
|
+
"headers": {
|
|
85
|
+
"Authorization": "=js:'Bearer ' + $vars.apiToken",
|
|
86
|
+
"X-Request-ID": "=js:$metadata.instanceId"
|
|
87
|
+
},
|
|
88
|
+
"query": {
|
|
89
|
+
"since": "=js:$vars.startDate"
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Pass the expression string verbatim to `node configure`:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
uip maestro flow node configure <Project>.flow <nodeId> \
|
|
98
|
+
--detail '{
|
|
99
|
+
"authentication": "manual",
|
|
100
|
+
"method": "GET",
|
|
101
|
+
"url": "=js:`https://api.example.com/users/${$vars.userId}`"
|
|
102
|
+
}' --output json
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
## Conditional branches
|
|
106
|
+
|
|
107
|
+
Use branches only to route based on response content, not to handle call failures; failures use the `error` port. Each `inputs.branches` entry creates `branch-{id}`; `$self` refers to the HTTP node output. Set branches with `node add --input`; `node configure --detail` does not accept them. Do not prefix `conditionExpression` with `=js:`; branch conditions are automatically evaluated as JS.
|
|
108
|
+
|
|
109
|
+
## Wire edges
|
|
110
|
+
|
|
111
|
+
The target port is `input`. Source ports are `default` (primary success output or fallback when no configured branch matches), `error` (network, timeout, or non-2xx failure not caught by a branch), and `branch-{id}` (one per `inputs.branches` entry).
|
|
112
|
+
|
|
113
|
+
Use `Edit` to add edge objects to `edges[]`; do not use `uip maestro flow edge add` for structural wiring. Use exact port names and this shape:
|
|
114
|
+
|
|
115
|
+
```json
|
|
116
|
+
{
|
|
117
|
+
"id": "e-<upstreamNodeId>-<nodeId>",
|
|
118
|
+
"sourceNodeId": "<upstreamNodeId>",
|
|
119
|
+
"sourcePort": "<port>",
|
|
120
|
+
"targetNodeId": "<nodeId>",
|
|
121
|
+
"targetPort": "input"
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
For success and error handling:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"id": "e-<nodeId>-<downstreamNodeId>",
|
|
130
|
+
"sourceNodeId": "<nodeId>",
|
|
131
|
+
"sourcePort": "default",
|
|
132
|
+
"targetNodeId": "<downstreamNodeId>",
|
|
133
|
+
"targetPort": "input"
|
|
134
|
+
}
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```json
|
|
138
|
+
{
|
|
139
|
+
"id": "e-<nodeId>-<errorHandlerId>",
|
|
140
|
+
"sourceNodeId": "<nodeId>",
|
|
141
|
+
"sourcePort": "error",
|
|
142
|
+
"targetNodeId": "<errorHandlerId>",
|
|
143
|
+
"targetPort": "input"
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Add an `error` edge only when requirements specify failure behavior. Without one, a failed call faults the flow. When an HTTP node has an outgoing `error` edge, set `inputs.errorHandlingEnabled: true`. `uip maestro flow edge add --source-port error` and `uip maestro flow format` set it automatically; direct JSON edits must set it explicitly. Never set it without an error edge: that suppresses the fault and can report a failed call as successful. See [file-format.md — Default: off](../../../shared/file-format.md#default-off--enable-only-for-a-failure-the-flow-actually-handles).
|
|
148
|
+
|
|
149
|
+
For a branch edge, use:
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{
|
|
153
|
+
"id": "e-<nodeId>-<hasItemsDownstream>",
|
|
154
|
+
"sourceNodeId": "<nodeId>",
|
|
155
|
+
"sourcePort": "branch-hasItems",
|
|
156
|
+
"targetNodeId": "<hasItemsDownstream>",
|
|
157
|
+
"targetPort": "input"
|
|
158
|
+
}
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Debug
|
|
162
|
+
|
|
163
|
+
| Error | Cause | Fix |
|
|
164
|
+
| --- | --- | --- |
|
|
165
|
+
| `not_authed` or 401/403 | v1 node, missing bindings, or expired connection | Verify `core.action.http.v2`, check `bindings_v2.json`, and ping the connection. |
|
|
166
|
+
| `configuration` field missing | Node was not configured through the CLI | Run `uip maestro flow node configure`; do not hand-write `inputs.detail`. |
|
|
167
|
+
| `flow validate` reports missing `uiPathActivityTypeId` on `core.action.http.v2` | Definition was hand-authored | Remove the node, run `uip maestro flow node add <file> core.action.http.v2 ...`, then run `node configure`. |
|
|
168
|
+
| Connection not found | Wrong connection ID or connector key | Re-run `uip is connections list` for the target connector. |
|
|
169
|
+
| Wrong API response | Incorrect `url` or `query` | Check the target service API documentation. |
|
|
170
|
+
| `ImplicitConnection` errors | Manual mode is misconfigured | Verify `authentication: "manual"` and a full URL. |
|
|
171
|
+
| Flow faults on 4xx/5xx | No `error` edge | This is expected when no fallback is required. Otherwise add `sourcePort: "error"` to an error-handler node. See [Implicit error port on action nodes](../../../shared/file-format.md#implicit-error-port-on-action-nodes). |
|
|
172
|
+
| Flow reports `Completed` although the API call failed | `inputs.errorHandlingEnabled: true` without a handler, or an error edge enters the happy path/success End node | Remove the flag without an error edge; otherwise route the error to a distinct End node with an error/status output or `core.logic.terminate`. See [Do not swallow the failure](../../../shared/file-format.md#do-not-swallow-the-failure). |
|
|
173
|
+
| Edge `source-port output` rejected | Variable namespace used as a port | Use `default`, `error`, or `branch-{id}`. `output` is only the variable namespace `$vars.{nodeId}.output`. |
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# HTTP Request Node — Planning
|
|
2
|
+
|
|
3
|
+
> **MUST READ FIRST — confirm Managed HTTP Request fits your use case before authoring:** [/uipath:uipath-platform — http-request.md](../../../../../uipath-platform/references/integration-service/http-request.md). This planning doc is the flow-specific layer on top of it.
|
|
4
|
+
|
|
5
|
+
## Node Type
|
|
6
|
+
|
|
7
|
+
`core.action.http.v2` (Managed HTTP Request)
|
|
8
|
+
|
|
9
|
+
> **Always use `core.action.http.v2`** for all HTTP requests — both connector-authenticated and manual. The older `core.action.http` (v1) is deprecated and does not pass IS credentials at runtime.
|
|
10
|
+
|
|
11
|
+
## When to Use a Managed HTTP Request Node
|
|
12
|
+
|
|
13
|
+
| Situation | Use Managed HTTP? |
|
|
14
|
+
| --- | --- |
|
|
15
|
+
| Connector exists but lacks the specific curated activity, and does **not** report `V4Compatible` | Yes — connector mode ([impl-connector.md](impl-connector.md)), **if the connector supports HTTP request activity** (verify `HasHttpRequest` — see [Prerequisites](#prerequisites)) |
|
|
16
|
+
| Connector exists but lacks the specific curated activity, and **does** report `V4Compatible` | No — generate a non-catalog activity instead ([connector/planning.md](../connector/planning.md#decision-order)) |
|
|
17
|
+
| No connector exists, but service has a REST API | Yes — manual mode ([impl-manual.md](impl-manual.md)) |
|
|
18
|
+
| Quick prototyping against any REST API | Yes — manual mode ([impl-manual.md](impl-manual.md)) |
|
|
19
|
+
| Connector exists and covers the use case | No — use [Connector Activity](../connector/planning.md) |
|
|
20
|
+
| Target system has no API (desktop app) | No — use [RPA Workflow](../rpa/planning.md) |
|
|
21
|
+
|
|
22
|
+
Both flags come from the same call: `uip is connectors metadata <key> --output json`
|
|
23
|
+
→ `Data[0].Flags.V4Compatible` and `Data[0].HasHttpRequest`.
|
|
24
|
+
|
|
25
|
+
For the two-mode concept (connector vs. manual) and the `url` / auth rules per mode, see the platform doc linked at the top.
|
|
26
|
+
|
|
27
|
+
## Ports
|
|
28
|
+
|
|
29
|
+
| Input Port | Output Port(s) |
|
|
30
|
+
| --- | --- |
|
|
31
|
+
| `input` | `default`, `error`, `branch-{id}` (dynamic, one per `inputs.branches` entry) |
|
|
32
|
+
|
|
33
|
+
- `default` — primary success output, or fallback when configured branches don't match.
|
|
34
|
+
- `error` — implicit error port; fires when the call fails (network error, timeout, non-2xx not caught by a branch). Shared with all action nodes — see [Implicit error port on action nodes](../../../shared/file-format.md#implicit-error-port-on-action-nodes).
|
|
35
|
+
- `branch-{id}` — HTTP-specific, configured via `inputs.branches` (response-content routing). See [Conditional Branches](#conditional-branches) below.
|
|
36
|
+
|
|
37
|
+
## Output Variables
|
|
38
|
+
|
|
39
|
+
- `$vars.{nodeId}.output` — `{ body, code, method, rawStringBody, request }` on success
|
|
40
|
+
- `$vars.{nodeId}.error` — `{ code, message, detail, category, status }` when the error port fires
|
|
41
|
+
|
|
42
|
+
## Conditional Branches
|
|
43
|
+
|
|
44
|
+
Use `inputs.branches` when you need to route downstream paths based on response content (e.g., empty vs non-empty results). For generic call-failure handling, prefer the shared `error` port instead — don't enumerate every bad status code as a branch.
|
|
45
|
+
|
|
46
|
+
Each branch's `conditionExpression` is a JS expression with `$self` bound to the current HTTP node's output:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"inputs": {
|
|
51
|
+
"branches": [
|
|
52
|
+
{ "id": "hasItems", "name": "Has Items", "conditionExpression": "$self.output.body.items.length > 0" },
|
|
53
|
+
{ "id": "empty", "name": "Empty", "conditionExpression": "$self.output.body.items.length == 0" }
|
|
54
|
+
]
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Wire `branch-hasItems` / `branch-empty` as source ports on outgoing edges. `default` fires when no branch condition matches.
|
|
60
|
+
|
|
61
|
+
> **Do not use `=js:` on `conditionExpression`** — HTTP branch conditions are evaluated as JS automatically (same rule as decision/switch expressions). See [variables-and-expressions.md](../../../shared/variables-and-expressions.md#http-branch-condition-inputsbranchesconditionexpression).
|
|
62
|
+
|
|
63
|
+
## Dynamic values
|
|
64
|
+
|
|
65
|
+
IS activity input fields (`url`, `headers`, `body`, `query` under `bodyParameters`) do **not** resolve `{$vars.x}` brace-templates — the template runner only applies to native flow fields. Use `=js:` expressions for any dynamic value; template literals with `${...}` interpolation or string concatenation both work. See [Dynamic values](impl.md#dynamic-values-in-url--headers--body--query) for the full rationale and examples.
|
|
66
|
+
|
|
67
|
+
## Key Inputs (`--detail` for `node configure`)
|
|
68
|
+
|
|
69
|
+
Run `uip maestro flow node configure` with a `--detail` JSON. The CLI builds the full `inputs.detail` payload, `bindings_v2.json`, and connection resource files automatically. **Do not hand-write `inputs.detail`.**
|
|
70
|
+
|
|
71
|
+
**Connector mode** (IS connection auth):
|
|
72
|
+
|
|
73
|
+
| `--detail` Key | Required | Description |
|
|
74
|
+
| --- | --- | --- |
|
|
75
|
+
| `authentication` | Yes | `"connector"` |
|
|
76
|
+
| `method` | Yes | HTTP method: GET, POST, PUT, PATCH, DELETE |
|
|
77
|
+
| `targetConnector` | Yes | Target connector key (e.g., `"uipath-salesforce-slack"`) |
|
|
78
|
+
| `connectionId` | Yes | Target connector's IS connection ID (from `uip is connections list --all-folders`) |
|
|
79
|
+
| `folderKey` | Yes | Orchestrator folder key (from `uip is connections list --all-folders`) |
|
|
80
|
+
| `url` | No | API endpoint URL/path (e.g., `"/conversations.replies"`). Auto-fills both `bodyParameters.path` and `bodyParameters.url`. |
|
|
81
|
+
| `query` | No | Query parameters as key-value object |
|
|
82
|
+
| `headers` | No | Additional headers as key-value object |
|
|
83
|
+
| `body` | No | Request body (for POST/PUT/PATCH). Connector mode is **`application/json` only** (request and response) — no other content type. |
|
|
84
|
+
|
|
85
|
+
**Manual mode** (no connector auth):
|
|
86
|
+
|
|
87
|
+
| `--detail` Key | Required | Description |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| `authentication` | Yes | `"manual"` |
|
|
90
|
+
| `method` | Yes | HTTP method: GET, POST, PUT, PATCH, DELETE |
|
|
91
|
+
| `url` | Yes | Full target URL |
|
|
92
|
+
| `query` | No | Query parameters as key-value object |
|
|
93
|
+
| `headers` | No | Additional headers as key-value object |
|
|
94
|
+
| `body` | No | Request body (for POST/PUT/PATCH) |
|
|
95
|
+
|
|
96
|
+
## Prerequisites
|
|
97
|
+
|
|
98
|
+
- `uip login` required (for both modes — node type comes from registry)
|
|
99
|
+
- For connector mode: connector must support the HTTP request activity — verify the `HasHttpRequest` flag via `uip is connectors get "<connector-key>"`. If false, fall back to manual mode — confirm the switch with the user before finalizing. See [impl-connector.md Step 2](impl-connector.md#step-2--identify-target-connection).
|
|
100
|
+
- For connector mode: a healthy IS connection must exist for the **target connector**. If none exists, auto-fall-through to manual mode is the recommended fallback — but confirm the mode switch with the user before finalizing. See [impl-connector.md Step 2 — HTTP-specific recovery](impl-connector.md#step-2--identify-target-connection) for the user-confirmation flow (switch-to-manual / create-now / skip).
|
|
101
|
+
- `uip maestro flow registry pull` to cache the `core.action.http.v2` definition
|
|
102
|
+
|
|
103
|
+
## Planning Annotation
|
|
104
|
+
|
|
105
|
+
In the architectural plan, annotate managed HTTP nodes as:
|
|
106
|
+
- Connector mode: `managed-http: <service> — <operation>` (e.g., "managed-http: Slack — GET /conversations.replies")
|
|
107
|
+
- Manual mode: `managed-http: manual — <method> <url>` (e.g., "managed-http: manual — GET https://api.example.com/data")
|