@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
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
# Evaluate — evaluators, eval sets, simulations, runs
|
|
2
|
-
|
|
3
|
-
Evaluators, eval sets, data points and simulations are project assets managed by
|
|
4
|
-
`uip maestro flow eval`; defining an `inlineAgent(...)` node does not create
|
|
5
|
-
them. Use this when the request asks for evaluation assets, or for a flow to be
|
|
6
|
-
evaluated.
|
|
7
|
-
|
|
8
|
-
Every `eval` command takes `--path <project-dir>` — the directory holding
|
|
9
|
-
`project.uiproj`.
|
|
10
|
-
|
|
11
|
-
**Local `add` / `list` / `remove` edit project files and need no login.**
|
|
12
|
-
Starting a run does — `uip login` first, and it needs a matching solution in
|
|
13
|
-
Studio Web.
|
|
14
|
-
|
|
15
|
-
Probe the installed CLI once, then let it write the JSON formats and generated
|
|
16
|
-
file references rather than hand-authoring them:
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
uip maestro flow eval --help --output json
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Evaluators — how an output is scored
|
|
23
|
-
|
|
24
|
-
```bash
|
|
25
|
-
uip maestro flow eval evaluator add response-quality \
|
|
26
|
-
--type llm-judge-output \
|
|
27
|
-
--model gpt-4.1-2025-04-14 \
|
|
28
|
-
--description "Score the response against the expected result" \
|
|
29
|
-
--target-key '*' \
|
|
30
|
-
--path ./MySolution/MyFlow --output json
|
|
31
|
-
|
|
32
|
-
uip maestro flow eval evaluator list --path ./MySolution/MyFlow --output json
|
|
33
|
-
uip maestro flow eval evaluator remove <id> --path ./MySolution/MyFlow --output json
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
`llm-judge-output` produces
|
|
37
|
-
`evaluatorTypeId: "uipath-llm-judge-output-semantic-similarity"`. Always pin a
|
|
38
|
-
model for an LLM judge. For deterministic values prefer `exact-match`,
|
|
39
|
-
`json-similarity`, or `contains` — a judge on a value that can simply be
|
|
40
|
-
compared is variance for nothing.
|
|
41
|
-
|
|
42
|
-
## Evals and eval sets
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
uip maestro flow eval set add "Smoke Tests" \
|
|
46
|
-
--entry-point start \
|
|
47
|
-
--path ./MySolution/MyFlow --output json
|
|
48
|
-
|
|
49
|
-
uip maestro flow eval add "basic case" \
|
|
50
|
-
--set "Smoke Tests" \
|
|
51
|
-
--inputs '{"request":"hello"}' \
|
|
52
|
-
--expected '{"reply":"hello"}' \
|
|
53
|
-
--path ./MySolution/MyFlow --output json
|
|
54
|
-
|
|
55
|
-
uip maestro flow eval list --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
56
|
-
uip maestro flow eval remove <id> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
57
|
-
uip maestro flow eval set list --path ./MySolution/MyFlow --output json
|
|
58
|
-
uip maestro flow eval set remove <id> --path ./MySolution/MyFlow --output json
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
Almost everything is addressed **through its set**. `--set` is required on
|
|
62
|
-
`eval list` and `eval remove`, on all three `simulation` commands, and on every
|
|
63
|
-
`run` verb including `status` and `results`; omitting it fails with
|
|
64
|
-
`required option '--set <name>' not specified` before anything runs. Only the
|
|
65
|
-
`set` commands themselves and the evaluator commands do without it.
|
|
66
|
-
|
|
67
|
-
Use the generated evaluator id or filename when explicitly passing
|
|
68
|
-
`--evaluators`; a display name alone is not a stable reference. Omitting the
|
|
69
|
-
flag on `eval set add` links all evaluators that currently exist.
|
|
70
|
-
|
|
71
|
-
A data point's input keys must match the flow's declared inputs. Declare them
|
|
72
|
-
with `.input({ … })` in the source and compile before `eval add`: it reads them
|
|
73
|
-
from the compiled `.flow`, so an input missing there fails with `Input "<name>"
|
|
74
|
-
is not declared as an input variable in the flow`. Do not add inputs with
|
|
75
|
-
`uip maestro flow variable add` — the next `compile -o` rewrites the `.flow`
|
|
76
|
-
from the source, so the CLI edit either disappears or collides with the compiled
|
|
77
|
-
input (`Variable '<name>' already exists`). To confirm what the compiled flow
|
|
78
|
-
declares, pass the `.flow` file itself; `variable` takes no `--path`:
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
uip maestro flow variable list ./MySolution/MyFlow/MyFlow.flow --output json
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Build expected outputs from real records rather than invented ones, for the same
|
|
85
|
-
reason a debug run needs real inputs: an invented key matches no record, and the
|
|
86
|
-
eval scores a fault instead of an answer.
|
|
87
|
-
|
|
88
|
-
## Simulations — stop an eval from really sending
|
|
89
|
-
|
|
90
|
-
A simulation stands in for a component during a run, keyed by component id: the
|
|
91
|
-
step id from the source, or the tool name for an inline agent's tool. A
|
|
92
|
-
simulation is scoped to one **data point inside one set**, not to the project,
|
|
93
|
-
so all three commands require `--set` and `--data-point`. `add` also requires
|
|
94
|
-
`--strategy`: `Static` returns `--mock-value` verbatim, `Llm` generates a
|
|
95
|
-
response from `--simulation-instructions`. And it requires `--component-type`
|
|
96
|
-
naming what the component is — `connector`, `agent`, `subflow` — unless
|
|
97
|
-
`--parent <agent-id>` adds a child tool simulation, which defaults it to `Node`.
|
|
98
|
-
|
|
99
|
-
```bash
|
|
100
|
-
uip maestro flow eval simulation add <component-id> \
|
|
101
|
-
--set "Smoke Tests" --data-point <id> \
|
|
102
|
-
--strategy Static --component-type connector --mock-value '{"ok":true}' \
|
|
103
|
-
--path ./MySolution/MyFlow --output json
|
|
104
|
-
|
|
105
|
-
uip maestro flow eval simulation list \
|
|
106
|
-
--set "Smoke Tests" --data-point <id> --path ./MySolution/MyFlow --output json
|
|
107
|
-
uip maestro flow eval simulation remove <component-id> \
|
|
108
|
-
--set "Smoke Tests" --data-point <id> --path ./MySolution/MyFlow --output json
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
Simulate every side-effecting component before running a set more than once. An
|
|
112
|
-
unsimulated connector step really sends — once per eval, every run.
|
|
113
|
-
|
|
114
|
-
## Running a set
|
|
115
|
-
|
|
116
|
-
```bash
|
|
117
|
-
uip maestro flow eval run start --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
118
|
-
uip maestro flow eval run status <evalSetRunId> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
119
|
-
uip maestro flow eval run results <evalSetRunId> --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
120
|
-
uip maestro flow eval run list --set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
121
|
-
uip maestro flow eval run compare <evalSetRunId> --compare-to <evalSetRunId> \
|
|
122
|
-
--set "Smoke Tests" --path ./MySolution/MyFlow --output json
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
`run start` returns an `evalSetRunId` and does not block. Poll `run status`
|
|
126
|
-
until it settles, then read `run results`. `run compare` puts a run against a
|
|
127
|
-
previous one — it takes both ids, the subject and `--compare-to` — which is how
|
|
128
|
-
a prompt or guidance change is shown to have helped rather than asserted to
|
|
129
|
-
have.
|
|
130
|
-
|
|
131
|
-
## Never upload as part of an eval workflow
|
|
132
|
-
|
|
133
|
-
**Never run `uip solution upload` automatically here. Always ask first.**
|
|
134
|
-
|
|
135
|
-
`eval run start` needs the solution in Studio Web, and when it cannot resolve
|
|
136
|
-
one it fails with `solution-id could not be resolved` or a variant. That error
|
|
137
|
-
is not licence to upload.
|
|
138
|
-
|
|
139
|
-
`uip solution upload` writes to Studio Web: it creates, or **overwrites**, the
|
|
140
|
-
solution matching the local `.uipx` `SolutionId`. No flag is needed and no
|
|
141
|
-
prompt is raised. Three ways that costs someone real work:
|
|
142
|
-
|
|
143
|
-
1. The user is iterating locally and meant to test *before* publishing. Upload
|
|
144
|
-
pushes work in progress to where teammates and triggers pick it up.
|
|
145
|
-
2. The user pulled the solution with `uip solution download` to change one
|
|
146
|
-
piece. Upload sends partial local state back over whatever else moved.
|
|
147
|
-
3. Local and Studio Web have diverged. Upload discards the remote side —
|
|
148
|
-
nothing is merged.
|
|
149
|
-
|
|
150
|
-
The overwrite is recorded as a restorable version unless `--no-snapshot` was
|
|
151
|
-
passed, but recovery is browser-only, after the fact, by the user, and it does
|
|
152
|
-
not undo case 1. Ask, and offer the two real options: upload now with the user's
|
|
153
|
-
acknowledgement, or pass `--solution-id` and `--project-id` for an existing
|
|
154
|
-
Studio Web solution and plumb them through to `eval run start`.
|
|
155
|
-
|
|
156
|
-
## Confirm what was written
|
|
157
|
-
|
|
158
|
-
After authoring, list the evaluator and the eval set and read the generated
|
|
159
|
-
JSON. Confirm the evaluator carries the requested `evaluatorTypeId`, the set
|
|
160
|
-
contains its generated file reference, and the entry point matches the flow.
|
|
161
|
-
|
|
162
|
-
## Evidence boundary
|
|
163
|
-
|
|
164
|
-
A score is evidence about this flow's output on these inputs under these
|
|
165
|
-
evaluators. It is not evidence the flow is correct, and an `llm-judge-output`
|
|
166
|
-
score carries a model's variance — one run moving a point or two is noise.
|
|
167
|
-
Compare runs rather than reading one, and name the eval set and the evaluator
|
|
168
|
-
behind any number reported.
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
# Connector Events
|
|
2
|
-
|
|
3
|
-
*Exact signatures, fields, and defaults: `onEvent()`, `waitForEvent()`.*
|
|
4
|
-
|
|
5
|
-
The same subscription can start a Flow or pause an already-running path.
|
|
6
|
-
|
|
7
|
-
Signatures:
|
|
8
|
-
|
|
9
|
-
- `.trigger(onEvent({ connector, event, where?, filters?, connection, folder, version? }))`
|
|
10
|
-
- `.step(name, waitForEvent({ connector, event, where?, filters?, connection, folder, version? }))`
|
|
11
|
-
- both also accept a generated trigger descriptor plus options.
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
.step('reply', waitForEvent({
|
|
15
|
-
connector: 'uipath-microsoft-outlook365', event: 'email-received',
|
|
16
|
-
where: { parentFolderId: inboxId },
|
|
17
|
-
filters: [{ field: 'subject', contains: 'Approval' }],
|
|
18
|
-
connection: 'outlook', folder: 'shared',
|
|
19
|
-
}))
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
`connection` and `folder` are bindings.json labels, and both are required: without
|
|
23
|
-
them the node compiles to `connectionId: null`, which `uip maestro flow validate`
|
|
24
|
-
refuses, so `check` reports `BINDING_MISSING` first.
|
|
25
|
-
|
|
26
|
-
## Tenant discovery — `check` names it, `prepare` does it
|
|
27
|
-
|
|
28
|
-
Event parameters and their ids are connection-specific. Author the
|
|
29
|
-
subscription first — an id-valued parameter as a `lookup()` token, never a
|
|
30
|
-
pasted id — and one `prepare` discharges everything `check` names:
|
|
31
|
-
|
|
32
|
-
```ts
|
|
33
|
-
.trigger(onEvent({
|
|
34
|
-
connector: 'uipath-microsoft-outlook365', event: 'email-received',
|
|
35
|
-
where: {
|
|
36
|
-
parentFolderId: lookup({ connector: 'uipath-microsoft-outlook365', event: 'email-received' },
|
|
37
|
-
'parentFolderId').by('displayName', 'Inbox'),
|
|
38
|
-
},
|
|
39
|
-
filters: [{ field: 'subject', contains: 'Approval' }],
|
|
40
|
-
connection: 'outlook', folder: 'shared',
|
|
41
|
-
}))
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
uip maestro registry prepare uipath-microsoft-outlook365 email-received \
|
|
46
|
-
--resolve parentFolderId:displayName=Inbox
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
That one command replaces the old manual sequence end to end: it discovers the
|
|
50
|
-
connection and writes both `bindings.json` entries (connection id AND folder
|
|
51
|
-
key — the same stage a connector-action prepare runs), fetches the event's
|
|
52
|
-
connection-scoped definition, records the object decision for a generic event
|
|
53
|
-
(`--object <name>`, the same matching ladder actions use), stores the
|
|
54
|
-
where/filter vocabulary in `.flow-sdk/connectors-local/` so `check` works offline, and
|
|
55
|
-
records each `--resolve` in `resolutions.json` for `compile` to substitute.
|
|
56
|
-
`check` then validates every `where` key and every `filters[].field` against
|
|
57
|
-
the prepared vocabulary — an unknown filter leaf is an ERROR
|
|
58
|
-
(`EVENT_FILTER_UNKNOWN_FIELD`), because the platform silently drops it and the
|
|
59
|
-
deployed trigger fires on events the filter should exclude.
|
|
60
|
-
|
|
61
|
-
Two facts prepare surfaces before they can hurt: an event object that requires
|
|
62
|
-
a BYOA (bring-your-own-app) connection is refused with the connections that
|
|
63
|
-
would work, instead of faulting at runtime with an unrelated webhook error;
|
|
64
|
-
and a `webhooks`-mode event prints the URL-registration step — it cannot be
|
|
65
|
-
debugged locally, so deploy to test it.
|
|
66
|
-
|
|
67
|
-
Do not run `uip is triggers objects` / `triggers describe` /
|
|
68
|
-
`resources run list` by hand and paste ids into `where`: prepare runs the same
|
|
69
|
-
calls deterministically, and a pasted id is meaningless in review and wrong
|
|
70
|
-
after a connection move.
|
|
71
|
-
Before finishing, inspect the emitted node's `inputs.detail.eventParameters`
|
|
72
|
-
and confirm it contains the selected id and the connection/folder bindings refer
|
|
73
|
-
to the same connection used for discovery.
|
|
74
|
-
|
|
75
|
-
`contains` uses case-sensitive substring matching, so preserve scenario casing.
|
|
76
|
-
If a known tenant event is absent after refreshing the registry/cache, report a
|
|
77
|
-
cache-generation gap instead of inventing a node type, binding, or field. Do
|
|
78
|
-
not patch a prebuilt sample/cache entry to make the missing event appear.
|
|
79
|
-
|
|
80
|
-
## Generic events: name the object
|
|
81
|
-
|
|
82
|
-
Most connectors expose their record events generically — `record-created`,
|
|
83
|
-
`record-updated` (Data Fabric, Salesforce, ServiceNow, Jira, Dynamics, …).
|
|
84
|
-
One node type covers every object of the connection, so the subscription must
|
|
85
|
-
say which one with `object`. It is not an event parameter: these operations
|
|
86
|
-
take none, so `where` stays empty and `check` refuses a subscription that
|
|
87
|
-
omits `object` (`EVENT_GENERIC_NO_OBJECT`) or puts the object in `where`.
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
import { RecordCreated, RecordUpdated } from './connectors/uipath-uipath-dataservice.ts';
|
|
91
|
-
|
|
92
|
-
// Start when a ContractRegistry record is created with dueDate before 2026-08-04.
|
|
93
|
-
.trigger(onEvent(RecordCreated, {
|
|
94
|
-
object: 'ContractRegistry',
|
|
95
|
-
filters: [{ field: 'dueDate', lessThan: '2026-08-04' }],
|
|
96
|
-
connection: 'dataFabric', folder: 'shared',
|
|
97
|
-
}))
|
|
98
|
-
|
|
99
|
-
// Pause until a FileUploadVerify_20260618 record is updated.
|
|
100
|
-
.step('updated', waitForEvent(RecordUpdated, {
|
|
101
|
-
object: 'FileUploadVerify_20260618', connection: 'dataFabric', folder: 'shared',
|
|
102
|
-
}))
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
The objects come from the bound connection, never from a guess:
|
|
106
|
-
|
|
107
|
-
```bash
|
|
108
|
-
uip is triggers objects uipath-uipath-dataservice CREATED --connection-id <id> --output json
|
|
109
|
-
```
|
|
110
|
-
|
|
111
|
-
The emitted node carries the object as `inputs.detail.objectName` (and inside
|
|
112
|
-
`configuration`), its event as `eventType`, and the platform-declared
|
|
113
|
-
`eventMode`. A curated event (Outlook `email-received`, OneDrive `file-created`)
|
|
114
|
-
has its object built in — passing `object` there is an error.
|
|
115
|
-
|
|
116
|
-
## Filter operators
|
|
117
|
-
|
|
118
|
-
A filter is `{ field, <operator>: value }` with exactly one operator. The
|
|
119
|
-
vocabulary is the designer's, and each form compiles to the same
|
|
120
|
-
`filterExpression` the canvas would write:
|
|
121
|
-
|
|
122
|
-
| Operator | Value | Emitted expression |
|
|
123
|
-
|---|---|---|
|
|
124
|
-
| `contains`, `startsWith`, `endsWith` | text | `contains(subject,'Invoice')` |
|
|
125
|
-
| `equals`, `notEquals` | text, number or boolean | `status=='open'`, ``priority==`3` `` |
|
|
126
|
-
| `lessThan`, `lessThanOrEqual`, `greaterThan`, `greaterThanOrEqual` | number, or an ISO date string | ``priority>`3` ``, `to_number(dueDate)<to_number('2026-08-04')` |
|
|
127
|
-
|
|
128
|
-
Ordering a plain string is refused (`EVENT_FILTER_BAD_VALUE`): JMESPath
|
|
129
|
-
compares numbers only, so the subscription would match nothing. Write the
|
|
130
|
-
value as a number or an ISO-8601 date, or use a text operator.
|
|
131
|
-
|
|
132
|
-
## Evidence boundary
|
|
133
|
-
|
|
134
|
-
A local start-trigger run injects a payload; it does not fire a subscription.
|
|
135
|
-
For a wait, seed both matching and nonmatching payloads to establish routing.
|
|
136
|
-
Only a platform event occurrence proves the connection, scope, and subscription
|
|
137
|
-
actually receive the intended event.
|
|
138
|
-
|
|
139
|
-
## Completion contract
|
|
140
|
-
|
|
141
|
-
Unless the request explicitly requires a live subscription witness, a
|
|
142
|
-
connector-event start is done after the last edit when both of these facts hold:
|
|
143
|
-
|
|
144
|
-
- `uip maestro flow validate` returns `Valid` for the emitted Flow.
|
|
145
|
-
- The emitted `.flow` carries the intended start-trigger type, scope/filter inputs,
|
|
146
|
-
bindings, and downstream edges.
|
|
147
|
-
|
|
148
|
-
At most one bounded direct-input debug may be used to answer a downstream
|
|
149
|
-
behavior question; stop when it answers that question. It is not subscription
|
|
150
|
-
proof. Do not poll or sleep on debug instances, create a scratch solution, or
|
|
151
|
-
upload seed content solely to manufacture a trigger event.
|
|
152
|
-
|
|
153
|
-
When the stated acceptance bar does require live delivery, cause one real
|
|
154
|
-
platform event and record that witness once. If the environment cannot provide
|
|
155
|
-
it, report that boundary instead of substituting repeated debug launches.
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# Form trigger
|
|
2
|
-
|
|
3
|
-
*Exact signatures, fields, and defaults: `formTrigger()`.*
|
|
4
|
-
|
|
5
|
-
A person starts the flow by submitting a form (`core.trigger.form`). The
|
|
6
|
-
submitted values ARE the flow's inputs — read them exactly like any other
|
|
7
|
-
input (`input('name')` / `$vars.start.output.name`).
|
|
8
|
-
|
|
9
|
-
Signature: `.trigger(formTrigger())` — the factory takes no arguments.
|
|
10
|
-
|
|
11
|
-
```ts
|
|
12
|
-
export default flow('expense-request')
|
|
13
|
-
.input({
|
|
14
|
-
invoiceAmount: types.number,
|
|
15
|
-
reason: types.string,
|
|
16
|
-
urgent: { type: types.boolean, default: false },
|
|
17
|
-
})
|
|
18
|
-
.trigger(formTrigger())
|
|
19
|
-
.step('assess', script({ code: 'return $vars.start.output.invoiceAmount > 500;' }))
|
|
20
|
-
.return({})
|
|
21
|
-
.build();
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## The derived schema
|
|
25
|
-
|
|
26
|
-
The form's fields are derived from `.input()` at compile time, the same rule
|
|
27
|
-
the designer applies to a flow's arguments: one field per input, the field id
|
|
28
|
-
IS the input's name (so submitted values line up by name), the label is the
|
|
29
|
-
name sentence-cased (`invoiceAmount` → "Invoice amount"), the field type
|
|
30
|
-
follows the input's type, and a field is **required exactly when its input
|
|
31
|
-
declares no default**. There is nothing to author on the trigger itself —
|
|
32
|
-
shape the form by shaping the inputs.
|
|
33
|
-
|
|
34
|
-
`check` warns (`FORM_TRIGGER_NO_INPUTS`) when the flow declares no inputs: the
|
|
35
|
-
person would get an empty form with only a submit button.
|
|
36
|
-
|
|
37
|
-
## Evidence boundary
|
|
38
|
-
|
|
39
|
-
No local rung renders a form — `--input` supplies the values locally, so a
|
|
40
|
-
green ladder proves the trigger type, the derived schema, and that the graph
|
|
41
|
-
runs. A person actually seeing and submitting the form is platform evidence.
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
# Human-in-the-Loop
|
|
2
|
-
|
|
3
|
-
*Exact signatures, fields, and defaults: `hitl()`.*
|
|
4
|
-
|
|
5
|
-
Pause a Flow for a person using the default inline form, the quick-form node
|
|
6
|
-
type, a deployed Action App, or a document-validation station.
|
|
7
|
-
|
|
8
|
-
Signature:
|
|
9
|
-
`hitl({ variant?: 'quick-form' | 'action-app' | 'document-validation', app?,
|
|
10
|
-
document?, title?, priority?, labels?, recipient?, fields?, outcomes,
|
|
11
|
-
outcomePorts?, exposeError? })`.
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
.var('status', types.string)
|
|
15
|
-
.stepSwitch('review', hitl({ title: 'Review invoice',
|
|
16
|
-
fields: [{ id: 'comment', type: 'text', direction: 'output' }],
|
|
17
|
-
outcomes: ['Approve', 'Reject'] }), [
|
|
18
|
-
{ value: 'Approve', body: (b) => b.step('pay', script({ … }), { updates: { status: lit('approved') } }) },
|
|
19
|
-
{ value: 'Reject', body: (b) => b.step('notify', script({ … }), { updates: { status: lit('rejected') } }) },
|
|
20
|
-
])
|
|
21
|
-
.return({ status: v('status') })
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
Every outcome is its own exit, `outcome-<slug>`. On the default node, more than
|
|
25
|
-
one outcome routes per outcome by itself — there is no flag to remember and no
|
|
26
|
-
decision node in the middle. On quick-form, with `outcomePorts: false`, or with a
|
|
27
|
-
pinned `{ version }`, a plain `.step()` after the task continues EVERY outcome to
|
|
28
|
-
the next step instead, each on its own edge.
|
|
29
|
-
|
|
30
|
-
`.stepSwitch` is how you route them: one arm per outcome, none of them the tacit
|
|
31
|
-
next step. It works on the default node, on quick-form and on a pinned task.
|
|
32
|
-
Arms behave like `.switch()`'s — one that ends in `.return()` is terminal, and one
|
|
33
|
-
that does not CONVERGES, so the step after the `.stepSwitch` fans in from every
|
|
34
|
-
arm that reaches it.
|
|
35
|
-
That is what makes the single `.return()` above correct, and what a flow VARIABLE
|
|
36
|
-
is for: each arm assigns it with `{ updates }` and the one return reads it, instead
|
|
37
|
-
of the return having to work out which arm ran.
|
|
38
|
-
|
|
39
|
-
## Delivery, fields, and routing
|
|
40
|
-
|
|
41
|
-
- `recipient` is `{ channels?, assignee: { type, value? }, connections? }` —
|
|
42
|
-
channels are `'Slack' | 'teams' | 'Email' | 'ActionCenter'` (Teams really is
|
|
43
|
-
the lowercase `'teams'`); assignee types are `user`, `group`, `staticEmail`,
|
|
44
|
-
`staticGroupName`, `workload`, `roundRobin`, `custom`. Omit the whole object
|
|
45
|
-
for the platform default (Email + Action Center, assigned to a group).
|
|
46
|
-
- `labels` is one comma-separated string, shown in Action Center.
|
|
47
|
-
- A field's `direction` is `'input'` (shown), `'output'` (asked), or `'inOut'`
|
|
48
|
-
(pre-filled AND editable — give it a `value`; the reviewed value comes back
|
|
49
|
-
at the field's own id).
|
|
50
|
-
- **Every outcome is its own exit — the SDK never emits `completed` on a task
|
|
51
|
-
that has outcomes.** Each outcome gets `outcome-<slug>` (the name lowercased,
|
|
52
|
-
non-alphanumerics to `-`). This holds on the default node and on quick-form,
|
|
53
|
-
at every definition version, because it is what the designer draws: it derives
|
|
54
|
-
one handle per entry in `inputs.schema.outcomes` and shows the manifest's
|
|
55
|
-
`completed` placeholder only when there are none (flow-workbench,
|
|
56
|
-
`getEffectiveHitlHandleCustomization`). A `completed` edge on a task with
|
|
57
|
-
outcomes is stale: Studio Web and the converter remap it to the PRIMARY
|
|
58
|
-
outcome, so every other outcome loses its path. `check` refuses it
|
|
59
|
-
(HITL_COMPLETED_PORT_GONE). `exposeError: true` additionally exposes
|
|
60
|
-
`out('<step>', 'error')` and selects the 1.2 definition (default node only).
|
|
61
|
-
|
|
62
|
-
**Every outcome must be wired**, and there are three ways. Prefer the first:
|
|
63
|
-
|
|
64
|
-
| | |
|
|
65
|
-
| --- | --- |
|
|
66
|
-
| `.stepSwitch(name, hitl({…}), arms)` | one arm per outcome, `value` naming the outcome. No tacit exit, arms converge, and a missing arm is a warning (STEP_SWITCH_EXIT_UNROUTED) rather than a port with no edge. |
|
|
67
|
-
| `.step()` + `.stepToList('outcome-<slug>', …)`, on a task that routes per outcome | the FIRST outcome continues the main path and the rest are side arms. Those arms do NOT converge — each gets an End of its own. |
|
|
68
|
-
| `.step()`, on a task that does not route per outcome | every outcome continues to the next step, each on its own edge. The decision reaches the flow as data: `out('<step>', 'Action')`. |
|
|
69
|
-
|
|
70
|
-
Do not route the FIRST outcome with `.stepToList`: its port is already taken by
|
|
71
|
-
the main path (flow-builder-sdk#741). After a task that does not route per
|
|
72
|
-
outcome EVERY outcome port is taken, so `.stepToList('outcome-…')` there is
|
|
73
|
-
refused (HITL_OUTCOME_PORTS_OFF) — use `.stepSwitch`, or `outcomePorts: true`.
|
|
74
|
-
|
|
75
|
-
**So `.step()` means one of two things.** After a task that routes per outcome,
|
|
76
|
-
the FIRST outcome continues and the others need routes. After any other task,
|
|
77
|
-
every outcome continues. For example, `hitl({ variant: 'quick-form', outcomes:
|
|
78
|
-
['Approve', 'Reject'] })` followed by `.step('log', …)` emits
|
|
79
|
-
`outcome-approve → log` and `outcome-reject → log`.
|
|
80
|
-
|
|
81
|
-
A default-node task with more than one outcome routes per outcome, on its 1.1
|
|
82
|
-
definition. Five things make `.step()` continue every outcome instead, and only
|
|
83
|
-
these:
|
|
84
|
-
|
|
85
|
-
| | `.step()` continues every outcome because |
|
|
86
|
-
| --- | --- |
|
|
87
|
-
| `outcomePorts: false` | you asked for it: the decision is wanted as data |
|
|
88
|
-
| `variant: 'quick-form'` | that is quick-form's default. `outcomePorts: true` or `.stepSwitch` route it per outcome, and its version stays 1.0 |
|
|
89
|
-
| `{ version: '1.0' }` | an explicit pin wins, which keeps `decompile` → `compile` exact on a deployed flow. `outcomePorts: true` with the pin routes per outcome on the 1.0 node |
|
|
90
|
-
| one outcome | an acknowledgement, not a choice |
|
|
91
|
-
| every outcome `action: 'End'` | each outcome gets its own End, so nothing may follow the task except a `.return()` (HITL_UNREACHABLE_AFTER) |
|
|
92
|
-
|
|
93
|
-
An `action: 'End'` outcome in that fan-out goes to an End node of its own
|
|
94
|
-
instead of into the next step, or joins the `.return()` when that is the next
|
|
95
|
-
step. The flow runtime never reads `action`, so only the graph can end the run
|
|
96
|
-
on that outcome.
|
|
97
|
-
|
|
98
|
-
Inside a `.parallel()` arm, such a task must not be the arm's last step, and
|
|
99
|
-
none of its outcomes may be `action: 'End'`. The join waits for a token on
|
|
100
|
-
every incoming edge, and only one outcome fires, so the run would never get
|
|
101
|
-
past it.
|
|
102
|
-
`check` refuses both (HITL_FAN_OUT_INTO_JOIN, HITL_END_OUTCOME_IN_PARALLEL).
|
|
103
|
-
Add a step after the task inside the arm, for example
|
|
104
|
-
`a.step('review', hitl(…)).step('record', …)`: every outcome continues to
|
|
105
|
-
`record`, and only `record` reaches the join. `.stepSwitch` does not help
|
|
106
|
-
here, because its arms rejoin at the same join. A `.stepSwitch` on a task
|
|
107
|
-
inside an arm needs the same step after it: with an empty `Approve` arm and a
|
|
108
|
-
`Reject` arm that runs `rej`, the arm would end on two paths (the `Approve`
|
|
109
|
-
outcome edge and `rej`), and `check` refuses that too
|
|
110
|
-
(HITL_FAN_OUT_INTO_JOIN). Write `a.stepSwitch('review', …).step('record', …)`.
|
|
111
|
-
That `.stepSwitch` also needs an arm for every outcome, and no arm may end in
|
|
112
|
-
`.return()`: either one sends that outcome's path to an End inside the arm,
|
|
113
|
-
so the join waits forever for the arm's other path, and `check` refuses it
|
|
114
|
-
(HITL_END_OUTCOME_IN_PARALLEL). Put the `.return()` after the `.parallel()`.
|
|
115
|
-
|
|
116
|
-
The action-app and document-validation variants are different: their outcomes
|
|
117
|
-
live in the app, `completed` is the only handle the designer draws for them,
|
|
118
|
-
and `.step()` leaves on it. Route on `out('<step>', 'Action')` downstream.
|
|
119
|
-
|
|
120
|
-
**Why routing is the default.** An approve/reject task whose outcomes all lead
|
|
121
|
-
to one place compiles and `flow validate` answers `Valid`, so the mistake
|
|
122
|
-
surfaced at runtime or in a grader (flow-builder-sdk#735). A warning was not
|
|
123
|
-
enough — #739 measured it firing three times while the unreachable artifact
|
|
124
|
-
shipped anyway — so the shape changed instead of the advice. `check` still
|
|
125
|
-
warns `HITL_OUTCOMES_UNREACHABLE` where every outcome continues to one step and
|
|
126
|
-
nothing reads `out('<step>', 'Action')`.
|
|
127
|
-
|
|
128
|
-
**Route EVERY outcome.** With `.stepToList`, an unrouted one deploys and then
|
|
129
|
-
stalls the run when the reviewer picks it (`check` warns
|
|
130
|
-
HITL_OUTCOME_UNROUTED). With `.stepSwitch` it compiles to an End instead, so
|
|
131
|
-
the run finishes rather than hanging — but finishes without the flow's declared
|
|
132
|
-
outputs, which STEP_SWITCH_EXIT_UNROUTED says out loud. Inside a `.parallel()`
|
|
133
|
-
arm that End would hang the join instead, so there it is refused
|
|
134
|
-
(HITL_END_OUTCOME_IN_PARALLEL). `action: 'End'` changes
|
|
135
|
-
what happens on that outcome (the run ends instead of stalling), not whether
|
|
136
|
-
its handle needs an edge.
|
|
137
|
-
|
|
138
|
-
**What `flow validate` checks.** It holds an `outcome-<id>` edge to the node's
|
|
139
|
-
declared outcomes: one naming a real outcome passes on every version (so
|
|
140
|
-
per-outcome wiring passes on 1.0 and on quick-form), and one naming no outcome
|
|
141
|
-
is refused — *Edge references undeclared source handle "outcome-nope"*. On a
|
|
142
|
-
1.1/1.2 node it also refuses `completed`. It does NOT refuse `completed` on a
|
|
143
|
-
1.0 or quick-form node that has outcomes, which is why `check` and the SDK do.
|
|
144
|
-
|
|
145
|
-
**The decision as data** — `.step()` then `.switch()` on
|
|
146
|
-
`out('<step>', 'Action')` — still works: every outcome reaches the switch on
|
|
147
|
-
its own edge, and the switch routes. Ask for it deliberately (quick-form, or
|
|
148
|
-
`outcomePorts: false` on the default node); the reason is that the decision is
|
|
149
|
-
wanted as DATA — recorded in an output, compared in one place. Every outcome
|
|
150
|
-
continuing to one step with nothing reading `Action` is the unreachable-outcomes
|
|
151
|
-
case above, not a third shape.
|
|
152
|
-
- `variant: 'document-validation'` takes `document: { extractionResult,
|
|
153
|
-
storageBucket?, documentId?, render?, taxonomy? }` and no `fields`; bind
|
|
154
|
-
`extractionResult` to the upstream extract step's `ExtractionResult`.
|
|
155
|
-
`render: 'custom'` requires `taxonomy` (and takes `app`).
|
|
156
|
-
|
|
157
|
-
## Variant judgment
|
|
158
|
-
|
|
159
|
-
Use the node variant explicitly named by the scenario. The default and
|
|
160
|
-
quick-form variants own their fields in the Flow; action-app delegates the form
|
|
161
|
-
to an already-deployed app. For an app task, resolve the app key, name, folder,
|
|
162
|
-
and argument names from the same tenant resource.
|
|
163
|
-
|
|
164
|
-
## Evidence boundary
|
|
165
|
-
|
|
166
|
-
Offline execution scripts the selected action and output fields. It proves
|
|
167
|
-
wiring and downstream routing, not that a real task appeared or that a person
|
|
168
|
-
participated. Live evidence should preserve the Action Center task identity,
|
|
169
|
-
the human-selected outcome, supplied answers, and the path that resumed.
|
|
@@ -1,105 +0,0 @@
|
|
|
1
|
-
# HTTP
|
|
2
|
-
|
|
3
|
-
*Exact signatures, fields, and defaults: `http()`.*
|
|
4
|
-
|
|
5
|
-
The one factory selects two distinct product nodes:
|
|
6
|
-
|
|
7
|
-
- standalone: `http({ managed: false, ... })`, non-2xx responses stay on the
|
|
8
|
-
success output with `statusCode`;
|
|
9
|
-
- managed: `http({ managed: true, ... })`, non-2xx responses take the error
|
|
10
|
-
path.
|
|
11
|
-
|
|
12
|
-
Signature:
|
|
13
|
-
`http({ method?, url, managed, connection?, folder?, targetConnector?, headers?, query?, body?, contentType?, timeout?, retryCount?, returns? })`.
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
.step('policy', http({ method: 'GET', url: policyUrl,
|
|
17
|
-
managed: true, returns: { limit: 'number' } }))
|
|
18
|
-
.step('read', script({
|
|
19
|
-
code: 'return $vars.policy.output.body.limit;' }))
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Choosing the node
|
|
23
|
-
|
|
24
|
-
Match the product node named by the scenario. “Managed HTTP Request,” “HTTP
|
|
25
|
-
Request node,” and `core.action.http.v2` select managed; “standalone” and
|
|
26
|
-
`core.action.http` select standalone. Authentication needs or the desire for an
|
|
27
|
-
error handler are not substitutes for that intent.
|
|
28
|
-
|
|
29
|
-
Live product evidence shows that both nodes expose an `application/json` body as
|
|
30
|
-
a parsed value. Declare its top-level fields with `returns` and read them
|
|
31
|
-
directly; do not apply `JSON.parse` to a body declared by `returns`. A non-JSON
|
|
32
|
-
body remains opaque unless its live media type establishes a scalar contract. An
|
|
33
|
-
offline local run is not evidence for the product-CLI contract either way: follow
|
|
34
|
-
the task's named evidence mode and use live debug for product response shape.
|
|
35
|
-
|
|
36
|
-
The definitions default `timeout` to `PT15M` and `retryCount` to `0`. Override
|
|
37
|
-
them only when the scenario calls for different operational behavior.
|
|
38
|
-
|
|
39
|
-
## Managed authentication
|
|
40
|
-
|
|
41
|
-
Managed HTTP has two authentication modes. Omit `connection` and `folder` for
|
|
42
|
-
manual/implicit mode. To reuse an Integration Service HTTP connection, provide
|
|
43
|
-
both symbolic names from `bindings.json`; the compiler resolves them into the
|
|
44
|
-
node detail and the emitted flow's resource bindings:
|
|
45
|
-
|
|
46
|
-
```ts
|
|
47
|
-
.step('profile', http({
|
|
48
|
-
managed: true,
|
|
49
|
-
method: 'GET',
|
|
50
|
-
url: '/me',
|
|
51
|
-
connection: 'spotifyHttp',
|
|
52
|
-
folder: 'shared',
|
|
53
|
-
returns: { display_name: 'string' },
|
|
54
|
-
}))
|
|
55
|
-
```
|
|
56
|
-
|
|
57
|
-
```json
|
|
58
|
-
{
|
|
59
|
-
"bindings": [
|
|
60
|
-
{ "name": "spotifyHttp", "resourceKey": "<uipath-uipath-http connection id>" },
|
|
61
|
-
{ "name": "shared", "resourceKey": "<folder key>" }
|
|
62
|
-
]
|
|
63
|
-
}
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
Connection mode emits `authentication: "connector"`, targets
|
|
67
|
-
`uipath-uipath-http`, and treats `url` as a path relative to the connection's
|
|
68
|
-
configured base URL. Supplying only one of `connection` or `folder` is an error.
|
|
69
|
-
|
|
70
|
-
For an HTTP fallback authenticated by another connector, set its connector key
|
|
71
|
-
as `targetConnector`. The node remains the managed HTTP wrapper, while the
|
|
72
|
-
proxied request reuses that connector's authentication:
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
.step('emoji', http({
|
|
76
|
-
managed: true,
|
|
77
|
-
method: 'GET',
|
|
78
|
-
url: '/emoji.list',
|
|
79
|
-
connection: 'slack',
|
|
80
|
-
folder: 'shared',
|
|
81
|
-
targetConnector: 'uipath-salesforce-slack',
|
|
82
|
-
}))
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
`targetConnector` requires both bindings and is not valid on standalone HTTP.
|
|
86
|
-
|
|
87
|
-
## Response branches
|
|
88
|
-
|
|
89
|
-
`branches: [{ name, condition }]` declares extra exits evaluated against the
|
|
90
|
-
response — each becomes a `branch-<name>` source port routed with
|
|
91
|
-
`.stepToList('branch-<name>', …)`, while the main path continues from the
|
|
92
|
-
default port. Conditions are expressions (e.g.
|
|
93
|
-
``js`$vars.fetch.output.statusCode === 429` ``), typically reading the step's
|
|
94
|
-
own declared `returns`. Names must be unique and constant conditions are
|
|
95
|
-
rejected by `check`.
|
|
96
|
-
|
|
97
|
-
## Evidence
|
|
98
|
-
|
|
99
|
-
An offline replay proves the graph and chosen response shape. A live request is
|
|
100
|
-
the evidence for endpoint reachability, response media type, authentication,
|
|
101
|
-
and the service's actual status/body behavior.
|
|
102
|
-
|
|
103
|
-
Both HTTP types default to `timeout: 'PT15M'` and `retryCount: 0` when omitted.
|
|
104
|
-
The managed node deserializes the response body, so read `out('fetch', 'body.items')`
|
|
105
|
-
and let `returns` declare the body's top-level fields.
|