@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
package/dist/llm.d.ts CHANGED
@@ -9,11 +9,15 @@ import { Moderation } from "./moderation/Moderation.js";
9
9
  import { Embedding } from "./embedding/Embedding.js";
10
10
  import { NodeLLMConfig } from "./config.js";
11
11
  import { Middleware } from "./types/Middleware.js";
12
+ import { JudgmentInput } from "./providers/Provider.js";
13
+ import { QuestionMap } from "./judge/Question.js";
14
+ import { JudgmentResult } from "./judge/Judgment.js";
12
15
  export interface RetryOptions {
13
16
  attempts?: number;
14
17
  delayMs?: number;
15
18
  }
16
- type LLMConfig = {
19
+ /** Options for createLLM(): the provider to use and its keys, as well as any NodeLLMConfig setting. */
20
+ export type LLMConfig = {
17
21
  provider?: Provider | string;
18
22
  retry?: RetryOptions;
19
23
  middlewares?: Middleware[];
@@ -21,6 +25,7 @@ type LLMConfig = {
21
25
  defaultTranscriptionModel?: string;
22
26
  defaultModerationModel?: string;
23
27
  defaultEmbeddingModel?: string;
28
+ defaultJudgmentModel?: string;
24
29
  } & Omit<Partial<NodeLLMConfig>, "provider">;
25
30
  export declare class NodeLLMCore {
26
31
  readonly config: NodeLLMConfig;
@@ -35,11 +40,13 @@ export declare class NodeLLMCore {
35
40
  transcription?: string;
36
41
  moderation?: string;
37
42
  embedding?: string;
43
+ judgment?: string;
38
44
  });
39
45
  get defaultChatModel(): string | undefined;
40
46
  get defaultTranscriptionModel(): string | undefined;
41
47
  get defaultModerationModel(): string | undefined;
42
48
  get defaultEmbeddingModel(): string | undefined;
49
+ get defaultJudgmentModel(): string | undefined;
43
50
  /**
44
51
  * Returns a scoped LLM instance configured for a specific provider.
45
52
  * This returns a NEW immutable instance.
@@ -72,6 +79,8 @@ export declare class NodeLLMCore {
72
79
  language?: string;
73
80
  speakerNames?: string[];
74
81
  speakerReferences?: string[];
82
+ /** Word and/or segment timestamps, where the provider supports them. */
83
+ timestamp_granularities?: ("word" | "segment")[];
75
84
  assumeModelExists?: boolean;
76
85
  requestTimeout?: number;
77
86
  middlewares?: Middleware[];
@@ -89,6 +98,44 @@ export declare class NodeLLMCore {
89
98
  requestTimeout?: number;
90
99
  middlewares?: Middleware[];
91
100
  }): Promise<Embedding>;
101
+ /**
102
+ * Asks typed questions about one input and returns a typed answer for each:
103
+ * a probability, a choice among named options, or a score on a scale.
104
+ *
105
+ * The provider follows the model: `jev-latest` (the default) is answered by
106
+ * TypeSafe whichever provider this instance is scoped to. Pass `provider` to
107
+ * route explicitly, for example to a Jev-compatible local server configured
108
+ * through `typesafeApiBase`.
109
+ *
110
+ * Each call judges only the input given; it keeps no conversation history.
111
+ *
112
+ * @example
113
+ * const judgment = await NodeLLM.judge("Please refund the duplicate charge today.", {
114
+ * questions: {
115
+ * urgent: probability("Does this need attention today?"),
116
+ * team: choice("Which team should handle this?", { billing: "Payments", other: null })
117
+ * }
118
+ * });
119
+ * judgment.urgent.probability; // 0.91
120
+ * judgment.team.choice; // "billing"
121
+ */
122
+ judge<const Q extends QuestionMap>(input: JudgmentInput, options: {
123
+ questions: Q;
124
+ model?: string;
125
+ provider?: string;
126
+ /** Provider-specific fields merged into the request body. */
127
+ providerOptions?: Record<string, unknown>;
128
+ requestTimeout?: number;
129
+ middlewares?: Middleware[];
130
+ }): Promise<JudgmentResult<Q>>;
131
+ /**
132
+ * Picks the provider that answers judgments for a model: an explicit choice
133
+ * first, then the registry's owner of a known judgment model, then this
134
+ * instance's own provider - which is how a model the registry does not know,
135
+ * such as one on a local Jev-compatible server, reaches the provider it was
136
+ * scoped to.
137
+ */
138
+ private judgmentProvider;
92
139
  }
