@toloka-platform/sdk 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +12 -6
  2. package/dist/cli/toloka.js +269 -142
  3. package/dist/cli/toloka.js.jsc +0 -0
  4. package/dist/cli/toloka.js.jsc.sha256 +1 -1
  5. package/dist/cli/toloka.js.sha256 +1 -1
  6. package/docs/authoring.md +2 -0
  7. package/docs/cli.md +86 -23
  8. package/docs/getting-started.md +11 -9
  9. package/docs/limitations.md +6 -0
  10. package/docs/testing-examples.md +2 -2
  11. package/docs/testing.md +10 -2
  12. package/docs/troubleshooting.md +16 -4
  13. package/openapi/gen/api.ts +30 -0
  14. package/openapi/gen/models/gistingTrainingConfigurationGistTokens.ts +1 -1
  15. package/openapi/gen/models/gistingTrainingConfigurationInputGistTokens.ts +1 -1
  16. package/openapi/gen/models/index.ts +3 -0
  17. package/openapi/gen/models/listAudienceSpecializations200.ts +7 -0
  18. package/openapi/gen/models/listAudienceSpecializationsParams.ts +5 -0
  19. package/openapi/gen/models/specialization.ts +6 -0
  20. package/openapi/gen/models/trainingCostEstimateOneOfTwoseven.ts +0 -2
  21. package/openapi/gen/models/trainingRunQuote.ts +0 -2
  22. package/package.json +1 -1
  23. package/skills/catalog.json +10 -10
  24. package/skills/toloka-build/SKILL.md +8 -5
  25. package/skills/toloka-build/references/node-semantics.md +2 -2
  26. package/skills/toloka-build/references/workflow-and-cli.md +50 -25
  27. package/skills/toloka-fine-tuning/SKILL.md +3 -2
  28. package/skills/toloka-get-started/SKILL.md +4 -3
  29. package/skills/toloka-gisting/SKILL.md +4 -3
  30. package/skills/toloka-report-issue/references/report-template.md +1 -1
  31. package/src/checks/task-ui-typecheck.ts +4 -1
  32. package/src/cli/analytics.ts +1 -0
  33. package/src/cli/audience.ts +31 -0
  34. package/src/cli/auth.ts +382 -81
  35. package/src/cli/auto-update.ts +363 -24
  36. package/src/cli/browser-login.ts +265 -0
  37. package/src/cli/browser-session.ts +244 -0
  38. package/src/cli/check.ts +51 -52
  39. package/src/cli/cli-entry.ts +31 -0
  40. package/src/cli/commands/audience.ts +22 -0
  41. package/src/cli/commands/auth.ts +22 -15
  42. package/src/cli/commands/project.ts +3 -3
  43. package/src/cli/commands/training.ts +10 -2
  44. package/src/cli/config.ts +41 -14
  45. package/src/cli/context.ts +45 -9
  46. package/src/cli/credentials.ts +13 -13
  47. package/src/cli/init.ts +7 -2
  48. package/src/cli/keycloak.ts +189 -0
  49. package/src/cli/models.ts +1 -21
  50. package/src/cli/native-runtime.ts +7 -0
  51. package/src/cli/program.ts +5 -0
  52. package/src/cli/sign-in-page.ts +153 -0
  53. package/src/cli/skill.ts +34 -26
  54. package/src/cli/style.ts +37 -0
  55. package/src/cli/table.ts +21 -0
  56. package/src/cli/terminal-io.ts +9 -2
  57. package/src/cli/trainings.ts +1 -22
  58. package/src/cli/version.ts +12 -1
  59. package/src/client.ts +20 -3
  60. package/src/index.ts +1 -0
  61. package/src/pipeline-graph-v1.contract.json +47 -24
  62. package/src/transport.ts +19 -11
Binary file
@@ -1 +1 @@
1
- ef3e378cf44fae35729752064f23960c37016cb6fd231756a974fc8e239c89ff toloka.js.jsc
1
+ a22866960e3e7f99095169d57097612bd388f58b10fcc6ba2f11c44d2673a59a toloka.js.jsc
@@ -1 +1 @@
1
- f411e3d6a2289108ed93862aedb96f9628cef1a7ee21ec197aa4cf1bb9390ce3 toloka.js
1
+ 4280c470c616abb21bd56a2f9528ba82a88b45b6ac02fd8c8ad21a5bfedd1284 toloka.js
package/docs/authoring.md CHANGED
@@ -152,6 +152,8 @@ export const annotateFaces = generation("annotate_faces", {
152
152
  });
