notdiamond 2.0.0-rc1 → 2.0.0-rc10

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 (137) hide show
  1. package/CHANGELOG.md +89 -0
  2. package/README.md +299 -97
  3. package/client.d.mts +19 -33
  4. package/client.d.mts.map +1 -1
  5. package/client.d.ts +19 -33
  6. package/client.d.ts.map +1 -1
  7. package/client.js +19 -35
  8. package/client.js.map +1 -1
  9. package/client.mjs +19 -35
  10. package/client.mjs.map +1 -1
  11. package/internal/tslib.js +17 -17
  12. package/internal/utils/env.d.mts.map +1 -1
  13. package/internal/utils/env.d.ts.map +1 -1
  14. package/internal/utils/env.js +4 -2
  15. package/internal/utils/env.js.map +1 -1
  16. package/internal/utils/env.mjs +4 -2
  17. package/internal/utils/env.mjs.map +1 -1
  18. package/package.json +10 -11
  19. package/resources/custom-router.d.mts +145 -0
  20. package/resources/custom-router.d.mts.map +1 -0
  21. package/resources/custom-router.d.ts +145 -0
  22. package/resources/custom-router.d.ts.map +1 -0
  23. package/resources/custom-router.js +83 -0
  24. package/resources/custom-router.js.map +1 -0
  25. package/resources/custom-router.mjs +79 -0
  26. package/resources/custom-router.mjs.map +1 -0
  27. package/resources/index.d.mts +6 -6
  28. package/resources/index.d.mts.map +1 -1
  29. package/resources/index.d.ts +6 -6
  30. package/resources/index.d.ts.map +1 -1
  31. package/resources/index.js +6 -6
  32. package/resources/index.js.map +1 -1
  33. package/resources/index.mjs +3 -3
  34. package/resources/index.mjs.map +1 -1
  35. package/resources/model-router.d.mts +196 -0
  36. package/resources/model-router.d.mts.map +1 -0
  37. package/resources/model-router.d.ts +196 -0
  38. package/resources/model-router.d.ts.map +1 -0
  39. package/resources/model-router.js +70 -0
  40. package/resources/model-router.js.map +1 -0
  41. package/resources/model-router.mjs +66 -0
  42. package/resources/model-router.mjs.map +1 -0
  43. package/resources/models.d.mts +50 -25
  44. package/resources/models.d.mts.map +1 -1
  45. package/resources/models.d.ts +50 -25
  46. package/resources/models.d.ts.map +1 -1
  47. package/resources/models.js +5 -0
  48. package/resources/models.js.map +1 -1
  49. package/resources/models.mjs +5 -0
  50. package/resources/models.mjs.map +1 -1
  51. package/resources/preferences.d.mts +34 -48
  52. package/resources/preferences.d.mts.map +1 -1
  53. package/resources/preferences.d.ts +34 -48
  54. package/resources/preferences.d.ts.map +1 -1
  55. package/resources/preferences.js +14 -36
  56. package/resources/preferences.js.map +1 -1
  57. package/resources/preferences.mjs +14 -36
  58. package/resources/preferences.mjs.map +1 -1
  59. package/resources/prompt-adaptation.d.mts +339 -234
  60. package/resources/prompt-adaptation.d.mts.map +1 -1
  61. package/resources/prompt-adaptation.d.ts +339 -234
  62. package/resources/prompt-adaptation.d.ts.map +1 -1
  63. package/resources/prompt-adaptation.js +30 -53
  64. package/resources/prompt-adaptation.js.map +1 -1
  65. package/resources/prompt-adaptation.mjs +30 -53
  66. package/resources/prompt-adaptation.mjs.map +1 -1
  67. package/resources/report/index.d.mts +3 -0
  68. package/resources/report/index.d.mts.map +1 -0
  69. package/resources/report/index.d.ts +3 -0
  70. package/resources/report/index.d.ts.map +1 -0
  71. package/resources/report/index.js +9 -0
  72. package/resources/report/index.js.map +1 -0
  73. package/resources/report/index.mjs +4 -0
  74. package/resources/report/index.mjs.map +1 -0
  75. package/resources/report/metrics.d.mts +87 -0
  76. package/resources/report/metrics.d.mts.map +1 -0
  77. package/resources/report/metrics.d.ts +87 -0
  78. package/resources/report/metrics.d.ts.map +1 -0
  79. package/resources/report/metrics.js +57 -0
  80. package/resources/report/metrics.js.map +1 -0
  81. package/resources/report/metrics.mjs +53 -0
  82. package/resources/report/metrics.mjs.map +1 -0
  83. package/resources/report/report.d.mts +10 -0
  84. package/resources/report/report.d.mts.map +1 -0
  85. package/resources/report/report.d.ts +10 -0
  86. package/resources/report/report.d.ts.map +1 -0
  87. package/resources/report/report.js +17 -0
  88. package/resources/report/report.js.map +1 -0
  89. package/resources/report/report.mjs +12 -0
  90. package/resources/report/report.mjs.map +1 -0
  91. package/resources/report.d.mts +1 -244
  92. package/resources/report.d.mts.map +1 -1
  93. package/resources/report.d.ts +1 -244
  94. package/resources/report.d.ts.map +1 -1
  95. package/resources/report.js +2 -82
  96. package/resources/report.js.map +1 -1
  97. package/resources/report.mjs +1 -80
  98. package/resources/report.mjs.map +1 -1
  99. package/src/client.ts +65 -116
  100. package/src/internal/utils/env.ts +4 -2
  101. package/src/resources/custom-router.ts +168 -0
  102. package/src/resources/index.ts +23 -34
  103. package/src/resources/model-router.ts +224 -0
  104. package/src/resources/models.ts +55 -32
  105. package/src/resources/preferences.ts +40 -77
  106. package/src/resources/prompt-adaptation.ts +361 -291
  107. package/src/resources/report/index.ts +4 -0
  108. package/src/resources/report/metrics.ts +99 -0
  109. package/src/resources/report/report.ts +19 -0
  110. package/src/resources/report.ts +1 -298
  111. package/src/version.ts +1 -1
  112. package/version.d.mts +1 -1
  113. package/version.d.mts.map +1 -1
  114. package/version.d.ts +1 -1
  115. package/version.d.ts.map +1 -1
  116. package/version.js +1 -1
  117. package/version.js.map +1 -1
  118. package/version.mjs +1 -1
  119. package/version.mjs.map +1 -1
  120. package/resources/admin.d.mts +0 -4
  121. package/resources/admin.d.mts.map +0 -1
  122. package/resources/admin.d.ts +0 -4
  123. package/resources/admin.d.ts.map +0 -1
  124. package/resources/admin.js +0 -9
  125. package/resources/admin.js.map +0 -1
  126. package/resources/admin.mjs +0 -5
  127. package/resources/admin.mjs.map +0 -1
  128. package/resources/routing.d.mts +0 -391
  129. package/resources/routing.d.mts.map +0 -1
  130. package/resources/routing.d.ts +0 -391
  131. package/resources/routing.d.ts.map +0 -1
  132. package/resources/routing.js +0 -163
  133. package/resources/routing.js.map +0 -1
  134. package/resources/routing.mjs +0 -159
  135. package/resources/routing.mjs.map +0 -1
  136. package/src/resources/admin.ts +0 -5
  137. package/src/resources/routing.ts +0 -476