93
140
  export { Transcription, Moderation, Embedding, ModelRegistry, PricingRegistry };
94
141
  /**
package/dist/llm.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAa9D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAUrD,OAAO,EAAU,aAAa,EAAiB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,UAAU,EAAqB,MAAM,uBAAuB,CAAC;AAItE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;AAe7C,qBAAa,WAAW;aAKJ,MAAM,EAAE,aAAa;aACrB,QAAQ,CAAC,EAAE,QAAQ;aACnB,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC;aAC7B,WAAW,EAAE,UAAU,EAAE;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR3B,SAAgB,MAAM,uBAAiB;IACvC,SAAgB,OAAO,yBAAmB;gBAGxB,MAAM,EAAE,aAAa,EACrB,QAAQ,CAAC,EAAE,QAAQ,YAAA,EACnB,KAAK,GAAE,QAAQ,CAAC,YAAY,CAA+B,EAC3D,WAAW,GAAE,UAAU,EAAO,EAC7B,QAAQ,GAAE;QACzB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACf;IAOR,IAAI,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAEzC;IACD,IAAI,yBAAyB,IAAI,MAAM,GAAG,SAAS,CAElD;IACD,IAAI,sBAAsB,IAAI,MAAM,GAAG,SAAS,CAE/C;IACD,IAAI,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAE9C;IAED;;;OAGG;IACH,YAAY,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,WAAW;IAiBtF;;;OAGG;IACH,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,GAAG,IAAI;IAInF,cAAc;IAId,OAAO,CAAC,qBAAqB;IAY7B,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,IAAI;IAoB/C,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAUlC,KAAK,CACT,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;QAC3B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;KACxB,GACA,OAAO,CAAC,cAAc,CAAC;IAoDpB,UAAU,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;KAC5B,GACA,OAAO,CAAC,aAAa,CAAC;IAqDnB,QAAQ,CACZ,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;KAC5B,GACA,OAAO,CAAC,UAAU,CAAC;IAqDhB,KAAK,CACT,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,EACxB,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;QAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;KAC5B,GACA,OAAO,CAAC,SAAS,CAAC;CAsDtB;AAED,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;AAEhF;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,GAAE,SAAc,GAAG,WAAW,CAkD9D;AAuCD;;;;;;;;;GASG;AACH,eAAO,MAAM,OAAO,EAAE,WA6BpB,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,aAAa;wBACJ,SAAS,GAAG,CAAC,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;CAOlE,CAAC"}
1
+ {"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
package/dist/llm.js CHANGED
@@ -1,16 +1,19 @@
1
1
  import { Chat } from "./chat/Chat.js";
2
- import { providerRegistry, ensureOpenAIRegistered, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider } from "./providers/registry.js";
2
+ import { providerRegistry, ensureOpenAIRegistered, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, registerBedrockProvider, registerXAIProvider, registerMistralProvider, registerTypeSafeProvider, registerAzureProvider } from "./providers/registry.js";
3
3
  import { GeneratedImage } from "./image/GeneratedImage.js";
4
4
  import { ModelRegistry } from "./models/ModelRegistry.js";
5
5
  import { PricingRegistry } from "./models/PricingRegistry.js";
6
6
  import { Transcription } from "./transcription/Transcription.js";
7
7
  import { Moderation } from "./moderation/Moderation.js";
8
8
  import { Embedding } from "./embedding/Embedding.js";
9
- import { ProviderNotConfiguredError, UnsupportedFeatureError, ModelCapabilityError } from "./errors/index.js";
9
+ import { ProviderNotConfiguredError, UnsupportedFeatureError, ModelCapabilityError, ConfigurationError } from "./errors/index.js";
10
10
  import { resolveModelAlias } from "./model_aliases.js";
11
11
  import { logger } from "./utils/logger.js";
12
12
  import { config, Configuration } from "./config.js";
13
13
  import { runMiddleware } from "./utils/middleware-runner.js";
14
+ import { normalizeQuestions, isJudgmentInput } from "./judge/Question.js";
15
+ import { buildJudgment } from "./judge/Judgment.js";
16
+ import { DEFAULT_MODELS } from "./constants.js";
14
17
  import { randomUUID } from "node:crypto";
15
18
  // Provider registration map
16
19
  const PROVIDER_REGISTRARS = {
@@ -22,7 +25,9 @@ const PROVIDER_REGISTRARS = {
22
25
  openrouter: registerOpenRouterProvider,
23
26
  bedrock: registerBedrockProvider,
24
27
  xai: registerXAIProvider,
25
- mistral: registerMistralProvider
28
+ mistral: registerMistralProvider,
29
+ typesafe: registerTypeSafeProvider,
30
+ azure: registerAzureProvider
26
31
  };
27
32
  export class NodeLLMCore {
28
33
  config;
@@ -54,6 +59,9 @@ export class NodeLLMCore {
54
59
  get defaultEmbeddingModel() {
55
60
  return this.defaults.embedding;
56
61
  }
62
+ get defaultJudgmentModel() {
63
+ return this.defaults.judgment;
64
+ }
57
65
  /**
58
66
  * Returns a scoped LLM instance configured for a specific provider.
59
67
  * This returns a NEW immutable instance.
@@ -70,7 +78,8 @@ export class NodeLLMCore {
70
78
  defaultChatModel: this.defaults.chat,
71
79
  defaultTranscriptionModel: this.defaults.transcription,
72
80
  defaultModerationModel: this.defaults.moderation,
73
- defaultEmbeddingModel: this.defaults.embedding
81
+ defaultEmbeddingModel: this.defaults.embedding,
82
+ defaultJudgmentModel: this.defaults.judgment
74
83
  });
75
84
  }
76
85
  /**
@@ -93,6 +102,11 @@ export class NodeLLMCore {
93
102
  return this.provider;
94
103
  }
95
104
  chat(model, options = {}) {
105
+ const { provider: providerName, ...chatOptions } = options;
106
+ // Provider ids are display names ("Anthropic") while registry names are lowercase.
107
+ if (providerName && providerName.toLowerCase() !== this.provider?.id.toLowerCase()) {
108
+ return this.withProvider(providerName).chat(model, chatOptions);
109
+ }
96
110
  if (!this.provider) {
97
111
  throw new ProviderNotConfiguredError();
98
112
  }
@@ -281,6 +295,97 @@ export class NodeLLMCore {
281
295
  throw error;
282
296
  }
283
297
  }
298
+ /**
299
+ * Asks typed questions about one input and returns a typed answer for each:
300
+ * a probability, a choice among named options, or a score on a scale.
301
+ *
302
+ * The provider follows the model: `jev-latest` (the default) is answered by
303
+ * TypeSafe whichever provider this instance is scoped to. Pass `provider` to
304
+ * route explicitly, for example to a Jev-compatible local server configured
305
+ * through `typesafeApiBase`.
306
+ *
307
+ * Each call judges only the input given; it keeps no conversation history.
308
+ *
309
+ * @example
310
+ * const judgment = await NodeLLM.judge("Please refund the duplicate charge today.", {
311
+ * questions: {
312
+ * urgent: probability("Does this need attention today?"),
313
+ * team: choice("Which team should handle this?", { billing: "Payments", other: null })
314
+ * }
315
+ * });
316
+ * judgment.urgent.probability; // 0.91
317
+ * judgment.team.choice; // "billing"
318
+ */
319
+ async judge(input, options) {
320
+ if (!isJudgmentInput(input)) {
321
+ throw new Error("Judgment input must be text, an object, or an array of JSON-compatible values");
322
+ }
323
+ const questions = normalizeQuestions(options.questions);
324
+ const model = options.model || this.defaults.judgment || DEFAULT_MODELS.JUDGMENT;
325
+ const provider = this.judgmentProvider(model, options.provider);
326
+ if (!provider.judge) {
327
+ throw new UnsupportedFeatureError(provider.id, "judge");
328
+ }
329
+ const context = {
330
+ requestId: randomUUID(),
331
+ provider: provider.id,
332
+ model,
333
+ judgmentInput: input,
334
+ judgmentOptions: options,
335
+ state: {}
336
+ };
337
+ const middlewares = [...this.middlewares, ...(options.middlewares || [])];
338
+ try {
339
+ await runMiddleware(middlewares, "onRequest", context);
340
+ const response = await provider.judge({
341
+ model,
342
+ input: context.judgmentInput ?? input,
343
+ questions,
344
+ providerOptions: options.providerOptions,
345
+ requestTimeout: options.requestTimeout ?? this.config.requestTimeout
346
+ });
347
+ // Priced by the requested model, which is what the registry knows; the
348
+ // response names the exact build that answered (jev-latest comes back as
349
+ // e.g. jev-1.13.0). An unpriced model leaves cost undefined rather than a
350
+ // guessed number.
351
+ const usage = ModelRegistry.calculateCost(response.usage, model, provider.id);
352
+ const judgment = buildJudgment({ ...response, usage }, questions);
353
+ await runMiddleware(middlewares, "onResponse", context, judgment);
354
+ return judgment;
355
+ }
356
+ catch (error) {
357
+ await runMiddleware(middlewares, "onError", context, error);
358
+ throw error;
359
+ }
360
+ }
361
+ /**
362
+ * Picks the provider that answers judgments for a model: an explicit choice
363
+ * first, then the registry's owner of a known judgment model, then this
364
+ * instance's own provider - which is how a model the registry does not know,
365
+ * such as one on a local Jev-compatible server, reaches the provider it was
366
+ * scoped to.
367
+ */
368
+ judgmentProvider(model, explicit) {
369
+ const known = ModelRegistry.find(model);
370
+ const owner = explicit ??
371
+ (known &&
372
+ known.id.toLowerCase() === model.toLowerCase() &&
373
+ known.capabilities?.includes("judgment")
374
+ ? known.provider
375
+ : undefined);
376
+ if (!owner || owner === this.provider?.id) {
377
+ if (!this.provider) {
378
+ // Guessing a provider for an unknown model would send the request (and
379
+ // the credentials) somewhere the caller did not choose.
380
+ throw new ConfigurationError(`Unknown judgment model '${model}': no provider is known to serve it. ` +
381
+ `Pass \`provider\` (for example "typesafe"), or call judge on ` +
382
+ `NodeLLM.withProvider("typesafe").`);
383
+ }
384
+ return this.provider;
385
+ }
386
+ PROVIDER_REGISTRARS[owner]?.();
387
+ return providerRegistry.resolve(owner, this.config);
388
+ }
284
389
  }
