@node-llm/core 0.7.0 → 1.0.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 (117) hide show
  1. package/README.md +67 -62
  2. package/dist/chat/Chat.d.ts +3 -2
  3. package/dist/chat/Chat.d.ts.map +1 -1
  4. package/dist/chat/Chat.js +4 -4
  5. package/dist/chat/ChatStream.d.ts +25 -0
  6. package/dist/chat/ChatStream.d.ts.map +1 -0
  7. package/dist/chat/ChatStream.js +93 -0
  8. package/dist/config.d.ts +6 -2
  9. package/dist/config.d.ts.map +1 -1
  10. package/dist/config.js +3 -0
  11. package/dist/embedding/Embedding.d.ts +1 -1
  12. package/dist/embedding/Embedding.d.ts.map +1 -1
  13. package/dist/errors/index.d.ts +22 -0
  14. package/dist/errors/index.d.ts.map +1 -1
  15. package/dist/errors/index.js +32 -0
  16. package/dist/index.d.ts +5 -1
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +5 -1
  19. package/dist/llm.d.ts +3 -1
  20. package/dist/llm.d.ts.map +1 -1
  21. package/dist/llm.js +26 -24
  22. package/dist/models/ModelRegistry.d.ts +3 -2
  23. package/dist/models/ModelRegistry.d.ts.map +1 -1
  24. package/dist/models/ModelRegistry.js +15 -3
  25. package/dist/models/models.d.ts +729 -60
  26. package/dist/models/models.d.ts.map +1 -1
  27. package/dist/models/models.js +24809 -2410
  28. package/dist/models/types.d.ts +3 -3
  29. package/dist/models/types.d.ts.map +1 -1
  30. package/dist/models/types.js +3 -0
  31. package/dist/providers/BaseProvider.d.ts +21 -0
  32. package/dist/providers/BaseProvider.d.ts.map +1 -0
  33. package/dist/providers/BaseProvider.js +28 -0
  34. package/dist/providers/Provider.d.ts +19 -1
  35. package/dist/providers/Provider.d.ts.map +1 -1
  36. package/dist/providers/anthropic/AnthropicProvider.d.ts +6 -7
  37. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  38. package/dist/providers/anthropic/AnthropicProvider.js +16 -13
  39. package/dist/providers/anthropic/Streaming.d.ts +1 -1
  40. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  41. package/dist/providers/anthropic/Streaming.js +80 -54
  42. package/dist/providers/deepseek/Capabilities.js +1 -1
  43. package/dist/providers/deepseek/DeepSeekProvider.d.ts +5 -1
  44. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  45. package/dist/providers/deepseek/DeepSeekProvider.js +15 -1
  46. package/dist/providers/deepseek/Streaming.d.ts +1 -1
  47. package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
  48. package/dist/providers/deepseek/Streaming.js +80 -48
  49. package/dist/providers/gemini/Capabilities.d.ts.map +1 -1
  50. package/dist/providers/gemini/Embeddings.d.ts +1 -1
  51. package/dist/providers/gemini/Embeddings.d.ts.map +1 -1
  52. package/dist/providers/gemini/GeminiProvider.d.ts +6 -4
  53. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  54. package/dist/providers/gemini/GeminiProvider.js +14 -4
  55. package/dist/providers/gemini/Streaming.d.ts +1 -1
  56. package/dist/providers/gemini/Streaming.d.ts.map +1 -1
  57. package/dist/providers/gemini/Streaming.js +62 -39
  58. package/dist/providers/ollama/Capabilities.d.ts +13 -0
  59. package/dist/providers/ollama/Capabilities.d.ts.map +1 -0
  60. package/dist/providers/ollama/Capabilities.js +54 -0
  61. package/dist/providers/ollama/Embedding.d.ts +6 -0
  62. package/dist/providers/ollama/Embedding.d.ts.map +1 -0
  63. package/dist/providers/ollama/Embedding.js +12 -0
  64. package/dist/providers/ollama/Models.d.ts +8 -0
  65. package/dist/providers/ollama/Models.d.ts.map +1 -0
  66. package/dist/providers/ollama/Models.js +31 -0
  67. package/dist/providers/ollama/OllamaProvider.d.ts +9 -0
  68. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -0
  69. package/dist/providers/ollama/OllamaProvider.js +31 -0
  70. package/dist/providers/ollama/index.d.ts +9 -0
  71. package/dist/providers/ollama/index.d.ts.map +1 -0
  72. package/dist/providers/ollama/index.js +17 -0
  73. package/dist/providers/openai/Capabilities.d.ts +1 -1
  74. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  75. package/dist/providers/openai/Capabilities.js +4 -2
  76. package/dist/providers/openai/Embedding.d.ts +5 -3
  77. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  78. package/dist/providers/openai/Embedding.js +13 -8
  79. package/dist/providers/openai/Models.d.ts +12 -2
  80. package/dist/providers/openai/Models.d.ts.map +1 -1
  81. package/dist/providers/openai/Models.js +50 -16
  82. package/dist/providers/openai/OpenAIProvider.d.ts +22 -12
  83. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  84. package/dist/providers/openai/OpenAIProvider.js +16 -2
  85. package/dist/providers/openai/Streaming.d.ts +1 -1
  86. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  87. package/dist/providers/openai/Streaming.js +75 -43
  88. package/dist/providers/openrouter/Capabilities.d.ts +13 -0
  89. package/dist/providers/openrouter/Capabilities.d.ts.map +1 -0
  90. package/dist/providers/openrouter/Capabilities.js +67 -0
  91. package/dist/providers/openrouter/Models.d.ts +11 -0
  92. package/dist/providers/openrouter/Models.d.ts.map +1 -0
  93. package/dist/providers/openrouter/Models.js +88 -0
  94. package/dist/providers/openrouter/OpenRouterProvider.d.ts +21 -0
  95. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -0
  96. package/dist/providers/openrouter/OpenRouterProvider.js +24 -0
  97. package/dist/providers/openrouter/index.d.ts +11 -0
  98. package/dist/providers/openrouter/index.d.ts.map +1 -0
  99. package/dist/providers/openrouter/index.js +26 -0
  100. package/dist/providers/registry.d.ts +11 -1
  101. package/dist/providers/registry.d.ts.map +1 -1
  102. package/dist/providers/registry.js +14 -0
  103. package/dist/streaming/Stream.d.ts +29 -0
  104. package/dist/streaming/Stream.d.ts.map +1 -0
  105. package/dist/streaming/Stream.js +67 -0
  106. package/dist/utils/FileLoader.d.ts.map +1 -1
  107. package/dist/utils/FileLoader.js +34 -3
  108. package/dist/utils/logger.d.ts +13 -0
  109. package/dist/utils/logger.d.ts.map +1 -0
  110. package/dist/utils/logger.js +24 -0
  111. package/package.json +1 -1
  112. package/dist/chat/Stream.d.ts +0 -21
  113. package/dist/chat/Stream.d.ts.map +0 -1
  114. package/dist/chat/Stream.js +0 -73
  115. package/dist/providers/Embedding.d.ts +0 -20
  116. package/dist/providers/Embedding.d.ts.map +0 -1
  117. package/dist/providers/Embedding.js +0 -1
