@node-llm/core 1.4.3 → 1.5.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 (83) hide show
  1. package/README.md +65 -2
  2. package/dist/chat/Chat.d.ts +51 -0
  3. package/dist/chat/Chat.d.ts.map +1 -1
  4. package/dist/chat/Chat.js +189 -55
  5. package/dist/chat/ChatOptions.d.ts +11 -2
  6. package/dist/chat/ChatOptions.d.ts.map +1 -1
  7. package/dist/chat/ChatResponse.d.ts +7 -1
  8. package/dist/chat/ChatResponse.d.ts.map +1 -1
  9. package/dist/chat/ChatResponse.js +9 -1
  10. package/dist/chat/ChatStream.d.ts +15 -1
  11. package/dist/chat/ChatStream.d.ts.map +1 -1
  12. package/dist/chat/ChatStream.js +122 -36
  13. package/dist/chat/Role.d.ts +1 -1
  14. package/dist/chat/Role.d.ts.map +1 -1
  15. package/dist/config.d.ts +11 -0
  16. package/dist/config.d.ts.map +1 -1
  17. package/dist/config.js +7 -1
  18. package/dist/constants.d.ts +11 -0
  19. package/dist/constants.d.ts.map +1 -1
  20. package/dist/constants.js +12 -0
  21. package/dist/index.d.ts +1 -0
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +1 -0
  24. package/dist/llm.d.ts +4 -0
  25. package/dist/llm.d.ts.map +1 -1
  26. package/dist/llm.js +10 -0
  27. package/dist/providers/Provider.d.ts +6 -0
  28. package/dist/providers/Provider.d.ts.map +1 -1
  29. package/dist/providers/anthropic/AnthropicProvider.d.ts +1 -0
  30. package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
  31. package/dist/providers/anthropic/AnthropicProvider.js +1 -0
  32. package/dist/providers/anthropic/Chat.d.ts.map +1 -1
  33. package/dist/providers/anthropic/Chat.js +4 -3
  34. package/dist/providers/anthropic/Streaming.d.ts.map +1 -1
  35. package/dist/providers/anthropic/Streaming.js +3 -2
  36. package/dist/providers/anthropic/Utils.js +2 -2
  37. package/dist/providers/deepseek/Chat.d.ts.map +1 -1
  38. package/dist/providers/deepseek/Chat.js +8 -5
  39. package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
  40. package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
  41. package/dist/providers/deepseek/DeepSeekProvider.js +1 -0
  42. package/dist/providers/deepseek/Streaming.d.ts.map +1 -1
  43. package/dist/providers/deepseek/Streaming.js +7 -4
  44. package/dist/providers/gemini/Chat.d.ts.map +1 -1
  45. package/dist/providers/gemini/Chat.js +4 -3
  46. package/dist/providers/gemini/ChatUtils.js +5 -5
  47. package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
  48. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
  49. package/dist/providers/gemini/GeminiProvider.js +1 -0
  50. package/dist/providers/gemini/Streaming.d.ts.map +1 -1
  51. package/dist/providers/gemini/Streaming.js +3 -2
  52. package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
  53. package/dist/providers/ollama/OllamaProvider.js +1 -0
  54. package/dist/providers/openai/Capabilities.d.ts +1 -0
  55. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  56. package/dist/providers/openai/Capabilities.js +3 -0
  57. package/dist/providers/openai/Chat.d.ts +4 -2
  58. package/dist/providers/openai/Chat.d.ts.map +1 -1
  59. package/dist/providers/openai/Chat.js +16 -7
  60. package/dist/providers/openai/Embedding.d.ts.map +1 -1
  61. package/dist/providers/openai/Embedding.js +3 -2
  62. package/dist/providers/openai/Image.d.ts.map +1 -1
  63. package/dist/providers/openai/Image.js +3 -2
  64. package/dist/providers/openai/Moderation.d.ts.map +1 -1
  65. package/dist/providers/openai/Moderation.js +3 -2
  66. package/dist/providers/openai/OpenAIProvider.d.ts +1 -0
  67. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  68. package/dist/providers/openai/OpenAIProvider.js +3 -2
  69. package/dist/providers/openai/Streaming.d.ts +4 -2
  70. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  71. package/dist/providers/openai/Streaming.js +15 -6
  72. package/dist/providers/openai/Transcription.d.ts.map +1 -1
  73. package/dist/providers/openai/Transcription.js +5 -4
  74. package/dist/providers/openrouter/OpenRouterProvider.d.ts +1 -0
  75. package/dist/providers/openrouter/OpenRouterProvider.d.ts.map +1 -1
  76. package/dist/providers/openrouter/OpenRouterProvider.js +1 -0
  77. package/dist/providers/utils.d.ts +8 -0
  78. package/dist/providers/utils.d.ts.map +1 -0
  79. package/dist/providers/utils.js +16 -0
  80. package/dist/utils/fetch.d.ts +12 -0
  81. package/dist/utils/fetch.d.ts.map +1 -0
  82. package/dist/utils/fetch.js +34 -0
  83. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { AudioUtils } from "../../utils/audio.js";
3
3
  import { DEFAULT_MODELS } from "../../constants.js";
4
4
  import { buildUrl } from "./utils.js";
5
5
  import { logger } from "../../utils/logger.js";
