@evolvingmachines/evolve 0.0.65 → 0.0.66
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/dist/{chunk-DK2MGUPB.js → chunk-RFLMRPGK.js} +5 -5
- package/dist/cli/index.cjs +39 -39
- package/dist/cli/index.d.cts +3 -3
- package/dist/cli/index.d.ts +3 -3
- package/dist/cli/index.js +30 -30
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +1 -1
- package/dist/{types-B_qmzlMk.d.cts → types-84M4J_Vm.d.cts} +11 -44
- package/dist/{types-B_qmzlMk.d.ts → types-84M4J_Vm.d.ts} +11 -44
- package/package.json +4 -4
- package/skills/create-adapter/SKILL.md +71 -26
- package/skills/create-task/SKILL.md +124 -66
- package/skills/evolve/SKILL.md +37 -20
- package/skills/evolve-evals/SKILL.md +142 -69
- package/skills/evolve-evals/references/cli-reference/agent.md +76 -0
- package/skills/evolve-evals/references/cli-reference/analysis.md +78 -0
- package/skills/evolve-evals/references/cli-reference/analyze.md +95 -0
- package/skills/evolve-evals/references/cli-reference/auth.md +96 -0
- package/skills/evolve-evals/references/cli-reference/check.md +156 -0
- package/skills/evolve-evals/references/cli-reference/dataset.md +154 -0
- package/skills/evolve-evals/references/cli-reference/filesystem.md +168 -0
- package/skills/evolve-evals/references/cli-reference/index.md +149 -0
- package/skills/evolve-evals/references/cli-reference/job.md +198 -0
- package/skills/evolve-evals/references/cli-reference/run.md +187 -0
- package/skills/evolve-evals/references/cli-reference/secrets.md +77 -0
- package/skills/evolve-evals/references/cli-reference/session.md +56 -0
- package/skills/evolve-evals/references/cli-reference/skill.md +52 -0
- package/skills/evolve-evals/references/cli-reference/skills.md +85 -0
- package/skills/evolve-evals/references/cli-reference/trial.md +115 -0
- package/skills/evolve-evals/references/cli-reference/upload.md +72 -0
- package/skills/evolve-evals/references/core-concepts/agents.md +96 -0
- package/skills/evolve-evals/references/core-concepts/analyze.md +143 -0
- package/skills/evolve-evals/references/core-concepts/check.md +116 -0
- package/skills/evolve-evals/references/core-concepts/compatibility.md +39 -0
- package/skills/evolve-evals/references/core-concepts/compose.md +103 -0
- package/skills/evolve-evals/references/core-concepts/datasets.md +234 -0
- package/skills/evolve-evals/references/core-concepts/index.md +52 -0
- package/skills/evolve-evals/references/core-concepts/jobs.md +223 -0
- package/skills/evolve-evals/references/core-concepts/models.md +73 -0
- package/skills/evolve-evals/references/core-concepts/multi-step.md +93 -0
- package/skills/evolve-evals/references/core-concepts/rewardkit.md +341 -0
- package/skills/evolve-evals/references/core-concepts/sandboxes.md +73 -0
- package/skills/evolve-evals/references/core-concepts/secrets.md +86 -0
- package/skills/evolve-evals/references/core-concepts/sharing.md +81 -0
- package/skills/evolve-evals/references/core-concepts/skills.md +100 -0
- package/skills/evolve-evals/references/core-concepts/task-config.md +169 -0
- package/skills/evolve-evals/references/core-concepts/task-environment.md +127 -0
- package/skills/evolve-evals/references/core-concepts/task-reference.md +191 -0
- package/skills/evolve-evals/references/core-concepts/task-verifiers.md +209 -0
- package/skills/evolve-evals/references/core-concepts/tasks.md +90 -0
- package/skills/evolve-evals/references/core-concepts/teams.md +128 -0
- package/skills/evolve-evals/references/core-concepts/trial-outputs.md +225 -0
- package/skills/evolve-evals/references/core-concepts/trials.md +129 -0
- package/skills/evolve-evals/references/core-concepts/upload-sdk-session.md +240 -0
- package/skills/evolve-evals/references/core-concepts/upload.md +166 -0
- package/skills/evolve-evals/references/dashboard/checks.md +54 -0
- package/skills/evolve-evals/references/dashboard/datasets.md +65 -0
- package/skills/evolve-evals/references/dashboard/jobs.md +106 -0
- package/skills/evolve-evals/references/dashboard/traces.md +54 -0
- package/skills/evolve-evals/references/dashboard/trial-viewer.md +77 -0
- package/skills/evolve-evals/references/getting-started/first-task.md +228 -0
- package/skills/evolve-evals/references/getting-started/installation.md +79 -0
- package/skills/evolve-evals/references/getting-started/quick-start.md +100 -0
- package/skills/evolve-evals/references/index.md +58 -0
- package/skills/evolve-evals/references/sdk/http.md +110 -0
- package/skills/evolve-evals/references/sdk/python.md +108 -0
- package/skills/evolve-evals/references/sdk/typescript.md +104 -0
- package/skills/evolve-evals/references/sdk-reference/agents.md +75 -0
- package/skills/evolve-evals/references/sdk-reference/analyses.md +124 -0
- package/skills/evolve-evals/references/sdk-reference/auth.md +171 -0
- package/skills/evolve-evals/references/sdk-reference/checks.md +145 -0
- package/skills/evolve-evals/references/sdk-reference/datasets.md +170 -0
- package/skills/evolve-evals/references/sdk-reference/error-codes.md +231 -0
- package/skills/evolve-evals/references/sdk-reference/errors.md +98 -0
- package/skills/evolve-evals/references/sdk-reference/filesystem.md +166 -0
- package/skills/evolve-evals/references/sdk-reference/index.md +161 -0
- package/skills/evolve-evals/references/sdk-reference/jobs.md +250 -0
- package/skills/evolve-evals/references/sdk-reference/meta.md +54 -0
- package/skills/evolve-evals/references/sdk-reference/methods/agents.md +154 -0
- package/skills/evolve-evals/references/sdk-reference/methods/analyses.md +211 -0
- package/skills/evolve-evals/references/sdk-reference/methods/auth.md +257 -0
- package/skills/evolve-evals/references/sdk-reference/methods/checks.md +460 -0
- package/skills/evolve-evals/references/sdk-reference/methods/datasets.md +687 -0
- package/skills/evolve-evals/references/sdk-reference/methods/filesystem.md +527 -0
- package/skills/evolve-evals/references/sdk-reference/methods/jobs.md +1021 -0
- package/skills/evolve-evals/references/sdk-reference/methods/meta.md +209 -0
- package/skills/evolve-evals/references/sdk-reference/methods/secrets.md +157 -0
- package/skills/evolve-evals/references/sdk-reference/methods/skills.md +125 -0
- package/skills/evolve-evals/references/sdk-reference/methods/trials.md +371 -0
- package/skills/evolve-evals/references/sdk-reference/secrets.md +104 -0
- package/skills/evolve-evals/references/sdk-reference/skills.md +66 -0
- package/skills/evolve-evals/references/sdk-reference/trials.md +164 -0
- package/skills/evolve-evals/references/sdk-reference/types.md +1249 -0
- package/skills/publish/SKILL.md +103 -79
- package/skills/rewardkit/SKILL.md +78 -23
- package/spec/openapi.yaml +19 -74
- package/skills/evolve-evals/references/cli-reference/agent.mdx +0 -79
- package/skills/evolve-evals/references/cli-reference/analysis.mdx +0 -160
- package/skills/evolve-evals/references/cli-reference/analyze.mdx +0 -84
- package/skills/evolve-evals/references/cli-reference/auth.mdx +0 -133
- package/skills/evolve-evals/references/cli-reference/check.mdx +0 -263
- package/skills/evolve-evals/references/cli-reference/dataset.mdx +0 -151
- package/skills/evolve-evals/references/cli-reference/index.mdx +0 -108
- package/skills/evolve-evals/references/cli-reference/job.mdx +0 -278
- package/skills/evolve-evals/references/cli-reference/run.mdx +0 -204
- package/skills/evolve-evals/references/cli-reference/secrets.mdx +0 -95
- package/skills/evolve-evals/references/cli-reference/skill.mdx +0 -61
- package/skills/evolve-evals/references/cli-reference/skills.mdx +0 -81
- package/skills/evolve-evals/references/cli-reference/trial.mdx +0 -181
- package/skills/evolve-evals/references/cli-reference/upload.mdx +0 -36
- package/skills/evolve-evals/references/core-concepts/agents.mdx +0 -106
- package/skills/evolve-evals/references/core-concepts/analyze.mdx +0 -86
- package/skills/evolve-evals/references/core-concepts/check.mdx +0 -64
- package/skills/evolve-evals/references/core-concepts/datasets.mdx +0 -138
- package/skills/evolve-evals/references/core-concepts/index.mdx +0 -42
- package/skills/evolve-evals/references/core-concepts/jobs.mdx +0 -151
- package/skills/evolve-evals/references/core-concepts/models.mdx +0 -68
- package/skills/evolve-evals/references/core-concepts/sandboxes.mdx +0 -52
- package/skills/evolve-evals/references/core-concepts/secrets.mdx +0 -41
- package/skills/evolve-evals/references/core-concepts/sharing.mdx +0 -35
- package/skills/evolve-evals/references/core-concepts/skills.mdx +0 -42
- package/skills/evolve-evals/references/core-concepts/tasks.mdx +0 -216
- package/skills/evolve-evals/references/core-concepts/teams.mdx +0 -36
- package/skills/evolve-evals/references/core-concepts/trial-outputs.mdx +0 -117
- package/skills/evolve-evals/references/core-concepts/trials.mdx +0 -103
- package/skills/evolve-evals/references/core-concepts/upload.mdx +0 -93
- package/skills/evolve-evals/references/dashboard/checks.mdx +0 -21
- package/skills/evolve-evals/references/dashboard/datasets.mdx +0 -24
- package/skills/evolve-evals/references/dashboard/jobs.mdx +0 -65
- package/skills/evolve-evals/references/dashboard/traces.mdx +0 -17
- package/skills/evolve-evals/references/dashboard/trial-viewer.mdx +0 -30
- package/skills/evolve-evals/references/getting-started/installation.mdx +0 -56
- package/skills/evolve-evals/references/getting-started/quick-start.mdx +0 -94
- package/skills/evolve-evals/references/index.mdx +0 -48
- package/skills/evolve-evals/references/sdk/python.mdx +0 -161
- package/skills/evolve-evals/references/sdk/typescript.mdx +0 -163
- package/skills/evolve-evals/references/sdk-reference/agents.mdx +0 -108
- package/skills/evolve-evals/references/sdk-reference/analyses.mdx +0 -222
- package/skills/evolve-evals/references/sdk-reference/auth.mdx +0 -116
- package/skills/evolve-evals/references/sdk-reference/checks.mdx +0 -300
- package/skills/evolve-evals/references/sdk-reference/datasets.mdx +0 -346
- package/skills/evolve-evals/references/sdk-reference/errors.mdx +0 -210
- package/skills/evolve-evals/references/sdk-reference/index.mdx +0 -60
- package/skills/evolve-evals/references/sdk-reference/jobs.mdx +0 -822
- package/skills/evolve-evals/references/sdk-reference/meta.mdx +0 -52
- package/skills/evolve-evals/references/sdk-reference/skills.mdx +0 -69
- package/skills/evolve-evals/references/sdk-reference/trials.mdx +0 -302
- package/skills/evolve-evals/references/sdk-reference/types.mdx +0 -274
- package/skills/evolve-evals/references/snippets/global-options.mdx +0 -13
- package/skills/evolve-evals/references/snippets/list-flags.mdx +0 -23
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Trials methods"
|
|
3
|
+
description: "Read attempts, traces, files, and actions by trial id."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use `trials()` to create `client`. Examples run inside an async context; ids name existing records. The [trial guide](/sdk-reference/trials) shows the full inspection workflow.
|
|
7
|
+
|
|
8
|
+
| Read | Act |
|
|
9
|
+
| --- | --- |
|
|
10
|
+
| [get](#get), [trace](#trace), [traceEvents](#traceevents) | [retry](#retry), [regrade](#regrade), [stop](#stop) |
|
|
11
|
+
| [files](#files), [file](#file), [artifact](#artifact), [filesystem](#filesystem) | |
|
|
12
|
+
|
|
13
|
+
## get
|
|
14
|
+
|
|
15
|
+
Read one attempt by its globally unique id. Returns `Trial`, including `job_id` and the untruncated exception message.
|
|
16
|
+
|
|
17
|
+
### Signature
|
|
18
|
+
|
|
19
|
+
```ts TypeScript signature
|
|
20
|
+
get(trialId: string): Promise<Trial>;
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```python Python signature
|
|
24
|
+
async def get(trial_id: str) -> Trial: ...
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
```ts TypeScript
|
|
28
|
+
const trial = await client.get(trialId);
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```python Python
|
|
32
|
+
trial = await client.get(trial_id)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
See [trial fields](/sdk-reference/types#trial-fields) for rewards, usage, retries, timing, and provenance.
|
|
36
|
+
|
|
37
|
+
## trace
|
|
38
|
+
|
|
39
|
+
Read one page of parsed events. Returns `TraceEventPage`.
|
|
40
|
+
|
|
41
|
+
### Signature
|
|
42
|
+
|
|
43
|
+
```ts TypeScript signature
|
|
44
|
+
trace(
|
|
45
|
+
trialId: string,
|
|
46
|
+
options?: TraceOptions
|
|
47
|
+
): Promise<TraceEventPage>;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
```python Python signature
|
|
51
|
+
async def trace(
|
|
52
|
+
trial_id: str,
|
|
53
|
+
*,
|
|
54
|
+
cursor: Optional[str] = None,
|
|
55
|
+
limit: Optional[int] = None,
|
|
56
|
+
type: Optional[str] = None,
|
|
57
|
+
grep: Optional[str] = None,
|
|
58
|
+
tail: Optional[int] = None,
|
|
59
|
+
) -> TraceEventPage: ...
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
```ts TypeScript
|
|
63
|
+
const page = await client.trace(trialId, {
|
|
64
|
+
tail: 20
|
|
65
|
+
});
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
```python Python
|
|
69
|
+
page = await client.trace(
|
|
70
|
+
trial_id,
|
|
71
|
+
tail=20,
|
|
72
|
+
)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
| Option | Meaning / default |
|
|
76
|
+
| --- | --- |
|
|
77
|
+
| `cursor` | Events strictly after this sequence number, passed as a string |
|
|
78
|
+
| `limit` | Events per page: default 200, maximum 1,000 |
|
|
79
|
+
| `type` | Exact event type |
|
|
80
|
+
| `grep` | Case-insensitive POSIX regular expression over type and content |
|
|
81
|
+
| `tail` | Last N matching events, still returned oldest first |
|
|
82
|
+
|
|
83
|
+
The page has `items`, `nextCursor`, `hasMore` / Python `next_cursor`, `has_more`. An event has `seq: number`, `type: string`, and `data: object`. A null next cursor means caught up. To poll again later, retain the last event’s `seq`.
|
|
84
|
+
|
|
85
|
+
## traceEvents
|
|
86
|
+
|
|
87
|
+
Python: `trace_events`. Iterate currently available parsed events across pages. It finishes when caught up; it is not a live subscription.
|
|
88
|
+
|
|
89
|
+
### Signature
|
|
90
|
+
|
|
91
|
+
```ts TypeScript signature
|
|
92
|
+
traceEvents(
|
|
93
|
+
trialId: string,
|
|
94
|
+
options?: TraceOptions
|
|
95
|
+
): AsyncIterableIterator<TraceEvent>;
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
```python Python signature
|
|
99
|
+
async def trace_events(
|
|
100
|
+
trial_id: str,
|
|
101
|
+
*,
|
|
102
|
+
cursor: Optional[str] = None,
|
|
103
|
+
limit: Optional[int] = None,
|
|
104
|
+
type: Optional[str] = None,
|
|
105
|
+
grep: Optional[str] = None,
|
|
106
|
+
tail: Optional[int] = None,
|
|
107
|
+
) -> AsyncIterator[TraceEvent]: ...
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts TypeScript
|
|
111
|
+
for await (const event of client.traceEvents(trialId)) {
|
|
112
|
+
console.log(event.seq, event.type);
|
|
113
|
+
}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```python Python
|
|
117
|
+
async for event in client.trace_events(trial_id):
|
|
118
|
+
print(event.seq, event.type)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Accepts the same `cursor`, `limit`, `type`, `grep`, and `tail` options as `trace`. Returns an async iterator of `TraceEvent`.
|
|
122
|
+
|
|
123
|
+
## files
|
|
124
|
+
|
|
125
|
+
List the stored trial tree by relative path. Returns one `TrialFilePage`, sorted by path.
|
|
126
|
+
|
|
127
|
+
### Signature
|
|
128
|
+
|
|
129
|
+
```ts TypeScript signature
|
|
130
|
+
files(
|
|
131
|
+
trialId: string,
|
|
132
|
+
options?: ListTrialFilesOptions
|
|
133
|
+
): Promise<TrialFilePage>;
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```python Python signature
|
|
137
|
+
async def files(
|
|
138
|
+
trial_id: str,
|
|
139
|
+
*,
|
|
140
|
+
cursor: Optional[str] = None,
|
|
141
|
+
limit: Optional[int] = None,
|
|
142
|
+
) -> TrialFilePage: ...
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```ts TypeScript
|
|
146
|
+
const page = await client.files(trialId, {
|
|
147
|
+
limit: 20
|
|
148
|
+
});
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```python Python
|
|
152
|
+
page = await client.files(
|
|
153
|
+
trial_id,
|
|
154
|
+
limit=20,
|
|
155
|
+
)
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Optional `limit` defaults to 200 (maximum 1,000); `cursor` continues the page. Each item contains `path: string` and `size_bytes: number`. An empty tree is a normal result.
|
|
159
|
+
|
|
160
|
+
## file
|
|
161
|
+
|
|
162
|
+
Read one path returned by `files`. Returns exact bytes: TypeScript `Buffer`, Python `bytes`.
|
|
163
|
+
|
|
164
|
+
### Signature
|
|
165
|
+
|
|
166
|
+
```ts TypeScript signature
|
|
167
|
+
file(
|
|
168
|
+
trialId: string,
|
|
169
|
+
path: string,
|
|
170
|
+
range?: TrialFileRange
|
|
171
|
+
): Promise<Buffer>;
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
```python Python signature
|
|
175
|
+
async def file(
|
|
176
|
+
trial_id: str,
|
|
177
|
+
path: str,
|
|
178
|
+
*,
|
|
179
|
+
start: Optional[int] = None,
|
|
180
|
+
end: Optional[int] = None,
|
|
181
|
+
suffix: Optional[int] = None,
|
|
182
|
+
) -> bytes: ...
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
```ts TypeScript
|
|
186
|
+
const bytes = await client.file(
|
|
187
|
+
trialId,
|
|
188
|
+
"agent/stderr.log",
|
|
189
|
+
{
|
|
190
|
+
suffix: 4096
|
|
191
|
+
}
|
|
192
|
+
);
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
```python Python
|
|
196
|
+
data = await client.file(
|
|
197
|
+
trial_id,
|
|
198
|
+
'agent/stderr.log',
|
|
199
|
+
suffix=4096,
|
|
200
|
+
)
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Optional byte range: `start` plus inclusive `end`, `start` through EOF, or `suffix` for the last N bytes. Do not combine `suffix` with `start` or `end`. TypeScript passes the range as the third object; Python uses keyword arguments. A missing path is a typed 404.
|
|
204
|
+
|
|
205
|
+
## artifact
|
|
206
|
+
|
|
207
|
+
Read a named stored artifact. Returns text, a path-to-text map, or null when nothing was stored.
|
|
208
|
+
|
|
209
|
+
### Signature
|
|
210
|
+
|
|
211
|
+
```ts TypeScript signature
|
|
212
|
+
artifact(
|
|
213
|
+
trialId: string,
|
|
214
|
+
stream: Exclude<TrialArtifactStream, "trace-parsed" | "agent-home" | "filesystem">
|
|
215
|
+
): Promise<string | null>;
|
|
216
|
+
artifact(
|
|
217
|
+
trialId: string,
|
|
218
|
+
stream: "agent-home"
|
|
219
|
+
): Promise<Record<string, string> | null>;
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
```python Python signature
|
|
223
|
+
async def artifact(
|
|
224
|
+
trial_id: str,
|
|
225
|
+
stream: Literal['trace-parsed', 'verifier', 'trace-stdout', 'trace-stderr', 'trace-atif', 'trajectory', 'agent-home', 'filesystem'],
|
|
226
|
+
) -> Optional[Union[str, Dict[str, str]]]: ...
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
```ts TypeScript
|
|
230
|
+
const trajectory = await client.artifact(
|
|
231
|
+
trialId,
|
|
232
|
+
"trace-atif"
|
|
233
|
+
);
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
```python Python
|
|
237
|
+
trajectory = await client.artifact(
|
|
238
|
+
trial_id,
|
|
239
|
+
'trace-atif',
|
|
240
|
+
)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
| Selector | Result |
|
|
244
|
+
| --- | --- |
|
|
245
|
+
| `verifier`, `trace-stdout`, `trace-stderr` | `string \| null` / `str \| None` |
|
|
246
|
+
| `trace-atif` | ATIF v1.7 document as JSON text, or null |
|
|
247
|
+
| `agent-home` | Map of sandbox paths to UTF-8 file text, or null |
|
|
248
|
+
| `trajectory` | Reserved native-session selector; currently returns not-found |
|
|
249
|
+
|
|
250
|
+
Use `trace` for `trace-parsed`, and `filesystem(id).archive()` for `filesystem`. Python’s annotation lists these selectors, but `artifact` rejects both locally. Non-text home files are omitted from the text map and recorded in `/agent-home.json`; the job archive preserves their bytes.
|
|
251
|
+
|
|
252
|
+
## filesystem
|
|
253
|
+
|
|
254
|
+
Get a `RunFilesystem` client for this attempt. No request is made until you call a method on it.
|
|
255
|
+
|
|
256
|
+
### Signature
|
|
257
|
+
|
|
258
|
+
```ts TypeScript signature
|
|
259
|
+
filesystem(trialId: string): RunFilesystem;
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
```python Python signature
|
|
263
|
+
def filesystem(trial_id: str) -> 'RunFilesystem': ...
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
```ts TypeScript
|
|
267
|
+
const fs = client.filesystem(trialId);
|
|
268
|
+
const status = await fs.status();
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
```python Python
|
|
272
|
+
fs = client.filesystem(trial_id)
|
|
273
|
+
status = await fs.status()
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
See [every filesystem method](/sdk-reference/methods/filesystem), including live files, captured files, sandbox logs, and processes.
|
|
277
|
+
|
|
278
|
+
## retry
|
|
279
|
+
|
|
280
|
+
Run one settled attempt again in a new linked job. Returns `Job`; the source job may still be running.
|
|
281
|
+
|
|
282
|
+
### Signature
|
|
283
|
+
|
|
284
|
+
```ts TypeScript signature
|
|
285
|
+
retry(
|
|
286
|
+
trialId: string,
|
|
287
|
+
options?: StartJobOptions
|
|
288
|
+
): Promise<Job>;
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
```python Python signature
|
|
292
|
+
async def retry(
|
|
293
|
+
trial_id: str,
|
|
294
|
+
*,
|
|
295
|
+
idempotency_key: Optional[str] = None,
|
|
296
|
+
) -> Job: ...
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
```ts TypeScript
|
|
300
|
+
const job = await client.retry(trialId, {
|
|
301
|
+
idempotencyKey: requestId
|
|
302
|
+
});
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
```python Python
|
|
306
|
+
job = await client.retry(
|
|
307
|
+
trial_id,
|
|
308
|
+
idempotency_key=request_id,
|
|
309
|
+
)
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
Optional `idempotencyKey` / `idempotency_key` makes a repeated request return the same accepted job. This is the one-trial form of `jobs().retry`. Imported attempts cannot retry.
|
|
313
|
+
|
|
314
|
+
## regrade
|
|
315
|
+
|
|
316
|
+
Run only the verifier again against eligible recorded inputs. Returns a new one-trial `Job`.
|
|
317
|
+
|
|
318
|
+
### Signature
|
|
319
|
+
|
|
320
|
+
```ts TypeScript signature
|
|
321
|
+
regrade(trialId: string): Promise<Job>;
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
```python Python signature
|
|
325
|
+
async def regrade(trial_id: str) -> Job: ...
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
```ts TypeScript
|
|
329
|
+
const job = await client.regrade(trialId);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
```python Python
|
|
333
|
+
job = await client.regrade(trial_id)
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
The attempt must be settled and have retained inputs from separate verification. Shared-mode or pre-persistence trials are refused with `regrade_source_ineligible`; imported jobs are refused.
|
|
337
|
+
|
|
338
|
+
## stop
|
|
339
|
+
|
|
340
|
+
Stop selected in-flight trials or trace analyses owned by the caller. Returns `StopResponse`.
|
|
341
|
+
|
|
342
|
+
Pass 1–100 non-empty IDs in one call. The list can contain trial IDs, analysis IDs, or both.
|
|
343
|
+
|
|
344
|
+
### Signature
|
|
345
|
+
|
|
346
|
+
```ts TypeScript signature
|
|
347
|
+
stop(trialIds: string[]): Promise<StopResponse>;
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
```python Python signature
|
|
351
|
+
async def stop(trial_ids: List[str]) -> StopResponse: ...
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
```ts TypeScript
|
|
355
|
+
const result = await client.stop([trialId, analysisId]);
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
```python Python
|
|
359
|
+
result = await client.stop(
|
|
360
|
+
[trial_id, analysis_id],
|
|
361
|
+
)
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
| Returned field | Type / meaning |
|
|
365
|
+
| --- | --- |
|
|
366
|
+
| `stopped` | `Trial[]`: attempts settled by this request |
|
|
367
|
+
| `stopped_analyses` | `TrialAnalysis[]`: analyses settled as failed, phase `stopped` |
|
|
368
|
+
| `already_terminal` | `string[]`: untouched settled ids |
|
|
369
|
+
| `not_found` | `string[]`: missing ids or ids owned by someone else |
|
|
370
|
+
|
|
371
|
+
This does not cancel the whole job. Repeating the request is safe: terminal work stays unchanged.
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Secrets"
|
|
3
|
+
description: "Store a credential once, then attach it to evaluation jobs by name."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
[Method reference: calls, parameters, and response fields](/sdk-reference/methods/secrets).
|
|
7
|
+
|
|
8
|
+
Managed evals attach **direct** secrets: their values enter the task sandbox as environment variables. Stored values are write-only through the secrets API.
|
|
9
|
+
|
|
10
|
+
## Store a value
|
|
11
|
+
|
|
12
|
+
```ts TypeScript
|
|
13
|
+
import { managedSecrets } from "@evolvingmachines/evolve";
|
|
14
|
+
|
|
15
|
+
const store = managedSecrets();
|
|
16
|
+
await store.set({
|
|
17
|
+
name: "SERVICE_TOKEN",
|
|
18
|
+
value: process.env.SERVICE_TOKEN!,
|
|
19
|
+
delivery: "direct",
|
|
20
|
+
});
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
```python Python
|
|
24
|
+
import os
|
|
25
|
+
from evolve import managed_secrets
|
|
26
|
+
|
|
27
|
+
store = managed_secrets()
|
|
28
|
+
await store.set(
|
|
29
|
+
name="SERVICE_TOKEN",
|
|
30
|
+
value=os.environ["SERVICE_TOKEN"],
|
|
31
|
+
delivery="direct",
|
|
32
|
+
)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Set `SERVICE_TOKEN` in your process environment before running this example. A value may contain at most 190 UTF-8 bytes.
|
|
36
|
+
|
|
37
|
+
## Attach it to a job
|
|
38
|
+
|
|
39
|
+
Add a `secrets` list to the job creation input:
|
|
40
|
+
|
|
41
|
+
```ts TypeScript
|
|
42
|
+
const secrets = [{ name: "SERVICE_TOKEN", as: "APP_TOKEN" }];
|
|
43
|
+
// Pass secrets alongside datasets and agents in jobs().start(...).
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
```python Python
|
|
47
|
+
secrets = [{"name": "SERVICE_TOKEN", "as": "APP_TOKEN"}]
|
|
48
|
+
# Pass secrets=secrets alongside datasets and agents in jobs().start(...).
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| Field | Meaning |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `name` | Stored secret name |
|
|
54
|
+
| `label` | Optional labeled version |
|
|
55
|
+
| `as` | Optional environment variable name inside the sandbox; defaults to `name` |
|
|
56
|
+
|
|
57
|
+
Without a label, resolution chooses the `default` row, then the only row if exactly one exists. Multiple remaining labels produce an ambiguity error.
|
|
58
|
+
|
|
59
|
+
### Inline values
|
|
60
|
+
|
|
61
|
+
Job creation can store and attach a value in one request:
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"secrets": [{
|
|
66
|
+
"name": "SERVICE_TOKEN",
|
|
67
|
+
"value": "your-value",
|
|
68
|
+
"delivery": "direct"
|
|
69
|
+
}]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Optional `label` and `as` work here too. The value is stored as a secret; the job retains a reference. Restating the same identity/value is allowed. A different value under the same name/label is refused instead of silently replacing it.
|
|
74
|
+
|
|
75
|
+
## Manage stored secrets
|
|
76
|
+
|
|
77
|
+
| Action | TypeScript | Python | Returns |
|
|
78
|
+
| --- | --- | --- | --- |
|
|
79
|
+
| Read metadata | `list()` | `list()` | Secret metadata list |
|
|
80
|
+
| Store a value | `set(input)` | `set(name=..., value=..., delivery=..., ...)` | `created` / `updated` and metadata |
|
|
81
|
+
| Delete a labeled value | `delete({name, label})` | `delete(name=..., label=...)` | Deletion result |
|
|
82
|
+
|
|
83
|
+
`set` requires `name`, `value`, and `delivery`; `label` defaults to `default`. A different value under an existing identity returns `secret_exists`. To rotate, use another label or delete and set that identity.
|
|
84
|
+
|
|
85
|
+
The broader storage API also accepts `delivery: "brokered"`, with required host/path/method scope lists. Managed eval jobs cannot attach those secrets today. Direct delivery refuses those scoping options.
|
|
86
|
+
|
|
87
|
+
| Scoping option | TypeScript | Python |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| Hosts | `allowedHosts` | `allowed_hosts` |
|
|
90
|
+
| Path prefixes | `allowedPathPrefixes` | `allowed_path_prefixes` |
|
|
91
|
+
| HTTP methods | `allowedMethods` | `allowed_methods` |
|
|
92
|
+
|
|
93
|
+
## Configuration and errors
|
|
94
|
+
|
|
95
|
+
This factory uses its own configuration:
|
|
96
|
+
|
|
97
|
+
| Setting | TypeScript | Python |
|
|
98
|
+
| --- | --- | --- |
|
|
99
|
+
| API key | `apiKey` | `api_key` |
|
|
100
|
+
| Dashboard origin | `dashboardUrl` | `dashboard_url` |
|
|
101
|
+
|
|
102
|
+
Python wraps those fields in `ManagedSecretsClientConfig`. Defaults come from `EVOLVE_API_KEY` and `EVOLVE_DASHBOARD_URL` as usual.
|
|
103
|
+
|
|
104
|
+
Secret-client HTTP failures raise plain `Error` in TypeScript and `RuntimeError` in Python. They are not the hosted `EvolveApiError` / `EvolveAPIError` class.
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Uploaded skills"
|
|
3
|
+
description: "Store skill folders and attach them to evaluation agents."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
[Method reference: calls, parameters, and response fields](/sdk-reference/methods/skills).
|
|
7
|
+
|
|
8
|
+
`skills()` manages content mounted into an agent run. It is separate from `evolve skills`, which serves documentation to coding agents.
|
|
9
|
+
|
|
10
|
+
## Upload and attach
|
|
11
|
+
|
|
12
|
+
```text
|
|
13
|
+
my-skill/
|
|
14
|
+
├── SKILL.md
|
|
15
|
+
├── scripts/
|
|
16
|
+
└── references/
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
```ts TypeScript
|
|
20
|
+
import { skills, jobs } from "@evolvingmachines/evolve";
|
|
21
|
+
|
|
22
|
+
const [skill] = await skills().upload("./my-skill");
|
|
23
|
+
const job = await jobs().start({
|
|
24
|
+
datasets: [{ name: "harbor-examples", version: "1.0", task_names: ["hello-world"] }],
|
|
25
|
+
agents: [{ name: "codex", model_name: "gpt-5.6-luna", skills: [skill.ref] }],
|
|
26
|
+
max_trial_spend_usd: 0.50,
|
|
27
|
+
retry: { max_retries: 0 },
|
|
28
|
+
});
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```python Python
|
|
32
|
+
from evolve import skills, jobs
|
|
33
|
+
|
|
34
|
+
uploaded = await skills().upload("./my-skill")
|
|
35
|
+
skill = uploaded[0]
|
|
36
|
+
job = await jobs().start(
|
|
37
|
+
datasets=[{"name": "harbor-examples", "version": "1.0", "task_names": ["hello-world"]}],
|
|
38
|
+
agents=[{"name": "codex", "model_name": "gpt-5.6-luna", "skills": [skill.ref]}],
|
|
39
|
+
max_trial_spend_usd=0.50,
|
|
40
|
+
retry={"max_retries": 0},
|
|
41
|
+
)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Upload returns a list. A folder containing multiple child skill folders can create multiple records.
|
|
45
|
+
|
|
46
|
+
## Pick a reference
|
|
47
|
+
|
|
48
|
+
| Reference | Meaning |
|
|
49
|
+
| --- | --- |
|
|
50
|
+
| `upload:<id>` | This immutable uploaded content |
|
|
51
|
+
| `name:<skill-name>` | The name's current uploaded version, resolved when the job is created |
|
|
52
|
+
|
|
53
|
+
Uploading identical content under the same name reuses the record. New content creates a new record and moves the name reference. Existing jobs keep their recorded skill locks.
|
|
54
|
+
|
|
55
|
+
## Methods
|
|
56
|
+
|
|
57
|
+
| Action | TypeScript | Python | Returns |
|
|
58
|
+
| --- | --- | --- | --- |
|
|
59
|
+
| Upload a directory | `upload(directory, {org})` | `upload(directory, org=...)` | Skill list |
|
|
60
|
+
| List uploads | `list({scope, limit, cursor})` | `list(scope=..., limit=..., cursor=...)` | Paginated handle |
|
|
61
|
+
| Read content/metadata | `get(idOrNameRef)` | `get(id_or_name_ref)` | Skill metadata and `skill_md` |
|
|
62
|
+
| Delete an upload | `delete(id)` | `delete(id)` | No content |
|
|
63
|
+
|
|
64
|
+
`org` overrides the client default. List scopes are `my`, `shared`, and `org`. Team members can reference visible skills; only their owner can delete them. A skill used by a non-terminal job cannot be deleted.
|
|
65
|
+
|
|
66
|
+
The metadata includes `id`, `name`, `org`, `digest`, `size_bytes`, `description`, `ref`, and `created_at`. See [skill concepts](/core-concepts/skills) for git-backed references and mounting behavior.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Trials"
|
|
3
|
+
description: "Inspect one attempt, from its reward to its trace and files."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
**Note:**
|
|
7
|
+
|
|
8
|
+
For every method’s inputs, return values, and language differences, see the [trials method reference](/sdk-reference/methods/trials).
|
|
9
|
+
|
|
10
|
+
A trial is one task, one agent/model arm, and one attempt. Get its id from `jobs.trials(jobId)`; its record includes the parent `job_id`.
|
|
11
|
+
|
|
12
|
+
## Read the result
|
|
13
|
+
|
|
14
|
+
```ts TypeScript
|
|
15
|
+
import { trials } from "@evolvingmachines/evolve";
|
|
16
|
+
|
|
17
|
+
const client = trials();
|
|
18
|
+
const trial = await client.get(trialId);
|
|
19
|
+
console.log(trial.status, trial.reward, trial.exception_info);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
```python Python
|
|
23
|
+
from evolve import trials
|
|
24
|
+
|
|
25
|
+
client = trials()
|
|
26
|
+
trial = await client.get(trial_id)
|
|
27
|
+
print(trial.status, trial.reward, trial.exception_info)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
| Read | What it tells you |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `status`, `attempt_phase` | Whether it is waiting, running, scoring, or settled; the current execution phase |
|
|
33
|
+
| `reward`, `verifier_result` | Primary reward and the verifier's full rewards map |
|
|
34
|
+
| `exception_info` | Why a trial ended with an exception |
|
|
35
|
+
| `agent_info` | Harness, version, model, and effort |
|
|
36
|
+
| `usage`, `spend_source` | Metered usage and whether the reading is final |
|
|
37
|
+
| `analysis` | Latest trace-analysis result, when present |
|
|
38
|
+
| `sandbox_provider`, `sandbox_id` | Where it actually ran |
|
|
39
|
+
| `n_retries`, `retries` | Automatic retry history |
|
|
40
|
+
|
|
41
|
+
A reward of `0` is a scored result. A missing reward is not automatically zero. See [statuses and nullable values](/sdk-reference/types).
|
|
42
|
+
|
|
43
|
+
## Read the trace
|
|
44
|
+
|
|
45
|
+
```ts TypeScript
|
|
46
|
+
for await (const event of client.traceEvents(trialId)) {
|
|
47
|
+
console.log(event.seq, event.type, event.data);
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
```python Python
|
|
52
|
+
async for event in client.trace_events(trial_id):
|
|
53
|
+
print(event.seq, event.type, event.data)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
This drains stored events. It does not remain connected waiting for future events.
|
|
57
|
+
|
|
58
|
+
| Method | Returns |
|
|
59
|
+
| --- | --- |
|
|
60
|
+
| `trace(id, options)` | One page of `TraceEvent` records |
|
|
61
|
+
| `traceEvents(id, options)` / `trace_events(id, ...)` | Async iterator over matching stored events |
|
|
62
|
+
|
|
63
|
+
Both accept `cursor`, `limit`, `type`, `grep`, and `tail`. TypeScript uses one options object; Python uses keywords. `grep` is a case-insensitive POSIX regex over event type and content. `tail` selects the newest matching events; the server caps it at 10,000.
|
|
64
|
+
|
|
65
|
+
### Read per-call model usage
|
|
66
|
+
|
|
67
|
+
Use `gatewayUsageOf` / `gateway_usage_of` to find the gateway's token and cost readings. Other events, including the harness's own usage reports, return null / `None`.
|
|
68
|
+
|
|
69
|
+
```ts TypeScript
|
|
70
|
+
import { gatewayUsageOf, trials } from "@evolvingmachines/evolve";
|
|
71
|
+
|
|
72
|
+
for await (const event of trials().traceEvents(trialId)) {
|
|
73
|
+
const call = gatewayUsageOf(event);
|
|
74
|
+
if (call) console.log(call.callId, call.usage.costUsd);
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```python Python
|
|
79
|
+
from evolve import gateway_usage_of, trials
|
|
80
|
+
|
|
81
|
+
async for event in trials().trace_events(trial_id):
|
|
82
|
+
call = gateway_usage_of(event)
|
|
83
|
+
if call is not None:
|
|
84
|
+
print(call["callId"], call["usage"]["costUsd"])
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
| Field | Meaning |
|
|
88
|
+
| --- | --- |
|
|
89
|
+
| `promptTokens` | Input tokens, including cached and cache-written tokens |
|
|
90
|
+
| `completionTokens` | Output tokens |
|
|
91
|
+
| `cachedTokens` | Cached portion of input tokens |
|
|
92
|
+
| `costUsd` | Cost recorded by the gateway |
|
|
93
|
+
|
|
94
|
+
These fields live under `call.usage` / `call["usage"]`. Do not add the harness's usage to these readings: they describe the same run from different sources. Use the trial's `usage` for its aggregate reading.
|
|
95
|
+
|
|
96
|
+
## Read stored artifacts
|
|
97
|
+
|
|
98
|
+
```ts TypeScript
|
|
99
|
+
const atif = await client.artifact(trialId, "trace-atif");
|
|
100
|
+
const verifier = await client.artifact(trialId, "verifier");
|
|
101
|
+
const home = await client.artifact(trialId, "agent-home");
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```python Python
|
|
105
|
+
atif = await client.artifact(trial_id, "trace-atif")
|
|
106
|
+
verifier = await client.artifact(trial_id, "verifier")
|
|
107
|
+
home = await client.artifact(trial_id, "agent-home")
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
| Stream | Result |
|
|
111
|
+
| --- | --- |
|
|
112
|
+
| `trace-atif` | Normalized ATIF trajectory as JSON text |
|
|
113
|
+
| `trace-stdout` | Harness stdout |
|
|
114
|
+
| `trace-stderr` | Harness stderr |
|
|
115
|
+
| `verifier` | Verifier output |
|
|
116
|
+
| `agent-home` | Map of captured sandbox paths to text |
|
|
117
|
+
| `trajectory` | Reserved native-session selector; availability is not guaranteed |
|
|
118
|
+
|
|
119
|
+
Missing stored content returns null / `None`. `trace-parsed` belongs to `trace`; `filesystem` belongs to the [filesystem client](/sdk-reference/filesystem).
|
|
120
|
+
|
|
121
|
+
## Read individual files
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
Stored trial result tree
|
|
125
|
+
├── config.json
|
|
126
|
+
├── result.json
|
|
127
|
+
├── agent/
|
|
128
|
+
│ ├── trajectory.json
|
|
129
|
+
│ └── … harness output
|
|
130
|
+
├── verifier/
|
|
131
|
+
│ └── … verifier output
|
|
132
|
+
└── artifacts/
|
|
133
|
+
└── … collected files
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The actual files depend on what was produced and retained. Use `files()` to discover them.
|
|
137
|
+
|
|
138
|
+
```ts TypeScript
|
|
139
|
+
const page = await client.files(trialId, { limit: 200 });
|
|
140
|
+
const bytes = await client.file(trialId, "result.json");
|
|
141
|
+
const prefix = await client.file(trialId, "result.json", { start: 0, end: 1023 });
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
```python Python
|
|
145
|
+
page = await client.files(trial_id, limit=200)
|
|
146
|
+
content = await client.file(trial_id, "result.json")
|
|
147
|
+
prefix = await client.file(trial_id, "result.json", start=0, end=1023)
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
`files` accepts `limit` and `cursor`. `file` returns `Buffer` / `bytes`; byte ranges accept `start`, inclusive `end`, or `suffix` for the last N bytes. A suffix takes precedence.
|
|
151
|
+
|
|
152
|
+
These are stored result files. To browse sandbox paths, use `client.filesystem(trialId)` and the [filesystem methods](/sdk-reference/filesystem).
|
|
153
|
+
|
|
154
|
+
## Stop, retry, or regrade
|
|
155
|
+
|
|
156
|
+
| Action | TypeScript | Python | Returns |
|
|
157
|
+
| --- | --- | --- | --- |
|
|
158
|
+
| Stop selected runs | `stop([trialId])` | `stop([trial_id])` | Batch result |
|
|
159
|
+
| Run the attempt again | `retry(trialId, { idempotencyKey })` | `retry(trial_id, idempotency_key=...)` | New linked job |
|
|
160
|
+
| Re-run its eligible verifier | `regrade(trialId)` | `regrade(trial_id)` | New linked job |
|
|
161
|
+
|
|
162
|
+
`stop` accepts up to 100 trial or analysis ids. Its response separates `stopped`, `stopped_analyses`, `already_terminal`, and `not_found`. Check each group; one missing id does not erase the rest of the result.
|
|
163
|
+
|
|
164
|
+
Retry requires a settled trial. Regrade requires retained inputs from an eligible separate verifier. [Job operations](/sdk-reference/jobs#cancel-or-run-selected-work-again) describe the differences.
|