285
390
  export { Transcription, Moderation, Embedding, ModelRegistry, PricingRegistry };
286
391
  /**
@@ -330,7 +435,8 @@ export function createLLM(options = {}) {
330
435
  chat: options.defaultChatModel,
331
436
  transcription: options.defaultTranscriptionModel,
332
437
  moderation: options.defaultModerationModel,
333
- embedding: options.defaultEmbeddingModel
438
+ embedding: options.defaultEmbeddingModel,
439
+ judgment: options.defaultJudgmentModel
334
440
  };
335
441
  return new NodeLLMCore(baseConfig, providerInstance, retry, options.middlewares || [], defaults);
336
442
  }
@@ -1,4 +1,4 @@
1
- import { Model } from "./types.js";
1
+ import { Model, ReasoningOption } from "./types.js";
2
2
  export declare class ModelRegistry {
3
3
  private static models;
4
4
  static find(modelId: string, provider?: string): Model | undefined;
@@ -14,6 +14,16 @@ export declare class ModelRegistry {
14
14
  * Get output tokens limit for a model.
15
15
  */
16
16
  static getMaxOutputTokens(modelId: string, provider: string): number | undefined;
17
+ /**
18
+ * Thinking controls the model accepts (effort, budget_tokens, toggle).
19
+ * Empty when the registry has no data for the model.
20
+ */
21
+ static getReasoningOptions(modelId: string, provider: string): ReasoningOption[];
22
+ /**
23
+ * Whether the model accepts a temperature. Models that reject one (such as Claude Opus 4.7
24
+ * and later) are marked in the registry; models it has no data for are assumed to accept it.
25
+ */
26
+ static supportsTemperature(modelId: string, provider: string): boolean;
17
27
  /**
18
28
  * Check if a model supports a capability.
19
29
  */