6
+ import { fetchWithTimeout } from "../../utils/fetch.js";
6
7
  export class OpenAITranscription {
7
8
  baseUrl;
8
9
  apiKey;
@@ -33,13 +34,13 @@ export class OpenAITranscription {
33
34
  }
34
35
  const url = buildUrl(this.baseUrl, '/audio/transcriptions');
35
36
  logger.logRequest("OpenAI", "POST", url, { model: request.model || DEFAULT_MODELS.TRANSCRIPTION, file: fileName });
36
- const response = await fetch(url, {
37
+ const response = await fetchWithTimeout(url, {
37
38
  method: "POST",
38
39
  headers: {
39
40
  "Authorization": `Bearer ${this.apiKey}`,
40
41
  },
41
42
  body: formData,
42
- });
43
+ }, request.requestTimeout);
43
44
  if (!response.ok) {
44
45
  await handleOpenAIError(response, request.model || DEFAULT_MODELS.TRANSCRIPTION);
45
46
  }
@@ -126,14 +127,14 @@ export class OpenAITranscription {
126
127
  };
127
128
  const url = buildUrl(this.baseUrl, '/chat/completions');
128
129
  logger.logRequest("OpenAI", "POST", url, body);
129
- const response = await fetch(url, {
130
+ const response = await fetchWithTimeout(url, {
130
131
  method: "POST",
131
132
  headers: {
132
133
  "Authorization": `Bearer ${this.apiKey}`,
133
134
  "Content-Type": "application/json",
134
135
  },
135
136
  body: JSON.stringify(body),
136
- });
137
+ }, request.requestTimeout);
137
138
  if (!response.ok) {
138
139
  await handleOpenAIError(response, actualModel);
139
140
  }
@@ -13,6 +13,7 @@ export declare class OpenRouterProvider extends OpenAIProvider {
13
13
  supportsTranscription: (model: string) => boolean;
14
14
  supportsModeration: (model: string) => boolean;
15
15
  supportsReasoning: (model: string) => boolean;
16
+ supportsDeveloperRole: (_model: string) => boolean;
16
17
  getContextWindow: (model: string) => number | null;
17
18
  };
18
19
  constructor(options: OpenRouterProviderOptions);
@@ -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;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,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;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;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;wCACD,MAAM;kCACZ,MAAM;MAChC;gBAEU,OAAO,EAAE,yBAAyB;IAO9C,SAAS,CAAC,YAAY,IAAI,MAAM;CAGjC"}
@@ -10,6 +10,7 @@ export class OpenRouterProvider extends OpenAIProvider {
10
10
  supportsTranscription: (model) => OpenRouterCapabilities.supportsTranscription(model),
11
11
  supportsModeration: (model) => OpenRouterCapabilities.supportsModeration(model),
12
12
  supportsReasoning: (model) => OpenRouterCapabilities.supportsReasoning(model),
13
+ supportsDeveloperRole: (_model) => true,
13
14
  getContextWindow: (model) => OpenRouterCapabilities.getContextWindow(model) || null,
14
15
  };
15
16
  constructor(options) {
@@ -0,0 +1,8 @@
1
+ import { Message } from "../chat/Message.js";
2
+ /**
3
+ * Maps system and developer roles based on provider capabilities.
4
+ * If supportsDeveloperRole is true, both "system" and "developer" messages are mapped to "developer".
5
+ * If supportsDeveloperRole is false, both "system" and "developer" messages are mapped to "system".
6
+ */
7
+ export declare function mapSystemMessages(messages: Message[], supportsDeveloperRole: boolean): Message[];
8
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/providers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,EAAE,qBAAqB,EAAE,OAAO,GAAG,OAAO,EAAE,CAUhG"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Maps system and developer roles based on provider capabilities.
3
+ * If supportsDeveloperRole is true, both "system" and "developer" messages are mapped to "developer".
4
+ * If supportsDeveloperRole is false, both "system" and "developer" messages are mapped to "system".
5
+ */
6
+ export function mapSystemMessages(messages, supportsDeveloperRole) {
7
+ return messages.map(msg => {
8
+ if (msg.role === "system" || msg.role === "developer") {
9
+ return {
10
+ ...msg,
11
+ role: supportsDeveloperRole ? "developer" : "system"
12
+ };
13
+ }
14
+ return msg;
15
+ });
16
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Fetch with timeout support.
3
+ * Wraps the standard fetch API with an AbortController to enforce request timeouts.
4
+ *
5
+ * @param url - The URL to fetch
6
+ * @param options - Standard fetch options
7
+ * @param timeoutMs - Timeout in milliseconds (optional)
8
+ * @returns Promise<Response>
9
+ * @throws Error if the request times out
10
+ */
11
+ export declare function fetchWithTimeout(url: string, options?: RequestInit, timeoutMs?: number): Promise<Response>;
12
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/utils/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,WAAgB,EACzB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,QAAQ,CAAC,CA0BnB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Fetch with timeout support.
3
+ * Wraps the standard fetch API with an AbortController to enforce request timeouts.
4
+ *
5
+ * @param url - The URL to fetch
6
+ * @param options - Standard fetch options
7
+ * @param timeoutMs - Timeout in milliseconds (optional)
8
+ * @returns Promise<Response>
9
+ * @throws Error if the request times out
10
+ */
11
+ export async function fetchWithTimeout(url, options = {}, timeoutMs) {
12
+ // If no timeout is specified, use standard fetch
13
+ if (!timeoutMs || timeoutMs <= 0) {
14
+ return fetch(url, options);
15
+ }
16
+ const controller = new AbortController();
17
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
18
+ try {
19
+ const response = await fetch(url, {
20
+ ...options,
21
+ signal: controller.signal,
22
+ });
23
+ clearTimeout(timeoutId);
24
+ return response;
25
+ }
26
+ catch (error) {
27
+ clearTimeout(timeoutId);
28
+ // Check if the error was due to abort (timeout)
29
+ if (error.name === 'AbortError') {
30
+ throw new Error(`Request timeout after ${timeoutMs}ms`);
31
+ }
32
+ throw error;
33
+ }
34
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-llm/core",
3
- "version": "1.4.3",
3
+ "version": "1.5.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",