@@ -1,86 +1,6 @@
1
1
  "use strict";
2
2
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.Report = void 0;
5
- const resource_1 = require("../core/resource.js");
6
- class Report extends resource_1.APIResource {
7
- /**
8
- * Evaluate Hallucination
9
- *
10
- * @example
11
- * ```ts
12
- * const response = await client.report.evaluateHallucination({
13
- * context: 'context',
14
- * prompt: 'prompt',
15
- * provider: { model: 'gpt-4o', provider: 'openai' },
16
- * response: 'response',
17
- * });
18
- * ```
19
- */
20
- evaluateHallucination(body, options) {
21
- return this._client.post('/v2/report/hallucination', { body, ...options });
22
- }
23
- /**
24
- * Report Latency
25
- *
26
- * @example
27
- * ```ts
28
- * const response = await client.report.latency({
29
- * feedback: { accuracy: 'bar' },
30
- * provider: { model: 'gpt-4o', provider: 'openai' },
31
- * session_id: 'session_id',
32
- * });
33
- * ```
34
- */
35
- latency(body, options) {
36
- return this._client.post('/v2/report/metrics/latency', { body, ...options });
37
- }
38
- /**
39
- * Submit feedback on a routing decision to improve future recommendations.
40
- *
41
- * This endpoint allows you to provide feedback on whether the router selected the
42
- * right model for your query. Your feedback is used to:
43
- *
44
- * 1. Personalize routing decisions for your preference_id
45
- * 2. Improve the overall routing quality
46
- * 3. Train and refine custom routers
47
- *
48
- * **Feedback Format:**
49
- *
50
- * - `accuracy: 1` - Thumbs up (the model performed well)
51
- * - `accuracy: 0` - Thumbs down (the model did not perform well)
52
- *
53
- * **Requirements:**
54
- *
55
- * - You must have used a preference_id in the original model_select() call
56
- * - The session_id must be valid and belong to your account
57
- * - The provider must match one of the providers returned by model_select()
58
- *
59
- * **How Feedback Works:** When you submit thumbs down, the router will:
60
- *
61
- * - Decrease the ranking of the selected model for similar queries
62
- * - Consider alternative models more favorably
63
- *
64
- * When you submit thumbs up, the router will:
65
- *
66
- * - Increase the ranking of the selected model for similar queries
67
- * - Prioritize this model for similar future requests
68
- *
69
- * **Note:** Feedback requires a valid preference_id. Create one via POST
70
- * /v2/preferences/userPreferenceCreate
71
- *
72
- * @example
73
- * ```ts
74
- * const response = await client.report.submitFeedback({
75
- * feedback: { accuracy: 1 },
76
- * provider: { provider: 'openai', model: 'gpt-4o' },
77
- * session_id: '550e8400-e29b-41d4-a716-446655440000',
78
- * });
79
- * ```
80
- */
81
- submitFeedback(body, options) {
82
- return this._client.post('/v2/report/metrics/feedback', { body, ...options });
83
- }
84
- }
85
- exports.Report = Report;
4
+ const tslib_1 = require("../internal/tslib.js");
5
+ tslib_1.__exportStar(require("./report/index.js"), exports);
86
6
  //# sourceMappingURL=report.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/resources/report.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,kDAA+C;AAI/C,MAAa,MAAO,SAAQ,sBAAW;IACrC;;;;;;;;;;;;OAYG;IACH,qBAAqB,CACnB,IAAuC,EACvC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,IAAyB,EAAE,OAAwB;QACzD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACH,cAAc,CACZ,IAAgC,EAChC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;CACF;AAtFD,wBAsFC"}
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../src/resources/report.ts"],"names":[],"mappings":";AAAA,sFAAsF;;;AAEtF,4DAA+B"}
@@ -1,82 +1,3 @@
1
1
  // File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