package/dist/llm.js CHANGED
@@ -1,15 +1,21 @@
1
1
  import { Chat } from "./chat/Chat.js";
2
- import { providerRegistry } from "./providers/registry.js";
3
- import { ensureOpenAIRegistered } from "./providers/openai/index.js";
4
- import { registerGeminiProvider } from "./providers/gemini/index.js";
5
- import { registerAnthropicProvider } from "./providers/anthropic/index.js";
6
- import { registerDeepSeekProvider } from "./providers/deepseek/index.js";
2
+ import { providerRegistry, ensureOpenAIRegistered, registerAnthropicProvider, registerGeminiProvider, registerDeepSeekProvider, registerOllamaProvider, registerOpenRouterProvider, } from "./providers/registry.js";
7
3
  import { GeneratedImage } from "./image/GeneratedImage.js";
8
4
  import { ModelRegistry } from "./models/ModelRegistry.js";
9
5
  import { Transcription } from "./transcription/Transcription.js";
10
6
  import { Moderation } from "./moderation/Moderation.js";
11
7
  import { Embedding } from "./embedding/Embedding.js";
8
+ import { ProviderNotConfiguredError, UnsupportedFeatureError, ModelCapabilityError } from "./errors/index.js";
12
9
  import { config } from "./config.js";
