@deepraxis/sdk 0.1.1-dev.da4893e → 0.1.1-dev.daf2585

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/METHODS.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # SDK methods
2
2
 
3
- Generated by `bun run generate`. 525 HTTP operations, plus product aliases. Version segments and path parameters are omitted from resource names. Inputs use typed `{ path, query, body, headers }` options. Collections form nested resource objects; POST actions retain their verb. Naming rules are documented in `scripts/resources.ts`; semantic exceptions and aliases with reasons are in `scripts/naming-overrides.ts`.
3
+ Generated by `bun run generate`. 620 HTTP operations, plus product aliases. Version segments and path parameters are omitted from resource names. Inputs use typed `{ path, query, body, headers }` options. Collections form nested resource objects; POST actions retain their verb. Naming rules are documented in `scripts/resources.ts`; semantic exceptions and aliases with reasons are in `scripts/naming-overrides.ts`.
4
4
 
5
5
  `always` returns an AsyncIterable; `optional` streams with `{ stream: true }`; `yes` pagination returns a Page. Only `{ data, next_cursor }` + `cursor` query contracts are automatically paginated.
6
6
 
@@ -103,6 +103,12 @@ Multipart request bodies expand plain objects into bracketed fields (for example
103
103
  | list | GET | `/agent/v1/computers/{computer_id}/files` | no | no |
104
104
  | retrieveContent | GET | `/agent/v1/computers/{computer_id}/files/content` | no | no |
105
105
 
106
+ ### agent.computers.files.convert
107
+
108
+ | Method | HTTP | Path | Streaming | Pagination |
109
+ |---|---|---|---|---|
110
+ | create | POST | `/agent/v1/computers/{computer_id}/files/convert` | no | no |
111
+
106
112
  ### agent.computers.leases
107
113
 
108
114
  | Method | HTTP | Path | Streaming | Pagination |
@@ -576,6 +582,12 @@ Multipart request bodies expand plain objects into bracketed fields (for example
576
582
  | stream | GET | `/browser/v1/sessions/{sessionId}/stream` | always | no |
577
583
  | update | POST | `/browser/v1/sessions/{sessionId}` | no | no |
578
584
 
585
+ ### browser.sessions.actions
586
+
587
+ | Method | HTTP | Path | Streaming | Pagination |
588
+ |---|---|---|---|---|
589
+ | create | POST | `/browser/v1/sessions/{sessionId}/actions` | no | no |
590
+
579
591
  ### browser.sessions.events
580
592
 
581
593
  | Method | HTTP | Path | Streaming | Pagination |
@@ -786,6 +798,12 @@ Multipart request bodies expand plain objects into bracketed fields (for example
786
798
  |---|---|---|---|---|
787
799
  | import | POST | `/cut/v1/projects/{project_id}/media:import` | no | no |
788
800
 
801
+ ### cut.projects.renders
802
+
803
+ | Method | HTTP | Path | Streaming | Pagination |
804
+ |---|---|---|---|---|
805
+ | create | POST | `/cut/v1/projects/{project_id}/renders` | no | no |
806
+
789
807
  ### cut.projects.versions
790
808
 
791
809
  | Method | HTTP | Path | Streaming | Pagination |
@@ -793,6 +811,12 @@ Multipart request bodies expand plain objects into bracketed fields (for example
793
811
  | create | POST | `/cut/v1/projects/{project_id}/versions` | no | no |
794
812
  | list | GET | `/cut/v1/projects/{project_id}/versions` | no | no |
795
813
 
814
+ ### cut.renders
815
+
816
+ | Method | HTTP | Path | Streaming | Pagination |
817
+ |---|---|---|---|---|
818
+ | retrieve | GET | `/cut/v1/renders/{render_id}` | no | no |
819
+
796
820
  ### cut.versions
797
821
 
798
822
  | Method | HTTP | Path | Streaming | Pagination |
@@ -852,6 +876,82 @@ Multipart request bodies expand plain objects into bracketed fields (for example
852
876
  | delete | DELETE | `/database/v1/databases/{database_id}/tables/{table}/fields/{field}` | no | no |
853
877
  | update | PATCH | `/database/v1/databases/{database_id}/tables/{table}/fields/{field}` | no | no |
854
878
 
879
+ ## devops
880
+
881
+ ### devops.projects
882
+
883
+ | Method | HTTP | Path | Streaming | Pagination |
884
+ |---|---|---|---|---|
885
+ | retrieveTestCatalog | GET | `/devops/v1/projects/{project}/test-catalog` | no | no |
886
+
887
+ ### devops.projects.testCases
888
+
889
+ | Method | HTTP | Path | Streaming | Pagination |
890
+ |---|---|---|---|---|
891
+ | list | GET | `/devops/v1/projects/{project}/test-cases` | no | no |
892
+
893
+ ### devops.projects.testPlans
894
+
895
+ | Method | HTTP | Path | Streaming | Pagination |
896
+ |---|---|---|---|---|
897
+ | create | POST | `/devops/v1/projects/{project}/test-plans` | no | no |
898
+ | list | GET | `/devops/v1/projects/{project}/test-plans` | no | no |
899
+
900
+ ### devops.projects.testReports
901
+
902
+ | Method | HTTP | Path | Streaming | Pagination |
903
+ |---|---|---|---|---|
904
+ | create | POST | `/devops/v1/projects/{project}/test-reports` | no | no |
905
+
906
+ ### devops.projects.testRuns
907
+
908
+ | Method | HTTP | Path | Streaming | Pagination |
909
+ |---|---|---|---|---|
910
+ | create | POST | `/devops/v1/projects/{project}/test-runs` | no | no |
911
+ | list | GET | `/devops/v1/projects/{project}/test-runs` | no | no |
912
+
913
+ ### devops.projects.testSuites
914
+
915
+ | Method | HTTP | Path | Streaming | Pagination |
916
+ |---|---|---|---|---|
917
+ | list | GET | `/devops/v1/projects/{project}/test-suites` | no | no |
918
+
919
+ ### devops.testCases
920
+
921
+ | Method | HTTP | Path | Streaming | Pagination |
922
+ |---|---|---|---|---|
923
+ | retrieve | GET | `/devops/v1/test-cases/{id}` | no | no |
924
+
925
+ ### devops.testPlans
926
+
927
+ | Method | HTTP | Path | Streaming | Pagination |
928
+ |---|---|---|---|---|
929
+ | delete | DELETE | `/devops/v1/test-plans/{id}` | no | no |
930
+ | pause | POST | `/devops/v1/test-plans/{id}:pause` | no | no |
931
+ | resume | POST | `/devops/v1/test-plans/{id}:resume` | no | no |
932
+ | retrieve | GET | `/devops/v1/test-plans/{id}` | no | no |
933
+ | update | PATCH | `/devops/v1/test-plans/{id}` | no | no |
934
+
935
+ ### devops.testRuns
936
+
937
+ | Method | HTTP | Path | Streaming | Pagination |
938
+ |---|---|---|---|---|
939
+ | cancel | POST | `/devops/v1/test-runs/{id}:cancel` | no | no |
940
+ | retrieve | GET | `/devops/v1/test-runs/{id}` | no | no |
941
+
942
+ ### devops.testRuns.executions
943
+
944
+ | Method | HTTP | Path | Streaming | Pagination |
945
+ |---|---|---|---|---|
946
+ | list | GET | `/devops/v1/test-runs/{run}/executions` | no | no |
947
+ | retrieve | GET | `/devops/v1/test-runs/{run}/executions/{case}` | no | no |
948
+
949
+ ### devops.testSuites
950
+
951
+ | Method | HTTP | Path | Streaming | Pagination |
952
+ |---|---|---|---|---|
953
+ | retrieve | GET | `/devops/v1/test-suites/{id}` | no | no |
954
+
855
955
  ## file
856
956
 
857
957
  ### file.files
@@ -884,6 +984,7 @@ Multipart request bodies expand plain objects into bracketed fields (for example
884
984
  | complete | POST | `/file/v1/uploads/{upload_id}/complete` | no | no |
885
985
  | create | POST | `/file/v1/uploads` | no | no |
886
986
  | createSigned | POST | `/file/v1/uploads/signed` | no | no |
987
+ | retrieve | GET | `/file/v1/uploads/{upload_id}` | no | no |
887
988
 
888
989
  ### file.uploads.parts
889
990
 
@@ -967,6 +1068,12 @@ Multipart request bodies expand plain objects into bracketed fields (for example
967
1068
 
968
1069
  ## media
969
1070
 
1071
+ ### media.generation.capabilities
1072
+
1073
+ | Method | HTTP | Path | Streaming | Pagination |
1074
+ |---|---|---|---|---|
1075
+ | list | GET | `/media/v1/generation/capabilities` | no | no |
1076
+
970
1077
  ### media.libraries
971
1078
 
972
1079
  | Method | HTTP | Path | Streaming | Pagination |
@@ -1038,12 +1145,26 @@ Multipart request bodies expand plain objects into bracketed fields (for example
1038
1145
  |---|---|---|---|---|
1039
1146
  | list | GET | `/media/v1/libraries/{library_id}/folders` | no | no |
1040
1147
 
1148
+ ### media.libraries.generations
1149
+
1150
+ | Method | HTTP | Path | Streaming | Pagination |
1151
+ |---|---|---|---|---|
1152
+ | create | POST | `/media/v1/libraries/{library_id}/generations` | no | no |
1153
+
1041
1154
  ### media.libraries.jobs
1042
1155
 
1043
1156
  | Method | HTTP | Path | Streaming | Pagination |
1044
1157
  |---|---|---|---|---|
1158
+ | cancel | POST | `/media/v1/libraries/{library_id}/jobs/{job_id}/cancel` | no | no |
1159
+ | list | GET | `/media/v1/libraries/{library_id}/jobs` | no | yes |
1045
1160
  | retrieve | GET | `/media/v1/libraries/{library_id}/jobs/{job_id}` | no | no |
1046
1161
 
1162
+ ### media.libraries.jobs.outputs.save
1163
+
1164
+ | Method | HTTP | Path | Streaming | Pagination |
1165
+ |---|---|---|---|---|
1166
+ | create | POST | `/media/v1/libraries/{library_id}/jobs/{job_id}/outputs/{index}/save` | no | no |
1167
+
1047
1168
  ### media.libraries.purge
1048
1169
 
1049
1170
  | Method | HTTP | Path | Streaming | Pagination |
@@ -1230,6 +1351,58 @@ Multipart request bodies expand plain objects into bracketed fields (for example
1230
1351
  | retrieve | GET | `/model/v1/videos/{video_id}` | no | no |
1231
1352
  | retrieveContent | GET | `/model/v1/videos/{video_id}/content` | no | no |
1232
1353
 
1354
+ ## ontology
1355
+
1356
+ ### ontology.changesets
1357
+
1358
+ | Method | HTTP | Path | Streaming | Pagination |
1359
+ |---|---|---|---|---|
1360
+ | create | POST | `/ontology/v1/changesets` | no | no |
1361
+
1362
+ ### ontology.nodes
1363
+
1364
+ | Method | HTTP | Path | Streaming | Pagination |
1365
+ |---|---|---|---|---|
1366
+ | create | POST | `/ontology/v1/nodes` | no | no |
1367
+ | list | GET | `/ontology/v1/nodes` | no | yes |
1368
+ | retrieve | GET | `/ontology/v1/nodes/{node_id}` | no | no |
1369
+ | retrieveNeighborhood | GET | `/ontology/v1/nodes/{node_id}/neighborhood` | no | no |
1370
+ | update | PATCH | `/ontology/v1/nodes/{node_id}` | no | no |
1371
+
1372
+ ### ontology.nodes.merge
1373
+
1374
+ | Method | HTTP | Path | Streaming | Pagination |
1375
+ |---|---|---|---|---|
1376
+ | create | POST | `/ontology/v1/nodes/{node_id}/merge` | no | no |
1377
+
1378
+ ### ontology.relations
1379
+
1380
+ | Method | HTTP | Path | Streaming | Pagination |
1381
+ |---|---|---|---|---|
1382
+ | create | POST | `/ontology/v1/relations` | no | no |
1383
+ | list | GET | `/ontology/v1/relations` | no | yes |
1384
+ | retrieve | GET | `/ontology/v1/relations/{relation_id}` | no | no |
1385
+
1386
+ ### ontology.relations.invalidate
1387
+
1388
+ | Method | HTTP | Path | Streaming | Pagination |
1389
+ |---|---|---|---|---|
1390
+ | create | POST | `/ontology/v1/relations/{relation_id}/invalidate` | no | no |
1391
+
1392
+ ### ontology.search
1393
+
1394
+ | Method | HTTP | Path | Streaming | Pagination |
1395
+ |---|---|---|---|---|
1396
+ | create | POST | `/ontology/v1/search` | no | no |
1397
+
1398
+ ### ontology.types
1399
+
1400
+ | Method | HTTP | Path | Streaming | Pagination |
1401
+ |---|---|---|---|---|
1402
+ | create | POST | `/ontology/v1/types` | no | no |
1403
+ | list | GET | `/ontology/v1/types` | no | no |
1404
+ | retrieve | GET | `/ontology/v1/types/{name}` | no | no |
1405
+
1233
1406
  ## organization
1234
1407
 
1235
1408
  ### organization.charges
@@ -1426,6 +1599,124 @@ Multipart request bodies expand plain objects into bracketed fields (for example
1426
1599
  |---|---|---|---|---|
1427
1600
  | create | POST | `/search/v1/search` | no | no |
1428
1601
 
1602
+ ## studio
1603
+
1604
+ ### studio.codexes
1605
+
1606
+ | Method | HTTP | Path | Streaming | Pagination |
1607
+ |---|---|---|---|---|
1608
+ | create | POST | `/studio/v1/codexes` | no | no |
1609
+ | delete | DELETE | `/studio/v1/codexes/{codex}` | no | no |
1610
+ | list | GET | `/studio/v1/codexes` | no | no |
1611
+ | retrieve | GET | `/studio/v1/codexes/{codex}` | no | no |
1612
+ | update | PATCH | `/studio/v1/codexes/{codex}` | no | no |
1613
+
1614
+ ### studio.codexes.entries
1615
+
1616
+ | Method | HTTP | Path | Streaming | Pagination |
1617
+ |---|---|---|---|---|
1618
+ | create | POST | `/studio/v1/codexes/{codex}/entries` | no | no |
1619
+ | delete | DELETE | `/studio/v1/codexes/{codex}/entries/{entry}` | no | no |
1620
+ | list | GET | `/studio/v1/codexes/{codex}/entries` | no | no |
1621
+ | retrieve | GET | `/studio/v1/codexes/{codex}/entries/{entry}` | no | no |
1622
+ | update | PATCH | `/studio/v1/codexes/{codex}/entries/{entry}` | no | no |
1623
+
1624
+ ### studio.genres
1625
+
1626
+ | Method | HTTP | Path | Streaming | Pagination |
1627
+ |---|---|---|---|---|
1628
+ | list | GET | `/studio/v1/genres` | no | no |
1629
+ | retrieve | GET | `/studio/v1/genres/{genre}` | no | no |
1630
+
1631
+ ### studio.platforms
1632
+
1633
+ | Method | HTTP | Path | Streaming | Pagination |
1634
+ |---|---|---|---|---|
1635
+ | list | GET | `/studio/v1/platforms` | no | no |
1636
+ | retrieve | GET | `/studio/v1/platforms/{platform}` | no | no |
1637
+
1638
+ ### studio.styles
1639
+
1640
+ | Method | HTTP | Path | Streaming | Pagination |
1641
+ |---|---|---|---|---|
1642
+ | create | POST | `/studio/v1/styles` | no | no |
1643
+ | delete | DELETE | `/studio/v1/styles/{style}` | no | no |
1644
+ | list | GET | `/studio/v1/styles` | no | no |
1645
+ | retrieve | GET | `/studio/v1/styles/{style}` | no | no |
1646
+ | update | PATCH | `/studio/v1/styles/{style}` | no | no |
1647
+
1648
+ ### studio.templates
1649
+
1650
+ | Method | HTTP | Path | Streaming | Pagination |
1651
+ |---|---|---|---|---|
1652
+ | create | POST | `/studio/v1/templates` | no | no |
1653
+ | delete | DELETE | `/studio/v1/templates/{template}` | no | no |
1654
+ | list | GET | `/studio/v1/templates` | no | no |
1655
+ | retrieve | GET | `/studio/v1/templates/{template}` | no | no |
1656
+
1657
+ ### studio.themes
1658
+
1659
+ | Method | HTTP | Path | Streaming | Pagination |
1660
+ |---|---|---|---|---|
1661
+ | create | POST | `/studio/v1/themes` | no | no |
1662
+ | delete | DELETE | `/studio/v1/themes/{theme}` | no | no |
1663
+ | list | GET | `/studio/v1/themes` | no | no |
1664
+ | retrieve | GET | `/studio/v1/themes/{theme}` | no | no |
1665
+ | update | PATCH | `/studio/v1/themes/{theme}` | no | no |
1666
+
1667
+ ### studio.works
1668
+
1669
+ | Method | HTTP | Path | Streaming | Pagination |
1670
+ |---|---|---|---|---|
1671
+ | create | POST | `/studio/v1/works` | no | no |
1672
+ | list | GET | `/studio/v1/works` | no | no |
1673
+ | resolve | GET | `/studio/v1/works:resolve` | no | no |
1674
+ | retrieve | GET | `/studio/v1/works/{work}` | no | no |
1675
+ | update | PATCH | `/studio/v1/works/{work}` | no | no |
1676
+ | updateBrief | PATCH | `/studio/v1/works/{work}/brief` | no | no |
1677
+
1678
+ ### studio.works.drafts
1679
+
1680
+ | Method | HTTP | Path | Streaming | Pagination |
1681
+ |---|---|---|---|---|
1682
+ | create | POST | `/studio/v1/works/{work}/drafts` | no | no |
1683
+ | list | GET | `/studio/v1/works/{work}/drafts` | no | no |
1684
+ | rebase | POST | `/studio/v1/works/{work}/drafts/{draft}:rebase` | no | no |
1685
+ | retrieve | GET | `/studio/v1/works/{work}/drafts/{draft}` | no | no |
1686
+ | retrieveExport | GET | `/studio/v1/works/{work}/drafts/{draft}/export` | no | no |
1687
+ | retrieveOutline | GET | `/studio/v1/works/{work}/drafts/{draft}/outline` | no | no |
1688
+ | retrieveReview | GET | `/studio/v1/works/{work}/drafts/{draft}/review` | no | no |
1689
+ | update | PATCH | `/studio/v1/works/{work}/drafts/{draft}` | no | no |
1690
+
1691
+ ### studio.works.drafts.status
1692
+
1693
+ | Method | HTTP | Path | Streaming | Pagination |
1694
+ |---|---|---|---|---|
1695
+ | list | GET | `/studio/v1/works/{work}/drafts/{draft}/status` | no | no |
1696
+
1697
+ ### studio.works.drafts.units
1698
+
1699
+ | Method | HTTP | Path | Streaming | Pagination |
1700
+ |---|---|---|---|---|
1701
+ | batchCreate | POST | `/studio/v1/works/{work}/drafts/{draft}/units:batchCreate` | no | no |
1702
+ | batchUpdate | POST | `/studio/v1/works/{work}/drafts/{draft}/units:batchUpdate` | no | no |
1703
+ | create | POST | `/studio/v1/works/{work}/drafts/{draft}/units` | no | no |
1704
+
1705
+ ### studio.works.units
1706
+
1707
+ | Method | HTTP | Path | Streaming | Pagination |
1708
+ |---|---|---|---|---|
1709
+ | move | POST | `/studio/v1/works/{work}/units/{unit}:move` | no | no |
1710
+ | retrieve | GET | `/studio/v1/works/{work}/units/{unit}` | no | no |
1711
+ | retrieveContext | GET | `/studio/v1/works/{work}/units/{unit}/context` | no | no |
1712
+ | update | PATCH | `/studio/v1/works/{work}/units/{unit}` | no | no |
1713
+
1714
+ ### studio.works.units.blocks
1715
+
1716
+ | Method | HTTP | Path | Streaming | Pagination |
1717
+ |---|---|---|---|---|
1718
+ | patch | POST | `/studio/v1/works/{work}/units/{unit}/blocks:patch` | no | no |
1719
+
1429
1720
  ## ticket
1430
1721
 
1431
1722
  ### ticket.activity
package/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Models, agents, sandboxes, search, data and automation, typed end to end.**
6
6
 
7
- The official TypeScript SDK for [知行云 Praxis](https://deepraxis.com), the cloud where AI agents are built, run and hosted.
7
+ The official TypeScript SDK for [Praxis](https://deepraxis.com), the cloud where AI agents are built, run and hosted.
8
8
 
9
9
  [![npm](https://img.shields.io/npm/v/@deepraxis/sdk?label=npm&color=2e8555)](https://www.npmjs.com/package/@deepraxis/sdk)
10
10
  [![Bundle size](https://img.shields.io/bundlephobia/minzip/@deepraxis/sdk?color=2e8555)](https://bundlephobia.com/package/@deepraxis/sdk)
@@ -33,7 +33,7 @@ console.log(completion.choices[0]?.message.content);
33
33
  ## Why this SDK
34
34
 
35
35
  - **The whole platform, one client.** About 350 operations across models, agents, sandboxes,
36
- cloud browsers, web search, databases, knowledge bases, files, media, automation and hosted
36
+ browsers, web search, databases, knowledge bases, files, media, automation and hosted
37
37
  applications, generated from the same contract as the API.
38
38
  - **Types from the contract.** Every path, query, body and response is typed, including the
39
39
  events of each stream, so your editor knows what comes back.
@@ -276,5 +276,5 @@ sandboxes, search, data, automation and the rest of the platform.
276
276
 
277
277
  [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0). Copyright 2026 南京深度实践人工智能科技有限公司 (Deepractice).
278
278
 
279
- "Praxis", "知行云" and "Deepraxis" are trademarks of Deepractice; the license does not grant
279
+ "Praxis" and "Deepraxis" are trademarks of Deepractice; the license does not grant
280
280
  rights to use them.
@@ -9,6 +9,9 @@ export interface ProblemDetails {
9
9
  requestId?: string;
10
10
  message?: string;
11
11
  param?: string | null;
12
+ /** ticket-681 — the documentation page the failure points at, and the exact section to read. */
13
+ docUrl?: string;
14
+ describe?: string;
12
15
  raw?: unknown;
13
16
  }
14
17
  /** Pure normalization shared by HTTP clients and the automation call ledger.
@@ -26,6 +29,9 @@ export declare class PraxisError extends Error {
26
29
  readonly errors: unknown[];
27
30
  readonly requestId?: string;
28
31
  readonly param?: string | null;
32
+ /** ticket-681 — the documented page and the exact section an agent should read to fix the call. */
33
+ readonly docUrl?: string;
34
+ readonly describe?: string;
29
35
  readonly raw?: unknown;
30
36
  constructor(problem?: ProblemDetails, options?: ErrorOptions);
31
37
  static fromResponse(response: Response, body: unknown): PraxisError;
@@ -16,6 +16,9 @@ export function problemFrom(status, headers, body, statusText) {
16
16
  param: typeof param === 'string' ? param : param === null || nested.param === null ? null : undefined,
17
17
  errors: Array.isArray(value.errors) ? value.errors : [],
18
18
  requestId: headers.get('x-request-id') ?? string(value.requestId) ?? string(value.request_id),
19
+ // Both spellings reach here: the own face writes snake_case, an in-process problem keeps docUrl.
20
+ docUrl: string(nested.doc_url) ?? string(value.doc_url) ?? string(nested.docUrl) ?? string(value.docUrl),
21
+ describe: string(nested.describe) ?? string(value.describe),
19
22
  raw: body,
20
23
  };
21
24
  }
@@ -28,6 +31,9 @@ export class PraxisError extends Error {
28
31
  errors;
29
32
  requestId;
30
33
  param;
34
+ /** ticket-681 — the documented page and the exact section an agent should read to fix the call. */
35
+ docUrl;
36
+ describe;
31
37
  raw;
32
38
  constructor(problem = {}, options) {
33
39
  super(problem.message ?? problem.detail ?? problem.title ?? `Praxis request failed${problem.status ? ` (${problem.status})` : ''}`, options);
@@ -40,6 +46,8 @@ export class PraxisError extends Error {
40
46
  this.errors = problem.errors ?? [];
41
47
  this.requestId = problem.requestId;
42
48
  this.param = problem.param;
49
+ this.docUrl = problem.docUrl;
50
+ this.describe = problem.describe;
43
51
  this.raw = problem.raw;
44
52
  }
45
53
  static fromResponse(response, body) {