scorecard-ai 1.0.0-alpha.6 → 1.0.0-alpha.8

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 (173) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/README.md +15 -5
  3. package/client.d.mts +11 -4
  4. package/client.d.mts.map +1 -1
  5. package/client.d.ts +11 -4
  6. package/client.d.ts.map +1 -1
  7. package/client.js +20 -0
  8. package/client.js.map +1 -1
  9. package/client.mjs +20 -0
  10. package/client.mjs.map +1 -1
  11. package/internal/headers.js +1 -1
  12. package/internal/headers.js.map +1 -1
  13. package/internal/headers.mjs +1 -1
  14. package/internal/headers.mjs.map +1 -1
  15. package/internal/to-file.d.mts +0 -1
  16. package/internal/to-file.d.mts.map +1 -1
  17. package/internal/to-file.d.ts +0 -1
  18. package/internal/to-file.d.ts.map +1 -1
  19. package/internal/to-file.js +3 -2
  20. package/internal/to-file.js.map +1 -1
  21. package/internal/to-file.mjs +3 -2
  22. package/internal/to-file.mjs.map +1 -1
  23. package/internal/uploads.d.mts +1 -1
  24. package/internal/uploads.d.mts.map +1 -1
  25. package/internal/uploads.d.ts +1 -1
  26. package/internal/uploads.d.ts.map +1 -1
  27. package/internal/uploads.js +14 -4
  28. package/internal/uploads.js.map +1 -1
  29. package/internal/uploads.mjs +12 -3
  30. package/internal/uploads.mjs.map +1 -1
  31. package/internal/utils/uuid.d.mts +1 -1
  32. package/internal/utils/uuid.d.mts.map +1 -1
  33. package/internal/utils/uuid.d.ts +1 -1
  34. package/internal/utils/uuid.d.ts.map +1 -1
  35. package/internal/utils/uuid.js +1 -2
  36. package/internal/utils/uuid.js.map +1 -1
  37. package/internal/utils/uuid.mjs +1 -2
  38. package/internal/utils/uuid.mjs.map +1 -1
  39. package/lib/runAndEvaluate.d.mts.map +1 -1
  40. package/lib/runAndEvaluate.d.ts.map +1 -1
  41. package/lib/runAndEvaluate.js +1 -5
  42. package/lib/runAndEvaluate.js.map +1 -1
  43. package/lib/runAndEvaluate.mjs +1 -5
  44. package/lib/runAndEvaluate.mjs.map +1 -1
  45. package/package.json +1 -5
  46. package/resources/index.d.mts +3 -2
  47. package/resources/index.d.mts.map +1 -1
  48. package/resources/index.d.ts +3 -2
  49. package/resources/index.d.ts.map +1 -1
  50. package/resources/index.js +3 -1
  51. package/resources/index.js.map +1 -1
  52. package/resources/index.mjs +1 -0
  53. package/resources/index.mjs.map +1 -1
  54. package/resources/projects.d.mts +39 -4
  55. package/resources/projects.d.mts.map +1 -1
  56. package/resources/projects.d.ts +39 -4
  57. package/resources/projects.d.ts.map +1 -1
  58. package/resources/projects.js +23 -4
  59. package/resources/projects.js.map +1 -1
  60. package/resources/projects.mjs +23 -4
  61. package/resources/projects.mjs.map +1 -1
  62. package/resources/records.d.mts +20 -8
  63. package/resources/records.d.mts.map +1 -1
  64. package/resources/records.d.ts +20 -8
  65. package/resources/records.d.ts.map +1 -1
  66. package/resources/records.js +12 -0
  67. package/resources/records.js.map +1 -1
  68. package/resources/records.mjs +12 -0
  69. package/resources/records.mjs.map +1 -1
  70. package/resources/runs.d.mts +10 -21
  71. package/resources/runs.d.mts.map +1 -1
  72. package/resources/runs.d.ts +10 -21
  73. package/resources/runs.d.ts.map +1 -1
  74. package/resources/runs.js +9 -6
  75. package/resources/runs.js.map +1 -1
  76. package/resources/runs.mjs +9 -6
  77. package/resources/runs.mjs.map +1 -1
  78. package/resources/scores.d.mts +83 -0
  79. package/resources/scores.d.mts.map +1 -0
  80. package/resources/scores.d.ts +83 -0
  81. package/resources/scores.d.ts.map +1 -0
  82. package/resources/scores.js +35 -0
  83. package/resources/scores.js.map +1 -0
  84. package/resources/scores.mjs +31 -0
  85. package/resources/scores.mjs.map +1 -0
  86. package/resources/system-configs.d.mts +33 -0
  87. package/resources/system-configs.d.mts.map +1 -1
  88. package/resources/system-configs.d.ts +33 -0
  89. package/resources/system-configs.d.ts.map +1 -1
  90. package/resources/system-configs.js +33 -0
  91. package/resources/system-configs.js.map +1 -1
  92. package/resources/system-configs.mjs +33 -0
  93. package/resources/system-configs.mjs.map +1 -1
  94. package/resources/systems.d.mts +73 -0
  95. package/resources/systems.d.mts.map +1 -1
  96. package/resources/systems.d.ts +73 -0
  97. package/resources/systems.d.ts.map +1 -1
  98. package/resources/systems.js +73 -0
  99. package/resources/systems.js.map +1 -1
  100. package/resources/systems.mjs +73 -0
  101. package/resources/systems.mjs.map +1 -1
  102. package/resources/testcases.d.mts +72 -18
  103. package/resources/testcases.d.mts.map +1 -1
  104. package/resources/testcases.d.ts +72 -18
  105. package/resources/testcases.d.ts.map +1 -1
  106. package/resources/testcases.js +62 -0
  107. package/resources/testcases.js.map +1 -1
  108. package/resources/testcases.mjs +62 -0
  109. package/resources/testcases.mjs.map +1 -1
  110. package/resources/testsets.d.mts +78 -30
  111. package/resources/testsets.d.mts.map +1 -1
  112. package/resources/testsets.d.ts +78 -30
  113. package/resources/testsets.d.ts.map +1 -1
  114. package/resources/testsets.js +48 -0
  115. package/resources/testsets.js.map +1 -1
  116. package/resources/testsets.mjs +48 -0
  117. package/resources/testsets.mjs.map +1 -1
  118. package/src/client.ts +31 -12
  119. package/src/internal/headers.ts +1 -1
  120. package/src/internal/to-file.ts +4 -2
  121. package/src/internal/uploads.ts +16 -4
  122. package/src/internal/utils/uuid.ts +1 -3
  123. package/src/lib/runAndEvaluate.ts +1 -6
  124. package/src/resources/index.ts +5 -3
  125. package/src/resources/projects.ts +48 -9
  126. package/src/resources/records.ts +22 -10
  127. package/src/resources/runs.ts +10 -46
  128. package/src/resources/scores.ts +98 -0
  129. package/src/resources/system-configs.ts +33 -0
  130. package/src/resources/systems.ts +73 -0
  131. package/src/resources/testcases.ts +73 -19
  132. package/src/resources/testsets.ts +78 -30
  133. package/src/version.ts +1 -1
  134. package/version.d.mts +1 -1
  135. package/version.d.ts +1 -1
  136. package/version.js +1 -1
  137. package/version.mjs +1 -1
  138. package/internal/shims/crypto.d.mts +0 -13
  139. package/internal/shims/crypto.d.mts.map +0 -1
  140. package/internal/shims/crypto.d.ts +0 -13
  141. package/internal/shims/crypto.d.ts.map +0 -1
  142. package/internal/shims/crypto.js +0 -13
  143. package/internal/shims/crypto.js.map +0 -1
  144. package/internal/shims/crypto.mjs +0 -9
  145. package/internal/shims/crypto.mjs.map +0 -1
  146. package/internal/shims/file.d.mts +0 -22
  147. package/internal/shims/file.d.mts.map +0 -1
  148. package/internal/shims/file.d.ts +0 -22
  149. package/internal/shims/file.d.ts.map +0 -1
  150. package/internal/shims/file.js +0 -16
  151. package/internal/shims/file.js.map +0 -1
  152. package/internal/shims/file.mjs +0 -12
  153. package/internal/shims/file.mjs.map +0 -1
  154. package/internal/shims/getBuiltinModule.d.mts +0 -11
  155. package/internal/shims/getBuiltinModule.d.mts.map +0 -1
  156. package/internal/shims/getBuiltinModule.d.ts +0 -11
  157. package/internal/shims/getBuiltinModule.d.ts.map +0 -1
  158. package/internal/shims/getBuiltinModule.js +0 -71
  159. package/internal/shims/getBuiltinModule.js.map +0 -1
  160. package/internal/shims/getBuiltinModule.mjs +0 -67
  161. package/internal/shims/getBuiltinModule.mjs.map +0 -1
  162. package/internal/shims/nullGetBuiltinModule.d.mts +0 -2
  163. package/internal/shims/nullGetBuiltinModule.d.mts.map +0 -1
  164. package/internal/shims/nullGetBuiltinModule.d.ts +0 -2
  165. package/internal/shims/nullGetBuiltinModule.d.ts.map +0 -1
  166. package/internal/shims/nullGetBuiltinModule.js +0 -5
  167. package/internal/shims/nullGetBuiltinModule.js.map +0 -1
  168. package/internal/shims/nullGetBuiltinModule.mjs +0 -2
  169. package/internal/shims/nullGetBuiltinModule.mjs.map +0 -1
  170. package/src/internal/shims/crypto.ts +0 -18
  171. package/src/internal/shims/file.ts +0 -32
  172. package/src/internal/shims/getBuiltinModule.ts +0 -66
  173. package/src/internal/shims/nullGetBuiltinModule.ts +0 -1