153
153
  ```
154
154
 
155
+ To require a specialization, add `{ value, qualificationId }` entries to `audience.specializations.values`. Both come from the platform catalog — `toloka audience specialization list` — where `NAME` is the `value`, `ID` is the `qualificationId`, and `EXPERTS` tells you how large the pool is. Specializations require `verifiedExperts: true`.
156
+
155
157
  Test the interface locally before applying it. The SDK's Vitest fixture renders this exact `ui` block in Chromium, interacts with Fields by `path`, runs postprocess, validates output entities, and saves screenshots. See [Test pipelines locally](./testing.md).
156
158
 
157
159
  ### quorum
package/docs/cli.md CHANGED
@@ -2,19 +2,68 @@
2
2
 
3
3
  The `toloka` CLI reads TypeScript source as the desired state, compares it with the live platform state, and reconciles the two.
4
4
 
5
- `toloka` `0.2.0` is the current stable CLI on the `latest` channel. Because it ships as part of the `0.x` SDK, commands, flags, and output can change between minor releases.
5
+ The CLI and SDK are versioned together. Before 1.0, commands and authoring APIs can change between minor releases.
6
6
 
7
- `toloka` requires Bun 1.4.0 or newer. The published package ships CLI bytecode built with Bun 1.4.0; another Bun version runs the same bundled JavaScript without that cache and starts slower. The launcher falls back to TypeScript source in a development checkout when the bytecode is absent.
7
+ ## Install
8
+
9
+ ```sh
10
+ curl -fsSL https://platform.toloka.ai/cli/install.sh | sh
11
+ ```
12
+
13
+ The installer prefers stable Bun 1.4.0 or newer matching the host architecture and installs the SDK's CLI into Bun's global binary directory. If Bun is missing, older, or built for a different architecture, it installs a standalone executable in `~/.local/bin` without changing Bun. Native downloads support macOS and glibc Linux on ARM64/x64 and require `curl`, `tar`, `mktemp`, and `shasum` or `sha256sum`. Compatible Bun can be used on musl Linux; this shell installer does not support native Windows.
14
+
15
+ Force the install mode:
16
+
17
+ ```sh
18
+ curl -fsSL https://platform.toloka.ai/cli/install.sh | sh -s -- --native
19
+ curl -fsSL https://platform.toloka.ai/cli/install.sh | sh -s -- --bun
20
+ ```
21
+
22
+ `--native` ignores installed Bun. `--bun` fails if Bun is incompatible. A Bun package installation failure is reported, not retried as a native install.
23
+
24
+ Add the printed directory to `PATH` if prompted. Verify the selected executable:
25
+
26
+ ```sh
27
+ toloka version --json
28
+ ```
29
+
30
+ Standalone installs report `"channel":"native"`. **Bun is the recommended runtime and package manager for SDK development:**
31
+
32
+ ```sh
33
+ bun add @toloka-platform/sdk@latest
34
+ ```
35
+
36
+ Use `bun i` for an existing project's dependencies. Training-only workflows need no SDK dependency. Local tests may also need Python or Chromium; see [Testing](./testing.md).
37
+
38
+ The installer accepts these environment variables:
39
+
40
+ | Variable | Effect |
41
+ | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- |
42
+ | `TOLOKA_CLI_INSTALL_DIR` | Override the native install directory; use with `--native`. Bun mode rejects this option and uses Bun's global binary directory. |
43
+ | `TOLOKA_CLI_CHANNEL` | Select `latest` (the default) or `preview`. |
44
+ | `TOLOKA_CLI_PACKAGE` | Override the selected mode's package: an SDK package for `--bun`, a matching native package for `--native`. A trailing version or tag overrides the channel. |
45
+ | `TOLOKA_CLI_REGISTRY` | Fetch installer metadata and the tarball from another npm registry. Automatic updates still use the public npm registry. |
46
+
47
+ Pass overrides to the `sh` process on the right side of the pipe, for example `curl -fsSL https://platform.toloka.ai/cli/install.sh | TOLOKA_CLI_CHANNEL=preview sh`.
48
+
49
+ ### Updates and migration from Bun global installs
50
+
51
+ Standalone and Bun-global CLIs check the public npm registry at most daily and install eligible releases at least 24 hours old, then rerun the command. Disable with `toloka config set auto-update false`. Project-local installs, CI, help, version, and config commands skip updates; `TOLOKA_SKIP_AUTO_UPDATE=1` also skips them. `TOLOKA_AUTO_UPDATE=0` or `1` overrides the stored setting for one command.
52
+
53
+ For a manual update, rerun the installer with the original mode (`--bun` or `--native`), directory, channel, package, and registry overrides. A version pin does not disable auto-update; automatic updates always use the public npm registry.
54
+
55
+ If both installations exist, put the desired directory first on `PATH`, run `hash -r` (Bash) or `rehash` (Zsh), and check `toloka version --json`: `native` means the standalone executable, `global-registry` means the Bun-global CLI. Credentials, settings, and project dependencies stay unchanged.
8
56
 
9
57
  ## Configuration
10
58
 
11
59
  Credentials and the platform base URL resolve from the same precedence order, highest first.
12
60
 
13
- | Precedence | API key source |
14
- | ----------- | ------------------------------------------ |
15
- | 1 (highest) | `--api-key` flag |
16
- | 2 | `TOLOKA_API_KEY` environment variable |
17
- | 3 (lowest) | credentials file written by `toloka login` |
61
+ | Precedence | Credential source |
62
+ | ----------- | ------------------------------------------------ |
63
+ | 1 (highest) | `--api-key` flag |
64
+ | 2 | `TOLOKA_API_KEY` environment variable |
65
+ | 3 | API key stored by `toloka login --api-key-stdin` |
66
+ | 4 (lowest) | browser session stored by `toloka login` |
18
67
 
19
68
  | Precedence | Base URL source |
20
69
  | ----------- | --------------------------------------- |
@@ -26,15 +75,13 @@ Credentials and the platform base URL resolve from the same precedence order, hi
26
75
  | Precedence | Project id source |
27
76
  | ----------- | --------------------------------------------- |
28
77
  | 1 (highest) | `--project-id` flag |
29
- | 2 | `TOLOKA_PROJECT_ID` |
78
+ | 2 | `TOLOKA_PROJECT_ID` environment variable |
30
79
  | 3 | `projectId` in `toloka.json` |
31
80
  | 4 (lowest) | `current` alias in the credentials file |
32
81
 
33
82
  Earlier releases named these variables `POTATO_API_KEY`, `POTATO_BASE_URL`, and `POTATO_PROJECT_ID`. The CLI still reads each legacy name when its `TOLOKA_*` counterpart is unset, prefers the `TOLOKA_*` value when both are set, and prints `POTATO_API_KEY is deprecated and will stop being read; set TOLOKA_API_KEY instead.` (and the same line for the other two) on stderr once per command. The aliases remain supported for compatibility; rename them to silence the warning and use the current names in new automation.
34
83
 
35
- `toloka login` verifies the key against the platform before saving anything. It writes `$XDG_CONFIG_HOME/toloka/credentials.json`, which defaults to `~/.config/toloka/credentials.json`, with file mode `0600` and a parent directory with mode `0700`. The file may also store local project aliases. The legacy `~/.toloka/credentials.json` is still read when the new path has no file. `toloka logout` deletes the stored file but does not revoke the key.
36
-
37
- Machine settings live next to that credentials file in `settings.json` and default `auto-update` to `true`. A globally installed `toloka` checks `https://registry.npmjs.org/` at most once per day and, when a newer `@toloka-platform/sdk` version has been published for at least 24 hours, installs it with `bun add --global` and re-runs the original command. The check is pinned to that registry; a checkout `.env` cannot retarget it. `config`, `version`, and `help` never trigger a check. Project-local installs, CI, and `TOLOKA_SKIP_AUTO_UPDATE=1` also skip it. `TOLOKA_AUTO_UPDATE=0` turns it off for one command; `TOLOKA_AUTO_UPDATE=1` turns it on even when the setting is false.
84
+ `toloka login` verifies access against the platform before saving anything. A browser login is saved as a session file under `$TOLOKA_CLI_CREDENTIALS_DIR`, which defaults to `~/.toloka/cli/credentials/<auth-host>/<realm>/<client>.json`. When `TOLOKA_CREDENTIALS_FILE` points at an explicit credentials file, sessions go to a `browser-sessions` directory next to it instead, so that profile stays isolated. The platform choice, a stored API key, and local project aliases live in `$XDG_CONFIG_HOME/toloka/credentials.json`, which defaults to `~/.config/toloka/credentials.json`. Both are written with file mode `0600` in directories with mode `0700`. The legacy `~/.toloka/credentials.json` is still read when the new path has no file. `toloka logout` ends the browser session and deletes both files; it does not revoke an API key.
38
85
 