@@ -25,30 +35,24 @@ export declare class ModelRegistry {
25
35
  /**
26
36
  * Calculate cost for usage.
27
37
  */
28
- static calculateCost(usage: {
29
- input_tokens: number;
30
- output_tokens: number;
31
- total_tokens: number;
32
- cached_tokens?: number;
33
- reasoning_tokens?: number;
34
- image_tokens?: number;
35
- }, modelId: string, provider: string): {
36
- input_tokens: number;
37
- output_tokens: number;
38
- total_tokens: number;
39
- cached_tokens?: number;
40
- reasoning_tokens?: number;
41
- image_tokens?: number;
42
- } | {
43
- input_cost: number;
44
- output_cost: number;
45
- cost: number;
38
+ /**
39
+ * Returns the usage with `input_cost`, `output_cost` and `cost` added when the
40
+ * model has known pricing. Without pricing the usage comes back unchanged and
41
+ * the cost fields are undefined - declared on the return type either way, so
42
+ * callers can read `.cost` without a cast.
43
+ */
44
+ static calculateCost<U extends {
46
45
  input_tokens: number;
47
46
  output_tokens: number;
48
47
  total_tokens: number;
49
48
  cached_tokens?: number;
49
+ cache_creation_tokens?: number;
50
50
  reasoning_tokens?: number;
51
51
  image_tokens?: number;
52
+ }>(usage: U, modelId: string, provider: string): U & {
53
+ input_cost?: number;
54
+ output_cost?: number;
55
+ cost?: number;
52
56
  };
53
57
  }
54
58
  //# sourceMappingURL=ModelRegistry.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ModelRegistry.d.ts","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAInC,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA6C;IAElE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAmBlE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI;IAe1C;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKhF;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAwB/E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9E;;OAEG;IACH,MAAM,CAAC,aAAa,CAClB,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EACD,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM;sBARA,MAAM;uBACL,MAAM;sBACP,MAAM;wBACJ,MAAM;2BACH,MAAM;uBACV,MAAM;;;;;sBALP,MAAM;uBACL,MAAM;sBACP,MAAM;wBACJ,MAAM;2BACH,MAAM;uBACV,MAAM;;CAoD1B"}
1
+ {"version":3,"file":"ModelRegistry.d.ts","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIpD,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA6C;IAElE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAmBlE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI;IAe1C;;OAEG;IACH,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE;IAIrB;;OAEG;IACH,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKhF;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,eAAe,EAAE;IAKhF;;;OAGG;IACH,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAItE;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO;IAwB/E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9E;;OAEG;IACH;;;;;OAKG;IACH,MAAM,CAAC,aAAa,CAClB,CAAC,SAAS;QACR,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,qBAAqB,CAAC,EAAE,MAAM,CAAC;QAC/B,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,EAED,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,GACf,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE;CAqDpE"}
@@ -44,6 +44,21 @@ export class ModelRegistry {
44
44
  const model = this.find(modelId, provider);
45
45
  return model?.max_output_tokens ?? undefined;
46
46
  }
47
+ /**
48
+ * Thinking controls the model accepts (effort, budget_tokens, toggle).
49
+ * Empty when the registry has no data for the model.
50
+ */
51
+ static getReasoningOptions(modelId, provider) {
52
+ const options = this.find(modelId, provider)?.metadata?.reasoning_options;
53
+ return Array.isArray(options) ? options : [];
54
+ }
55
+ /**
56
+ * Whether the model accepts a temperature. Models that reject one (such as Claude Opus 4.7
57
+ * and later) are marked in the registry; models it has no data for are assumed to accept it.
58
+ */
59
+ static supportsTemperature(modelId, provider) {
60
+ return this.find(modelId, provider)?.metadata?.temperature !== false;
61
+ }
47
62
  /**
48
63
  * Check if a model supports a capability.
49
64
  */
@@ -77,6 +92,12 @@ export class ModelRegistry {
77
92
  /**
78
93
  * Calculate cost for usage.
79
94
  */
95
+ /**
96
+ * Returns the usage with `input_cost`, `output_cost` and `cost` added when the
97
+ * model has known pricing. Without pricing the usage comes back unchanged and
98
+ * the cost fields are undefined - declared on the return type either way, so
99
+ * callers can read `.cost` without a cast.
100
+ */
80
101
  static calculateCost(usage, modelId, provider) {
81
102
  const pricing = PricingRegistry.getPricing(modelId, provider);
82
103
  if (!pricing) {
@@ -92,9 +113,14 @@ export class ModelRegistry {
92
113
  const reasoningPrice = prices.reasoning_output_per_million ??
93
114
  (modelId.includes("reasoner") || modelId.includes("3-7") ? outputPrice * 2.5 : outputPrice);
94
115
  const cachedPrice = prices.cached_input_per_million ?? inputPrice / 2;
116
+ const cacheWritePrice = prices.cache_write_per_million ?? inputPrice;
117
+ // input_tokens counts every input token, including cache reads and writes.
118
+ const cachedTokens = usage.cached_tokens || 0;
119
+ const cacheWriteTokens = usage.cache_creation_tokens || 0;
95
120
  inputCost +=
96
- ((usage.input_tokens - (usage.cached_tokens || 0)) / 1_000_000) * inputPrice +
97
- ((usage.cached_tokens || 0) / 1_000_000) * cachedPrice;
121
+ ((usage.input_tokens - cachedTokens - cacheWriteTokens) / 1_000_000) * inputPrice +
122
+ (cachedTokens / 1_000_000) * cachedPrice +
123
+ (cacheWriteTokens / 1_000_000) * cacheWritePrice;
98
124
  const outputTokens = usage.output_tokens - (usage.reasoning_tokens || 0);
99
125
  const reasoningTokens = usage.reasoning_tokens || 0;
100
126
  outputCost +=