@node-llm/core 1.8.0 → 1.9.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/dist/aliases.d.ts +3 -0
- package/dist/aliases.d.ts.map +1 -1
- package/dist/aliases.js +3 -0
- package/dist/chat/Chat.d.ts +7 -3
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +15 -3
- package/dist/chat/ChatResponse.d.ts +24 -3
- package/dist/chat/ChatResponse.d.ts.map +1 -1
- package/dist/chat/ChatResponse.js +72 -5
- package/dist/chat/ChatStream.d.ts.map +1 -1
- package/dist/chat/ChatStream.js +13 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -7
- package/dist/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +6 -0
- package/dist/errors/index.d.ts +20 -2
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +31 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/models/ModelRegistry.d.ts.map +1 -1
- package/dist/models/ModelRegistry.js +4 -2
- package/dist/models/PricingRegistry.js +3 -3
- package/dist/models/{models.js → models.json} +8331 -7603
- package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.js +2 -1
- package/dist/providers/anthropic/Chat.d.ts.map +1 -1
- package/dist/providers/anthropic/Chat.js +2 -1
- package/dist/providers/anthropic/Errors.d.ts.map +1 -1
- package/dist/providers/anthropic/Errors.js +15 -1
- package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
- package/dist/providers/anthropic/Streaming.js +19 -3
- package/dist/providers/bedrock/Chat.d.ts.map +1 -1
- package/dist/providers/bedrock/Chat.js +2 -20
- package/dist/providers/bedrock/Errors.d.ts +2 -0
- package/dist/providers/bedrock/Errors.d.ts.map +1 -0
- package/dist/providers/bedrock/Errors.js +51 -0
- package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
- package/dist/providers/bedrock/Streaming.js +2 -3
- package/dist/providers/deepseek/Chat.d.ts.map +1 -1
- package/dist/providers/deepseek/Chat.js +2 -2
- package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.js +2 -1
- package/dist/providers/deepseek/Errors.d.ts +2 -0
- package/dist/providers/deepseek/Errors.d.ts.map +1 -0
- package/dist/providers/deepseek/Errors.js +45 -0
- package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
- package/dist/providers/deepseek/Streaming.js +13 -2
- package/dist/providers/gemini/Errors.d.ts.map +1 -1
- package/dist/providers/gemini/Errors.js +13 -1
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/gemini/GeminiProvider.js +2 -1
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/ollama/OllamaProvider.js +2 -2
- package/dist/providers/openai/Errors.d.ts.map +1 -1
- package/dist/providers/openai/Errors.js +31 -5
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +2 -1
- package/dist/providers/openai/Streaming.d.ts.map +1 -1
- package/dist/providers/openai/Streaming.js +10 -0
- package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/openrouter/OpenRouterProvider.js +2 -1
- package/dist/providers/registry.d.ts +3 -0
- package/dist/providers/registry.d.ts.map +1 -1
- package/dist/providers/registry.js +10 -2
- package/dist/utils/json.d.ts +6 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +43 -0
- package/package.json +1 -1
- package/dist/models/models.d.ts +0 -572
- package/dist/models/models.d.ts.map +0 -1
|
@@ -50,6 +50,7 @@ export class OpenAIStreaming {
|
|
|
50
50
|
if (request.thinking?.effort && request.thinking.effort !== "none") {
|
|
51
51
|
body.reasoning_effort = request.thinking.effort;
|
|
52
52
|
}
|
|
53
|
+
body.stream_options = { include_usage: true };
|
|
53
54
|
let done = false;
|
|
54
55
|
// Track tool calls being built across chunks
|
|
55
56
|
const toolCallsMap = new Map();
|
|
@@ -154,6 +155,15 @@ export class OpenAIStreaming {
|
|
|
154
155
|
}
|
|
155
156
|
}
|
|
156
157
|
}
|
|
158
|
+
// Handle usage (usually in the special chunk when stream_options.include_usage: true)
|
|
159
|
+
if (json.usage) {
|
|
160
|
+
const usage = {
|
|
161
|
+
input_tokens: json.usage.prompt_tokens,
|
|
162
|
+
output_tokens: json.usage.completion_tokens,
|
|
163
|
+
total_tokens: json.usage.total_tokens
|
|
164
|
+
};
|
|
165
|
+
yield { content: "", usage };
|
|
166
|
+
}
|
|
157
167
|
}
|
|
158
168
|
catch (e) {
|
|
159
169
|
// Re-throw APIError
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenRouterProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openrouter/OpenRouterProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAI7D,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,cAAc;IAC7C,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCAEZ,MAAM;yCACD,MAAM;uCAER,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;kCACZ,MAAM;MAChC;gBAEU,OAAO,EAAE,yBAAyB;IAO9C,SAAS,CAAC,YAAY,IAAI,MAAM;CAGjC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { OpenAIProvider } from "../openai/OpenAIProvider.js";
|
|
2
|
+
import { DEFAULT_OPENROUTER_BASE_URL } from "../../constants.js";
|
|
2
3
|
import { OpenRouterCapabilities } from "./Capabilities.js";
|
|
3
4
|
export class OpenRouterProvider extends OpenAIProvider {
|
|
4
5
|
capabilities = {
|
|
@@ -16,7 +17,7 @@ export class OpenRouterProvider extends OpenAIProvider {
|
|
|
16
17
|
constructor(options) {
|
|
17
18
|
super({
|
|
18
19
|
apiKey: options.apiKey,
|
|
19
|
-
baseUrl: options.baseUrl ||
|
|
20
|
+
baseUrl: options.baseUrl || DEFAULT_OPENROUTER_BASE_URL
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
providerName() {
|
|
@@ -8,8 +8,11 @@ import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
|
8
8
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
9
9
|
import { NodeLLMConfig } from "../config.js";
|
|
10
10
|
type ProviderFactory = (config?: NodeLLMConfig) => Provider;
|
|
11
|
+
export type ProviderInterceptor = (provider: Provider) => Provider;
|
|
11
12
|
declare class ProviderRegistry {
|
|
12
13
|
private providers;
|
|
14
|
+
private globalInterceptor?;
|
|
15
|
+
setInterceptor(interceptor: ProviderInterceptor | undefined): void;
|
|
13
16
|
/**
|
|
14
17
|
* Register a provider factory
|
|
15
18
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,eAAe,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,eAAe,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,KAAK,QAAQ,CAAC;AAC5D,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC;AAEnE,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAsC;IACvD,OAAO,CAAC,iBAAiB,CAAC,CAAsB;IAEzC,cAAc,CAAC,WAAW,EAAE,mBAAmB,GAAG,SAAS;IAIlE;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe;IAO/C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ;IAgBvD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B;;OAEG;IACH,IAAI,IAAI,MAAM,EAAE;CAGjB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAGvD,OAAO,EACL,sBAAsB,IAAI,sBAAsB,EAChD,sBAAsB,EACtB,yBAAyB,EACzB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,0BAA0B,EAC1B,uBAAuB,EACxB,CAAC"}
|
|
@@ -7,6 +7,10 @@ import { registerOpenRouterProvider } from "./openrouter/index.js";
|
|
|
7
7
|
import { registerBedrockProvider } from "./bedrock/index.js";
|
|
8
8
|
class ProviderRegistry {
|
|
9
9
|
providers = new Map();
|
|
10
|
+
globalInterceptor;
|
|
11
|
+
setInterceptor(interceptor) {
|
|
12
|
+
this.globalInterceptor = interceptor;
|
|
13
|
+
}
|
|
10
14
|
/**
|
|
11
15
|
* Register a provider factory
|
|
12
16
|
*/
|
|
@@ -22,9 +26,13 @@ class ProviderRegistry {
|
|
|
22
26
|
resolve(name, config) {
|
|
23
27
|
const factory = this.providers.get(name);
|
|
24
28
|
if (!factory) {
|
|
25
|
-
throw new Error(`
|
|
29
|
+
throw new Error(`Provider ${name} not registered`);
|
|
30
|
+
}
|
|
31
|
+
let provider = factory(config);
|
|
32
|
+
if (this.globalInterceptor) {
|
|
33
|
+
provider = this.globalInterceptor(provider);
|
|
26
34
|
}
|
|
27
|
-
return
|
|
35
|
+
return provider;
|
|
28
36
|
}
|
|
29
37
|
/**
|
|
30
38
|
* Check if a provider is registered
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/utils/json.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAwChD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boring, standard JSON extraction logic.
|
|
3
|
+
* Avoids cleverness in favor of predictable industry-standard patterns.
|
|
4
|
+
*/
|
|
5
|
+
export function extractJson(text) {
|
|
6
|
+
const cleaned = text.trim();
|
|
7
|
+
// 1. Fast path: The string is already just JSON
|
|
8
|
+
try {
|
|
9
|
+
JSON.parse(cleaned);
|
|
10
|
+
return cleaned;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
// Continue extraction
|
|
14
|
+
}
|
|
15
|
+
// 2. Handle Markdown blocks (the most common LLM artifact)
|
|
16
|
+
const markdownMatch = cleaned.match(/```(?:json)?\s*([\s\S]*?)```/);
|
|
17
|
+
if (markdownMatch?.[1]) {
|
|
18
|
+
const candidate = markdownMatch[1].trim();
|
|
19
|
+
try {
|
|
20
|
+
JSON.parse(candidate);
|
|
21
|
+
return candidate;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// Invalid JSON inside backticks, fall through
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// 3. Last resort: Find the first '{' and last '}'
|
|
28
|
+
// This handles conversational filler like "Here is your data: { ... }"
|
|
29
|
+
const firstBrace = cleaned.indexOf("{");
|
|
30
|
+
const lastBrace = cleaned.lastIndexOf("}");
|
|
31
|
+
if (firstBrace !== -1 && lastBrace !== -1 && lastBrace > firstBrace) {
|
|
32
|
+
const candidate = cleaned.substring(firstBrace, lastBrace + 1);
|
|
33
|
+
try {
|
|
34
|
+
JSON.parse(candidate);
|
|
35
|
+
return candidate;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Not valid JSON
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// 4. Return as-is and let the final JSON.parse() fail loudly
|
|
42
|
+
return cleaned;
|
|
43
|
+
}
|