@node-llm/core 1.17.1 → 1.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +14 -11
  2. package/dist/agent/Agent.d.ts +41 -14
  3. package/dist/agent/Agent.d.ts.map +1 -1
  4. package/dist/agent/Agent.js +12 -3
  5. package/dist/aliases.d.ts +477 -283
  6. package/dist/aliases.d.ts.map +1 -1
  7. package/dist/aliases.js +546 -352
  8. package/dist/chat/Chat.d.ts +23 -13
  9. package/dist/chat/Chat.d.ts.map +1 -1
  10. package/dist/chat/Chat.js +59 -16
  11. package/dist/chat/ChatOptions.d.ts +28 -11
  12. package/dist/chat/ChatOptions.d.ts.map +1 -1
  13. package/dist/chat/ChatResponse.d.ts +5 -0
  14. package/dist/chat/ChatResponse.d.ts.map +1 -1
  15. package/dist/chat/ChatResponse.js +12 -4
  16. package/dist/chat/ChatStream.d.ts.map +1 -1
  17. package/dist/chat/ChatStream.js +20 -10
  18. package/dist/chat/PromptCache.d.ts +7 -0
  19. package/dist/chat/PromptCache.d.ts.map +1 -0
  20. package/dist/chat/PromptCache.js +7 -0
  21. package/dist/chat/Temperature.d.ts +7 -0
  22. package/dist/chat/Temperature.d.ts.map +1 -0
  23. package/dist/chat/Temperature.js +17 -0
  24. package/dist/chat/Tool.d.ts +52 -8
  25. package/dist/chat/Tool.d.ts.map +1 -1
  26. package/dist/chat/Tool.js +53 -5
  27. package/dist/chat/ToolCallOutcome.d.ts +18 -6
  28. package/dist/chat/ToolCallOutcome.d.ts.map +1 -1
  29. package/dist/chat/ToolCallOutcome.js +14 -0
  30. package/dist/chat/ToolHandler.d.ts +2 -2
  31. package/dist/chat/ToolHandler.d.ts.map +1 -1
  32. package/dist/chat/ToolResultWindow.d.ts +16 -0
  33. package/dist/chat/ToolResultWindow.d.ts.map +1 -0
  34. package/dist/chat/ToolResultWindow.js +25 -0
  35. package/dist/config.d.ts +42 -2
  36. package/dist/config.d.ts.map +1 -1
  37. package/dist/config.js +80 -27
  38. package/dist/constants.d.ts +7 -0
  39. package/dist/constants.d.ts.map +1 -1
  40. package/dist/constants.js +3 -1
  41. package/dist/errors/billing.d.ts +7 -0
  42. package/dist/errors/billing.d.ts.map +1 -0
  43. package/dist/errors/billing.js +24 -0
  44. package/dist/errors/index.d.ts +28 -0
  45. package/dist/errors/index.d.ts.map +1 -1
  46. package/dist/errors/index.js +32 -0
  47. package/dist/executor/Executor.d.ts.map +1 -1
  48. package/dist/executor/Executor.js +5 -3
  49. package/dist/index.d.ts +12 -3
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +4 -1
  52. package/dist/judge/Judge.d.ts +107 -0
  53. package/dist/judge/Judge.d.ts.map +1 -0
  54. package/dist/judge/Judge.js +104 -0
  55. package/dist/judge/Judgment.d.ts +116 -0
  56. package/dist/judge/Judgment.d.ts.map +1 -0
  57. package/dist/judge/Judgment.js +159 -0
  58. package/dist/judge/Question.d.ts +91 -0
  59. package/dist/judge/Question.d.ts.map +1 -0
  60. package/dist/judge/Question.js +180 -0
  61. package/dist/llm.d.ts +48 -1
  62. package/dist/llm.d.ts.map +1 -1
  63. package/dist/llm.js +111 -5
  64. package/dist/models/ModelRegistry.d.ts +23 -19
  65. package/dist/models/ModelRegistry.d.ts.map +1 -1
  66. package/dist/models/ModelRegistry.js +28 -2
  67. package/dist/models/models.json +15154 -4786
  68. package/dist/models/types.d.ts +14 -1
  69. package/dist/models/types.d.ts.map +1 -1
  70. package/dist/providers/BaseProvider.d.ts +2 -1
  71. package/dist/providers/BaseProvider.d.ts.map +1 -1
  72. package/dist/providers/BaseProvider.js +3 -0
  73. package/dist/providers/Provider.d.ts +60 -1
  74. package/dist/providers/Provider.d.ts.map +1 -1
  75. package/dist/providers/anthropic/AnthropicProvider.d.ts +2 -0
  76. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  77. package/dist/providers/anthropic/AnthropicProvider.js +2 -0
  78. package/dist/providers/anthropic/Capabilities.d.ts +1 -0
  79. package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
  80. package/dist/providers/anthropic/Capabilities.js +3 -0
  81. package/dist/providers/anthropic/Chat.d.ts.map +1 -1
  82. package/dist/providers/anthropic/Chat.js +7 -75
  83. package/dist/providers/anthropic/Errors.d.ts.map +1 -1
  84. package/dist/providers/anthropic/Errors.js +4 -3
  85. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  86. package/dist/providers/anthropic/Streaming.js +4 -66
  87. package/dist/providers/anthropic/Utils.d.ts +33 -1
  88. package/dist/providers/anthropic/Utils.d.ts.map +1 -1
  89. package/dist/providers/anthropic/Utils.js +114 -0
  90. package/dist/providers/anthropic/types.d.ts +17 -3
  91. package/dist/providers/anthropic/types.d.ts.map +1 -1
  92. package/dist/providers/azure/AzureProvider.d.ts +54 -0
  93. package/dist/providers/azure/AzureProvider.d.ts.map +1 -0
  94. package/dist/providers/azure/AzureProvider.js +110 -0
  95. package/dist/providers/azure/Capabilities.d.ts +16 -0
  96. package/dist/providers/azure/Capabilities.d.ts.map +1 -0
  97. package/dist/providers/azure/Capabilities.js +36 -0
  98. package/dist/providers/azure/Embedding.d.ts +11 -0
  99. package/dist/providers/azure/Embedding.d.ts.map +1 -0
  100. package/dist/providers/azure/Embedding.js +23 -0
  101. package/dist/providers/azure/Models.d.ts +18 -0
  102. package/dist/providers/azure/Models.d.ts.map +1 -0
  103. package/dist/providers/azure/Models.js +29 -0
  104. package/dist/providers/azure/index.d.ts +5 -0
  105. package/dist/providers/azure/index.d.ts.map +1 -0
  106. package/dist/providers/azure/index.js +28 -0
  107. package/dist/providers/bedrock/BedrockProvider.d.ts.map +1 -1
  108. package/dist/providers/bedrock/BedrockProvider.js +1 -0
  109. package/dist/providers/bedrock/Capabilities.d.ts +1 -0
  110. package/dist/providers/bedrock/Capabilities.d.ts.map +1 -1
  111. package/dist/providers/bedrock/Capabilities.js +3 -0
  112. package/dist/providers/bedrock/Chat.d.ts.map +1 -1
  113. package/dist/providers/bedrock/Chat.js +6 -2
  114. package/dist/providers/bedrock/Errors.d.ts.map +1 -1
  115. package/dist/providers/bedrock/Errors.js +4 -0
  116. package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
  117. package/dist/providers/bedrock/Streaming.js +4 -1
  118. package/dist/providers/deepseek/Capabilities.d.ts +1 -0
  119. package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
  120. package/dist/providers/deepseek/Capabilities.js +3 -0
  121. package/dist/providers/deepseek/Chat.d.ts.map +1 -1
  122. package/dist/providers/deepseek/Chat.js +3 -2
  123. package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
  124. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  125. package/dist/providers/deepseek/DeepSeekProvider.js +1 -0
  126. package/dist/providers/deepseek/Errors.d.ts.map +1 -1
  127. package/dist/providers/deepseek/Errors.js +5 -4
  128. package/dist/providers/gemini/Capabilities.d.ts +1 -0
  129. package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
  130. package/dist/providers/gemini/Capabilities.js +3 -0
  131. package/dist/providers/gemini/Chat.d.ts.map +1 -1
  132. package/dist/providers/gemini/Chat.js +3 -2
  133. package/dist/providers/gemini/Errors.d.ts.map +1 -1
  134. package/dist/providers/gemini/Errors.js +4 -3
  135. package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
  136. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  137. package/dist/providers/gemini/GeminiProvider.js +1 -0
  138. package/dist/providers/mistral/Capabilities.d.ts +1 -0
  139. package/dist/providers/mistral/Capabilities.d.ts.map +1 -1
  140. package/dist/providers/mistral/Capabilities.js +3 -0
  141. package/dist/providers/mistral/Chat.d.ts.map +1 -1
  142. package/dist/providers/mistral/Chat.js +3 -2
  143. package/dist/providers/mistral/Errors.d.ts.map +1 -1
  144. package/dist/providers/mistral/Errors.js +4 -3
  145. package/dist/providers/mistral/MistralProvider.d.ts +1 -0
  146. package/dist/providers/mistral/MistralProvider.d.ts.map +1 -1
  147. package/dist/providers/mistral/MistralProvider.js +1 -0
  148. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  149. package/dist/providers/ollama/OllamaProvider.js +1 -0
  150. package/dist/providers/openai/Capabilities.d.ts +6 -0
  151. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  152. package/dist/providers/openai/Capabilities.js +10 -0
  153. package/dist/providers/openai/Chat.d.ts +3 -0
  154. package/dist/providers/openai/Chat.d.ts.map +1 -1
  155. package/dist/providers/openai/Chat.js +26 -7
  156. package/dist/providers/openai/Embedding.d.ts +2 -0
  157. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  158. package/dist/providers/openai/Embedding.js +8 -5
  159. package/dist/providers/openai/Errors.d.ts.map +1 -1
  160. package/dist/providers/openai/Errors.js +4 -3
  161. package/dist/providers/openai/Models.d.ts +10 -0
  162. package/dist/providers/openai/Models.d.ts.map +1 -1
  163. package/dist/providers/openai/Models.js +12 -8
  164. package/dist/providers/openai/OpenAIProvider.d.ts +11 -1
  165. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  166. package/dist/providers/openai/OpenAIProvider.js +36 -0
  167. package/dist/providers/openai/Responses.d.ts +30 -0
  168. package/dist/providers/openai/Responses.d.ts.map +1 -0
  169. package/dist/providers/openai/Responses.js +176 -0
  170. package/dist/providers/openai/Streaming.d.ts +2 -0
  171. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  172. package/dist/providers/openai/Streaming.js +19 -5
  173. package/dist/providers/openrouter/Capabilities.d.ts +1 -0
  174. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
  175. package/dist/providers/openrouter/Capabilities.js +3 -0
  176. package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
  177. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  178. package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
  179. package/dist/providers/registry.d.ts +3 -1
  180. package/dist/providers/registry.d.ts.map +1 -1
  181. package/dist/providers/registry.js +3 -1
  182. package/dist/providers/typesafe/SystemOne.d.ts +11 -0
  183. package/dist/providers/typesafe/SystemOne.d.ts.map +1 -0
  184. package/dist/providers/typesafe/SystemOne.js +171 -0
  185. package/dist/providers/typesafe/TypeSafeProvider.d.ts +27 -0
  186. package/dist/providers/typesafe/TypeSafeProvider.d.ts.map +1 -0
  187. package/dist/providers/typesafe/TypeSafeProvider.js +76 -0
  188. package/dist/providers/typesafe/index.d.ts +4 -0
  189. package/dist/providers/typesafe/index.d.ts.map +1 -0
  190. package/dist/providers/typesafe/index.js +19 -0
  191. package/dist/providers/xai/Capabilities.d.ts +1 -0
  192. package/dist/providers/xai/Capabilities.d.ts.map +1 -1
  193. package/dist/providers/xai/Capabilities.js +3 -0
  194. package/dist/providers/xai/Chat.d.ts.map +1 -1
  195. package/dist/providers/xai/Chat.js +3 -2
  196. package/dist/providers/xai/Errors.d.ts.map +1 -1
  197. package/dist/providers/xai/Errors.js +5 -2
  198. package/dist/providers/xai/XAIProvider.d.ts +1 -0
  199. package/dist/providers/xai/XAIProvider.d.ts.map +1 -1
  200. package/dist/providers/xai/XAIProvider.js +1 -0
  201. package/dist/schema/Schema.d.ts +3 -3
  202. package/dist/schema/Schema.d.ts.map +1 -1
  203. package/dist/schema/to-json-schema.d.ts +2 -2
  204. package/dist/schema/to-json-schema.d.ts.map +1 -1
  205. package/dist/schema/to-json-schema.js +3 -8
  206. package/dist/schema/zod.d.ts +32 -0
  207. package/dist/schema/zod.d.ts.map +1 -0
  208. package/dist/schema/zod.js +31 -0
  209. package/dist/types/Middleware.d.ts +9 -0
  210. package/dist/types/Middleware.d.ts.map +1 -1
  211. package/package.json +5 -3