39
86
  Ordinary usage events (`sdk_cli_command_completed` / `sdk_cli_command_failed`) go to Toloka's PostHog project so we can see which commands run and which error classes they hit. Every failed command with an exception also emits a sanitized PostHog Error Tracking `$exception`; usage errors such as unknown commands or invalid flags do not. Command events contain only an allowlisted command classifier, duration, exit code, outcome or error code, optional HTTP status and server request ID, SDK and Bun versions, actor, and channel. Error Tracking receives the same bounded metadata plus a synthetic exception; raw arguments, flag values, environment variables, API keys, secret names, base URLs and hosts, local paths, project ids, error messages, stack traces, response bodies, and source context are not sent. GeoIP enrichment is disabled. Distinct id starts as a random UUID stored next to the credentials file. After a successful authenticated command, the CLI calls `GET /me` and aliases that UUID onto the platform user id without setting person properties. Set `TOLOKA_TELEMETRY=0` or `DO_NOT_TRACK=1` to disable capture. CI environments are disabled unless `TOLOKA_TELEMETRY=1`. The explicitly approved full-text `report` event is documented in [report](#report).
40
87
 
@@ -49,6 +96,8 @@ The root program accepts these flags before any command:
49
96
 
50
97
  Commands resolve the project root by walking up from the working directory until they find a `toloka.json` file. The CLI reports that directory on stderr when it differs from the working directory. Passing `--source-root` disables discovery. With no marker found, the working directory is used. `init` and `report` do not walk up: they use the working directory or `--source-root` only. The authentication commands `login`, `logout`, and `auth-status` do not need a project root.
51
98
 
99
+ The CLI colors its output only when standard output is a terminal. `NO_COLOR` with any value, or `TERM=dumb`, turns color off. `FORCE_COLOR` overrides the terminal detection in both directions: `FORCE_COLOR=0` turns color off even on a terminal, and any other value turns it on even when the output is piped.
100
+
52
101
  ## Errors and hints
53
102
 
54
103
  A failing command prints its message to stderr and exits `1`. Most messages are followed by a `Hint: …` line with the next command to run; messages that already spell out the remedy carry no hint. Platform failures print `Potato API request failed with status <code> (request id: <id>)`, the response body, and a status-based hint: `401`/`403` point at `toloka whoami` and `toloka login`, `404` at the selected project and the matching list command, `429` asks you to wait, and `5xx` asks you to retry and then send a report with `toloka report <report.md>`.
@@ -69,7 +118,7 @@ Resources may also expose specialized actions beyond the Base Actions, such as `
69
118
 
70
119
  ## version
71
120
 
72
- Print the SDK/CLI version. `toloka version --json` also prints build provenance: the build commit when the bytecode bundle recorded one, the install channel (`global-registry`, `linked`, or `project-local`), and the local package path for linked installs. `toloka -v` and `toloka --version` remain semver-only for scripts.
121
+ Print the SDK/CLI version. `toloka version --json` also prints build provenance: the build commit, the install channel (`native`, `global-registry`, `linked`, or `project-local`), the executable path for a native install, and the package path for a linked install. `toloka -v` and `toloka --version` remain semver-only for scripts.
73
122
 
74
123
  ```sh
75
124
  toloka version [--json]
@@ -108,38 +157,52 @@ toloka delivery-order list
108
157
 
109
158
  Prints `ID`, `NAME`, `STATUS`, and `CLIENT` columns. Empty output is `No delivery orders visible.`
110
159
 
160
+ ## audience
161
+
162
+ Inspect the global, read-only expert audience catalog: the values a node's `audienceAndPricing.audience` filter can use.
163
+
164
+ ```sh
165
+ toloka audience specialization list [--json]
166
+ ```
167
+
168
+ Lists every expert specialization (platform qualification) with `ID`, `NAME`, and `EXPERTS` columns, sorted by name. Copy `ID` into `qualificationId` and `NAME` into `value` of `audience.specializations.values[]`; never invent a `qualificationId`. `EXPERTS` is the number of ID-verified experts currently eligible for tasks who hold the specialization; it can be `0` while the id is still valid. Pass `--json` for the full array. Empty output is `No specializations available.`
169
+
111
170
  ## login
112
171
 
113
- Stores an API key for this machine after verifying it.
172
+ Signs in through the browser, or stores an API key, after verifying access.
114
173
 
115
174
  ```sh
116
175
  toloka login
176
+ toloka login --browser
177
+ toloka login --no-browser
117
178
  toloka login --api-key-stdin < key.txt
118
179
  ```
119
180
 
120
- The command explains how to generate an API key, prompts for it with masked input, and verifies it against the platform before saving. On success it prints `Authenticated against <base-url>: N project(s) visible.` and `Saved credentials to <path>.`
181
+ By default the command asks whether to sign in through the browser or with an API key. The browser choice opens a local page in the system browser where you continue with Google or Microsoft, the same providers as the platform's own sign-in page (testing environments also offer email and password and the testing users), or follow the link to create a Toloka account first; the page hands you to the Toloka login page, a one-time loopback redirect returns the result to the CLI, and the CLI verifies access by listing projects before saving anything. On success it prints `Logged in to <base-url> as <email>`, then the number of projects visible and when the session stops renewing. The session carries a short-lived access token that the CLI renews on its own; renewal stops 14 days after signing in, or after 8 days without use, and the next command asks you to run `toloka login` again. The session is a credential for the platform API only; it does not work against other Toloka services. `--browser` skips the question and goes straight to the browser flow, even when `TOLOKA_API_KEY` is set; coding agents and scripts that sign the user in should pass it. `--no-browser` does the same but prints the link instead of opening a browser. Set `BROWSER` to choose the browser command.
182
+
183
+ Browser login is available for `https://platform.toloka.ai` and the `*.platform.toloka-test.ai` environments. Without a terminal the command opens the chooser page directly and fails fast when no browser can be opened; automation uses an API key instead.
121
184
 
