@uipath/skills 1.201.0-preview.621 → 1.201.0-preview.637
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/package.json +1 -1
- package/skills/uipath-automationhub/SKILL.md +1 -0
- package/skills/uipath-automationhub/references/api-endpoints.md +23 -1
- package/skills/uipath-automationhub/references/cli-commands.md +11 -0
- package/skills/uipath-automationhub/references/get-process-cli-guide.md +2 -0
- package/skills/uipath-automationhub/references/get-process.md +7 -4
- package/skills/uipath-automationhub/references/publish-process-cli-guide.md +1 -1
- package/skills/uipath-automationhub/references/publish-process.md +4 -2
- package/skills/uipath-ixp/references/cli-reference.md +1 -1
- package/skills/uipath-ixp/references/improve-prompts-guide.md +5 -6
- package/version-manifest.json +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@uipath/skills",
|
|
3
|
-
"version": "1.201.0-preview.
|
|
3
|
+
"version": "1.201.0-preview.637",
|
|
4
4
|
"description": "UiPath agent skills for Claude Code, Codex, Cursor, Copilot, Gemini and OpenCode — RPA, UI automation, UI testing, coded agents/apps/workflows, and troubleshooting. Distributed as the UiPath Claude Code plugin.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "UiPath"
|
|
@@ -68,5 +68,6 @@ Every addition keeps the skill's three invariants: collect inputs before the fir
|
|
|
68
68
|
## Notes
|
|
69
69
|
|
|
70
70
|
- **Cloud token only** — authorization is the user's real AH permissions; you see and can do exactly what their AH role allows.
|
|
71
|
+
- **If Automation Hub isn't available on the tenant, say so plainly and stop** — never let it surface as a generic failure. Two cases with **different remedies**: *not enabled* (only an admin can fix it) and *reachable but never onboarded* (self-service). Signals, and the exact wording to quote verbatim rather than paraphrase, live in one home per transport: [`references/api-endpoints.md`](references/api-endpoints.md) → **Automation Hub not available on this tenant** for the raw-API flows, [`references/cli-commands.md`](references/cli-commands.md) → same heading for the CLI flows.
|
|
71
72
|
- The publish flow fetches the idea-flow schema live, so it adapts automatically if fields change on the tenant.
|
|
72
73
|
- **Open dependency:** in a hosted runtime (e.g. Process Scribe/Delegate) the cloud token is expected via the environment (Authentication, option 1). Confirm the runtime provides `UIPATH_CLI_AUTH_TOKEN` (or an equivalent) before relying on it in production.
|
|
@@ -138,5 +138,27 @@ Linked components for the process.
|
|
|
138
138
|
| 400 | Validation — missing required field, invalid enum, empty `user_inputs`, missing `OVERVIEW_NAME` |
|
|
139
139
|
| 401 | Unauthorized — token missing/expired, or `x-ah-openapi-auth` was wrongly sent |
|
|
140
140
|
| 403 | Forbidden — the user lacks the AH permission (authorization = the user's real AH role) |
|
|
141
|
-
| 404 | Wrong URL, or AH not
|
|
141
|
+
| 404 | Wrong URL, or AH not available on the tenant — see **Automation Hub not available on this tenant** below |
|
|
142
142
|
| 409 | Duplicate process name |
|
|
143
|
+
|
|
144
|
+
### Automation Hub not available on this tenant
|
|
145
|
+
|
|
146
|
+
Two distinct cases, with **different remedies** — don't collapse them, the advice differs:
|
|
147
|
+
|
|
148
|
+
**1. AH is not enabled for the tenant.** The tenant has no Automation Hub service at all. Signals: a **404** whose body says `not found in organization`, or a **3xx redirect** to `portal_/unregistered` (following it would surface an HTML portal page as a JSON parse error). The user cannot fix this themselves — report exactly:
|
|
149
|
+
|
|
150
|
+
> Please contact your administrator to enable Automation Hub on this tenant.
|
|
151
|
+
|
|
152
|
+
**2. AH is reachable but the tenant was never onboarded into it.** The service answers **422 Tenant Lookup Error** on every call. This one *is* self-service — report exactly:
|
|
153
|
+
|
|
154
|
+
> Automation Hub is reachable for this tenant but has not finished setup. Open Automation Hub in the browser once to complete it, then retry.
|
|
155
|
+
|
|
156
|
+
In both cases: **stop after reporting** — do not retry, do not fall back to an admin OpenAPI token, and do not attempt the write against another tenant unless the user asks. Quote the message verbatim; don't paraphrase it.
|
|
157
|
+
|
|
158
|
+
**Making the signals observable from `curl`.** `curl` reports the status but not *where* a 3xx points, so the first call each flow makes against the tenant asks for both:
|
|
159
|
+
|
|
160
|
+
```bash
|
|
161
|
+
curl -s -w "\n%{http_code} %{redirect_url}" …
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
The last line is then `<status> <redirect target>`: `%{redirect_url}` is empty on any non-3xx and carries the resolved `Location` on a 3xx — which is what makes the `portal_/unregistered` case above distinguishable from an ordinary redirect. **Never add `-L`.** Following the redirect throws away the one diagnosable signal and hands you an HTML portal page, which then fails as a JSON parse error — exactly the generic failure this section exists to prevent.
|
|
@@ -12,6 +12,17 @@ The CLI wraps the same Open API endpoints as [`api-endpoints.md`](api-endpoints.
|
|
|
12
12
|
|
|
13
13
|
If a command fails with an authentication error, tell the user to run `uip login` — never ask for or handle a raw token yourself.
|
|
14
14
|
|
|
15
|
+
## Automation Hub not available on this tenant
|
|
16
|
+
|
|
17
|
+
The CLI already classifies this for you — read its `Instructions` field:
|
|
18
|
+
|
|
19
|
+
- `Instructions` mentioning **"not provisioned on this tenant"** → AH is not enabled. Report: *"Please contact your administrator to enable Automation Hub on this tenant."*
|
|
20
|
+
- `Instructions` mentioning **"no tenant record of its own yet"** → reachable but not onboarded. Report: *"Automation Hub is reachable for this tenant but has not finished setup. Open Automation Hub in the browser once to complete it, then retry."*
|
|
21
|
+
|
|
22
|
+
Either way **stop** — don't retry and don't try another tenant unless asked, and quote the message verbatim rather than paraphrasing it.
|
|
23
|
+
|
|
24
|
+
> This section is the **canonical wording for the CLI path**; the CLI flows reference it instead of restating it, so each message exists in exactly one place per transport (raw-API twin: [`api-endpoints.md`](api-endpoints.md) → **Automation Hub not available on this tenant**, which also carries the raw signals behind each case). The two homes exist because the CLI files stay self-contained for the day the raw-API fallback retires — keep them in sync if the wording ever changes.
|
|
25
|
+
|
|
15
26
|
## Output envelope (every command)
|
|
16
27
|
|
|
17
28
|
Always pass `--output json`. Success:
|
|
@@ -19,6 +19,8 @@ Fetches one process (by id or search) and its documents, and downloads document
|
|
|
19
19
|
uip ah automations get $PROCESS_ID --output json
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
If the command fails with `Instructions` about AH **not being provisioned** on the tenant, or about the tenant having **no AH record yet**, report the message for the matching case, verbatim, from [`cli-commands.md`](cli-commands.md) → **Automation Hub not available on this tenant**, and stop.
|
|
23
|
+
|
|
22
24
|
`Data` is the projected record (`Id`, `Name`, `Phase`, `PhaseStatus`, `Tags`, …). Add `--all-fields` only when you need the raw record (e.g. `process_slug` for the deep link). `Failure` with not-found → no such process; auth error → `uip login`.
|
|
23
25
|
|
|
24
26
|
## Step 3: Fetch the documents
|
|
@@ -9,19 +9,22 @@ Fetches one process (by id or search) and its documents from Automation Hub, aut
|
|
|
9
9
|
- If the caller gives a **process id**, use it directly.
|
|
10
10
|
- Otherwise search by name:
|
|
11
11
|
```bash
|
|
12
|
-
curl -s -H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
12
|
+
curl -s -w "\n%{http_code} %{redirect_url}" -H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
13
13
|
"$BASE_URL/$ORG/$TENANT/automationhub_/api/v1/openapi/automations?search=$QUERY&limit=20"
|
|
14
14
|
```
|
|
15
|
-
|
|
15
|
+
The last line is `<status> <redirect target>` (empty target unless 3xx). Check it **before** the results: a **404 / 3xx to `portal_/unregistered` / 422 tenant lookup** means AH isn't available on this tenant at all — handle it as in Step 2, don't report it as "no match". Never add `-L`.
|
|
16
|
+
|
|
17
|
+
On a 200: one clear match → use its `process_id`. If several → show a short list (name + id + owner) and ask the user to pick. If none → tell the user and stop.
|
|
16
18
|
|
|
17
19
|
## Step 2: Fetch the process
|
|
18
20
|
|
|
19
21
|
```bash
|
|
20
|
-
curl -s -w "\n%{http_code}" -H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
22
|
+
curl -s -w "\n%{http_code} %{redirect_url}" -H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
21
23
|
"$BASE_URL/$ORG/$TENANT/automationhub_/api/v1/openapi/automations/$PROCESS_ID"
|
|
22
24
|
```
|
|
25
|
+
The last line is `<status> <redirect target>` (empty target unless 3xx) — the target is what separates a `portal_/unregistered` redirect from any other 3xx. Never add `-L`.
|
|
23
26
|
- **200** → keep the record; project to the useful fields for display (name, status/phase, category, owner, description). The raw record is large — don't dump it all unless asked.
|
|
24
|
-
- **401** → re-authenticate. **403** → the user can't view this process. **404** → no such process.
|
|
27
|
+
- **401** → re-authenticate. **403** → the user can't view this process. **404** → no such process — *unless* the body says `not found in organization` (or the call 3xx-redirects to `portal_/unregistered`, or answers **422 tenant lookup**), which means AH itself is not available on this tenant: report the message for the matching case, verbatim, from [`api-endpoints.md`](api-endpoints.md) → **Automation Hub not available on this tenant**, and stop.
|
|
25
28
|
|
|
26
29
|
## Step 3: Fetch the documents
|
|
27
30
|
|
|
@@ -12,7 +12,7 @@ uip ah idea-flows list --output json
|
|
|
12
12
|
|
|
13
13
|
- `Result: Success` → keep `Data` (flow names + ids) and tell the user "Connected to Automation Hub."
|
|
14
14
|
- Auth failure → tell the user to run `uip login` (or, in Delegate, to sign in). Never ask for a raw token.
|
|
15
|
-
- `Failure` mentioning the tenant/enablement → AH is not
|
|
15
|
+
- `Failure` mentioning the tenant/enablement → AH is not available on this tenant. Report the message for the matching case, verbatim, from [`cli-commands.md`](cli-commands.md) → **Automation Hub not available on this tenant** — then **stop**; nothing later in this flow can succeed.
|
|
16
16
|
|
|
17
17
|
## Step 2: Pick the idea flow
|
|
18
18
|
|
|
@@ -9,15 +9,17 @@ Creates one process in Automation Hub from a schema-driven payload and attaches
|
|
|
9
9
|
Verify the resolved token with a cheap call — this also fetches the idea flows you need next:
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
curl -s -w "\n%{http_code}" \
|
|
12
|
+
curl -s -w "\n%{http_code} %{redirect_url}" \
|
|
13
13
|
-H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
14
14
|
"$BASE_URL/$ORG/$TENANT/automationhub_/api/v1/openapi/idea-flows"
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
+
The last line is `<status> <redirect target>` — the target is empty unless the response was a 3xx. Read both: a 3xx alone is ambiguous, a 3xx **to `portal_/unregistered`** is the tenant-not-enabled signal below. Never add `-L`.
|
|
18
|
+
|
|
17
19
|
- **200** → save the `data` array (reused in Step 2) and tell the user "Connected to Automation Hub."
|
|
18
20
|
- **401** → token missing/expired: if it came from `~/.uipath/.auth`, ask the user to run `uip login` again; re-resolve and retry. **Never** add `x-ah-openapi-auth` to "fix" a 401 — that routes to the admin-token path and guarantees failure.
|
|
19
21
|
- **403** → the user is authenticated but lacks AH access on this tenant.
|
|
20
|
-
- **404 /
|
|
22
|
+
- **404 / 3xx to `portal_/unregistered` / 422 tenant lookup** → AH is not available on this tenant. Confirm the org/tenant first; if they're right, report the message for the matching case, verbatim, from [`api-endpoints.md`](api-endpoints.md) → **Automation Hub not available on this tenant** — then **stop**.
|
|
21
23
|
|
|
22
24
|
Do not proceed until you have a 200.
|
|
23
25
|
|
|
@@ -15,7 +15,7 @@ All commands use `uip ixp` prefix. Always append `--output json` when parsing ou
|
|
|
15
15
|
| `uip ixp projects update-title <project-name> "<new-title>" --output json` | Update the display title of a project |
|
|
16
16
|
| `uip ixp projects update-prompt <project-name> --prompt "<text>" --output json` | Update the project's **Overall extraction instructions** — the taxonomy-wide prompt the model sees on every extraction (the field at the top of the IXP UI's Manage Taxonomy page). Distinct from per-field-group prompts (`groups update-prompts`) and per-field prompts (`fields update-prompts`). Replaces the existing value. |
|
|
17
17
|
| `uip ixp projects get-taxonomy <project-name> --output json` | Export the raw IXP taxonomy artifact. Data is `{ status, dataset: { entity_defs, label_groups } }` — read `entity_defs` and `label_groups` under `dataset`. Intended for re-import (see `import-taxonomy`), not a human-readable view. `dataset` also carries `_model_config`, the only read path for the configured extraction model and pre-processing — see [Reading the current model and pre-processing](#reading-the-current-model-and-pre-processing). |
|
|
18
|
-
| `uip ixp projects get-metrics <project-name> [--model-version <N>] --output json` | Get validation metrics. **Validated model →** flat Data: `ProjectScore`, `ProjectScoreQuality`, `ValidatedDocuments`, `ModelVersion`, plus per-group `FieldGroups[]` (`FieldGroup`, `F1`, `Precision`, `Recall`, `ErrorRate`, `Documents`) and per-field `Fields[]` (`FieldGroup`, `FieldId`, `F1`, `Precision`, `Recall`, `ErrorRate`, `Documents`, `Annotations`, `Quality`). **Trained but not yet validated →** Data is `{ Metrics: null }` (not an error). **No trained model yet (e.g. a project with no confirmed labellings) →** the call returns a failure envelope `Result: Failure` with `ErrorCode: not_found` (no `Data`), NOT `{ Metrics: null }` — treat it as "no metrics yet". **Defaults to the LATEST TRAINED version, which is NOT necessarily the published/live one** — resolve the version from `list-models` and pass it as `--model-version <N>` whenever you report a score, so the numbers and the version identity match (SKILL.md Critical Rule 21). Field semantics — which values decide and which are derived — are in [Improve Prompts Guide § What get-metrics returns](improve-prompts-guide.md#what-get-metrics-returns-and-which-values-decide). `ErrorRate` is `errors / Annotations` (it counts misses — not `1 - Precision`); the `Quality`/`ProjectScoreQuality` labels use inconsistent scales — never gate on them. |
|
|
18
|
+
| `uip ixp projects get-metrics <project-name> [--model-version <N>] --output json` | Get validation metrics. **Validated model →** flat Data: `ProjectScore`, `ProjectScoreQuality`, `ValidatedDocuments`, `ModelVersion`, plus per-group `FieldGroups[]` (`FieldGroup`, `F1`, `Precision`, `Recall`, `ErrorRate`, `Documents`) and per-field `Fields[]` (`FieldGroup`, `FieldId`, `Name`, `F1`, `Precision`, `Recall`, `ErrorRate`, `Documents`, `Annotations`, `Quality`). `Name` is the field's display name resolved from the taxonomy — report on it, but compare on `FieldId`, which is the stable key; it is `null` when the service could not resolve it (e.g. the field was deleted after that version was scored). Display names are unique only within a group, so qualify as `<FieldGroup> / <Name>` when two fields share one. Scores are surfaced at the backend's own precision — long tails like `0.824999988079071` are its float32 arithmetic widened to double, not extra accuracy; round when you display them, and compare the raw values. **Trained but not yet validated →** Data is `{ Metrics: null }` (not an error). **No trained model yet (e.g. a project with no confirmed labellings) →** the call returns a failure envelope `Result: Failure` with `ErrorCode: not_found` (no `Data`), NOT `{ Metrics: null }` — treat it as "no metrics yet". **Defaults to the LATEST TRAINED version, which is NOT necessarily the published/live one** — resolve the version from `list-models` and pass it as `--model-version <N>` whenever you report a score, so the numbers and the version identity match (SKILL.md Critical Rule 21). **Any version the backend ever scored is readable**, including older ones `list-models` no longer lists — that is what makes a version-to-version comparison possible; `not_found` on a version means the backend never scored it, not that it aged out. Field semantics — which values decide and which are derived — are in [Improve Prompts Guide § What get-metrics returns](improve-prompts-guide.md#what-get-metrics-returns-and-which-values-decide). `ErrorRate` is `errors / Annotations` (it counts misses — not `1 - Precision`); the `Quality`/`ProjectScoreQuality` labels use inconsistent scales — never gate on them. |
|
|
19
19
|
| `uip ixp projects configure-model <project-name> [options] --output json` | Configure extraction model. Options: `--model` (gemini_2_5_flash/gemini_2_5_pro/gpt_4o_2024_05_13) and `--preprocessing` (none/table_mini/table). To read the current settings, see [Reading the current model and pre-processing](#reading-the-current-model-and-pre-processing). |
|
|
20
20
|
| `uip ixp projects list-models <project-name> --output json` | List all model versions and tags. Returns `Models[]` (`Version`, `ModelName`, `Pinned`, `TrainedTime`, `Description`), `Tags[]` (`Name`, `Version`, `UpdatedAt`), and `MaxPublished`. **The only read path for the project's live version** — `Tags[]` entry Name=`live`, else the highest `Models[]` with `Pinned: true`; which version a **folder** serves at runtime is a different question — [Deployments](#deployments). `ModelName` is the trained labeller's **family** (e.g. `gemini_ixp`, `gemini_pro_ixp`) — it is never a `--model` value like `gemini_2_5_flash`, so it does not answer "which extraction model is configured" (see [Reading the current model and pre-processing](#reading-the-current-model-and-pre-processing)). |
|
|
21
21
|
| `uip ixp projects publish <project-name> [--model-version <N>] [--tag <live\|staging>] --output json` | Publish a model version — defaults to the latest; pass `-m, --model-version <N>` to pick a specific one. `-d, --description "<text>"` sets a description; `--tag <live\|staging>` tags the published version. |
|
|
@@ -55,7 +55,7 @@ The values `get-metrics` returns are neither independent nor interchangeable —
|
|
|
55
55
|
| `ErrorRate` | field, group | **Report — independent of `Precision`.** Wrong extractions over `Annotations`. A wrong value counts **once** (not as a false positive plus a false miss), and a miss counts even though it cannot lower `Precision` — so `Precision` 1.00 can still carry `ErrorRate` 0.20. Report it as the manual-correction burden; diagnose direction from `Precision`/`Recall`. |
|
|
56
56
|
| `Quality` | field | **Ignore.** A coarse label derived from the numbers, on a scale inconsistent with `ProjectScoreQuality` (an `F1` of 1.00 still reads `good` while a `ProjectScore` of 0.91 reads `excellent`). Never gate on it and don't report it per field — if the user asks about the UI's label, explain the scales differ. |
|
|
57
57
|
| `ProjectScoreQuality` | project | **Report on the project line only** (the label the UI shows beside the score) — different scale from field `Quality` (above). |
|
|
58
|
-
| `FieldGroup`, `FieldId` | field | Identity. `FieldId`
|
|
58
|
+
| `FieldGroup`, `FieldId`, `Name` | field | Identity. Compare on `FieldId` (stable); report on `Name` (the current display name — `null` for a deleted field, fall back to `FieldId`, see 1a). |
|
|
59
59
|
|
|
60
60
|
|
|
61
61
|
## Waiting for retrain
|
|
@@ -89,12 +89,11 @@ Note the `ModelVersion` from this baseline read — later iterations check that
|
|
|
89
89
|
|
|
90
90
|
Save the full per-field `Fields` array as `baseline_metrics`. This is the starting point you compare against. (For a validated model, get-metrics Data is flat — `Fields`/`FieldGroups`/`ValidatedDocuments` are top-level. An unvalidated model returns `Data: { Metrics: null }` instead — re-fetch under the bounded wait above.)
|
|
91
91
|
|
|
92
|
-
**
|
|
92
|
+
**Field names:** each `Fields` entry carries both `FieldId` and `Name`, so report and compare fields straight from the metrics — do NOT fetch the taxonomy to build an id→name map. Three rules:
|
|
93
93
|
|
|
94
|
-
-
|
|
95
|
-
-
|
|
96
|
-
|
|
97
|
-
Build this mapping once and reuse it throughout the loop.
|
|
94
|
+
- **Compare on `FieldId`, report on `Name`.** `FieldId` is stable; `Name` reflects the taxonomy as it is now, so a field renamed since an older version was scored reads back under its current name.
|
|
95
|
+
- **`Name` is null** when the service could not resolve it (e.g. the field was deleted after that version was scored). Fall back to `FieldId` — never skip the field.
|
|
96
|
+
- **When two fields share a `Name`, qualify it with `FieldGroup`.** Display names are unique only *within* a group, so the same label can sit under two of them — print those rows as `<FieldGroup> / <Name>` or the reader cannot tell which one a score belongs to. This changes how you print the row, nothing else: the comparison still keys on `FieldId`.
|
|
98
97
|
|
|
99
98
|
### 1b. Check model configuration
|
|
100
99
|
|
package/version-manifest.json
CHANGED