2
- import { APIResource } from "../core/resource.mjs";
3
- export class Report extends APIResource {
4
- /**
5
- * Evaluate Hallucination
6
- *
7
- * @example
8
- * ```ts
9
- * const response = await client.report.evaluateHallucination({
10
- * context: 'context',
11
- * prompt: 'prompt',
12
- * provider: { model: 'gpt-4o', provider: 'openai' },
13
- * response: 'response',
14
- * });
15
- * ```
16
- */
17
- evaluateHallucination(body, options) {
18
- return this._client.post('/v2/report/hallucination', { body, ...options });
19
- }
20
- /**
21
- * Report Latency
22
- *
23
- * @example
24
- * ```ts
25
- * const response = await client.report.latency({
26
- * feedback: { accuracy: 'bar' },
27
- * provider: { model: 'gpt-4o', provider: 'openai' },
28
- * session_id: 'session_id',
29
- * });
30
- * ```
31
- */
32
- latency(body, options) {
33
- return this._client.post('/v2/report/metrics/latency', { body, ...options });
34
- }
35
- /**
36
- * Submit feedback on a routing decision to improve future recommendations.
37
- *
38
- * This endpoint allows you to provide feedback on whether the router selected the
39
- * right model for your query. Your feedback is used to:
40
- *
41
- * 1. Personalize routing decisions for your preference_id
42
- * 2. Improve the overall routing quality
43
- * 3. Train and refine custom routers
44
- *
45
- * **Feedback Format:**
46
- *
47
- * - `accuracy: 1` - Thumbs up (the model performed well)
48
- * - `accuracy: 0` - Thumbs down (the model did not perform well)
49
- *
50
- * **Requirements:**
51
- *
52
- * - You must have used a preference_id in the original model_select() call
53
- * - The session_id must be valid and belong to your account
54
- * - The provider must match one of the providers returned by model_select()
55
- *
56
- * **How Feedback Works:** When you submit thumbs down, the router will:
57
- *
58
- * - Decrease the ranking of the selected model for similar queries
59
- * - Consider alternative models more favorably
60
- *
61
- * When you submit thumbs up, the router will:
62
- *
63
- * - Increase the ranking of the selected model for similar queries
64
- * - Prioritize this model for similar future requests
65
- *
66
- * **Note:** Feedback requires a valid preference_id. Create one via POST
67
- * /v2/preferences/userPreferenceCreate
68
- *
69
- * @example
70
- * ```ts
71
- * const response = await client.report.submitFeedback({
72
- * feedback: { accuracy: 1 },
73
- * provider: { provider: 'openai', model: 'gpt-4o' },
74
- * session_id: '550e8400-e29b-41d4-a716-446655440000',
75
- * });
76
- * ```
77
- */
78
- submitFeedback(body, options) {
79
- return this._client.post('/v2/report/metrics/feedback', { body, ...options });
80
- }
81
- }
2
+ export * from "./report/index.mjs";
82
3
  //# sourceMappingURL=report.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"report.mjs","sourceRoot":"","sources":["../src/resources/report.ts"],"names":[],"mappings":"AAAA,sFAAsF;OAE/E,EAAE,WAAW,EAAE;AAItB,MAAM,OAAO,MAAO,SAAQ,WAAW;IACrC;;;;;;;;;;;;OAYG;IACH,qBAAqB,CACnB,IAAuC,EACvC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,IAAyB,EAAE,OAAwB;QACzD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,4BAA4B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA0CG;IACH,cAAc,CACZ,IAAgC,EAChC,OAAwB;QAExB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;IAChF,CAAC;CACF"}