122
- Without a terminal there is no prompt. `--api-key-stdin` reads the key from standard input, so it never appears in shell history or the process list; `--api-key <key>` and `TOLOKA_API_KEY` also work but expose the key to both.
185
+ The API key choice does not expire: the key works until it is deleted in the Business Console, which suits scripts, CI, and coding agents. Choosing it asks for the key with masked input; `--api-key-stdin` reads it from standard input instead, so it never appears in shell history or the process list; `--api-key <key>` and `TOLOKA_API_KEY` also work but expose the key to both. Platforms without a known login service go straight to the API key prompt. The command verifies the key and prints `Authenticated against <base-url> with an API key`, then the number of projects visible, where the key is stored, and a reminder that the key does not expire until you delete it in the Business Console.
123
186
 
124
187
  ## logout
125
188
 
126
- Removes stored credentials from this machine.
189
+ Ends the browser login and removes stored credentials from this machine.
127
190
 
128
191
  ```sh
129
192
  toloka logout
130
193
  ```
131
194
 
132
- On success it prints `Removed <paths>.` and notes that the key is not revoked. When nothing is stored, it prints `No stored credentials found at <path>.`
195
+ On success it prints `Removed <paths>.`; after a browser login it also ends every stored browser session (production and testing) at the login service, and after an API-key login it notes that the key is not revoked. When nothing is stored, it prints `No stored credentials found at <path>.`
133
196
 
134
197
  ## auth-status
135
198
 
136
- Shows which platform and key the CLI would use. Alias: `whoami`.
199
+ Shows which platform and login the CLI would use. Alias: `whoami`.
137
200
 
138
201
  ```sh
139
202
  toloka auth-status [--show-token]
140
203
  ```
141
204
 
142
- On success it prints the platform URL with its source, the API key masked unless `--show-token` is passed, the selected project, `Reachable: N project(s) visible.`, `Internal: true` or `Internal: false` for the account, and a `Teams:` line that marks each team `(internal)` and `(read-only)` where that applies. The project line is printed even when the probe fails. It exits `1` when no key is in effect, when the platform rejects the key (`Rejected: …`, followed by the advice to run `toloka login`), when the platform does not answer (`Not reachable: …`; the key was not evaluated), or when the platform fails (`Platform error: …`).
205
+ On success it prints the platform URL with its source, then either the masked API key or a `Login:` line for the browser session and a `Session:` line with the current refresh window, then the selected project, `Reachable: N project(s) visible.`, `Account:` with the email the platform reports, `Internal: true` or `Internal: false` for the account, and a `Teams:` line that marks each team `(internal)` and `(read-only)` where that applies. The project line is printed even when the probe fails. `--show-token` prints the full API key or the browser session's live access token instead of the mask; pass it only when you need the raw value on this terminal. It exits `1` when no login is in effect, when the browser session has expired, when the platform rejects the login (`Rejected: …`, followed by the advice to run `toloka login`), when the platform does not answer (`Not reachable: …`; the login was not evaluated), or when the platform fails (`Platform error: …`).
143
206
 
144
207
  ## config
145
208
 
@@ -294,8 +357,8 @@ Create a reusable Training draft, price it, and run it.
294
357
  ```sh
295
358
  toloka training list [--json]
296
359
  toloka training get <name-or-id> [--json]
297
- toloka training create <name> [--method sft|gisting] (--base-model <id> | --model-version <id>) --dataset <id> [--train-filter field=value] [--validation-dataset <id> [--validation-filter field=value]] [--prompt-file <path>] [--lora-rank 8|16|32 | --gist-tokens 8|32|64] [--epochs 1..5] [--learning-rate <rate>] [--batch-size 8|16|32|64] [--max-sequence-length <tokens>] [--json]
298
- toloka training update <name-or-id> [--base-model <id> | --model-version <id>] [--dataset <id>] [--train-filter field=value] [--validation-dataset <id> [--validation-filter field=value]] [--prompt-file <path>] [--lora-rank 8|16|32 | --gist-tokens 8|32|64] [--epochs 1..5] [--learning-rate <rate>] [--batch-size 8|16|32|64] [--max-sequence-length <tokens>] [--json]
360
+ toloka training create <name> [--method sft|gisting] (--base-model <id> | --model-version <id>) --dataset <id> [--train-filter field=value] [--validation-dataset <id> [--validation-filter field=value]] [--prompt-file <path>] [--lora-rank 8|16|32 | --gist-tokens 8|32|64|1/4|1/8|1/16|1/32] [--epochs 1..5] [--learning-rate <rate>] [--batch-size 8|16|32|64] [--max-sequence-length <tokens>] [--json]
361
+ toloka training update <name-or-id> [--base-model <id> | --model-version <id>] [--dataset <id>] [--train-filter field=value] [--validation-dataset <id> [--validation-filter field=value]] [--prompt-file <path>] [--lora-rank 8|16|32 | --gist-tokens 8|32|64|1/4|1/8|1/16|1/32] [--epochs 1..5] [--learning-rate <rate>] [--batch-size 8|16|32|64] [--max-sequence-length <tokens>] [--json]
299
362
  toloka training cost <name-or-id> [--idempotency-key <key>] [--json]
300
363
  toloka training run <name-or-id> [--estimate-file <path>] [--version-name <name>] [--idempotency-key <key>] [--json]
301
364
  toloka training runs <name-or-id> [--json]
@@ -306,7 +369,7 @@ toloka training logs <training-run-id>
306
369
  toloka training metrics <training-run-id> [--key <metric>] [--resolution <n>] [--json]
307
370
  ```
308
371
 