@@ -0,0 +1,171 @@
1
+ import { APIError, AuthenticationError, BadRequestError, InvalidModelError, NotFoundError, RateLimitError, ServerError, ServiceUnavailableError } from "../../errors/index.js";
2
+ /**
3
+ * The System One protocol: one request carries the input as `state` and a map
4
+ * of typed questions; the response carries one typed answer per question.
5
+ *
6
+ * Wire names differ from ours in two places. A probability question is a
7
+ * `noul` ("not unlikely"), and its yes/no descriptions are keyed "true" and
8
+ * "false".
9
+ */
10
+ const WIRE_TYPES = { probability: "noul", choice: "choice", score: "score" };
11
+ const OUTCOME_KEYS = {
12
+ yes: "true",
13
+ true: "true",
14
+ no: "false",
15
+ false: "false"
16
+ };
17
+ const RESERVED = ["model", "state", "questions"];
18
+ function renderQuestion(question) {
19
+ let criteria;
20
+ switch (question.type) {
21
+ case "probability":
22
+ criteria = question.criteria
23
+ ? Object.fromEntries(Object.entries(question.criteria).map(([key, value]) => [OUTCOME_KEYS[key], value]))
24
+ : undefined;
25
+ break;
26
+ case "choice":
27
+ criteria = question.options;
28
+ break;
29
+ case "score":
30
+ criteria = question.levels;
31
+ break;
32
+ }
33
+ const rendered = { type: WIRE_TYPES[question.type] };
34
+ if (question.instructions !== undefined && question.instructions !== null) {
35
+ rendered.instructions = question.instructions;
36
+ }
37
+ if (criteria !== undefined)
38
+ rendered.criteria = criteria;
39
+ return rendered;
40
+ }
41
+ export function renderJudgmentPayload(request) {
42
+ const options = request.providerOptions ?? {};
43
+ const reserved = Object.keys(options).filter((key) => RESERVED.includes(key));
44
+ if (reserved.length > 0) {
45
+ throw new Error(`Use the judgment arguments instead of providerOptions for ${reserved.join(", ")}`);
46
+ }
47
+ return {
48
+ model: request.model,
49
+ state: request.input,
50
+ questions: Object.fromEntries(request.questions.map((q) => [q.name, renderQuestion(q)])),
51
+ ...options
52
+ };
53
+ }
54
+ function malformed(detail) {
55
+ throw new Error(`System One returned an invalid judgment: ${detail}`);
56
+ }
57
+ function requireNumber(value, field) {
58
+ if (typeof value !== "number" || !Number.isFinite(value))
59
+ malformed(`${field} is not a number`);
60
+ return value;
61
+ }
62
+ function requireObject(value, field) {
63
+ if (!value || typeof value !== "object" || Array.isArray(value))
64
+ malformed(`${field} is missing`);
65
+ return value;
66
+ }
67
+ function parseAnswer(raw, question) {
68
+ const answer = requireObject(raw, `the answer to '${question.name}'`);
69
+ switch (question.type) {
70
+ case "probability":
71
+ return {
72
+ type: "probability",
73
+ probability: requireNumber(answer.noul, `${question.name}.noul`)
74
+ };
75
+ case "choice": {
76
+ const options = Object.keys(question.options);
77
+ const chosen = answer.choice;
78
+ if (typeof chosen !== "string" || !options.includes(chosen)) {
79
+ malformed(`'${question.name}' chose '${String(chosen)}', which is not one of its options`);
80
+ }
81
+ const wire = requireObject(answer.probabilities, `${question.name}.probabilities`);
82
+ const probabilities = Object.fromEntries(options.map((option) => [
83
+ option,
84
+ requireNumber(wire[option], `${question.name}.probabilities.${option}`)
85
+ ]));
86
+ return {
87
+ type: "choice",
88
+ choice: chosen,
89
+ probabilities,
90
+ confidence: requireNumber(answer.confidence, `${question.name}.confidence`)
91
+ };
92
+ }
93
+ case "score": {
94
+ // Levels go out as an array and come back keyed "0", "1", ... - map them
95
+ // back to numeric indexes so they line up with the declared levels.
96
+ const wire = requireObject(answer.probabilities, `${question.name}.probabilities`);
97
+ const probabilities = {};
98
+ question.levels.forEach((_, index) => {
99
+ probabilities[index] = requireNumber(wire[String(index)], `${question.name}.probabilities.${index}`);
100
+ });
101
+ return {
102
+ type: "score",
103
+ score: requireNumber(answer.score, `${question.name}.score`),
104
+ probabilities,
105
+ confidence: requireNumber(answer.confidence, `${question.name}.confidence`)
106
+ };
107
+ }
108
+ }
109
+ }
110
+ export function parseJudgmentResponse(json, questions) {
111
+ const body = requireObject(json, "the response body");
112
+ const answers = requireObject(body.answers, "answers");
113
+ const usage = (body.usage ?? {});
114
+ const input = typeof usage.input_tokens === "number" ? usage.input_tokens : 0;
115
+ const output = typeof usage.output_tokens === "number" ? usage.output_tokens : 0;
116
+ return {
117
+ model: typeof body.model === "string" ? body.model : "",
118
+ answers: Object.fromEntries(questions.map((question) => [question.name, parseAnswer(answers[question.name], question)])),
119
+ usage: { input_tokens: input, output_tokens: output, total_tokens: input + output },
120
+ raw: json
121
+ };
122
+ }
123
+ /**
124
+ * Turns an error response into the matching NodeLLM error. System One reports
125
+ * errors FastAPI-style: `detail` is a string, an object with a `message`, or a
126
+ * list of validation errors each with a location and message.
127
+ */
128
+ export async function handleTypeSafeError(response, model) {
129
+ const status = response.status;
130
+ let body;
131
+ let message = `TypeSafe error (${status})`;
132
+ try {
133
+ body = await response.json();
134
+ const detail = body?.detail;
135
+ if (typeof detail === "string") {
136
+ message = detail;
137
+ }
138
+ else if (Array.isArray(detail)) {
139
+ message = detail
140
+ .map((item) => [Array.isArray(item.loc) ? item.loc.join(".") : "", item.msg ?? ""]
141
+ .filter(Boolean)
142
+ .join(": "))
143
+ .join("; ");
144
+ }
145
+ else if (detail && typeof detail === "object" && "message" in detail) {
146
+ message = String(detail.message);
147
+ }
148
+ }
149
+ catch {
150
+ body = await response.text().catch(() => "");
151
+ }
152
+ const provider = "typesafe";
153
+ if (status === 400 || status === 422)
154
+ throw new BadRequestError(message, body, provider, model);
155
+ if (status === 401 || status === 403)
156
+ throw new AuthenticationError(message, status, body, provider);
157
+ if (status === 404) {
158
+ if (message.toLowerCase().includes("model"))
159
+ throw new InvalidModelError(message, body, provider, model);
160
+ throw new NotFoundError(message, status, body, provider, model);
161
+ }
162
+ if (status === 429) {
163
+ const retryAfter = Number(response.headers?.get?.("retry-after"));
164
+ throw new RateLimitError(message, body, provider, model, Number.isFinite(retryAfter) && retryAfter > 0 ? retryAfter : undefined);
165
+ }
166
+ if (status === 503)
167
+ throw new ServiceUnavailableError(message, status, body, provider);
168
+ if (status >= 500)
169
+ throw new ServerError(message, status, body, provider);
170
+ throw new APIError(message, status, body, provider, model);
171
+ }
@@ -0,0 +1,27 @@
1
+ import { BaseProvider } from "../BaseProvider.js";
2
+ import { ChatRequest, ChatResponse, JudgmentRequest, JudgmentResponse, ModelInfo } from "../Provider.js";
3
+ export interface TypeSafeProviderOptions {
4
+ apiKey: string;
5
+ baseUrl?: string;
6
+ }
7
+ /**
8
+ * TypeSafe's System One models (Jev) answer typed questions with calibrated
9
+ * probabilities. They do not generate text, so this provider offers judgments
10
+ * and a model listing only; chat and every other operation are unsupported.
11
+ *
12
+ * Any server implementing the same System One API works by pointing
13
+ * `typesafeApiBase` at it.
14
+ */
15
+ export declare class TypeSafeProvider extends BaseProvider {
16
+ private readonly options;
17
+ private readonly baseUrl;
18
+ constructor(options: TypeSafeProviderOptions);
19
+ apiBase(): string;
20
+ headers(): Record<string, string>;
21
+ protected providerName(): string;
22
+ defaultModel(feature?: string): string;
23
+ chat(_request: ChatRequest): Promise<ChatResponse>;
24
+ judge(request: JudgmentRequest): Promise<JudgmentResponse>;
25
+ listModels(): Promise<ModelInfo[]>;
26
+ }
27
+ //# sourceMappingURL=TypeSafeProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypeSafeProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/typesafe/TypeSafeProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,SAAS,EACV,MAAM,gBAAgB,CAAC;AAMxB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,qBAAa,gBAAiB,SAAQ,YAAY;IAGpC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAFpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,OAAO,EAAE,uBAAuB;IAM7D,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOjC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIlD,KAAK,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAkB1D,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CA2BzC"}
@@ -0,0 +1,76 @@
1
+ import { BaseProvider } from "../BaseProvider.js";
2
+ import { fetchWithTimeout } from "../../utils/fetch.js";
3
+ import { logger } from "../../utils/logger.js";
4
+ import { DEFAULT_MODELS, DEFAULT_TYPESAFE_BASE_URL } from "../../constants.js";
5
+ import { handleTypeSafeError, parseJudgmentResponse, renderJudgmentPayload } from "./SystemOne.js";
6
+ /**
7
+ * TypeSafe's System One models (Jev) answer typed questions with calibrated
8
+ * probabilities. They do not generate text, so this provider offers judgments
9
+ * and a model listing only; chat and every other operation are unsupported.
10
+ *
11
+ * Any server implementing the same System One API works by pointing
12
+ * `typesafeApiBase` at it.
13
+ */
14
+ export class TypeSafeProvider extends BaseProvider {
15
+ options;
16
+ baseUrl;
17
+ constructor(options) {
18
+ super();
19
+ this.options = options;
20
+ this.baseUrl = (options.baseUrl || DEFAULT_TYPESAFE_BASE_URL).replace(/\/+$/, "");
21
+ this.capabilities = this.defaultCapabilities();
22
+ }
23
+ apiBase() {
24
+ return this.baseUrl;
25
+ }
26
+ headers() {
27
+ return {
28
+ Authorization: `Bearer ${this.options.apiKey}`,
29
+ "Content-Type": "application/json"
30
+ };
31
+ }
32
+ providerName() {
33
+ return "typesafe";
34
+ }
35
+ defaultModel(feature) {
36
+ return feature === undefined || feature === "judgment" ? DEFAULT_MODELS.JUDGMENT : "";
37
+ }
38
+ async chat(_request) {
39
+ this.throwUnsupportedError("chat (TypeSafe models answer judgments, not chat)");
40
+ }
41
+ async judge(request) {
42
+ const url = `${this.baseUrl}/v1/systemone`;
43
+ const body = renderJudgmentPayload(request);
44
+ logger.logRequest("TypeSafe", "POST", url, body);
45
+ const response = await fetchWithTimeout(url, { method: "POST", headers: this.headers(), body: JSON.stringify(body) }, request.requestTimeout);
46
+ if (!response.ok)
47
+ await handleTypeSafeError(response, request.model);
48
+ const json = await response.json();
49
+ logger.logResponse("TypeSafe", response.status, response.statusText, json);
50
+ return parseJudgmentResponse(json, request.questions);
51
+ }
52
+ async listModels() {
53
+ const response = await fetchWithTimeout(`${this.baseUrl}/v1/models`, {
54
+ method: "GET",
55
+ headers: this.headers()
56
+ });
57
+ if (!response.ok)
58
+ await handleTypeSafeError(response);
59
+ const json = (await response.json());
60
+ return (json.models ?? []).map((entry) => ({
61
+ id: entry.name,
62
+ name: entry.name,
63
+ provider: "typesafe",
64
+ family: "jev",
65
+ context_window: null,
66
+ max_output_tokens: null,
67
+ modalities: { input: ["text"], output: ["judgment"] },
68
+ capabilities: ["judgment"],
69
+ pricing: {},
70
+ metadata: {
71
+ ...(entry.description ? { description: entry.description } : {}),
72
+ ...(entry.release_date ? { created_at: entry.release_date } : {})
73
+ }
74
+ }));
75
+ }
76
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./TypeSafeProvider.js";
2
+ export declare function registerTypeSafeProvider(): void;
3
+ export declare const ensureTypeSafeRegistered: typeof registerTypeSafeProvider;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/providers/typesafe/index.ts"],"names":[],"mappings":"AAIA,cAAc,uBAAuB,CAAC;AAItC,wBAAgB,wBAAwB,SAiBvC;AAED,eAAO,MAAM,wBAAwB,iCAA2B,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { config as globalConfig } from "../../config.js";
2
+ import { providerRegistry } from "../registry.js";
3
+ import { TypeSafeProvider } from "./TypeSafeProvider.js";
4
+ export * from "./TypeSafeProvider.js";
5
+ let registered = false;
6
+ export function registerTypeSafeProvider() {
7
+ if (registered)
8
+ return;
9
+ providerRegistry.register("typesafe", (config) => {
10
+ const cfg = config || globalConfig;
11
+ const apiKey = cfg.typesafeApiKey;
12
+ if (!apiKey) {
13
+ throw new Error("typesafeApiKey is not set in config or TYPESAFE_API_KEY environment variable");
14
+ }
15
+ return new TypeSafeProvider({ apiKey, baseUrl: cfg.typesafeApiBase });
16
+ });
17
+ registered = true;
18
+ }
19
+ export const ensureTypeSafeRegistered = registerTypeSafeProvider;
@@ -9,6 +9,7 @@ export declare class Capabilities {
9
9
  static supportsModeration(modelId: string): boolean;
10
10
  static supportsReasoning(modelId: string): boolean;
11
11
  static supportsToolChoice(_modelId: string): boolean;
12
+ static supportsTemperature(modelId: string): boolean;
12
13
  static getContextWindow(modelId: string): number;
13
14
  static getPricing(modelId: string): ModelPricing | undefined;
14
15
  private static findModel;
@@ -1 +1 @@
1
- {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIhD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
1
+ {"version":3,"file":"Capabilities.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Capabilities.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,qBAAa,YAAY;IACvB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI/C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAS9C,MAAM,CAAC,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAOzD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAQxD,MAAM,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAItD,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAInD,MAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIlD,MAAM,CAAC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIpD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIhD,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI5D,OAAO,CAAC,MAAM,CAAC,SAAS;CAGzB"}
@@ -36,6 +36,9 @@ export class Capabilities {
36
36
  static supportsToolChoice(_modelId) {
37
37
  return true;
38
38
  }
39
+ static supportsTemperature(modelId) {
40
+ return ModelRegistry.supportsTemperature(modelId, "xai");
41
+ }
39
42
  static getContextWindow(modelId) {
40
43
  return ModelRegistry.getContextWindow(modelId, "xai") ?? 128_000;
41
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAiClE,qBAAa,OAAO;IAEhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAgF3D"}
1
+ {"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Chat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAS,MAAM,gBAAgB,CAAC;AAiClE,qBAAa,OAAO;IAEhB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBADN,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM;IAG3B,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;CAkF3D"}
@@ -11,7 +11,7 @@ export class XAIChat {
11
11
  this.apiKey = apiKey;
12
12
  }
13
13
  async execute(request) {
14
- const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, requestTimeout, ...rest } = request;
14
+ const { model, messages, tools, max_tokens, response_format, thinking: _thinking, headers: _headers, requestTimeout, signal, ...rest } = request;
15
15
  const mappedMessages = mapSystemMessages(messages, false);
16
16
  const body = {
17
17
  model,
@@ -33,7 +33,8 @@ export class XAIChat {
33
33
  "Content-Type": "application/json",
34
34
  ...request.headers
35
35
  },
36
- body: JSON.stringify(body)
36
+ body: JSON.stringify(body),
37
+ signal
37
38
  }, requestTimeout);
38
39
  if (!response.ok) {
39
40
  await handleXAIError(response, model);
@@ -1 +1 @@
1
- {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Errors.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAiCvF"}
1
+ {"version":3,"file":"Errors.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/Errors.ts"],"names":[],"mappings":"AAWA,wBAAsB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAoCvF"}
@@ -1,11 +1,11 @@
1
- import { APIError, AuthenticationError, BadRequestError, RateLimitError, ServerError, NotFoundError } from "../../errors/index.js";
1
+ import { InsufficientQuotaError, APIError, AuthenticationError, BadRequestError, RateLimitError, ServerError, NotFoundError } from "../../errors/index.js";
2
+ import { isBillingProblem } from "../../errors/billing.js";
2
3
  export async function handleXAIError(response, model) {
3
4
  const status = response.status;
4
5
  let errorMessage = `xAI API identification failed with status ${status}`;
5
6
  let errorData = {};
6
7
  try {
7
8
  const text = await response.text();
8
- console.error("XAI ERROR RESPONSE:", text);
9
9
  errorData = JSON.parse(text);
10
10
  errorMessage = errorData.error?.message || errorMessage;
11
11
  }
@@ -13,6 +13,9 @@ export async function handleXAIError(response, model) {
13
13
  // Ignore JSON parsing errors
14
14
  }
15
15
  const provider = "xai";
16
+ if (isBillingProblem(status, errorMessage)) {
17
+ throw new InsufficientQuotaError(errorMessage, errorData, provider, model);
18
+ }
16
19
  switch (status) {
17
20
  case 401:
18
21
  throw new AuthenticationError(errorMessage, status, errorData, provider);
@@ -21,6 +21,7 @@ export declare class XAIProvider extends BaseProvider implements Provider {
21
21
  supportsModeration: (model: string) => boolean;
22
22
  supportsReasoning: (model: string) => boolean;
23
23
  supportsDeveloperRole: (_model: string) => boolean;
24
+ supportsTemperature: (model: string) => boolean;
24
25
  getContextWindow: (model: string) => number;
25
26
  };
26
27
  constructor(options: XAIProviderOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"XAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/XAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAY,SAAQ,YAAa,YAAW,QAAQ;IAoBnD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAnBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IAEjC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;kCACZ,MAAM;MAChC;gBAE2B,OAAO,EAAE,kBAAkB;IASxD,IAAW,EAAE,IAAI,MAAM,CAEtB;IAEM,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAG3D"}
1
+ {"version":3,"file":"XAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/xai/XAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQlD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAY,SAAQ,YAAa,YAAW,QAAQ;IAqBnD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAY;IAC1C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IAEjC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;qCACT,MAAM;kCACT,MAAM;MAChC;gBAE2B,OAAO,EAAE,kBAAkB;IASxD,IAAW,EAAE,IAAI,MAAM,CAEtB;IAEM,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;IAIjD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;CAG3D"}
@@ -22,6 +22,7 @@ export class XAIProvider extends BaseProvider {
22
22
  supportsModeration: (model) => Capabilities.supportsModeration(model),
23
23
  supportsReasoning: (model) => Capabilities.supportsReasoning(model),
24
24
  supportsDeveloperRole: (_model) => false,
25
+ supportsTemperature: (model) => Capabilities.supportsTemperature(model),
25
26
  getContextWindow: (model) => Capabilities.getContextWindow(model)
26
27
  };
27
28
  constructor(options) {
@@ -1,14 +1,14 @@
1
- import { z } from "zod";
1
+ import type { ZodSchema } from "./zod.js";
2
2
  export interface SchemaDefinition {
3
3
  name: string;
4
- schema: z.ZodType<unknown> | Record<string, unknown>;
4
+ schema: ZodSchema | Record<string, unknown>;
5
5
  description?: string;
6
6
  strict?: boolean;
7
7
  }
8
8
  export declare class Schema {
9
9
  readonly definition: SchemaDefinition;
10
10
  constructor(definition: SchemaDefinition);
11
- static fromZod(name: string, schema: z.ZodType<unknown>, options?: {
11
+ static fromZod(name: string, schema: ZodSchema, options?: {
12
12
  description?: string;
13
13
  strict?: boolean;
14
14
  }): Schema;
@@ -1 +1 @@
1
- {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,MAAM;aACW,UAAU,EAAE,gBAAgB;gBAA5B,UAAU,EAAE,gBAAgB;IAExD,MAAM,CAAC,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAC1B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACnD,MAAM;IAST,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACnD,MAAM;CAQV"}
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/schema/Schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,qBAAa,MAAM;aACW,UAAU,EAAE,gBAAgB;gBAA5B,UAAU,EAAE,gBAAgB;IAExD,MAAM,CAAC,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACnD,MAAM;IAST,MAAM,CAAC,QAAQ,CACb,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GACnD,MAAM;CAQV"}
@@ -1,3 +1,3 @@
1
- import { z } from "zod";
2
- export declare function toJsonSchema(schema: z.ZodType<unknown> | Record<string, unknown>): Record<string, unknown>;
1
+ import { ZodSchema } from "./zod.js";
2
+ export declare function toJsonSchema(schema: ZodSchema | Record<string, unknown>): Record<string, unknown>;
3
3
  //# sourceMappingURL=to-json-schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-json-schema.d.ts","sourceRoot":"","sources":["../../src/schema/to-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,wBAAgB,YAAY,CAC1B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAOzB"}
1
+ {"version":3,"file":"to-json-schema.d.ts","sourceRoot":"","sources":["../../src/schema/to-json-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,SAAS,EAAE,MAAM,UAAU,CAAC;AAE7D,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAGjG"}
@@ -1,10 +1,5 @@
1
- import { z } from "zod";
2
- import { zodToJsonSchema } from "zod-to-json-schema";
1
+ import { isZodSchema, zodToJson } from "./zod.js";
3
2
  export function toJsonSchema(schema) {
4
- // If it's a Zod schema, convert it
5
- if (schema instanceof z.ZodType) {
6
- return zodToJsonSchema(schema, { target: "openApi3" });
7
- }
8
- // If it's already a JSON schema object, return as is
9
- return schema;
3
+ // A Zod schema is converted; a JSON Schema object is used as it is.
4
+ return isZodSchema(schema) ? zodToJson(schema) : schema;
10
5
  }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A Zod 4 schema. Typed by shape, because Zod's own types only match schemas from the same Zod
3
+ * version, and NodeLLM takes schemas from whichever Zod 4 release the app installs.
4
+ */
5
+ export interface Zod4Schema<Output = unknown> {
6
+ readonly _zod: {
7
+ readonly output: Output;
8
+ };
9
+ parse(value: unknown): Output;
10
+ }
11
+ /**
12
+ * A Zod 3 schema, typed by shape like Zod 4's so a schema from another copy of Zod 3 matches.
13
+ * Supported until NodeLLM 2.0, which drops Zod 3; use Zod 4 schemas.
14
+ */
15
+ export interface Zod3Schema<Output = unknown> {
16
+ readonly _def: unknown;
17
+ readonly _output: Output;
18
+ parse(value: unknown): Output;
19
+ }
20
+ /** A Zod 4 or Zod 3 schema. */
21
+ export type ZodSchema<Output = unknown> = Zod4Schema<Output> | Zod3Schema<Output>;
22
+ /**
23
+ * Whether a value is a Zod 4 or Zod 3 schema. Checked by shape rather than with `instanceof`,
24
+ * which fails for Zod 4 schemas and for schemas from another copy of Zod 3.
25
+ */
26
+ export declare function isZodSchema(value: unknown): value is ZodSchema;
27
+ /**
28
+ * The JSON Schema a model is given for a Zod schema: the shape it must send, so fields with
29
+ * defaults are optional.
30
+ */
31
+ export declare function zodToJson(schema: ZodSchema): Record<string, unknown>;
32
+ //# sourceMappingURL=zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/schema/zod.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO;IAC1C,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,UAAU,CAAC,MAAM,GAAG,OAAO;IAC1C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC;CAC/B;AAED,+BAA+B;AAC/B,MAAM,MAAM,SAAS,CAAC,MAAM,GAAG,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;AAElF;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAI9D;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEpE"}
@@ -0,0 +1,31 @@
1
+ import { zodToJsonSchema } from "zod-to-json-schema";
2
+ /**
3
+ * Whether a value is a Zod 4 or Zod 3 schema. Checked by shape rather than with `instanceof`,
4
+ * which fails for Zod 4 schemas and for schemas from another copy of Zod 3.
5
+ */
6
+ export function isZodSchema(value) {
7
+ if (typeof value !== "object" || value === null)
8
+ return false;
9
+ if (typeof value.parse !== "function")
10
+ return false;
11
+ return "_zod" in value || "_def" in value;
12
+ }
13
+ /**
14
+ * The JSON Schema a model is given for a Zod schema: the shape it must send, so fields with
15
+ * defaults are optional.
16
+ */
17
+ export function zodToJson(schema) {
18
+ return "_zod" in schema ? zod4ToJson(schema) : zod3ToJson(schema);
19
+ }
20
+ // Zod 4.2 added toJSONSchema() to schemas; earlier Zod 4 releases and zod/mini don't have it.
21
+ function zod4ToJson(schema) {
22
+ const toJSONSchema = schema.toJSONSchema;
23
+ if (typeof toJSONSchema !== "function") {
24
+ throw new Error(`[NodeLLM] Zod 4 schemas need Zod 4.2 or later, imported from "zod" rather than "zod/mini".`);
25
+ }
26
+ return toJSONSchema.call(schema, { target: "openapi-3.0", io: "input" });
27
+ }
28
+ // Removed with Zod 3 support in NodeLLM 2.0.
29
+ function zod3ToJson(schema) {
30
+ return zodToJsonSchema(schema, { target: "openApi3" });
31
+ }
@@ -53,6 +53,15 @@ export interface MiddlewareContext {
53
53
  * Options passed to the moderation request (Moderation only).
54
54
  */
55
55
  moderationOptions?: Record<string, unknown>;
56
+ /**
57
+ * Options for the judgment request (Judgment only).
58
+ */
59
+ judgmentOptions?: Record<string, unknown>;
60
+ /**
61
+ * The input a judgment is asked about (Judgment only). Text or JSON-compatible
62
+ * structured data. Mutating it in `onRequest` affects the actual call.
63
+ */
64
+ judgmentInput?: unknown;
56
65
  /**
57
66
  * Options passed to the image generation request (Paint only).
58
67
  */
@@ -1 +1 @@
1
- {"version":3,"file":"Middleware.d.ts","sourceRoot":"","sources":["../../src/types/Middleware.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Middleware.d.ts","sourceRoot":"","sources":["../../src/types/Middleware.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-llm/core",
3
- "version": "1.17.1",
3
+ "version": "1.19.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -56,14 +56,15 @@
56
56
  "LICENSE"
57
57
  ],
58
58
  "dependencies": {
59
- "zod": "^3.23.8",
59
+ "zod": "^4.6.6",
60
60
  "zod-to-json-schema": "^3.25.1"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@pollyjs/adapter-fetch": "^6.0.7",
64
64
  "@pollyjs/adapter-node-http": "^6.0.6",
65
65
  "@pollyjs/core": "^6.0.6",
66
- "@pollyjs/persister-fs": "^6.0.6"
66
+ "@pollyjs/persister-fs": "^6.0.6",
67
+ "typescript": "^5.9.3"
67
68
  },
68
69
  "scripts": {
69
70
  "build": "tsc -p tsconfig.json",
@@ -71,6 +72,7 @@
71
72
  "lint": "tsc --noEmit",
72
73
  "test": "vitest run",
73
74
  "test:docs": "vitest run test/docs",
75
+ "test:live": "vitest run --config vitest.live.config.ts",
74
76
  "test:watch": "vitest"
75
77
  }
76
78
  }