1
+ {"version":3,"file":"report.mjs","sourceRoot":"","sources":["../src/resources/report.ts"],"names":[],"mappings":"AAAA,sFAAsF"}
package/src/client.ts CHANGED
@@ -17,48 +17,37 @@ import * as Errors from './core/error';
17
17
  import * as Uploads from './core/uploads';
18
18
  import * as API from './resources/index';
19
19
  import { APIPromise } from './core/api-promise';
20
- import { Admin } from './resources/admin';
21
- import { ModelListParams, ModelListResponse, Models } from './resources/models';
22
20
  import {
23
- PreferenceCreateUserPreferenceParams,
24
- PreferenceCreateUserPreferenceResponse,
25
- PreferenceDeleteUserPreferenceResponse,
26
- PreferenceRetrieveParams,
27
- PreferenceRetrieveResponse,
28
- PreferenceUpdateUserPreferenceParams,
29
- PreferenceUpdateUserPreferenceResponse,
21
+ CustomRouter,
22
+ CustomRouterTrainCustomRouterParams,
23
+ CustomRouterTrainCustomRouterResponse,
24
+ } from './resources/custom-router';
25
+ import {
26
+ ModelRouter,
27
+ ModelRouterSelectModelParams,
28
+ ModelRouterSelectModelResponse,
29
+ } from './resources/model-router';
30
+ import { Model, ModelListParams, ModelListResponse, Models } from './resources/models';
31
+ import {
32
+ PreferenceCreateParams,
33
+ PreferenceCreateResponse,
34
+ PreferenceDeleteResponse,
35
+ PreferenceUpdateParams,
36
+ PreferenceUpdateResponse,
30
37
  Preferences,
31
38
  } from './resources/preferences';
32
39
  import {
33
- AdaptationRunResults,
40
+ GoldenRecord,
34
41
  JobStatus,
35
42
  PromptAdaptation,
36
- PromptAdaptationAdaptParams,
37
- PromptAdaptationAdaptResponse,
38
- PromptAdaptationGetAdaptRunResultsParams,
39
- PromptAdaptationGetAdaptRunsParams,
40
- PromptAdaptationGetAdaptRunsResponse,
43
+ PromptAdaptationCreateParams,
44
+ PromptAdaptationCreateResponse,
45
+ PromptAdaptationGetAdaptResultsResponse,
41
46
  PromptAdaptationGetAdaptStatusResponse,
42
- PromptAdaptationRetrieveCostsResponse,
47
+ PromptAdaptationGetCostsResponse,
48
+ RequestProvider,
43
49
  } from './resources/prompt-adaptation';
44
- import {
45
- Report,
46
- ReportEvaluateHallucinationParams,
47
- ReportEvaluateHallucinationResponse,
48
- ReportLatencyParams,
49
- ReportLatencyResponse,
50
- ReportSubmitFeedbackParams,
51
- ReportSubmitFeedbackResponse,
52
- } from './resources/report';
53
- import {
54
- Routing,
55
- RoutingCreateSurveyResponseParams,
56
- RoutingCreateSurveyResponseResponse,
57
- RoutingSelectModelParams,
58
- RoutingSelectModelResponse,
59
- RoutingTrainCustomRouterParams,
60
- RoutingTrainCustomRouterResponse,
61
- } from './resources/routing';
50
+ import { Report } from './resources/report/report';
62
51
  import { type Fetch } from './internal/builtin-types';
63
52
  import { HeadersLike, NullableHeaders, buildHeaders } from './internal/headers';
64
53
  import { FinalRequestOptions, RequestOptions } from './internal/request-options';
@@ -72,26 +61,11 @@ import {
72
61
  } from './internal/utils/log';
73
62
  import { isEmptyObj } from './internal/utils/values';
74
63
 