309
- Hyperparameters are optional flags on `training create` and `training update`: `--epochs 1..5` (default 3), `--learning-rate` (SFT 0.00001–0.001, default 0.00015; gisting 0.001–0.3, default 0.03), `--batch-size 8|16|32|64` (default 8; sequences per optimizer step across all GPUs) and `--max-sequence-length 64..16384` (default 12288 for SFT, 3072 for gisting) apply to both methods; `--lora-rank 8|16|32` (default 16) is SFT-only and `--gist-tokens 8|32|64` (default 32) is gisting-only — passing one to the other method fails before any request. `--regime` and `--eval-steps` no longer exist. `training update` has no `--method` flag: the method stays as created, and every flag you omit keeps its current value. `training cost` is blocked when the longest example exceeds `--max-sequence-length` or when the training selection leaves fewer rows than `--batch-size` after the 10% holdout. `training get` prints the resolved recipe, so omitted flags are visible as their defaults.
372
+ Hyperparameters are optional flags on `training create` and `training update`: `--epochs 1..5` (default 3), `--learning-rate` (SFT 0.00001–0.001, default 0.00015; gisting 0.001–0.3, default 0.03), `--batch-size 8|16|32|64` (default 8; sequences per optimizer step across all GPUs) and `--max-sequence-length 64..16384` (default 12288 for SFT, 3072 for gisting) apply to both methods; `--lora-rank 8|16|32` (default 16) is SFT-only and `--gist-tokens` (default 32) is gisting-only — passing one to the other method fails before any request. `--gist-tokens` takes an absolute count `8|32|64` or a fraction of the prompt being compressed (`1/4`, `1/8`, `1/16`, `1/32`), which the run resolves to `ceil(prompt tokens / N)` clamped to 8..256. `--regime` and `--eval-steps` no longer exist. `training update` has no `--method` flag: the method stays as created, and every flag you omit keeps its current value. `training cost` is blocked when the longest example exceeds `--max-sequence-length` or when the training selection leaves fewer rows than `--batch-size` after the 10% holdout. `training get` prints the resolved recipe, so omitted flags are visible as their defaults.
310
373
 
311
374
  ## dataset
312
375
 
@@ -362,7 +425,7 @@ toloka skill install <skillId> [--force]
362
425
 
363
426
  After an SDK upgrade `list` reports installed skills whose catalog digest changed as `stale` until they are refreshed with `install --force`. Local edits to an installed skill also make it `stale`; `list` and `search` never modify local files.
364
427
 
365
- The catalog is bound to the installed package version, so a skill that a newer release ships is simply absent from an older CLI. `install` then exits 1, names the missing skill and installed package version, and creates nothing. Run `toloka skill list` to see the available skills. To get the current supported catalog, update with `bun add --global @toloka-platform/sdk@latest` and retry.
428
+ The catalog is bound to the installed CLI version, so a skill that a newer release ships is absent from an older CLI. `install` then exits 1, names the missing skill and installed version, and creates nothing. Run `toloka skill list` to see the available skills. To get the current supported catalog, rerun the CLI installer and retry.
366
429
 
367
430
  ## Exit codes
368
431
 
@@ -4,16 +4,17 @@ Install the SDK, sign in, and get a pipeline project reconciling from source in
4
4
 
5
5
  ## Install
6
6
 
7
- Install the bytecode-cached CLI globally and declare the stable SDK in the project:
7
+ Install the CLI, then add the SDK for pipeline authoring:
8
8
 
9
9
  ```sh
10
10
  curl -fsSL https://platform.toloka.ai/cli/install.sh | sh
11
11
  bun add @toloka-platform/sdk@latest
12
+ toloka --version
12
13
  ```
13
14
 
14
- The installer requires Bun 1.4.0 or newer, installs `@toloka-platform/sdk` globally, and exposes `toloka` through Bun's global binary directory. The published CLI includes bytecode built with Bun 1.4.0; another Bun version runs the same bundled JavaScript without that cache and starts slower. The project install makes SDK imports resolvable.
15
+ **Bun is the recommended runtime and package manager for SDK development.** In an existing project, run `bun i` instead of adding dependencies again. The standalone CLI includes its runtime; Training-only workflows do not need the SDK.
15
16
 
