@node-llm/core 0.2.2 → 0.4.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 (127) hide show
  1. package/README.md +288 -16
  2. package/dist/chat/Chat.d.ts +58 -17
  3. package/dist/chat/Chat.d.ts.map +1 -1
  4. package/dist/chat/Chat.js +185 -33
  5. package/dist/chat/ChatOptions.d.ts +10 -0
  6. package/dist/chat/ChatOptions.d.ts.map +1 -1
  7. package/dist/chat/ChatResponse.d.ts +23 -0
  8. package/dist/chat/ChatResponse.d.ts.map +1 -0
  9. package/dist/chat/ChatResponse.js +38 -0
  10. package/dist/chat/Stream.d.ts.map +1 -1
  11. package/dist/chat/Stream.js +10 -0
  12. package/dist/constants.d.ts +7 -0
  13. package/dist/constants.d.ts.map +1 -0
  14. package/dist/constants.js +6 -0
  15. package/dist/embedding/Embedding.d.ts +17 -0
  16. package/dist/embedding/Embedding.d.ts.map +1 -0
  17. package/dist/embedding/Embedding.js +24 -0
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +1 -1
  21. package/dist/llm.d.ts +35 -3
  22. package/dist/llm.d.ts.map +1 -1
  23. package/dist/llm.js +88 -14
  24. package/dist/models/ModelRegistry.d.ts +23 -0
  25. package/dist/models/ModelRegistry.d.ts.map +1 -0
  26. package/dist/models/ModelRegistry.js +54 -0
  27. package/dist/moderation/Moderation.d.ts +56 -0
  28. package/dist/moderation/Moderation.d.ts.map +1 -0
  29. package/dist/moderation/Moderation.js +92 -0
  30. package/dist/providers/Embedding.d.ts +20 -0
  31. package/dist/providers/Embedding.d.ts.map +1 -0
  32. package/dist/providers/Provider.d.ts +50 -4
  33. package/dist/providers/Provider.d.ts.map +1 -1
  34. package/dist/providers/gemini/Capabilities.d.ts +30 -0
  35. package/dist/providers/gemini/Capabilities.d.ts.map +1 -0
  36. package/dist/providers/gemini/Capabilities.js +148 -0
  37. package/dist/providers/gemini/Chat.d.ts +8 -0
  38. package/dist/providers/gemini/Chat.d.ts.map +1 -0
  39. package/dist/providers/gemini/Chat.js +69 -0
  40. package/dist/providers/gemini/ChatUtils.d.ts +9 -0
  41. package/dist/providers/gemini/ChatUtils.d.ts.map +1 -0
  42. package/dist/providers/gemini/ChatUtils.js +83 -0
  43. package/dist/providers/gemini/Embeddings.d.ts +8 -0
  44. package/dist/providers/gemini/Embeddings.d.ts.map +1 -0
  45. package/dist/providers/gemini/Embeddings.js +44 -0
  46. package/dist/providers/gemini/Errors.d.ts +2 -0
  47. package/dist/providers/gemini/Errors.d.ts.map +1 -0
  48. package/dist/providers/gemini/Errors.js +34 -0
  49. package/dist/providers/gemini/GeminiProvider.d.ts +34 -0
  50. package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -0
  51. package/dist/providers/gemini/GeminiProvider.js +55 -0
  52. package/dist/providers/gemini/Image.d.ts +8 -0
  53. package/dist/providers/gemini/Image.d.ts.map +1 -0
  54. package/dist/providers/gemini/Image.js +47 -0
  55. package/dist/providers/gemini/Models.d.ts +8 -0
  56. package/dist/providers/gemini/Models.d.ts.map +1 -0
  57. package/dist/providers/gemini/Models.js +38 -0
  58. package/dist/providers/gemini/Streaming.d.ts +8 -0
  59. package/dist/providers/gemini/Streaming.d.ts.map +1 -0
  60. package/dist/providers/gemini/Streaming.js +70 -0
  61. package/dist/providers/gemini/Transcription.d.ts +9 -0
  62. package/dist/providers/gemini/Transcription.d.ts.map +1 -0
  63. package/dist/providers/gemini/Transcription.js +63 -0
  64. package/dist/providers/gemini/index.d.ts +11 -0
  65. package/dist/providers/gemini/index.d.ts.map +1 -0
  66. package/dist/providers/gemini/index.js +24 -0
  67. package/dist/providers/gemini/types.d.ts +118 -0
  68. package/dist/providers/gemini/types.d.ts.map +1 -0
  69. package/dist/providers/gemini/types.js +1 -0
  70. package/dist/providers/openai/Capabilities.d.ts +7 -2
  71. package/dist/providers/openai/Capabilities.d.ts.map +1 -1
  72. package/dist/providers/openai/Capabilities.js +52 -214
  73. package/dist/providers/openai/Chat.d.ts.map +1 -1
  74. package/dist/providers/openai/Chat.js +4 -0
  75. package/dist/providers/openai/Embedding.d.ts +8 -0
  76. package/dist/providers/openai/Embedding.d.ts.map +1 -0
  77. package/dist/providers/openai/Embedding.js +48 -0
  78. package/dist/providers/openai/ModelDefinitions.d.ts +25 -0
  79. package/dist/providers/openai/ModelDefinitions.d.ts.map +1 -0
  80. package/dist/providers/openai/ModelDefinitions.js +211 -0
  81. package/dist/providers/openai/Moderation.d.ts +8 -0
  82. package/dist/providers/openai/Moderation.d.ts.map +1 -0
  83. package/dist/providers/openai/Moderation.js +27 -0
  84. package/dist/providers/openai/OpenAIProvider.d.ts +13 -1
  85. package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
  86. package/dist/providers/openai/OpenAIProvider.js +22 -0
  87. package/dist/providers/openai/Streaming.d.ts.map +1 -1
  88. package/dist/providers/openai/Streaming.js +19 -8
  89. package/dist/providers/openai/Transcription.d.ts +10 -0
  90. package/dist/providers/openai/Transcription.d.ts.map +1 -0
  91. package/dist/providers/openai/Transcription.js +162 -0
  92. package/dist/providers/openai/index.d.ts +8 -0
  93. package/dist/providers/openai/index.d.ts.map +1 -1
  94. package/dist/providers/openai/index.js +12 -0
  95. package/dist/schema/Schema.d.ts +20 -0
  96. package/dist/schema/Schema.d.ts.map +1 -0
  97. package/dist/schema/Schema.js +22 -0
  98. package/dist/schema/to-json-schema.d.ts +3 -0
  99. package/dist/schema/to-json-schema.d.ts.map +1 -0
  100. package/dist/schema/to-json-schema.js +10 -0
  101. package/dist/transcription/Transcription.d.ts +11 -0
  102. package/dist/transcription/Transcription.d.ts.map +1 -0
  103. package/dist/transcription/Transcription.js +21 -0
  104. package/dist/utils/Binary.d.ts +12 -0
  105. package/dist/utils/Binary.d.ts.map +1 -0
  106. package/dist/utils/Binary.js +71 -0
  107. package/dist/utils/FileLoader.d.ts.map +1 -1
  108. package/dist/utils/FileLoader.js +12 -1
  109. package/dist/utils/audio.d.ts +10 -0
  110. package/dist/utils/audio.d.ts.map +1 -0
  111. package/dist/utils/audio.js +46 -0
  112. package/package.json +18 -7
  113. package/dist/providers/openai/register.d.ts +0 -2
  114. package/dist/providers/openai/register.d.ts.map +0 -1
  115. package/dist/providers/openai/register.js +0 -15
  116. package/dist/tools/Tool.d.ts +0 -8
  117. package/dist/tools/Tool.d.ts.map +0 -1
  118. package/dist/tools/ToolSet.d.ts +0 -15
  119. package/dist/tools/ToolSet.d.ts.map +0 -1
  120. package/dist/tools/ToolSet.js +0 -29
  121. package/dist/tools/index.d.ts +0 -2
  122. package/dist/tools/index.d.ts.map +0 -1
  123. package/dist/tools/index.js +0 -1
  124. package/dist/tools/runCommandTool.d.ts +0 -8
  125. package/dist/tools/runCommandTool.d.ts.map +0 -1
  126. package/dist/tools/runCommandTool.js +0 -19
  127. /package/dist/{tools/Tool.js → providers/Embedding.js} +0 -0