75
- const environments = {
76
- production: 'https://api.notdiamond.ai',
77
- staging: 'https://staging-api.notdiamond.ai',
78
- };
79
- type Environment = keyof typeof environments;
80
-
81
64
  export interface ClientOptions {
82
65
  /**
83
- * Defaults to process.env['NOT_DIAMOND_API_KEY'].
84
- */
85
- apiKey?: string | null | undefined;
86
-
87
- /**
88
- * Specifies the environment to use for the API.
89
- *
90
- * Each environment maps to a different base URL:
91
- * - `production` corresponds to `https://api.notdiamond.ai`
92
- * - `staging` corresponds to `https://staging-api.notdiamond.ai`
66
+ * API key authentication using Bearer token
93
67
  */
94
- environment?: Environment | undefined;
68
+ apiKey?: string | undefined;
95
69
 
96
70
  /**
97
71
  * Override the default base URL for the API, e.g., "https://api.example.com/v2/"
@@ -166,7 +140,7 @@ export interface ClientOptions {
166
140
  * API Client for interfacing with the Not Diamond API.
167
141
  */
168
142
  export class NotDiamond {
169
- apiKey: string | null;
143
+ apiKey: string;
170
144
 
171
145
  baseURL: string;
172
146
  maxRetries: number;
@@ -183,8 +157,7 @@ export class NotDiamond {
183
157
  /**
184
158
  * API Client for interfacing with the Not Diamond API.
185
159
  *
186
- * @param {string | null | undefined} [opts.apiKey=process.env['NOT_DIAMOND_API_KEY'] ?? null]
187
- * @param {Environment} [opts.environment=production] - Specifies the environment URL to use for the API.
160
+ * @param {string | undefined} [opts.apiKey=process.env['NOT_DIAMOND_API_KEY'] ?? undefined]
188
161
  * @param {string} [opts.baseURL=process.env['NOT_DIAMOND_BASE_URL'] ?? https://api.notdiamond.ai] - Override the default base URL for the API.
189
162
  * @param {number} [opts.timeout=1 minute] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out.
190
163
  * @param {MergedRequestInit} [opts.fetchOptions] - Additional `RequestInit` options to be passed to `fetch` calls.
@@ -195,23 +168,22 @@ export class NotDiamond {
195
168
  */
196
169
  constructor({
197
170
  baseURL = readEnv('NOT_DIAMOND_BASE_URL'),
198
- apiKey = readEnv('NOT_DIAMOND_API_KEY') ?? null,
171
+ apiKey = readEnv('NOT_DIAMOND_API_KEY'),
199
172
  ...opts
200
173
  }: ClientOptions = {}) {
174
+ if (apiKey === undefined) {
175
+ throw new Errors.NotDiamondError(
176
+ "The NOT_DIAMOND_API_KEY environment variable is missing or empty; either provide it, or instantiate the NotDiamond client with an apiKey option, like new NotDiamond({ apiKey: 'My API Key' }).",
177
+ );
178
+ }
179
+
201
180
  const options: ClientOptions = {
202
181
  apiKey,
203
182
  ...opts,
204
- baseURL,
205
- environment: opts.environment ?? 'production',
183
+ baseURL: baseURL || `https://api.notdiamond.ai`,
206
184
  };
207
185
 
208
- if (baseURL && opts.environment) {
209
- throw new Errors.NotDiamondError(
210
- 'Ambiguous URL; The `baseURL` option (or NOT_DIAMOND_BASE_URL env var) and the `environment` option are given. If you want to use the environment you must pass baseURL: null',
211
- );
212
- }
213
-
214
- this.baseURL = options.baseURL || environments[options.environment || 'production'];
186
+ this.baseURL = options.baseURL!;
215
187
  this.timeout = options.timeout ?? NotDiamond.DEFAULT_TIMEOUT /* 1 minute */;
216
188
  this.logger = options.logger ?? console;
217
189
  const defaultLogLevel = 'warn';
@@ -237,8 +209,7 @@ export class NotDiamond {
237
209
  withOptions(options: Partial<ClientOptions>): this {
238
210
  const client = new (this.constructor as any as new (props: ClientOptions) => typeof this)({
239
211
  ...this._options,
240
- environment: options.environment ? options.environment : undefined,
241
- baseURL: options.environment ? undefined : this.baseURL,
212
+ baseURL: this.baseURL,
242
213
  maxRetries: this.maxRetries,
243
214
  timeout: this.timeout,
244
215
  logger: this.logger,
@@ -255,7 +226,7 @@ export class NotDiamond {
255
226
  * Check whether the base URL is set to its default.
256
227
  */
257
228
  #baseURLOverridden(): boolean {
258
- return this.baseURL !== environments[this._options.environment || 'production'];
229
+ return this.baseURL !== 'https://api.notdiamond.ai';
259
230
  }
260
231
 
261
232
  protected defaultQuery(): Record<string, string | undefined> | undefined {
@@ -263,22 +234,10 @@ export class NotDiamond {
263
234
  }
264
235
 
265
236
  protected validateHeaders({ values, nulls }: NullableHeaders) {
266
- if (this.apiKey && values.get('authorization')) {
267
- return;
268
- }
269
- if (nulls.has('authorization')) {
270
- return;
271
- }
272
-
273
- throw new Error(
274
- 'Could not resolve authentication method. Expected the apiKey to be set. Or for the "Authorization" headers to be explicitly omitted',
275
- );
237
+ return;
276
238
  }
277
239
 
278
240
  protected async authHeaders(opts: FinalRequestOptions): Promise<NullableHeaders | undefined> {
279
- if (this.apiKey == null) {
280
- return undefined;
281
- }
282
241
  return buildHeaders([{ Authorization: `Bearer ${this.apiKey}` }]);
283
242
  }
284
243
 
@@ -770,73 +729,63 @@ export class NotDiamond {
770
729
 
771
730
  static toFile = Uploads.toFile;
772
731
 
773
- routing: API.Routing = new API.Routing(this);
732
+ modelRouter: API.ModelRouter = new API.ModelRouter(this);
733
+ report: API.Report = new API.Report(this);
774
734
  preferences: API.Preferences = new API.Preferences(this);
775
735
  promptAdaptation: API.PromptAdaptation = new API.PromptAdaptation(this);
776
- report: API.Report = new API.Report(this);
736
+ customRouter: API.CustomRouter = new API.CustomRouter(this);
777
737
  models: API.Models = new API.Models(this);
778
- admin: API.Admin = new API.Admin(this);
779
738
  }
780
739
 
781
- NotDiamond.Routing = Routing;
740
+ NotDiamond.ModelRouter = ModelRouter;
741
+ NotDiamond.Report = Report;
782
742
  NotDiamond.Preferences = Preferences;
783
743
  NotDiamond.PromptAdaptation = PromptAdaptation;
784
- NotDiamond.Report = Report;
744
+ NotDiamond.CustomRouter = CustomRouter;
785
745
  NotDiamond.Models = Models;
786
- NotDiamond.Admin = Admin;
787
746
 
788
747
  export declare namespace NotDiamond {
789
748
  export type RequestOptions = Opts.RequestOptions;
790
749
 
791
750
  export {
792
- Routing as Routing,
793
- type RoutingCreateSurveyResponseResponse as RoutingCreateSurveyResponseResponse,
794
- type RoutingSelectModelResponse as RoutingSelectModelResponse,
795
- type RoutingTrainCustomRouterResponse as RoutingTrainCustomRouterResponse,
796
- type RoutingCreateSurveyResponseParams as RoutingCreateSurveyResponseParams,
797
- type RoutingSelectModelParams as RoutingSelectModelParams,
798
- type RoutingTrainCustomRouterParams as RoutingTrainCustomRouterParams,
751
+ ModelRouter as ModelRouter,
752
+ type ModelRouterSelectModelResponse as ModelRouterSelectModelResponse,
753
+ type ModelRouterSelectModelParams as ModelRouterSelectModelParams,
799
754
  };
800
755
 
756
+ export { Report as Report };
757
+
801
758
  export {
802
759
  Preferences as Preferences,
803
- type PreferenceRetrieveResponse as PreferenceRetrieveResponse,
804
- type PreferenceCreateUserPreferenceResponse as PreferenceCreateUserPreferenceResponse,
805
- type PreferenceDeleteUserPreferenceResponse as PreferenceDeleteUserPreferenceResponse,
806
- type PreferenceUpdateUserPreferenceResponse as PreferenceUpdateUserPreferenceResponse,
807
- type PreferenceRetrieveParams as PreferenceRetrieveParams,
808
- type PreferenceCreateUserPreferenceParams as PreferenceCreateUserPreferenceParams,
809
- type PreferenceUpdateUserPreferenceParams as PreferenceUpdateUserPreferenceParams,
760
+ type PreferenceCreateResponse as PreferenceCreateResponse,
761
+ type PreferenceUpdateResponse as PreferenceUpdateResponse,
762
+ type PreferenceDeleteResponse as PreferenceDeleteResponse,
763
+ type PreferenceCreateParams as PreferenceCreateParams,
764
+ type PreferenceUpdateParams as PreferenceUpdateParams,
810
765
  };
811
766
 
812
767
  export {
813
768
  PromptAdaptation as PromptAdaptation,
814
- type AdaptationRunResults as AdaptationRunResults,
769
+ type GoldenRecord as GoldenRecord,
815
770
  type JobStatus as JobStatus,
816
- type PromptAdaptationAdaptResponse as PromptAdaptationAdaptResponse,
817
- type PromptAdaptationGetAdaptRunsResponse as PromptAdaptationGetAdaptRunsResponse,
771
+ type RequestProvider as RequestProvider,
772
+ type PromptAdaptationCreateResponse as PromptAdaptationCreateResponse,
773
+ type PromptAdaptationGetAdaptResultsResponse as PromptAdaptationGetAdaptResultsResponse,
818
774
  type PromptAdaptationGetAdaptStatusResponse as PromptAdaptationGetAdaptStatusResponse,
819
- type PromptAdaptationRetrieveCostsResponse as PromptAdaptationRetrieveCostsResponse,
820
- type PromptAdaptationAdaptParams as PromptAdaptationAdaptParams,
821
- type PromptAdaptationGetAdaptRunResultsParams as PromptAdaptationGetAdaptRunResultsParams,
822
- type PromptAdaptationGetAdaptRunsParams as PromptAdaptationGetAdaptRunsParams,
775
+ type PromptAdaptationGetCostsResponse as PromptAdaptationGetCostsResponse,
776
+ type PromptAdaptationCreateParams as PromptAdaptationCreateParams,
823
777
  };
824
778
 
825
779
  export {
826
- Report as Report,
827
- type ReportEvaluateHallucinationResponse as ReportEvaluateHallucinationResponse,
828
- type ReportLatencyResponse as ReportLatencyResponse,
829
- type ReportSubmitFeedbackResponse as ReportSubmitFeedbackResponse,
830
- type ReportEvaluateHallucinationParams as ReportEvaluateHallucinationParams,
831
- type ReportLatencyParams as ReportLatencyParams,
832
- type ReportSubmitFeedbackParams as ReportSubmitFeedbackParams,
780
+ CustomRouter as CustomRouter,
781
+ type CustomRouterTrainCustomRouterResponse as CustomRouterTrainCustomRouterResponse,
782
+ type CustomRouterTrainCustomRouterParams as CustomRouterTrainCustomRouterParams,
833
783
  };
834
784
 
835
785
  export {
836
786
  Models as Models,
787
+ type Model as Model,
837
788
  type ModelListResponse as ModelListResponse,
838
789
  type ModelListParams as ModelListParams,
839
790
  };
840
-
841
- export { Admin as Admin };
842
791
  }
@@ -9,10 +9,12 @@
9
9
  */
10
10
  export const readEnv = (env: string): string | undefined => {
11
11
  if (typeof (globalThis as any).process !== 'undefined') {
12
- return (globalThis as any).process.env?.[env]?.trim() ?? undefined;
12
+ const value = (globalThis as any).process.env?.[env]?.trim() ?? undefined;
13
+ return value === '' ? undefined : value;
13
14
  }
14
15
  if (typeof (globalThis as any).Deno !== 'undefined') {
15
- return (globalThis as any).Deno.env?.get?.(env)?.trim();
16
+ const value = (globalThis as any).Deno.env?.get?.(env)?.trim();
17
+ return value === '' ? undefined : value;
16
18
  }
17
19
  return undefined;
18
20
  };
@@ -0,0 +1,168 @@
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 { type Uploadable } from '../core/uploads';
6
+ import { RequestOptions } from '../internal/request-options';
7
+ import { multipartFormRequestOptions } from '../internal/uploads';
8
+
9
+ export class CustomRouter extends APIResource {
10
+ /**
11
+ * Train a custom router on your evaluation data to optimize routing for your
12
+ * specific use case.
13
+ *
14
+ * This endpoint allows you to train a domain-specific router that learns which
15
+ * models perform best for different types of queries in your application. The
16
+ * router analyzes your evaluation dataset, clusters similar queries, and learns
17
+ * model performance patterns.
18
+ *
19
+ * **Training Process:**
20
+ *
21
+ * 1. Upload a CSV file with your evaluation data
22
+ * 2. Specify which models to route between
23
+ * 3. Define the evaluation metric (score column)
24
+ * 4. The system trains asynchronously and returns a preference_id
25
+ * 5. Use the preference_id in model_select() calls once training completes
26
+ *
27
+ * **Dataset Requirements:**
28
+ *
29
+ * - Format: CSV file
30
+ * - Minimum samples: 25 (more is better for accuracy)
31
+ * - Required columns:
32
+ * - Prompt column (specified in prompt_column parameter)
33
+ * - For each model: `{provider}/{model}/score` and `{provider}/{model}/response`
34
+ *
35
+ * **Example CSV structure:**
36
+ *
37
+ * ```
38
+ * prompt,openai/gpt-4o/score,openai/gpt-4o/response,anthropic/claude-sonnet-4-5-20250929/score,anthropic/claude-sonnet-4-5-20250929/response
39
+ * "Explain quantum computing",0.95,"Quantum computing uses...",0.87,"Quantum computers leverage..."
40
+ * "Write a Python function",0.82,"def my_function()...",0.91,"Here's a Python function..."
41
+ * ```
42
+ *
43
+ * **Model Selection:**
44
+ *
45
+ * - Specify standard models: `{"provider": "openai", "model": "gpt-4o"}`
46
+ * - Or custom models with pricing:
47
+ * `{"provider": "custom", "model": "my-model", "is_custom": true, "input_price": 10.0, "output_price": 30.0, "context_length": 8192, "latency": 1.5}`
48
+ *
49
+ * **Training Time:**
50
+ *
51
+ * - Training is asynchronous and typically takes 5-15 minutes
52
+ * - Larger datasets or more models take longer
53
+ * - You'll receive a preference_id immediately
54
+ * - Check training status by attempting to use the preference_id in model_select()
55
+ *
56
+ * **Best Practices:**
57
+ *
58
+ * 1. Use diverse, representative examples from your production workload
59
+ * 2. Include at least 50-100 samples for best results
60
+ * 3. Ensure consistent evaluation metrics across all models
61
+ * 4. Use the same models you plan to route between in production
62
+ *
63
+ * **Related Documentation:** See
64
+ * https://docs.notdiamond.ai/docs/adapting-prompts-to-new-models for detailed
65
+ * guide.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const response =
70
+ * await client.customRouter.trainCustomRouter({
71
+ * dataset_file: fs.createReadStream('path/to/file'),
72
+ * language: 'english',
73
+ * llm_providers:
74
+ * '[{"provider": "openai", "model": "gpt-4o"}, {"provider": "anthropic", "model": "claude-sonnet-4-5-20250929"}]',
75
+ * maximize: true,
76
+ * prompt_column: 'prompt',
77
+ * });
78
+ * ```
79
+ */
80
+ trainCustomRouter(
81
+ body: CustomRouterTrainCustomRouterParams,
82
+ options?: RequestOptions,
83
+ ): APIPromise<CustomRouterTrainCustomRouterResponse> {
84
+ return this._client.post(
85
+ '/v2/pzn/trainCustomRouter',
86
+ multipartFormRequestOptions({ body, ...options }, this._client),
87
+ );
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Response model for POST /v2/pzn/trainCustomRouter endpoint.
93
+ *
94
+ * Returned immediately after submitting a custom router training request. The
95
+ * training process runs asynchronously (typically 5-15 minutes), so use the
96
+ * returned preference_id to make routing calls once training completes.
97
+ *
98
+ * **Next steps:**
99
+ *
100
+ * 1. Store the preference_id
101
+ * 2. Wait for training to complete (typically 5-15 minutes)
102
+ * 3. Use this preference_id in POST /v2/modelRouter/modelSelect requests
103
+ * 4. The router will use your custom-trained model to make routing decisions
104
+ *
105
+ * **How to use the preference_id:**
106
+ *
107
+ * - Include it in the 'preference_id' field of model_select() calls
108
+ * - The system automatically uses your custom router once training is complete
109
+ * - No need to poll status - you can start using it immediately (will use default
110
+ * until ready)
111
+ */
112
+ export interface CustomRouterTrainCustomRouterResponse {
113
+ /**
114
+ * Unique identifier for the custom router. Use this in model_select() calls to
115
+ * enable routing with your custom-trained router
116
+ */
117
+ preference_id: string;
118
+ }
119
+
120
+ export interface CustomRouterTrainCustomRouterParams {
121
+ /**
122
+ * CSV file containing evaluation data with prompt column and score/response
123
+ * columns for each model
124
+ */
125
+ dataset_file: Uploadable;
126
+
127
+ /**
128
+ * Language of the evaluation data. Use 'english' for English-only data or
129
+ * 'multilingual' for multi-language support
130
+ */
131
+ language: string;
132
+
133
+ /**
134
+ * JSON string array of LLM providers to train the router on. Format:
135
+ * '[{"provider": "openai", "model": "gpt-4o"}, {"provider": "anthropic", "model":
136
+ * "claude-sonnet-4-5-20250929"}]'
137
+ */
138
+ llm_providers: string;
139
+
140
+ /**
141
+ * Whether higher scores are better. Set to true if higher scores indicate better
142
+ * performance, false otherwise
143
+ */
144
+ maximize: boolean;
145
+
146
+ /**
147
+ * Name of the column in the CSV file that contains the prompts
148
+ */
149
+ prompt_column: string;
150
+
151
+ /**
152
+ * Whether to override an existing custom router for this preference_id
153
+ */
154
+ override?: boolean | null;
155
+
156
+ /**
157
+ * Optional preference ID to update an existing router. If not provided, a new
158
+ * preference will be created
159
+ */
160
+ preference_id?: string | null;
161
+ }
162
+
163
+ export declare namespace CustomRouter {
164
+ export {
165
+ type CustomRouterTrainCustomRouterResponse as CustomRouterTrainCustomRouterResponse,
166
+ type CustomRouterTrainCustomRouterParams as CustomRouterTrainCustomRouterParams,
167
+ };
168
+ }