10
+ // Provider registration map
11
+ const PROVIDER_REGISTRARS = {
12
+ openai: ensureOpenAIRegistered,
13
+ gemini: registerGeminiProvider,
14
+ anthropic: registerAnthropicProvider,
15
+ deepseek: registerDeepSeekProvider,
16
+ ollama: registerOllamaProvider,
17
+ openrouter: registerOpenRouterProvider,
18
+ };
13
19
  class LLMCore {
14
20
  models = ModelRegistry;
15
21
  config = config;
@@ -49,17 +55,10 @@ class LLMCore {
49
55
  };
50
56
  }
51
57
  if (typeof provider === "string") {
52
- if (provider === "openai") {
53
- ensureOpenAIRegistered();
54
- }
55
- if (provider === "gemini") {
56
- registerGeminiProvider();
57
- }
58
- if (provider === "anthropic") {
59
- registerAnthropicProvider();
60
- }
61
- if (provider === "deepseek") {
62
- registerDeepSeekProvider();
58
+ // Use the provider registrars map
59
+ const registrar = PROVIDER_REGISTRARS[provider];
60
+ if (registrar) {
61
+ registrar();
63
62
  }
64
63
  this.provider = providerRegistry.resolve(provider);
65
64
  }
@@ -69,22 +68,25 @@ class LLMCore {
69
68
  }
70
69
  ensureProviderSupport(method) {
71
70
  if (!this.provider) {
72
- throw new Error("LLM provider not configured");
71
+ throw new ProviderNotConfiguredError();
73
72
  }
74
73
  if (!this.provider[method]) {
75
- throw new Error(`Provider does not support ${method}`);
74
+ throw new UnsupportedFeatureError("Provider", String(method));
76
75
  }
77
76
  return this.provider;
78
77
  }
79
78
  chat(model, options) {
80
79
  if (!this.provider) {
81
- throw new Error("LLM provider not configured");
80
+ throw new ProviderNotConfiguredError();
82
81
  }
83
82
  return new Chat(this.provider, model, options);
84
83
  }
85
84
  async listModels() {
86
85
  const provider = this.ensureProviderSupport("listModels");
87
- return provider.listModels();
86
+ const models = await provider.listModels();
87
+ // Dynamically update the model registry with the fetched info
88
+ ModelRegistry.save(models);
89
+ return models;
88
90
  }
89
91
  async paint(prompt, options) {
90
92
  const provider = this.ensureProviderSupport("paint");
@@ -93,7 +95,7 @@ class LLMCore {
93
95
  console.warn(`[NodeLLM] Skipping validation for model ${model}`);
94
96
  }
95
97
  else if (model && provider.capabilities && !provider.capabilities.supportsImageGeneration(model)) {
96
- throw new Error(`Model ${model} does not support image generation.`);
98
+ throw new ModelCapabilityError(model, "image generation");
97
99
  }
98
100
  const response = await provider.paint({
99
101
  prompt,
@@ -108,7 +110,7 @@ class LLMCore {
108
110
  console.warn(`[NodeLLM] Skipping validation for model ${model}`);
109
111
  }
110
112
  else if (model && provider.capabilities && !provider.capabilities.supportsTranscription(model)) {
111
- throw new Error(`Model ${model} does not support transcription.`);
113
+ throw new ModelCapabilityError(model, "transcription");
112
114
  }
113
115
  const response = await provider.transcribe({
114
116
  file,
@@ -136,7 +138,7 @@ class LLMCore {
136
138
  console.warn(`[NodeLLM] Skipping validation for model ${model}`);
137
139
  }
138
140
  else if (model && provider.capabilities && !provider.capabilities.supportsModeration(model)) {
139
- throw new Error(`Model ${model} does not support moderation.`);
141
+ throw new ModelCapabilityError(model, "moderation");
140
142
  }
141
143
  const response = await provider.moderate({
142
144
  input,
@@ -157,7 +159,7 @@ class LLMCore {
157
159
  console.warn(`[NodeLLM] Skipping validation for model ${request.model}`);
158
160
  }
159
161
  else if (request.model && provider.capabilities && !provider.capabilities.supportsEmbeddings(request.model)) {
160
- throw new Error(`Model ${request.model} does not support embeddings.`);
162
+ throw new ModelCapabilityError(request.model, "embeddings");
161
163
  }
162
164
  const response = await provider.embed(request);
163
165
  return new Embedding(response);
@@ -1,10 +1,11 @@
1
1
  import { Model } from "./types.js";
2
2
  export declare class ModelRegistry {
3
3
  private static models;
4
+ static find(modelId: string, provider?: string): Model | undefined;
4
5
  /**
5
- * Find a model by its ID.
6
+ * Add or update models in the registry.
6
7
  */
7
- static find(modelId: string, provider?: string): Model | undefined;
8
+ static save(models: Model | Model[]): void;
8
9
  /**
9
10
  * Get all available models.
10
11
  */
@@ -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;AAGnC,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA6C;IAElE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAMlE;;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;IAK/E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9E;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;sBAA3I,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;wBAAkB,MAAM;2BAAqB,MAAM;;;;;sBAAtG,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;wBAAkB,MAAM;2BAAqB,MAAM;;CA+BrJ"}
1
+ {"version":3,"file":"ModelRegistry.d.ts","sourceRoot":"","sources":["../../src/models/ModelRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGnC,qBAAa,aAAa;IACtB,OAAO,CAAC,MAAM,CAAC,MAAM,CAA6C;IAElE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAMlE;;OAEG;IACH,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,EAAE,GAAG,IAAI;IAa1C;;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;IAK/E;;OAEG;IACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAK9E;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;sBAA3I,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;wBAAkB,MAAM;2BAAqB,MAAM;;;;;sBAAtG,MAAM;uBAAiB,MAAM;sBAAgB,MAAM;wBAAkB,MAAM;2BAAqB,MAAM;;CA+BrJ"}
@@ -1,12 +1,24 @@
1
1
  import { modelsData } from "./models.js";
2
2
  export class ModelRegistry {
3
3
  static models = modelsData;
4
- /**
5
- * Find a model by its ID.
6
- */
7
4
  static find(modelId, provider) {
8
5
  return this.models.find(m => (m.id === modelId || m.family === modelId) && (!provider || m.provider === provider));
9
6
  }
7
+ /**
8
+ * Add or update models in the registry.
9
+ */
10
+ static save(models) {
11
+ const toAdd = Array.isArray(models) ? models : [models];
12
+ toAdd.forEach(newModel => {
13
+ const index = this.models.findIndex(m => m.id === newModel.id && m.provider === newModel.provider);
14
+ if (index >= 0) {
15
+ this.models[index] = newModel;
16
+ }
17
+ else {
18
+ this.models.push(newModel);
19
+ }
20
+ });
21
+ }
10
22
  /**
11
23
  * Get all available models.
12
24
  */