16
- `latest` currently installs stable `0.2.0`, including Training commands and the bundled agent runbooks and skills. Use `bun add @toloka-platform/sdk@0.2.0` when you need an exact, reproducible project dependency.
17
+ The installer prefers compatible Bun and otherwise installs a standalone executable. Add the printed directory to `PATH` if prompted. See [CLI setup](./cli.md#install) for mode overrides and updates, and [Testing](./testing.md) for local test dependencies.
17
18
 
18
19
  ## Sign in
19
20
 
@@ -21,21 +22,22 @@ The installer requires Bun 1.4.0 or newer, installs `@toloka-platform/sdk` globa
21
22
  toloka login
22
23
  ```
23
24
 
24
- `login` explains where to generate an API key, prompts for it without echoing, verifies it against the platform, and only then stores it. A key that does not authenticate is never written to disk.
25
+ `login` asks whether to sign in through the browser or with an API key, opens a page in your browser where you pick the provider, verifies access against the platform, and only then stores the session. Nothing is written when the platform does not accept the account.
25
26
 
26
27
  ```
27
- API key: ******************
28
- Authenticated against https://platform.toloka.ai: 12 project(s) visible.
29
- Saved credentials to /Users/you/.config/toloka/credentials.json.
28
+ ? How do you want to sign in? Sign in with your browser
29
+ Waiting for the sign-in to finish in your browser... If no browser opened, run toloka login --no-browser to get a link.
30
+ ✔ Logged in to https://platform.toloka.ai as you@example.com
31
+ 12 projects visible · session renews automatically until 2026-09-25T10:00:00Z, then run toloka login again
30
32
  ```
31
33
 
32
- Check what the CLI will use at any time:
34
+ The session renews itself for up to 14 days; after that, run `toloka login` again. Check what the CLI will use at any time:
33
35
 
34
36
  ```sh
35
37
  toloka whoami
36
38
  ```
37
39
 
38
- CI does not need `login`. Set `TOLOKA_API_KEY` and the stored file is ignored. See the precedence table in the [CLI reference](./cli.md).
40
+ CI does not need `login`. Set `TOLOKA_API_KEY` and the stored login is ignored; an agent without a terminal can pipe a key to `toloka login --api-key-stdin`. See the precedence table in the [CLI reference](./cli.md).
39
41
 
40
42
  ## Start with an agent
41
43
 
@@ -4,6 +4,10 @@ Current constraints of the stable SDK, stated plainly so you can decide what to
4
4
 
5
5
  `@toloka-platform/sdk` `0.2.0` is the current stable release on `latest`. Because it is a `0.x` release, the authoring API, CLI surface, and generated source layout can change between minor versions. Use `latest` for the current supported release, or pin `@toloka-platform/sdk@0.2.0` for reproducible installs.
6
6
 
7
+ ## Native CLI availability
8
+
9
+ The standalone CLI supports macOS and glibc Linux on ARM64 and x64. Native Windows and musl Linux executables are not available yet. It includes its runtime, so running the CLI does not require Bun or Node.js. See [CLI installation](./cli.md#install).
10
+
7
11
  ## Local checks do not certify deployability
8
12
 
9
13
  `toloka check` is the required credential-free local gate. It runs project TypeScript, automatic Task UI typechecking, Vitest, and typed node and pipeline-flow coverage. `toloka apply` reruns it before any platform write.
@@ -19,6 +23,8 @@ The typed client can list, start, and poll Remote Node Checks. `toloka check` do
19
23
 
20
24
  Python code nodes have executable behavior checks but no useful static Python typecheck yet. Their generated `Inputs` and `Outputs` aliases are currently `dict[str, Any]`; adding Pyright or mypy before those aliases become field-derived `TypedDict` contracts would provide little protection.
21
25
 
26
+ The standalone CLI's runtime does not provide project test dependencies. Executable code-node tests need `python3` and their imported packages. Task UI tests need Playwright and its Chromium binary. See [Test pipelines locally](./testing.md#install-test-dependencies).
27
+
22
28
  ## Layout is not authored
23
29
 
24
30
  Node canvas positions are not part of authored source. Existing layout is preserved across applies and the server supplies defaults for new nodes. You cannot lay out a graph from code.
@@ -239,9 +239,9 @@ await task.close();
239
239
 
240
240
  ## Setup and execution
241
241
 
242
+ Install any missing test tools as described in [Test pipelines locally](./testing.md#install-test-dependencies). Then run:
243
+
242
244
  ```sh
243
- bun add --dev vitest playwright
244
- bunx playwright install chromium
245
245
  toloka check
246
246
  ```
247
247
 
package/docs/testing.md CHANGED
@@ -4,12 +4,20 @@ The `@toloka-platform/sdk/testing` entry point provides typed Vitest wrappers fo
4
4
 
5
5
  ## Install test dependencies
6
6
 
7
+ The standalone CLI includes its runtime, but project test runners and browser binaries remain project dependencies. Bun is the recommended runtime and package manager for SDK development. In an existing project, install its declared dependencies first:
8
+
9
+ ```sh
10
+ bun i
11
+ ```
12
+
13
+ When they are not already declared, add Vitest and Playwright and install Chromium:
14
+
7
15
  ```sh
8
- bun add --dev vitest playwright
16
+ bun add -d vitest playwright
9
17
  bunx playwright install chromium
10
18
  ```
11
19
 
12
- Code-node tests also require `python3` on the test machine. See [testing examples](./testing-examples.md) for parameterization, validation failures, hardware coverage, and cleanup patterns.
20
+ Executable code-node tests also require `python3` on the test machine, including any third-party Python packages imported by the authored program. Browser-backed Task UI tests use the separately downloaded Playwright Chromium binary and require network access to the hosted launcher. Training-only CLI workflows require none of these project test tools or a separate JavaScript runtime. See [testing examples](./testing-examples.md) for parameterization, validation failures, hardware coverage, and cleanup patterns.
13
21
 
14
22
  ## Test a code node
15
23
 
@@ -2,7 +2,11 @@
2
2
 
3
3
  The failures you will actually hit, what causes each, and the next step that works.
4
4
 
5
- Every entry here has been reproduced against a live platform. Where the right fix is on the platform side rather than yours, this page says so instead of suggesting a workaround that does not exist.
5
+ Platform behavior described here has been reproduced against a live platform. Installation entries describe the shipped installer and CLI. Where the right fix is platform-side rather than local, this page says so instead of suggesting a workaround that does not exist.
6
+
7
+ ## Installer succeeded but the shell runs an old CLI
8
+
9
+ Run `toloka version --json`. If it reports `"channel":"global-registry"` or an unexpected version or path, follow [Updates and migration from Bun global installs](./cli.md#updates-and-migration-from-bun-global-installs). Rerun the installer for an immediate update; there is no `toloka update` command.
6
10
 
7
11
  ## plan reports a change immediately after apply
8
12
 
@@ -89,11 +93,19 @@ toloka pipeline results <runId> --failed
89
93
  ## Missing credentials
90
94
 
91
95
  ```
92
- Missing API key. Run toloka login once to store credentials for this machine.
96
+ Not logged in. Run toloka login once to sign in through your browser on this machine:
97
+ ```
98
+
99
+ Run `toloka login`. Where a browser is not available, pipe an API key to `toloka login --api-key-stdin` or set `TOLOKA_API_KEY`. `toloka whoami` reports which platform and which login source is in effect, and exits non-zero when the platform is unreachable.
100
+
101
+ ## The browser login expired
102
+
103
+ ```
104
+ Your browser login for https://platform.toloka.ai has expired.
93
105
  ```
94
106
 
95
- Run `toloka login`. Where interactive login is not possible, pipe the key to `toloka login --api-key-stdin` or set `TOLOKA_API_KEY`. `toloka whoami` reports which platform and which key source is in effect, and exits non-zero when the platform is unreachable.
107
+ A browser session renews itself for up to 14 days after signing in, or 8 days without use. Run `toloka login` again.
96
108
 
97
109
  ## Authentication fails with a key you just generated
98
110
 
99
- Keys are scoped to the platform that issued them. A key from one platform's console will not authenticate against a different platform. `whoami` prints the base URL it is using; confirm it matches the console where the key was generated.
111
+ Keys are scoped to the platform that issued them. A key from one platform's console will not authenticate against a different platform. `whoami` prints the base URL it is using; confirm it matches the console where the key was generated. The same holds for browser logins: `ENV=prestable toloka login` signs in to the testing login service, and a production login does not serve prestable.
@@ -32,6 +32,8 @@ import type {
32
32
  GetTrainingRunLogsParams,
33
33
  GetTrainingRunMetricHistoryParams,
34
34
  ImportPipelineBody,
35
+ ListAudienceSpecializations200,
36
+ ListAudienceSpecializationsParams,
35
37
  ListBaseModels200,
36
38
  ListDatasetFields200,
37
39
  ListDatasetFieldsParams,
@@ -686,6 +688,34 @@ export const cancelTrainingRun = async (trainingRunId: TrainingRunId, options?:
686
688
 
687
689
 
688
690
 
691
+ export const getListAudienceSpecializationsUrl = (params?: ListAudienceSpecializationsParams,) => {
692
+ const normalizedParams = new URLSearchParams();
693
+
694
+ Object.entries(params || {}).forEach(([key, value]) => {
695
+
696
+ if (value !== undefined) {
697
+ normalizedParams.append(key, value === null ? 'null' : value.toString())
698
+ }
699
+ });
700
+
701
+ const stringifiedParams = normalizedParams.toString();
702
+
703
+ return stringifiedParams.length > 0 ? `/api/v2-beta/audience/specializations?${stringifiedParams}` : `/api/v2-beta/audience/specializations`
704
+ }
705
+
706
+ export const listAudienceSpecializations = async (params?: ListAudienceSpecializationsParams, options?: RequestInit): Promise<ListAudienceSpecializations200> => {
707
+
708
+ return potatoFetch<ListAudienceSpecializations200>(getListAudienceSpecializationsUrl(params),
709
+ {
710
+ ...options,
711
+ method: 'GET'
712
+
713
+
714
+ }
715
+ );}
716
+
717
+
718
+
689
719
  export const getGetCurrentUserUrl = () => {
690
720
 
691
721
 
@@ -1,2 +1,2 @@
1
1
 
2
- export type GistingTrainingConfigurationGistTokens = 8 | 32 | 64;
2
+ export type GistingTrainingConfigurationGistTokens = 8 | 32 | 64 | '1/4' | '1/8' | '1/16' | '1/32';
@@ -1,2 +1,2 @@
1
1
 
2
- export type GistingTrainingConfigurationInputGistTokens = 8 | 32 | 64;
2
+ export type GistingTrainingConfigurationInputGistTokens = 8 | 32 | 64 | '1/4' | '1/8' | '1/16' | '1/32';
@@ -280,6 +280,8 @@ export * from './jsonSchema';
280
280
  export * from './jsonSchemaAdditionalProperties';
281
281
  export * from './jsonSchemaType';
282
282
  export * from './jsonSchemaTypeAnyOfItem';
283
+ export * from './listAudienceSpecializations200';
284
+ export * from './listAudienceSpecializationsParams';
283
285
  export * from './listBaseModels200';
284
286
  export * from './listDatasetFields200';
285
287
  export * from './listDatasetFieldsParams';
@@ -829,6 +831,7 @@ export * from './sftTrainingConfigurationInput';
829
831
  export * from './sftTrainingConfigurationInputBatchSize';
830
832
  export * from './sftTrainingConfigurationInputLoraRank';
831
833
  export * from './sftTrainingConfigurationLoraRank';
834
+ export * from './specialization';
832
835
  export * from './training';
833
836
  export * from './trainingArchivedAt';
834
837
  export * from './trainingConfiguration';
@@ -0,0 +1,7 @@
1
+ import type { Specialization } from './specialization';
2
+ import type { Pagination } from './pagination';
3
+
4
+ export type ListAudienceSpecializations200 = {
5
+ specializations: Specialization[];
6
+ pagination: Pagination;
7
+ };
@@ -0,0 +1,5 @@
1
+
2
+ export type ListAudienceSpecializationsParams = {
3
+ limit?: number;
4
+ offset?: number;
5
+ };
@@ -0,0 +1,6 @@
1
+
2
+ export interface Specialization {
3
+ id: string;
4
+ name: string;
5
+ expertsCount: number;
6
+ }
@@ -15,8 +15,6 @@ export type TrainingCostEstimateOneOfTwoseven = {
15
15
  status: 'ready';
16
16
  issues: TrainingCostEstimateOneOfTwosevenIssuesItem[];
17
17
  budget: TrainingCostEstimateOneOfTwosevenBudget;
18
- basePricePerGpuHour: string;
19
- marginMultiplier: string;
20
18
  maximumCharge: string;
21
19
  currency: 'USD';
22
20
  fingerprint: string;
@@ -10,8 +10,6 @@ export type TrainingRunQuote = {
10
10
  pricingVersion: string;
11
11
  calculatedAt: string;
12
12
  budget: TrainingRunQuoteBudget;
13
- basePricePerGpuHour: string;
14
- marginMultiplier: string;
15
13
  maximumCharge: string;
16
14
  currency: 'USD';
17
15
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@toloka-platform/sdk",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "private": false,
5
5
  "description": "Build, inspect, and operate Toloka pipeline projects as TypeScript source. The public API may change between minor versions before 1.0.",
6
6
  "license": "Apache-2.0",
@@ -11,8 +11,8 @@
11
11
  "testing",
12
12
  "checks"
13
13
  ],
14
- "version": "0.2.0",
15
- "digest": "d1475f85dad9f81a8a0321778466ca21e2c93f04094f402a4ad83ac92641b99c",
14
+ "version": "0.3.0",
15
+ "digest": "c5433bf9639a469672ae24f9edcb05b091f83c3c451ed83400dba86027c4b88f",
16
16
  "files": [
17
17
  "SKILL.md",
18
18
  "references/node-semantics.md",
@@ -29,8 +29,8 @@
29
29
  "bug",
30
30
  "report"
31
31
  ],
32
- "version": "0.2.0",
33
- "digest": "56a0c283649052c85ba882f05d4a996bd98bf1bc011bc7a70af234b3664057d6",
32
+ "version": "0.3.0",
33
+ "digest": "70f0bd2c80b32f87896aeb27c363b8a2d37f40e22424f57fe1aad142e125ad67",
34
34
  "files": [
35
35
  "SKILL.md",
36
36
  "references/report-template.md"
@@ -46,8 +46,8 @@
46
46
  "getting-started",
47
47
  "agent"
48
48
  ],
49
- "version": "0.2.0",
50
- "digest": "61a3cf60f0b7d00e48c9663ed6e0e3d77fd3923e528cee52e16ef6e2ccebae69",
49
+ "version": "0.3.0",
50
+ "digest": "ccf148c682de4e452bb031db95d3933257899006b1766f0fdbc3d15265a63bb9",
51
51
  "files": [
52
52
  "SKILL.md"
53
53
  ]
@@ -63,8 +63,8 @@
63
63
  "sft",
64
64
  "models"
65
65
  ],
66
- "version": "0.2.0",
67
- "digest": "ee961e8daea643998b00918055214316e27ab99b43c1015c0af24f86deb97502",
66
+ "version": "0.3.0",
67
+ "digest": "eeea5c38f65319b8d825be951094fbd00354dc5b990bdca383c1006e84c825e9",
68
68
  "files": [
69
69
  "SKILL.md"
70
70
  ]
@@ -80,8 +80,8 @@
80
80
  "prompt",
81
81
  "models"
82
82
  ],
83
- "version": "0.2.0",
84
- "digest": "2dd5dc9aef29c7f2840b1047ac2c03d4f096bfdba62db72e848c4051b5481bed",
83
+ "version": "0.3.0",
84
+ "digest": "766a4029b344469d2df97fbd5f607d4dcbbae5f1e6ab209cea65825f64cdf6f4",
85
85
  "files": [
86
86
  "SKILL.md"
87
87
  ]
@@ -102,12 +102,15 @@ Register code behavior with `test.code(pipeline, node, name, callback)` and exec
102
102
 
103
103
  ## Credentials
104
104
 
105
- `toloka login` verifies an API key and stores it with owner-only permissions, so no later command needs
106
- `--api-key`. Precedence is flag, then environment variable (`TOLOKA_API_KEY`, `TOLOKA_BASE_URL`), then
107
- that file. `toloka auth-status` reports what is in effect and where it came from; `toloka logout`
108
- removes it. If credentials are missing, ask the user to run `toloka login` in their terminal; never request a key in chat.
105
+ `toloka login` signs the user in through the browser, or stores an API key when they choose that, and
106
+ keeps the login with owner-only permissions, so no later command needs `--api-key`. Precedence is flag,
107
+ then environment variable (`TOLOKA_API_KEY`, `TOLOKA_BASE_URL`), then the stored API key, then the
108
+ browser session. `toloka auth-status` reports what is in effect and where it came from; `toloka logout`
109
+ ends the browser session and removes the stored files. If credentials are missing, run `toloka login --browser`
110
+ yourself: it opens the sign-in page in the user's browser and waits, so ask the user to pick their
111
+ provider and finish signing in there. Never request a key in chat.
109
112
  Anonymous command telemetry is on by default; set `TOLOKA_TELEMETRY=0` or `DO_NOT_TRACK=1` to disable it.
110
- A globally installed CLI auto-updates by default; turn that off with `toloka config set auto-update false`.
113
+ Standalone and Bun-global CLI installations check for eligible public releases at most daily; turn that off with `toloka config set auto-update false`. See [workflow and CLI recipes](references/workflow-and-cli.md) for manual updates, installer overrides, and version-pin behavior.
111
114
 
112
115
  ## Recover from expected failures
113
116
 
@@ -164,7 +164,7 @@ Keep `instruction` actionable and in English. Include the workflow, concepts, qu
164
164
 
165
165
  #### Audience and pricing
166
166
 
167
- For humans, set `audienceType: 'human'`, `verifiedExperts`, all three audience filters, `pricePerTask`, and `timeForTask`. The public shapes differ by filter: languages use `{ type: 'and' | 'or', values: [{ value: 'English' }] }`; specializations use `{ type: 'and' | 'or', values: [{ value, qualificationId }] }`; countries use ISO 3166-1 alpha-2 codes, for example `{ type: 'or', values: ['US'] }`. Verify every country value matches `/^[A-Z]{2}$/`; apply currently accepts arbitrary strings that can match no experts. Derive languages and expertise from the task and its inputs, leaving specialization and country filters unrestricted unless needed. English is a reasonable starting language for an English-language task, not a universal audience default. Ask when an unresolved audience requirement changes who can do the work. Do not put specializations on an unverified audience. A specialization's `qualificationId` is platform identity: preserve an imported value, and do not invent one when the SDK cannot discover it.
167
+ For humans, set `audienceType: 'human'`, `verifiedExperts`, all three audience filters, `pricePerTask`, and `timeForTask`. The public shapes differ by filter: languages use `{ type: 'and' | 'or', values: [{ value: 'English' }] }`; specializations use `{ type: 'and' | 'or', values: [{ value, qualificationId }] }`; countries use ISO 3166-1 alpha-2 codes, for example `{ type: 'or', values: ['US'] }`. Verify every country value matches `/^[A-Z]{2}$/`; apply currently accepts arbitrary strings that can match no experts. Derive languages and expertise from the task and its inputs, leaving specialization and country filters unrestricted unless needed. English is a reasonable starting language for an English-language task, not a universal audience default. Ask when an unresolved audience requirement changes who can do the work. Do not put specializations on an unverified audience. A specialization's `qualificationId` is platform identity: preserve an imported value, and discover new ones with `toloka audience specialization list`, copying `ID` into `qualificationId` and `NAME` into `value`; never invent one.
168
168
 
169
169
  `$0.20` and 120 seconds are a starting point for a short task, not a universal rate. Estimate effort from the work and required expertise, respect explicit rates, and explain meaningful adjustments in the cost forecast. The per-expert cap is normally off. For collection tasks, choose a cap based on contributor diversity and repetition requirements; 1 fits one-response-per-expert collection. Avoid copying an arbitrary cap into a task that does not need one.
170
170
 
@@ -281,7 +281,7 @@ Ordering is semantic: `conditions[0]` routes to `matched(0)`, the first true con
281
281
 
282
282
  When the requirement depends on one of these capabilities, state the gap instead of inventing source syntax:
283
283
 
284
- - Audience discovery and validation helpers have no SDK or CLI path: valid-language/country/specialization suggestions, audience-size statistics, and recommended-rate calculation.
284
+ - Audience discovery beyond specializations has no SDK or CLI path: valid-language/country suggestions, audience-size statistics for a composed filter, and recommended-rate calculation. Specializations and their expert counts come from `toloka audience specialization list`.
285
285
  - Audience-reuse candidate discovery has no SDK or CLI path. Source can store a known cross-pipeline pointer, but cannot search candidates.
286
286
  - Smart Search rendering, source-fingerprint computation, and stale-profile diagnosis have no SDK or CLI path. Source can carry the public profile; it cannot generate the server-owned fingerprint or preview rendered sourcing documents.
287
287
  - The `@toloka-platform/sdk/testing` entry point provides typed `test.code`, `test.ui`, and `test.pipeline` wrappers. `toloka check` runs their evidence with project TypeScript and automatic Task UI typechecking. Missing Remote Node Checks remain separate from this local gate.