@@ -6,6 +6,28 @@ export class Testsets extends APIResource {
6
6
  /**
7
7
  * Create a new Testset for a Project. The Testset will be created in the Project
8
8
  * specified in the path.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * const testset = await client.testsets.create('314', {
13
+ * description: 'Testset for long context Q&A chatbot.',
14
+ * fieldMapping: {
15
+ * inputs: ['question'],
16
+ * expected: ['idealAnswer'],
17
+ * metadata: [],
18
+ * },
19
+ * jsonSchema: {
20
+ * type: 'object',
21
+ * properties: {
22
+ * question: { type: 'string' },
23
+ * idealAnswer: { type: 'string' },
24
+ * provenance: { type: 'string' },
25
+ * geo: { type: 'string' },
26
+ * },
27
+ * },
28
+ * name: 'Long Context Q&A',
29
+ * });
30
+ * ```
9
31
  */
10
32
  create(projectID, body, options) {
11
33
  return this._client.post(path `/projects/${projectID}/testsets`, { body, ...options });
@@ -23,12 +45,28 @@ export class Testsets extends APIResource {
23
45
  * updated schema
24
46
  * - For complete control, provide both schema and fieldMapping when updating the
25
47
  * schema
48
+ *
49
+ * @example
50
+ * ```ts
51
+ * const testset = await client.testsets.update('246', {
52
+ * description: 'Updated description for the Q&A Testset.',
53
+ * name: 'Updated Q&A Testset',
54
+ * });
55
+ * ```
26
56
  */
27
57
  update(testsetID, body = {}, options) {
28
58
  return this._client.patch(path `/testsets/${testsetID}`, { body, ...options });
29
59
  }
30
60
  /**
31
61
  * Retrieve a paginated list of Testsets belonging to a Project.
62
+ *
63
+ * @example
64
+ * ```ts
65
+ * // Automatically fetches more pages as needed.
66
+ * for await (const testset of client.testsets.list('314')) {
67
+ * // ...
68
+ * }
69
+ * ```
32
70
  */
33
71
  list(projectID, query = {}, options) {
34
72
  return this._client.getAPIList(path `/projects/${projectID}/testsets`, (PaginatedResponse), {
@@ -38,12 +76,22 @@ export class Testsets extends APIResource {
38
76
  }
39
77
  /**
40
78
  * Delete Testset
79
+ *
80
+ * @example
81
+ * ```ts
82
+ * const testset = await client.testsets.delete('246');
83
+ * ```
41
84
  */
42
85
  delete(testsetID, options) {
43
86
  return this._client.delete(path `/testsets/${testsetID}`, options);
44
87
  }
45
88
  /**
46
89
  * Get Testset by ID
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const testset = await client.testsets.get('246');
94
+ * ```
47
95
  */
48
96
  get(testsetID, options) {
49
97
  return this._client.get(path `/testsets/${testsetID}`, options);
@@ -1 +1 @@
1
- {"version":3,"file":"testsets.mjs","sourceRoot":"","sources":["../src/resources/testsets.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,WAAW,EAAE;OAEf,EAAe,iBAAiB,EAAgC;OAEhE,EAAE,IAAI,EAAE;AAEf,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC;;;OAGG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,aAAa,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,MAAM,CACJ,SAAiB,EACjB,OAA+C,EAAE,EACjD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;OAEG;IACH,IAAI,CACF,SAAiB,EACjB,QAA8C,EAAE,EAChD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAA,aAAa,SAAS,WAAW,EAAE,CAAA,iBAA0B,CAAA,EAAE;YAChG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,SAAiB,EAAE,OAAwB;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACF"}
1
+ {"version":3,"file":"testsets.mjs","sourceRoot":"","sources":["../src/resources/testsets.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,WAAW,EAAE;OAEf,EAAe,iBAAiB,EAAgC;OAEhE,EAAE,IAAI,EAAE;AAEf,MAAM,OAAO,QAAS,SAAQ,WAAW;IACvC;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,MAAM,CAAC,SAAiB,EAAE,IAAyB,EAAE,OAAwB;QAC3E,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAA,aAAa,SAAS,WAAW,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CACJ,SAAiB,EACjB,OAA+C,EAAE,EACjD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;IAED;;;;;;;;;;OAUG;IACH,IAAI,CACF,SAAiB,EACjB,QAA8C,EAAE,EAChD,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAA,aAAa,SAAS,WAAW,EAAE,CAAA,iBAA0B,CAAA,EAAE;YAChG,KAAK;YACL,GAAG,OAAO;SACX,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,SAAiB,EAAE,OAAwB;QAChD,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;;;;;OAOG;IACH,GAAG,CAAC,SAAiB,EAAE,OAAwB;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAA,aAAa,SAAS,EAAE,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;CACF"}
package/src/client.ts CHANGED
@@ -23,13 +23,15 @@ import { type Fetch } from './internal/builtin-types';
23
23
  import { HeadersLike, NullableHeaders, buildHeaders } from './internal/headers';
24
24
  import { FinalRequestOptions, RequestOptions } from './internal/request-options';
25
25
  import {
26
+ Project,
27
+ ProjectCreateParams,
26
28
  ProjectListParams,
27
- ProjectListResponse,
28
- ProjectListResponsesPaginatedResponse,
29
29
  Projects,
30
+ ProjectsPaginatedResponse,
30
31
  } from './resources/projects';
31
32
  import { Record as RecordsAPIRecord, RecordCreateParams, Records } from './resources/records';
32
- import { Run, RunCreateParams, RunUpdateParams, RunUpdateResponse, Runs } from './resources/runs';
33
+ import { Run, RunCreateParams, Runs } from './resources/runs';
34
+ import { Score, ScoreUpsertParams, Scores } from './resources/scores';
33
35
  import {
34
36
  SystemConfig,
35
37
  SystemConfigCreateParams,
@@ -236,6 +238,24 @@ export class Scorecard {
236
238
  this.apiKey = apiKey;
237
239
  }
238
240
 
241
+ /**
242
+ * Create a new client instance re-using the same options given to the current client with optional overriding.
243
+ */
244
+ withOptions(options: Partial<ClientOptions>): this {
245
+ return new (this.constructor as any as new (props: ClientOptions) => typeof this)({
246
+ ...this._options,
247
+ environment: options.environment ? options.environment : undefined,
248
+ baseURL: options.environment ? undefined : this.baseURL,
249
+ maxRetries: this.maxRetries,
250
+ timeout: this.timeout,
251
+ logger: this.logger,
252
+ logLevel: this.logLevel,
253
+ fetchOptions: this.fetchOptions,
254
+ apiKey: this.apiKey,
255
+ ...options,
256
+ });
257
+ }
258
+
239
259
  protected defaultQuery(): Record<string, string | undefined> | undefined {
240
260
  return this._options.defaultQuery;
241
261
  }
@@ -769,6 +789,7 @@ export class Scorecard {
769
789
  testcases: API.Testcases = new API.Testcases(this);
770
790
  runs: API.Runs = new API.Runs(this);
771
791
  records: API.Records = new API.Records(this);
792
+ scores: API.Scores = new API.Scores(this);
772
793
  systems: API.Systems = new API.Systems(this);
773
794
  systemConfigs: API.SystemConfigs = new API.SystemConfigs(this);
774
795
  }
@@ -777,6 +798,7 @@ Scorecard.Testsets = Testsets;
777
798
  Scorecard.Testcases = Testcases;
778
799
  Scorecard.Runs = Runs;
779
800
  Scorecard.Records = Records;
801
+ Scorecard.Scores = Scores;
780
802
  Scorecard.Systems = Systems;
781
803
  Scorecard.SystemConfigs = SystemConfigs;
782
804
  export declare namespace Scorecard {
@@ -790,8 +812,9 @@ export declare namespace Scorecard {
790
812
 
791
813
  export {
792
814
  Projects as Projects,
793
- type ProjectListResponse as ProjectListResponse,
794
- type ProjectListResponsesPaginatedResponse as ProjectListResponsesPaginatedResponse,
815
+ type Project as Project,
816
+ type ProjectsPaginatedResponse as ProjectsPaginatedResponse,
817
+ type ProjectCreateParams as ProjectCreateParams,
795
818
  type ProjectListParams as ProjectListParams,
796
819
  };
797
820
 
@@ -817,13 +840,7 @@ export declare namespace Scorecard {
817
840
  type TestcaseDeleteParams as TestcaseDeleteParams,
818
841
  };
819
842
 
820
- export {
821
- Runs as Runs,
822
- type Run as Run,
823
- type RunUpdateResponse as RunUpdateResponse,
824
- type RunCreateParams as RunCreateParams,
825
- type RunUpdateParams as RunUpdateParams,
826
- };
843
+ export { Runs as Runs, type Run as Run, type RunCreateParams as RunCreateParams };
827
844
 
828
845
  export {
829
846
  Records as Records,
@@ -831,6 +848,8 @@ export declare namespace Scorecard {
831
848
  type RecordCreateParams as RecordCreateParams,
832
849
  };
833
850
 
851
+ export { Scores as Scores, type Score as Score, type ScoreUpsertParams as ScoreUpsertParams };
852
+
834
853
  export {
835
854
  Systems as Systems,
836
855
  type System as System,
@@ -71,8 +71,8 @@ function* iterateHeaders(headers: HeadersLike): IterableIterator<readonly [strin
71
71
  export const buildHeaders = (newHeaders: HeadersLike[]): NullableHeaders => {
72
72
  const targetHeaders = new Headers();
73
73
  const nullHeaders = new Set<string>();
74
- const seenHeaders = new Set<string>();
75
74
  for (const headers of newHeaders) {
75
+ const seenHeaders = new Set<string>();
76
76
  for (const [name, value] of iterateHeaders(headers)) {
77
77
  const lowerName = name.toLowerCase();
78
78
  if (!seenHeaders.has(lowerName)) {
@@ -1,6 +1,6 @@
1
- import { type File, getFile } from './shims/file';
2
1
  import { BlobPart, getName, makeFile, isAsyncIterable } from './uploads';
3
2
  import type { FilePropertyBag } from './builtin-types';
3
+ import { checkFileSupport } from './uploads';
4
4
 
5
5
  type BlobLikePart = string | ArrayBuffer | ArrayBufferView | BlobLike | DataView;
6
6
 
@@ -85,12 +85,14 @@ export async function toFile(
85
85
  name?: string | null | undefined,
86
86
  options?: FilePropertyBag | undefined,
87
87
  ): Promise<File> {
88
+ checkFileSupport();
89
+
88
90
  // If it's a promise, resolve it.
89
91
  value = await value;
90
92
 
91
93
  // If we've been given a `File` we don't need to do anything
92
94
  if (isFileLike(value)) {
93
- if (value instanceof getFile()) {
95
+ if (value instanceof File) {
94
96
  return value;
95
97
  }
96
98
  return makeFile([await value.arrayBuffer()], value.name);
@@ -1,7 +1,6 @@
1
1
  import { type RequestOptions } from './request-options';
2
2
  import type { FilePropertyBag, Fetch } from './builtin-types';
3
3
  import type { Scorecard } from '../client';
4
- import { type File, getFile } from './shims/file';
5
4
  import { ReadableStreamFrom } from './shims';
6
5
 
7
6
  export type BlobPart = string | ArrayBuffer | ArrayBufferView | Blob | DataView;
@@ -12,6 +11,20 @@ interface BunFile extends Blob {
12
11
  readonly name?: string | undefined;
13
12
  }
14
13
 
14
+ export const checkFileSupport = () => {
15
+ if (typeof File === 'undefined') {
16
+ const { process } = globalThis as any;
17
+ const isOldNode =
18
+ typeof process?.versions?.node === 'string' && parseInt(process.versions.node.split('.')) < 20;
19
+ throw new Error(
20
+ '`File` is not defined as a global, which is required for file uploads.' +
21
+ (isOldNode ?
22
+ " Update to Node 20 LTS or newer, or set `globalThis.File` to `import('node:buffer').File`."
23
+ : ''),
24
+ );
25
+ }
26
+ };
27
+
15
28
  /**
16
29
  * Typically, this is a native "File" class.
17
30
  *
@@ -32,7 +45,7 @@ export function makeFile(
32
45
  fileName: string | undefined,
33
46
  options?: FilePropertyBag,
34
47
  ): File {
35
- const File = getFile();
48
+ checkFileSupport();
36
49
  return new File(fileBits as any, fileName ?? 'unknown_file', options);
37
50
  }
38
51
 
@@ -125,8 +138,7 @@ export const createForm = async <T = Record<string, unknown>>(
125
138
 
126
139
  // We check for Blob not File because Bun.File doesn't inherit from File,
127
140
  // but they both inherit from Blob and have a `name` property at runtime.
128
- const isNamedBlob = (value: object) =>
129
- value instanceof getFile() || (value instanceof Blob && 'name' in value);
141
+ const isNamedBlob = (value: object) => value instanceof Blob && 'name' in value;
130
142
 
131
143
  const isUploadable = (value: unknown) =>
132
144
  typeof value === 'object' &&
@@ -1,12 +1,10 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
- import { getCrypto } from '../shims/crypto';
4
-
5
3
  /**
6
4
  * https://stackoverflow.com/a/2117523
7
5
  */
8
6
  export let uuid4 = function () {
9
- const crypto = getCrypto();
7
+ const { crypto } = globalThis as any;
10
8
  if (crypto?.randomUUID) {
11
9
  uuid4 = crypto.randomUUID.bind(crypto);
12
10
  return crypto.randomUUID();
@@ -35,7 +35,7 @@ export async function runAndEvaluate<SystemInput extends Object, SystemOutput ex
35
35
  const promise = scorecard.records.create(run.id, {
36
36
  testcaseId: testcase.id,
37
37
  inputs: testcase.inputs,
38
- labels: testcase.labels,
38
+ expected: testcase.expected,
39
39
  outputs: modelResponse as Record<string, unknown>,
40
40
  });
41
41
  recordPromises.push(promise);
@@ -43,11 +43,6 @@ export async function runAndEvaluate<SystemInput extends Object, SystemOutput ex
43
43
  // Wait until all the Records are created
44
44
  await Promise.all(recordPromises);
45
45
 
46
- // Mark the Run as done with execution and ready for scoring.
47
- await scorecard.runs.update(run.id, {
48
- status: 'awaiting_scoring',
49
- });
50
-
51
46
  const runUrl = `https://app.getscorecard.ai/projects/${projectId}/runs/grades/${run.id}`;
52
47
 
53
48
  return { id: run.id, url: runUrl };
@@ -3,12 +3,14 @@
3
3
  export * from './shared';
4
4
  export {
5
5
  Projects,
6
- type ProjectListResponse,
6
+ type Project,
7
+ type ProjectCreateParams,
7
8
  type ProjectListParams,
8
- type ProjectListResponsesPaginatedResponse,
9
+ type ProjectsPaginatedResponse,
9
10
  } from './projects';
10
11
  export { Records, type Record, type RecordCreateParams } from './records';
11
- export { Runs, type Run, type RunUpdateResponse, type RunCreateParams, type RunUpdateParams } from './runs';
12
+ export { Runs, type Run, type RunCreateParams } from './runs';
13
+ export { Scores, type Score, type ScoreUpsertParams } from './scores';
12
14
  export {
13
15
  SystemConfigs,
14
16
  type SystemConfig,
@@ -1,48 +1,87 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
2
 
3
3
  import { APIResource } from '../core/resource';
4
+ import { APIPromise } from '../core/api-promise';
4
5
  import { PagePromise, PaginatedResponse, type PaginatedResponseParams } from '../core/pagination';
5
6
  import { RequestOptions } from '../internal/request-options';
6
7
 
7
8
  export class Projects extends APIResource {
9
+ /**
10
+ * Create a new Project.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const project = await client.projects.create({
15
+ * description: 'This is a test project',
16
+ * name: 'My Project',
17
+ * });
18
+ * ```
19
+ */
20
+ create(body: ProjectCreateParams, options?: RequestOptions): APIPromise<Project> {
21
+ return this._client.post('/projects', { body, ...options });
22
+ }
23
+
8
24
  /**
9
25
  * Retrieve a paginated list of all Projects. Projects are ordered by creation
10
26
  * date, with oldest Projects first.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * // Automatically fetches more pages as needed.
31
+ * for await (const project of client.projects.list()) {
32
+ * // ...
33
+ * }
34
+ * ```
11
35
  */
12
36
  list(
13
37
  query: ProjectListParams | null | undefined = {},
14
38
  options?: RequestOptions,
15
- ): PagePromise<ProjectListResponsesPaginatedResponse, ProjectListResponse> {
16
- return this._client.getAPIList('/projects', PaginatedResponse<ProjectListResponse>, {
17
- query,
18
- ...options,
19
- });
39
+ ): PagePromise<ProjectsPaginatedResponse, Project> {
40
+ return this._client.getAPIList('/projects', PaginatedResponse<Project>, { query, ...options });
20
41
  }
21
42
  }
22
43
 
23
- export type ProjectListResponsesPaginatedResponse = PaginatedResponse<ProjectListResponse>;
44
+ export type ProjectsPaginatedResponse = PaginatedResponse<Project>;
24
45
 
25
46
  /**
26
47
  * A Project in the Scorecard system.
27
48
  */
28
- export interface ProjectListResponse {
49
+ export interface Project {
29
50
  /**
30
51
  * The ID of the Project.
31
52
  */
32
53
  id: string;
33
54
 
55
+ /**
56
+ * The description of the Project.
57
+ */
58
+ description: string | null;
59
+
34
60
  /**
35
61
  * The name of the Project.
36
62
  */
37
63
  name: string | null;
38
64
  }
39
65
 
66
+ export interface ProjectCreateParams {
67
+ /**
68
+ * The description of the Project.
69
+ */
70
+ description: string;
71
+
72
+ /**
73
+ * The name of the Project.
74
+ */
75
+ name: string;
76
+ }
77
+
40
78
  export interface ProjectListParams extends PaginatedResponseParams {}
41
79
 
42
80
  export declare namespace Projects {
43
81
  export {
44
- type ProjectListResponse as ProjectListResponse,
45
- type ProjectListResponsesPaginatedResponse as ProjectListResponsesPaginatedResponse,
82
+ type Project as Project,
83
+ type ProjectsPaginatedResponse as ProjectsPaginatedResponse,
84
+ type ProjectCreateParams as ProjectCreateParams,
46
85
  type ProjectListParams as ProjectListParams,
47
86
  };
48
87
  }
@@ -9,6 +9,18 @@ import { path } from '../internal/utils/path';
9
9
  export class Records extends APIResource {
10
10
  /**
11
11
  * Create a new Record in a Run.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const record = await client.records.create('135', {
16
+ * expected: {
17
+ * idealAnswer: 'Paris is the capital of France',
18
+ * },
19
+ * inputs: { question: 'What is the capital of France?' },
20
+ * outputs: { response: 'The capital of France is Paris.' },
21
+ * testcaseId: '248',
22
+ * });
23
+ * ```
12
24
  */
13
25
  create(runID: string, body: RecordCreateParams, options?: RequestOptions): APIPromise<Record> {
14
26
  return this._client.post(path`/runs/${runID}/records`, { body, ...options });
@@ -25,15 +37,15 @@ export interface Record {
25
37
  id: string;
26
38
 
27
39
  /**
28
- * The actual inputs sent to the system, which should match the system's input
29
- * schema.
40
+ * The expected outputs for the Testcase.
30
41
  */
31
- inputs: BuiltinRecord<string, unknown>;
42
+ expected: BuiltinRecord<string, unknown>;
32
43
 
33
44
  /**
34
- * The expected outputs for the Testcase.
45
+ * The actual inputs sent to the system, which should match the system's input
46
+ * schema.
35
47
  */
36
- labels: BuiltinRecord<string, unknown>;
48
+ inputs: BuiltinRecord<string, unknown>;
37
49
 
38
50
  /**
39
51
  * The actual outputs from the system.
@@ -53,15 +65,15 @@ export interface Record {
53
65
 
54
66
  export interface RecordCreateParams {
55
67
  /**
56
- * The actual inputs sent to the system, which should match the system's input
57
- * schema.
68
+ * The expected outputs for the Testcase.
58
69
  */
59
- inputs: BuiltinRecord<string, unknown>;
70
+ expected: BuiltinRecord<string, unknown>;
60
71
 
61
72
  /**
62
- * The expected outputs for the Testcase.
73
+ * The actual inputs sent to the system, which should match the system's input
74
+ * schema.
63
75
  */
64
- labels: BuiltinRecord<string, unknown>;
76
+ inputs: BuiltinRecord<string, unknown>;
65
77
 
66
78
  /**
67
79
  * The actual outputs from the system.
@@ -8,17 +8,19 @@ import { path } from '../internal/utils/path';
8
8
  export class Runs extends APIResource {
9
9
  /**
10
10
  * Create a new Run.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * const run = await client.runs.create('314', {
15
+ * metricIds: ['789', '101'],
16
+ * testsetId: '246',
17
+ * systemConfigId: '87654321-4d3b-4ae4-8c7a-4b6e2a19ccf0',
18
+ * });
19
+ * ```
11
20
  */
12
21
  create(projectID: string, body: RunCreateParams, options?: RequestOptions): APIPromise<Run> {
13
22
  return this._client.post(path`/projects/${projectID}/runs`, { body, ...options });
14
23
  }
15
-
16
- /**
17
- * Update the status of a Run.
18
- */
19
- update(runID: string, body: RunUpdateParams, options?: RequestOptions): APIPromise<RunUpdateResponse> {
20
- return this._client.patch(path`/runs/${runID}`, { body, ...options });
21
- }
22
24
  }
23
25
 
24
26
  /**
@@ -58,25 +60,6 @@ export interface Run {
58
60
  systemConfigId?: string;
59
61
  }
60
62
 
61
- export interface RunUpdateResponse {
62
- /**
63
- * The ID of the Run.
64
- */
65
- id: string;
66
-
67
- /**
68
- * The status of the Run.
69
- */
70
- status:
71
- | 'pending'
72
- | 'awaiting_execution'
73
- | 'running_execution'
74
- | 'awaiting_scoring'
75
- | 'running_scoring'
76
- | 'awaiting_human_scoring'
77
- | 'completed';
78
- }
79
-
80
63
  export interface RunCreateParams {
81
64
  /**
82
65
  * The IDs of the metrics this Run is using.
@@ -94,25 +77,6 @@ export interface RunCreateParams {
94
77
  systemConfigId?: string;
95
78
  }
96
79
 
97
- export interface RunUpdateParams {
98
- /**
99
- * The status of the Run.
100
- */
101
- status:
102
- | 'pending'
103
- | 'awaiting_execution'
104
- | 'running_execution'
105
- | 'awaiting_scoring'
106
- | 'running_scoring'
107
- | 'awaiting_human_scoring'
108
- | 'completed';
109
- }
110
-
111
80
  export declare namespace Runs {
112
- export {
113
- type Run as Run,
114
- type RunUpdateResponse as RunUpdateResponse,
115
- type RunCreateParams as RunCreateParams,
116
- type RunUpdateParams as RunUpdateParams,
117
- };
81
+ export { type Run as Run, type RunCreateParams as RunCreateParams };
118
82
  }
@@ -0,0 +1,98 @@
1
+ // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
+
3
+ import { APIResource } from '../core/resource';
4
+ import { APIPromise } from '../core/api-promise';
5
+ import { RequestOptions } from '../internal/request-options';
6
+ import { path } from '../internal/utils/path';
7
+
8
+ export class Scores extends APIResource {
9
+ /**
10
+ * Create or update a Score for a given Record and MetricConfig. If a Score with
11
+ * the specified Record ID and MetricConfig ID already exists, it will be updated.
12
+ * Otherwise, a new Score will be created. The score provided should conform to the
13
+ * schema defined by the MetricConfig; otherwise, validation errors will be
14
+ * reported.
15
+ *
16
+ * @example
17
+ * ```ts
18
+ * const score = await client.scores.upsert(
19
+ * 'a1b2c3d4-e5f6-7890-1234-567890abcdef',
20
+ * {
21
+ * recordId: '777',
22
+ * score: {
23
+ * value: true,
24
+ * reasoning: 'The response is correct',
25
+ * },
26
+ * },
27
+ * );
28
+ * ```
29
+ */
30
+ upsert(metricConfigID: string, params: ScoreUpsertParams, options?: RequestOptions): APIPromise<Score> {
31
+ const { recordId, ...body } = params;
32
+ return this._client.put(path`/records/${recordId}/scores/${metricConfigID}`, { body, ...options });
33
+ }
34
+ }
35
+
36
+ /**
37
+ * A Score represents the evaluation of a Record against a specific MetricConfig.
38
+ * The actual `score` is stored as flexible JSON. While any JSON is accepted, it is
39
+ * expected to conform to the output schema defined by the MetricConfig. Any
40
+ * discrepancies will be noted in the `validationErrors` field, but the Score will
41
+ * still be stored.
42
+ */
43
+ export interface Score {
44
+ /**
45
+ * The ID of the MetricConfig this Score is for.
46
+ */
47
+ metricConfigId: string;
48
+
49
+ /**
50
+ * The ID of the Record this Score is for.
51
+ */
52
+ recordId: string;
53
+
54
+ /**
55
+ * The score of the Record, as arbitrary JSON. This data should ideally conform to
56
+ * the output schema defined by the associated MetricConfig. If it doesn't,
57
+ * validation errors will be captured in the `validationErrors` field.
58
+ */
59
+ score: Record<string, unknown>;
60
+
61
+ /**
62
+ * Validation errors found in the Score data. If present, the Score doesn't fully
63
+ * conform to its MetricConfig's schema.
64
+ */
65
+ validationErrors?: Array<Score.ValidationError>;
66
+ }
67
+
68
+ export namespace Score {
69
+ export interface ValidationError {
70
+ /**
71
+ * Human-readable error description.
72
+ */
73
+ message: string;
74
+
75
+ /**
76
+ * JSON Pointer to the field with the validation error.
77
+ */
78
+ path: string;
79
+ }
80
+ }
81
+
82
+ export interface ScoreUpsertParams {
83
+ /**
84
+ * Path param: The ID of the Record.
85
+ */
86
+ recordId: string;
87
+
88
+ /**
89
+ * Body param: The score of the Record, as arbitrary JSON. This data should ideally
90
+ * conform to the output schema defined by the associated MetricConfig. If it
91
+ * doesn't, validation errors will be captured in the `validationErrors` field.
92
+ */
93
+ score: Record<string, unknown>;
94
+ }
95
+
96
+ export declare namespace Scores {
97
+ export { type Score as Score, type ScoreUpsertParams as ScoreUpsertParams };
98
+ }