@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.
Files changed (72) hide show
  1. package/dist/aliases.d.ts +3 -0
  2. package/dist/aliases.d.ts.map +1 -1
  3. package/dist/aliases.js +3 -0
  4. package/dist/chat/Chat.d.ts +7 -3
  5. package/dist/chat/Chat.d.ts.map +1 -1
  6. package/dist/chat/Chat.js +15 -3
  7. package/dist/chat/ChatResponse.d.ts +24 -3
  8. package/dist/chat/ChatResponse.d.ts.map +1 -1
  9. package/dist/chat/ChatResponse.js +72 -5
  10. package/dist/chat/ChatStream.d.ts.map +1 -1
  11. package/dist/chat/ChatStream.js +13 -1
  12. package/dist/config.d.ts.map +1 -1
  13. package/dist/config.js +9 -7
  14. package/dist/constants.d.ts +6 -0
  15. package/dist/constants.d.ts.map +1 -1
  16. package/dist/constants.js +6 -0
  17. package/dist/errors/index.d.ts +20 -2
  18. package/dist/errors/index.d.ts.map +1 -1
  19. package/dist/errors/index.js +31 -3
  20. package/dist/index.d.ts +2 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/models/ModelRegistry.d.ts.map +1 -1
  23. package/dist/models/ModelRegistry.js +4 -2
  24. package/dist/models/PricingRegistry.js +3 -3
  25. package/dist/models/{models.js → models.json} +8331 -7603
  26. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  27. package/dist/providers/anthropic/AnthropicProvider.js +2 -1
  28. package/dist/providers/anthropic/Chat.d.ts.map +1 -1
  29. package/dist/providers/anthropic/Chat.js +2 -1
  30. package/dist/providers/anthropic/Errors.d.ts.map +1 -1
  31. package/dist/providers/anthropic/Errors.js +15 -1
  32. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  33. package/dist/providers/anthropic/Streaming.js +19 -3
  34. package/dist/providers/bedrock/Chat.d.ts.map +1 -1
  35. package/dist/providers/bedrock/Chat.js +2 -20
  36. package/dist/providers/bedrock/Errors.d.ts +2 -0
  37. package/dist/providers/bedrock/Errors.d.ts.map +1 -0
  38. package/dist/providers/bedrock/Errors.js +51 -0
  39. package/dist/providers/bedrock/Streaming.d.ts.map +1 -1
  40. package/dist/providers/bedrock/Streaming.js +2 -3
  41. package/dist/providers/deepseek/Chat.d.ts.map +1 -1
  42. package/dist/providers/deepseek/Chat.js +2 -2
  43. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  44. package/dist/providers/deepseek/DeepSeekProvider.js +2 -1
  45. package/dist/providers/deepseek/Errors.d.ts +2 -0
  46. package/dist/providers/deepseek/Errors.d.ts.map +1 -0
  47. package/dist/providers/deepseek/Errors.js +45 -0
  48. package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
  49. package/dist/providers/deepseek/Streaming.js +13 -2
  50. package/dist/providers/gemini/Errors.d.ts.map +1 -1
  51. package/dist/providers/gemini/Errors.js +13 -1
  52. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  53. package/dist/providers/gemini/GeminiProvider.js +2 -1
  54. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  55. package/dist/providers/ollama/OllamaProvider.js +2 -2
  56. package/dist/providers/openai/Errors.d.ts.map +1 -1
  57. package/dist/providers/openai/Errors.js +31 -5
  58. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  59. package/dist/providers/openai/OpenAIProvider.js +2 -1
  60. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  61. package/dist/providers/openai/Streaming.js +10 -0
  62. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  63. package/dist/providers/openrouter/OpenRouterProvider.js +2 -1
  64. package/dist/providers/registry.d.ts +3 -0
  65. package/dist/providers/registry.d.ts.map +1 -1
  66. package/dist/providers/registry.js +10 -2
  67. package/dist/utils/json.d.ts +6 -0
  68. package/dist/utils/json.d.ts.map +1 -0
  69. package/dist/utils/json.js +43 -0
  70. package/package.json +1 -1
  71. package/dist/models/models.d.ts +0 -572
  72. 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;AAG7D,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
+ {"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 || "https://openrouter.ai/api/v1"
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;AAE5D,cAAM,gBAAgB;IACpB,OAAO,CAAC,SAAS,CAAsC;IAEvD;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAQtD;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,aAAa,GAAG,QAAQ;IAUvD;;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"}
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(`Unknown LLM provider '${name}'`);
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 factory(config);
35
+ return provider;
28
36
  }
29
37
  /**
30
38
  * Check if a provider is registered
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Boring, standard JSON extraction logic.
3
+ * Avoids cleverness in favor of predictable industry-standard patterns.
4
+ */
5
+ export declare function extractJson(text: string): string;
6
+ //# sourceMappingURL=json.d.ts.map
@@ -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
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-llm/core",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",