@@ -0,0 +1,46 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ export class AudioUtils {
4
+ static async load(filePath) {
5
+ let data;
6
+ let fileName;
7
+ if (filePath.startsWith("http")) {
8
+ const response = await fetch(filePath);
9
+ if (!response.ok) {
10
+ throw new Error(`Failed to fetch remote audio file: ${response.statusText}`);
11
+ }
12
+ const arrayBuffer = await response.arrayBuffer();
13
+ data = new Uint8Array(arrayBuffer);
14
+ const urlPath = new URL(filePath).pathname;
15
+ fileName = path.basename(urlPath) || "audio.mp3";
16
+ }
17
+ else {
18
+ const buffer = fs.readFileSync(filePath);
19
+ data = new Uint8Array(buffer);
20
+ fileName = path.basename(filePath);
21
+ }
22
+ const duration = this.estimateDuration(data, fileName);
23
+ return { data, fileName, duration };
24
+ }
25
+ static estimateDuration(data, fileName) {
26
+ try {
27
+ const ext = path.extname(fileName).toLowerCase();
28
+ if (ext === ".wav") {
29
+ // Simple WAV duration: (DataSize / ByteRate)
30
+ const view = new DataView(data.buffer, data.byteOffset, data.length);
31
+ const byteRate = view.getUint32(28, true);
32
+ const dataSize = view.getUint32(40, true);
33
+ if (byteRate > 0)
34
+ return dataSize / byteRate;
35
+ }
36
+ else if (ext === ".mp3") {
37
+ // Very rough MP3 estimate (assume 128kbps)
38
+ return data.length / (128000 / 8);
39
+ }
40
+ }
41
+ catch (e) {
42
+ // Ignore estimation errors
43
+ }
44
+ return undefined;
45
+ }
46
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-llm/core",
3
- "version": "0.2.2",
3
+ "version": "0.4.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -13,17 +13,28 @@
13
13
  "description": "A provider-agnostic LLM core for Node.js, inspired by ruby-llm.",
14
14
  "author": "node-llm contributors",
15
15
  "license": "MIT",
16
+ "engines": {
17
+ "node": ">=20.0.0"
18
+ },
16
19
  "files": [
17
20
  "dist",
18
21
  "README.md"
19
22
  ],
23
+ "dependencies": {
24
+ "zod": "^3.23.8",
25
+ "zod-to-json-schema": "^3.25.1"
26
+ },
27
+ "devDependencies": {
28
+ "@pollyjs/adapter-fetch": "^6.0.7",
29
+ "@pollyjs/adapter-node-http": "^6.0.6",
30
+ "@pollyjs/core": "^6.0.6",
31
+ "@pollyjs/persister-fs": "^6.0.6"
32
+ },
20
33
  "scripts": {
21
34
  "build": "tsc -p tsconfig.json",
22
35
  "dev": "tsc -w",
23
- "test": "vitest",
24
- "prepublishOnly": "npm run build"
25
- },
26
- "dependencies": {
27
- "zod": "^3.23.8"
36
+ "lint": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest"
28
39
  }
29
- }
40
+ }
@@ -1,2 +0,0 @@
1
- export declare function ensureOpenAIRegistered(): void;
2
- //# sourceMappingURL=register.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/register.ts"],"names":[],"mappings":"AAKA,wBAAgB,sBAAsB,SAcrC"}
@@ -1,15 +0,0 @@
1
- import { providerRegistry } from "../registry.js";
2
- import { OpenAIProvider } from "./OpenAIProvider.js";
3
- let registered = false;
4
- export function ensureOpenAIRegistered() {
5
- if (registered)
6
- return;
7
- providerRegistry.register("openai", () => {
8
- const apiKey = process.env.OPENAI_API_KEY;
9
- if (!apiKey) {
10
- throw new Error("OPENAI_API_KEY is not set");
11
- }
12
- return new OpenAIProvider({ apiKey });
13
- });
14
- registered = true;
15
- }
@@ -1,8 +0,0 @@
1
- export type ToolHandler = (args: any) => any | Promise<any>;
2
- export interface Tool {
3
- name: string;
4
- description?: string;
5
- parameters?: Record<string, any>;
6
- handler: ToolHandler;
7
- }
8
- //# sourceMappingURL=Tool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Tool.d.ts","sourceRoot":"","sources":["../../src/tools/Tool.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;AAE5D,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;CACtB"}
@@ -1,15 +0,0 @@
1
- import { Tool, ToolHandler } from "./Tool.js";
2
- type ToolDefinition = ToolHandler | {
3
- description?: string;
4
- parameters?: Record<string, any>;
5
- handler: ToolHandler;
6
- };
7
- export declare class ToolSet {
8
- private tools;
9
- constructor(defs?: Record<string, ToolDefinition>);
10
- register(tool: Tool): void;
11
- get(name: string): Tool | undefined;
12
- list(): Tool[];
13
- }
14
- export {};
15
- //# sourceMappingURL=ToolSet.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ToolSet.d.ts","sourceRoot":"","sources":["../../src/tools/ToolSet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE9C,KAAK,cAAc,GACf,WAAW,GACX;IACE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEN,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAA2B;gBAE5B,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC;IAiBjD,QAAQ,CAAC,IAAI,EAAE,IAAI;IAInB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,IAAI,IAAI,IAAI,EAAE;CAGf"}
@@ -1,29 +0,0 @@
1
- export class ToolSet {
2
- tools = new Map();
3
- constructor(defs) {
4
- if (defs) {
5
- for (const [name, def] of Object.entries(defs)) {
6
- if (typeof def === "function") {
7
- this.register({ name, handler: def });
8
- }
9
- else {
10
- this.register({
11
- name,
12
- handler: def.handler,
13
- description: def.description,
14
- parameters: def.parameters,
15
- });
16
- }
17
- }
18
- }
19
- }
20
- register(tool) {
21
- this.tools.set(tool.name, tool);
22
- }
23
- get(name) {
24
- return this.tools.get(name);
25
- }
26
- list() {
27
- return [...this.tools.values()];
28
- }
29
- }
@@ -1,2 +0,0 @@
1
- export { runCommand } from './runCommandTool.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- export { runCommand } from './runCommandTool.js';
@@ -1,8 +0,0 @@
1
- /**
2
- * Executes a shell command and returns its stdout as a string.
3
- *
4
- * @param command - The command to execute.
5
- * @returns A promise that resolves with the command's standard output.
6
- */
7
- export declare function runCommand(command: string): Promise<string>;
8
- //# sourceMappingURL=runCommandTool.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"runCommandTool.d.ts","sourceRoot":"","sources":["../../src/tools/runCommandTool.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW3D"}
@@ -1,19 +0,0 @@
1
- import { exec } from 'child_process';
2
- /**
3
- * Executes a shell command and returns its stdout as a string.
4
- *
5
- * @param command - The command to execute.
6
- * @returns A promise that resolves with the command's standard output.
7
- */
8
- export function runCommand(command) {
9
- return new Promise((resolve, reject) => {
10
- exec(command, { maxBuffer: 1024 * 1024 }, (error, stdout, stderr) => {
11
- if (error) {
12
- reject(error);
13
- return;
14
- }
15
- // Trim trailing newlines for cleaner output
16
- resolve(stdout.trim());
17
- });
18
- });
19
- }
File without changes