@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.
- package/README.md +14 -11
- package/dist/agent/Agent.d.ts +41 -14
- package/dist/agent/Agent.d.ts.map +1 -1
- package/dist/agent/Agent.js +12 -3
- package/dist/aliases.d.ts +477 -283
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +546 -352
- package/dist/chat/Chat.d.ts +23 -13
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +59 -16
- package/dist/chat/ChatOptions.d.ts +28 -11
- package/dist/chat/ChatOptions.d.ts.map +1 -1
- package/dist/chat/ChatResponse.d.ts +5 -0
- package/dist/chat/ChatResponse.d.ts.map +1 -1
- package/dist/chat/ChatResponse.js +12 -4
- package/dist/chat/ChatStream.d.ts.map +1 -1
- package/dist/chat/ChatStream.js +20 -10
- package/dist/chat/PromptCache.d.ts +7 -0
- package/dist/chat/PromptCache.d.ts.map +1 -0
- package/dist/chat/PromptCache.js +7 -0
- package/dist/chat/Temperature.d.ts +7 -0
- package/dist/chat/Temperature.d.ts.map +1 -0
- package/dist/chat/Temperature.js +17 -0
- package/dist/chat/Tool.d.ts +52 -8
- package/dist/chat/Tool.d.ts.map +1 -1
- package/dist/chat/Tool.js +53 -5
- package/dist/chat/ToolCallOutcome.d.ts +18 -6
- package/dist/chat/ToolCallOutcome.d.ts.map +1 -1
- package/dist/chat/ToolCallOutcome.js +14 -0
- package/dist/chat/ToolHandler.d.ts +2 -2
- package/dist/chat/ToolHandler.d.ts.map +1 -1
- package/dist/chat/ToolResultWindow.d.ts +16 -0
- package/dist/chat/ToolResultWindow.d.ts.map +1 -0
- package/dist/chat/ToolResultWindow.js +25 -0
- package/dist/config.d.ts +42 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +80 -27
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +3 -1
- package/dist/errors/billing.d.ts +7 -0
- package/dist/errors/billing.d.ts.map +1 -0
- package/dist/errors/billing.js +24 -0
- package/dist/errors/index.d.ts +28 -0
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +32 -0
- package/dist/executor/Executor.d.ts.map +1 -1
- package/dist/executor/Executor.js +5 -3
- package/dist/index.d.ts +12 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/judge/Judge.d.ts +107 -0
- package/dist/judge/Judge.d.ts.map +1 -0
- package/dist/judge/Judge.js +104 -0
- package/dist/judge/Judgment.d.ts +116 -0
- package/dist/judge/Judgment.d.ts.map +1 -0
- package/dist/judge/Judgment.js +159 -0
- package/dist/judge/Question.d.ts +91 -0
- package/dist/judge/Question.d.ts.map +1 -0
- package/dist/judge/Question.js +180 -0
- package/dist/llm.d.ts +48 -1
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +111 -5
- package/dist/models/ModelRegistry.d.ts +23 -19
- package/dist/models/ModelRegistry.d.ts.map +1 -1
- package/dist/models/ModelRegistry.js +28 -2
- package/dist/models/models.json +15154 -4786
- package/dist/models/types.d.ts +14 -1
- package/dist/models/types.d.ts.map +1 -1
- package/dist/providers/BaseProvider.d.ts +2 -1
- package/dist/providers/BaseProvider.d.ts.map +1 -1
- package/dist/providers/BaseProvider.js +3 -0
- package/dist/providers/Provider.d.ts +60 -1
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.d.ts +2 -0
- package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.js +2 -0
- package/dist/providers/anthropic/Capabilities.d.ts +1 -0
- package/dist/providers/anthropic/Capabilities.d.ts.map +1 -1
- package/dist/providers/anthropic/Capabilities.js +3 -0
- package/dist/providers/anthropic/Chat.d.ts.map +1 -1
- package/dist/providers/anthropic/Chat.js +7 -75
- package/dist/providers/anthropic/Errors.d.ts.map +1 -1
- package/dist/providers/anthropic/Errors.js +4 -3
- package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
- package/dist/providers/anthropic/Streaming.js +4 -66
- package/dist/providers/anthropic/Utils.d.ts +33 -1
- package/dist/providers/anthropic/Utils.d.ts.map +1 -1
- package/dist/providers/anthropic/Utils.js +114 -0
- package/dist/providers/anthropic/types.d.ts +17 -3
- package/dist/providers/anthropic/types.d.ts.map +1 -1
- package/dist/providers/azure/AzureProvider.d.ts +54 -0
- package/dist/providers/azure/AzureProvider.d.ts.map +1 -0
- package/dist/providers/azure/AzureProvider.js +110 -0
- package/dist/providers/azure/Capabilities.d.ts +16 -0
- package/dist/providers/azure/Capabilities.d.ts.map +1 -0
- package/dist/providers/azure/Capabilities.js +36 -0
- package/dist/providers/azure/Embedding.d.ts +11 -0
- package/dist/providers/azure/Embedding.d.ts.map +1 -0
- package/dist/providers/azure/Embedding.js +23 -0
- package/dist/providers/azure/Models.d.ts +18 -0
- package/dist/providers/azure/Models.d.ts.map +1 -0
- package/dist/providers/azure/Models.js +29 -0
- package/dist/providers/azure/index.d.ts +5 -0
- package/dist/providers/azure/index.d.ts.map +1 -0
- package/dist/providers/azure/index.js +28 -0
- package/dist/providers/bedrock/BedrockProvider.d.ts.map +1 -1
- package/dist/providers/bedrock/BedrockProvider.js +1 -0
- package/dist/providers/bedrock/Capabilities.d.ts +1 -0
- package/dist/providers/bedrock/Capabilities.d.ts.map +1 -1
- package/dist/providers/bedrock/Capabilities.js +3 -0
- package/dist/providers/bedrock/Chat.d.ts.map +1 -1
- package/dist/providers/bedrock/Chat.js +6 -2
- package/dist/providers/bedrock/Errors.d.ts.map +1 -1
- package/dist/providers/bedrock/Errors.js +4 -0
- package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
- package/dist/providers/bedrock/Streaming.js +4 -1
- package/dist/providers/deepseek/Capabilities.d.ts +1 -0
- package/dist/providers/deepseek/Capabilities.d.ts.map +1 -1
- package/dist/providers/deepseek/Capabilities.js +3 -0
- package/dist/providers/deepseek/Chat.d.ts.map +1 -1
- package/dist/providers/deepseek/Chat.js +3 -2
- package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
- package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.js +1 -0
- package/dist/providers/deepseek/Errors.d.ts.map +1 -1
- package/dist/providers/deepseek/Errors.js +5 -4
- package/dist/providers/gemini/Capabilities.d.ts +1 -0
- package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
- package/dist/providers/gemini/Capabilities.js +3 -0
- package/dist/providers/gemini/Chat.d.ts.map +1 -1
- package/dist/providers/gemini/Chat.js +3 -2
- package/dist/providers/gemini/Errors.d.ts.map +1 -1
- package/dist/providers/gemini/Errors.js +4 -3
- package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/gemini/GeminiProvider.js +1 -0
- package/dist/providers/mistral/Capabilities.d.ts +1 -0
- package/dist/providers/mistral/Capabilities.d.ts.map +1 -1
- package/dist/providers/mistral/Capabilities.js +3 -0
- package/dist/providers/mistral/Chat.d.ts.map +1 -1
- package/dist/providers/mistral/Chat.js +3 -2
- package/dist/providers/mistral/Errors.d.ts.map +1 -1
- package/dist/providers/mistral/Errors.js +4 -3
- package/dist/providers/mistral/MistralProvider.d.ts +1 -0
- package/dist/providers/mistral/MistralProvider.d.ts.map +1 -1
- package/dist/providers/mistral/MistralProvider.js +1 -0
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/ollama/OllamaProvider.js +1 -0
- package/dist/providers/openai/Capabilities.d.ts +6 -0
- package/dist/providers/openai/Capabilities.d.ts.map +1 -1
- package/dist/providers/openai/Capabilities.js +10 -0
- package/dist/providers/openai/Chat.d.ts +3 -0
- package/dist/providers/openai/Chat.d.ts.map +1 -1
- package/dist/providers/openai/Chat.js +26 -7
- package/dist/providers/openai/Embedding.d.ts +2 -0
- package/dist/providers/openai/Embedding.d.ts.map +1 -1
- package/dist/providers/openai/Embedding.js +8 -5
- package/dist/providers/openai/Errors.d.ts.map +1 -1
- package/dist/providers/openai/Errors.js +4 -3
- package/dist/providers/openai/Models.d.ts +10 -0
- package/dist/providers/openai/Models.d.ts.map +1 -1
- package/dist/providers/openai/Models.js +12 -8
- package/dist/providers/openai/OpenAIProvider.d.ts +11 -1
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +36 -0
- package/dist/providers/openai/Responses.d.ts +30 -0
- package/dist/providers/openai/Responses.d.ts.map +1 -0
- package/dist/providers/openai/Responses.js +176 -0
- package/dist/providers/openai/Streaming.d.ts +2 -0
- package/dist/providers/openai/Streaming.d.ts.map +1 -1
- package/dist/providers/openai/Streaming.js +19 -5
- package/dist/providers/openrouter/Capabilities.d.ts +1 -0
- package/dist/providers/openrouter/Capabilities.d.ts.map +1 -1
- package/dist/providers/openrouter/Capabilities.js +3 -0
- package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
- package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
- package/dist/providers/registry.d.ts +3 -1
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +3 -1
- package/dist/providers/typesafe/SystemOne.d.ts +11 -0
- package/dist/providers/typesafe/SystemOne.d.ts.map +1 -0
- package/dist/providers/typesafe/SystemOne.js +171 -0
- package/dist/providers/typesafe/TypeSafeProvider.d.ts +27 -0
- package/dist/providers/typesafe/TypeSafeProvider.d.ts.map +1 -0
- package/dist/providers/typesafe/TypeSafeProvider.js +76 -0
- package/dist/providers/typesafe/index.d.ts +4 -0
- package/dist/providers/typesafe/index.d.ts.map +1 -0
- package/dist/providers/typesafe/index.js +19 -0
- package/dist/providers/xai/Capabilities.d.ts +1 -0
- package/dist/providers/xai/Capabilities.d.ts.map +1 -1
- package/dist/providers/xai/Capabilities.js +3 -0
- package/dist/providers/xai/Chat.d.ts.map +1 -1
- package/dist/providers/xai/Chat.js +3 -2
- package/dist/providers/xai/Errors.d.ts.map +1 -1
- package/dist/providers/xai/Errors.js +5 -2
- package/dist/providers/xai/XAIProvider.d.ts +1 -0
- package/dist/providers/xai/XAIProvider.d.ts.map +1 -1
- package/dist/providers/xai/XAIProvider.js +1 -0
- package/dist/schema/Schema.d.ts +3 -3
- package/dist/schema/Schema.d.ts.map +1 -1
- package/dist/schema/to-json-schema.d.ts +2 -2
- package/dist/schema/to-json-schema.d.ts.map +1 -1
- package/dist/schema/to-json-schema.js +3 -8
- package/dist/schema/zod.d.ts +32 -0
- package/dist/schema/zod.d.ts.map +1 -0
- package/dist/schema/zod.js +31 -0
- package/dist/types/Middleware.d.ts +9 -0
- package/dist/types/Middleware.d.ts.map +1 -1
- 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
|
-
|
|
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;
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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;
|
|
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 -
|
|
97
|
-
(
|
|
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 +=
|