@node-llm/core 1.2.0 → 1.3.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/README.md +243 -0
- package/dist/chat/Chat.d.ts +11 -8
- package/dist/chat/Chat.d.ts.map +1 -1
- package/dist/chat/Chat.js +24 -14
- package/dist/chat/ChatOptions.d.ts +2 -2
- package/dist/chat/ChatOptions.d.ts.map +1 -1
- package/dist/chat/Tool.d.ts +35 -1
- package/dist/chat/Tool.d.ts.map +1 -1
- package/dist/chat/Tool.js +38 -1
- package/dist/errors/index.d.ts +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/llm.d.ts +27 -15
- package/dist/llm.d.ts.map +1 -1
- package/dist/llm.js +37 -5
- package/dist/providers/BaseProvider.d.ts +1 -0
- package/dist/providers/BaseProvider.d.ts.map +1 -1
- package/dist/providers/BaseProvider.js +3 -0
- package/dist/providers/Provider.d.ts +3 -2
- package/dist/providers/Provider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.d.ts +1 -0
- package/dist/providers/anthropic/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/anthropic/AnthropicProvider.js +3 -0
- package/dist/providers/deepseek/DeepSeekProvider.d.ts +1 -0
- package/dist/providers/deepseek/DeepSeekProvider.d.ts.map +1 -1
- package/dist/providers/deepseek/DeepSeekProvider.js +3 -0
- package/dist/providers/gemini/GeminiProvider.d.ts +1 -0
- package/dist/providers/gemini/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/gemini/GeminiProvider.js +3 -0
- package/dist/providers/ollama/OllamaProvider.d.ts +1 -0
- package/dist/providers/ollama/OllamaProvider.d.ts.map +1 -1
- package/dist/providers/ollama/OllamaProvider.js +3 -0
- package/dist/providers/openai/OpenAIProvider.d.ts +1 -0
- package/dist/providers/openai/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/openai/OpenAIProvider.js +3 -0
- package/dist/utils/FileLoader.d.ts.map +1 -1
- package/dist/utils/FileLoader.js +2 -1
- package/dist/utils/logger.d.ts +1 -1
- package/dist/utils/logger.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
<p align="left">
|
|
2
|
+
<img src="https://github.com/eshaiju/node-llm/raw/main/docs/assets/images/logo.jpg" alt="NodeLLMlogo" width="300" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
# NodeLLM
|
|
6
|
+
**An opinionated architectural layer for using Large Language Models in Node.js.**
|
|
7
|
+
|
|
8
|
+
Build chatbots, autonomous agents, and RAG pipelines without the SDK fatigue. NodeLLM provides a unified, production-oriented API for interacting with over **540+ models** across multiple providers (OpenAI, Gemini, Anthropic, DeepSeek, OpenRouter, Ollama, etc.) without coupling your application to any single SDK.
|
|
9
|
+
|
|
10
|
+
<br/>
|
|
11
|
+
|
|
12
|
+
<p align="left">
|
|
13
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openai.svg" height="28" />
|
|
14
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openai-text.svg" height="22" />
|
|
15
|
+
|
|
16
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/anthropic-text.svg" height="18" />
|
|
17
|
+
|
|
18
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/gemini-color.svg" height="28" />
|
|
19
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/gemini-text.svg" height="20" />
|
|
20
|
+
|
|
21
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/deepseek-color.svg" height="28" />
|
|
22
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/deepseek-text.svg" height="20" />
|
|
23
|
+
|
|
24
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openrouter.svg" height="28" />
|
|
25
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openrouter-text.svg" height="22" />
|
|
26
|
+
|
|
27
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/ollama.svg" height="28" />
|
|
28
|
+
<img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/ollama-text.svg" height="18" />
|
|
29
|
+
</p>
|
|
30
|
+
|
|
31
|
+
<br/>
|
|
32
|
+
|
|
33
|
+
[](https://www.npmjs.com/package/@node-llm/core)
|
|
34
|
+
[](https://opensource.org/licenses/MIT)
|
|
35
|
+
[](https://www.typescriptlang.org/)
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## ⚡ The Golden Path
|
|
40
|
+
|
|
41
|
+
```ts
|
|
42
|
+
import { NodeLLM } from "@node-llm/core";
|
|
43
|
+
|
|
44
|
+
// 1. Configure once
|
|
45
|
+
NodeLLM.configure({ provider: "openai" });
|
|
46
|
+
|
|
47
|
+
// 2. Chat (High-level request/response)
|
|
48
|
+
const chat = NodeLLM.chat("gpt-4o");
|
|
49
|
+
const response = await chat.ask("Explain event-driven architecture");
|
|
50
|
+
console.log(response.content);
|
|
51
|
+
|
|
52
|
+
// 3. Streaming (Standard AsyncIterator)
|
|
53
|
+
for await (const chunk of chat.stream("Explain event-driven architecture")) {
|
|
54
|
+
process.stdout.write(chunk.content);
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Why`NodeLLM`?
|
|
61
|
+
|
|
62
|
+
Most AI integrations today are provider-specific, SDK-driven, and leaky at abstraction boundaries. This creates long-term architectural risk. Switching models should not mean a total rewrite of your business logic.
|
|
63
|
+
|
|
64
|
+
NodeLLMexists to solve **architectural problems**, not just provide API access.
|
|
65
|
+
|
|
66
|
+
### Strategic Goals
|
|
67
|
+
|
|
68
|
+
- **Provider Isolation**: Your application logic never touches a provider-specific SDK.
|
|
69
|
+
- **Unified Mental Model**: Chat, streaming, tools, and structured outputs feel identical across providers.
|
|
70
|
+
- **Production-Ready**: Streaming, retries, and errors are first-class concerns.
|
|
71
|
+
- **The "Standard Library" Voice**: It provides a beautiful, native-feeling API for modern Node.js.
|
|
72
|
+
|
|
73
|
+
### Non-Goals
|
|
74
|
+
|
|
75
|
+
- It is **not** a thin wrapper that mirrors every provider's unique API knobs.
|
|
76
|
+
- It is **not** a UI framework or a simple chatbot builder.
|
|
77
|
+
- It prioritizes **architectural clarity** over raw SDK convenience.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## 🔧 Strategic Configuration
|
|
82
|
+
|
|
83
|
+
NodeLLMprovides a flexible configuration system designed for enterprise usage:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
// Recommended for multi-provider pipelines
|
|
87
|
+
NodeLLM.configure((config) => {
|
|
88
|
+
config.openaiApiKey = process.env.OPENAI_API_KEY;
|
|
89
|
+
config.anthropicApiKey = process.env.ANTHROPIC_API_KEY;
|
|
90
|
+
config.ollamaApiBase = process.env.OLLAMA_API_BASE;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Switch providers at the framework level
|
|
94
|
+
NodeLLM.configure({ provider: "anthropic" });
|
|
95
|
+
|
|
96
|
+
// Support for Custom Endpoints (e.g., Azure or LocalAI)
|
|
97
|
+
NodeLLM.configure({
|
|
98
|
+
openaiApiKey: process.env.AZURE_KEY,
|
|
99
|
+
openaiApiBase: "https://your-resource.openai.azure.com/openai/deployments/...",
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**[Full Configuration Guide →](docs/getting_started/configuration.md)**
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## 🔮 Capabilities
|
|
110
|
+
|
|
111
|
+
### 💬 Unified Chat
|
|
112
|
+
Stop rewriting code for every provider. `NodeLLM` normalizes inputs and outputs into a single, predictable mental model.
|
|
113
|
+
```ts
|
|
114
|
+
const chat = NodeLLM.chat(); // Defaults to GPT-4o
|
|
115
|
+
await chat.ask("Hello world");
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### 👁️ Smart Vision & Files
|
|
119
|
+
Pass images, PDFs, or audio files directly. We handle the heavy lifting: fetching remote URLs, base64 encoding, and MIME type mapping.
|
|
120
|
+
```ts
|
|
121
|
+
await chat.ask("Analyze this interface", {
|
|
122
|
+
files: ["./screenshot.png", "https://example.com/spec.pdf"]
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
### 🛠️ Auto-Executing Tools
|
|
127
|
+
Define tools once;`NodeLLM` manages the recursive execution loop for you, keeping your controller logic clean. **Works seamlessly with both regular chat and streaming!**
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
// Class-based DSL
|
|
131
|
+
class WeatherTool extends Tool {
|
|
132
|
+
name = "get_weather";
|
|
133
|
+
description = "Get current weather";
|
|
134
|
+
schema = z.object({ location: z.string() });
|
|
135
|
+
async execute({ location }) { return `Sunny in ${location}`; }
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Register tools
|
|
139
|
+
chat.withTools([WeatherTool]);
|
|
140
|
+
|
|
141
|
+
// Now the model can use it automatically
|
|
142
|
+
await chat.ask("What's the weather in Tokyo?");
|
|
143
|
+
```
|
|
144
|
+
**[Full Tool Calling Guide →](https://node-llm.eshaiju.com/core-features/tool-calling)**
|
|
145
|
+
|
|
146
|
+
### 🔍 Comprehensive Debug Logging
|
|
147
|
+
Enable detailed logging for all API requests and responses across every feature and provider:
|
|
148
|
+
```ts
|
|
149
|
+
// Set environment variable
|
|
150
|
+
process.env.NODELLM_DEBUG = "true";
|
|
151
|
+
|
|
152
|
+
// Now see detailed logs for every API call:
|
|
153
|
+
// [NodeLLM] [OpenAI] Request: POST https://api.openai.com/v1/chat/completions
|
|
154
|
+
// { "model": "gpt-4o", "messages": [...] }
|
|
155
|
+
// [NodeLLM] [OpenAI] Response: 200 OK
|
|
156
|
+
// { "id": "chatcmpl-123", ... }
|
|
157
|
+
```
|
|
158
|
+
**Covers:** Chat, Streaming, Images, Embeddings, Transcription, Moderation - across all providers!
|
|
159
|
+
|
|
160
|
+
### ✨ Structured Output
|
|
161
|
+
Get type-safe, validated JSON back using **Zod** schemas.
|
|
162
|
+
```ts
|
|
163
|
+
import { z } from "@node-llm/core";
|
|
164
|
+
const Product = z.object({ name: z.string(), price: z.number() });
|
|
165
|
+
|
|
166
|
+
const res = await chat.withSchema(Product).ask("Generate a gadget");
|
|
167
|
+
console.log(res.parsed.name); // Full type-safety
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
### 🎨 Image Generation
|
|
171
|
+
```ts
|
|
172
|
+
await NodeLLM.paint("A cyberpunk city in rain");
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### 🎤 Audio Transcription
|
|
176
|
+
```ts
|
|
177
|
+
await NodeLLM.transcribe("meeting-recording.wav");
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### ⚡ Scoped Parallelism
|
|
181
|
+
Run multiple providers in parallel safely without global configuration side effects using isolated contexts.
|
|
182
|
+
```ts
|
|
183
|
+
const [gpt, claude] = await Promise.all([
|
|
184
|
+
// Each call branch off into its own isolated context
|
|
185
|
+
NodeLLM.withProvider("openai").chat("gpt-4o").ask(prompt),
|
|
186
|
+
NodeLLM.withProvider("anthropic").chat("claude-3-5-sonnet").ask(prompt),
|
|
187
|
+
]);
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 🧠 Deep Reasoning
|
|
191
|
+
Direct access to the thought process of models like **DeepSeek R1** or **OpenAI o1/o3** using the `.reasoning` field.
|
|
192
|
+
```ts
|
|
193
|
+
const res = await NodeLLM.chat("deepseek-reasoner").ask("Solve this logical puzzle");
|
|
194
|
+
console.log(res.reasoning); // Chain-of-thought
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
## 🚀 Why use this over official SDKs?
|
|
200
|
+
|
|
201
|
+
| Feature |`NodeLLM` | Official SDKs | Architectural Impact |
|
|
202
|
+
| :--- | :--- | :--- | :--- |
|
|
203
|
+
| **Provider Logic** | Transparently Handled | Exposed to your code | **Low Coupling** |
|
|
204
|
+
| **Streaming** | Standard `AsyncIterator` | Vendor-specific Events | **Predictable Data Flow** |
|
|
205
|
+
| **Streaming + Tools** | Automated Execution | Manual implementation | **Seamless UX** |
|
|
206
|
+
| **Tool Loops** | Automated Recursion | Manual implementation | **Reduced Boilerplate** |
|
|
207
|
+
| **Files/Vision** | Intelligent Path/URL handling | Base64/Buffer management | **Cleaner Service Layer** |
|
|
208
|
+
| **Configuration** | Centralized & Global | Per-instance initialization | **Easier Lifecycle Mgmt** |
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## 📋 Supported Providers
|
|
213
|
+
|
|
214
|
+
| Provider | Supported Features |
|
|
215
|
+
| :--- | :--- |
|
|
216
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openai.svg" height="18"> **OpenAI** | Chat, **Streaming + Tools**, Vision, Audio, Images, Transcription, **Reasoning** |
|
|
217
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/gemini-color.svg" height="18"> **Gemini** | Chat, **Streaming + Tools**, Vision, Audio, Video, Embeddings |
|
|
218
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/anthropic-text.svg" height="12"> **Anthropic** | Chat, **Streaming + Tools**, Vision, PDF, Structured Output |
|
|
219
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/deepseek-color.svg" height="18"> **DeepSeek** | Chat (V3), **Reasoning (R1)**, **Streaming + Tools** |
|
|
220
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/openrouter.svg" height="18"> **OpenRouter** | **Aggregator**, Chat, Streaming, Tools, Vision, Embeddings, **Reasoning** |
|
|
221
|
+
| <img src="https://registry.npmmirror.com/@lobehub/icons-static-svg/latest/files/icons/ollama.svg" height="18"> **Ollama** | **Local Inference**, Chat, Streaming, Tools, Vision, Embeddings |
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## 📚 Documentation & Installation
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
npm install @node-llm/core
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**[View Full Documentation ↗](https://node-llm.eshaiju.com/)**
|
|
232
|
+
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## 🫶 Credits
|
|
236
|
+
|
|
237
|
+
Heavily inspired by the elegant design of [RubyLLM](https://rubyllm.com/).
|
|
238
|
+
|
|
239
|
+
---
|
|
240
|
+
|
|
241
|
+
## 📄 License
|
|
242
|
+
|
|
243
|
+
MIT © [NodeLLMcontributors]
|
package/dist/chat/Chat.d.ts
CHANGED
|
@@ -27,6 +27,7 @@ export declare class Chat {
|
|
|
27
27
|
* Read-only access to message history
|
|
28
28
|
*/
|
|
29
29
|
get history(): readonly Message[];
|
|
30
|
+
get modelId(): string;
|
|
30
31
|
/**
|
|
31
32
|
* Aggregate usage across the entire conversation
|
|
32
33
|
*/
|
|
@@ -37,14 +38,16 @@ export declare class Chat {
|
|
|
37
38
|
*/
|
|
38
39
|
withTool(tool: any): this;
|
|
39
40
|
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
withTools(tools: (Tool |
|
|
41
|
+
* Add multiple tools to the chat session.
|
|
42
|
+
* Supports passing Tool classes (which will be instantiated) or instances.
|
|
43
|
+
* Can replace existing tools if options.replace is true.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* chat.withTools([WeatherTool, new CalculatorTool()], { replace: true });
|
|
47
|
+
*/
|
|
48
|
+
withTools(tools: (Tool | {
|
|
49
|
+
new (): Tool;
|
|
50
|
+
} | any)[], options?: {
|
|
48
51
|
replace?: boolean;
|
|
49
52
|
}): this;
|
|
50
53
|
/**
|
package/dist/chat/Chat.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../src/chat/Chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"Chat.d.ts","sourceRoot":"","sources":["../../src/chat/Chat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGtE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAkB,MAAM,WAAW,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAEvD,qBAAa,IAAI;IAKb,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ,CAAC,OAAO;IAN1B,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAW;gBAGR,QAAQ,EAAE,QAAQ,EAC3B,KAAK,EAAE,MAAM,EACJ,OAAO,GAAE,WAAgB,EAC1C,WAAW,GAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAgC;IAmBlF;;OAEG;IACH,IAAI,OAAO,IAAI,SAAS,OAAO,EAAE,CAEhC;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;OAEG;IACH,IAAI,UAAU,IAAI,KAAK,CAetB;IAED;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAIvB;;;;;;;KAOC;IACH,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,GAAG;QAAE,QAAO,IAAI,CAAA;KAAE,GAAG,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAmCzF;;;;OAIG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAmB5E;;OAEG;IACH,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAI5E;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKnC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK9B;;;OAGG;IACH,kBAAkB,CAAC,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,cAAc,CAAC,EAAE,GAAG,CAAA;KAAE,GAAG,IAAI;IAU7F;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAK7C;;;OAGG;IACH,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI;IAkB9E,YAAY,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI;IAKvC,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,GAAG,IAAI;IAKlE,UAAU,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAKlD,YAAY,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,GAAG,IAAI;IAKlD;;OAEG;IACG,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,EAAE,EAAE,OAAO,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgMrF;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC;CAI3C"}
|
package/dist/chat/Chat.js
CHANGED
|
@@ -32,6 +32,9 @@ export class Chat {
|
|
|
32
32
|
get history() {
|
|
33
33
|
return this.messages;
|
|
34
34
|
}
|
|
35
|
+
get modelId() {
|
|
36
|
+
return this.model;
|
|
37
|
+
}
|
|
35
38
|
/**
|
|
36
39
|
* Aggregate usage across the entire conversation
|
|
37
40
|
*/
|
|
@@ -56,13 +59,13 @@ export class Chat {
|
|
|
56
59
|
return this.withTools([tool]);
|
|
57
60
|
}
|
|
58
61
|
/**
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
62
|
+
* Add multiple tools to the chat session.
|
|
63
|
+
* Supports passing Tool classes (which will be instantiated) or instances.
|
|
64
|
+
* Can replace existing tools if options.replace is true.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* chat.withTools([WeatherTool, new CalculatorTool()], { replace: true });
|
|
68
|
+
*/
|
|
66
69
|
withTools(tools, options) {
|
|
67
70
|
if (options?.replace) {
|
|
68
71
|
this.options.tools = [];
|
|
@@ -71,20 +74,27 @@ export class Chat {
|
|
|
71
74
|
this.options.tools = [];
|
|
72
75
|
}
|
|
73
76
|
for (const tool of tools) {
|
|
77
|
+
let toolInstance;
|
|
78
|
+
// Handle class constructor
|
|
74
79
|
if (typeof tool === "function") {
|
|
75
80
|
try {
|
|
76
|
-
|
|
77
|
-
this.options.tools.push(new tool());
|
|
81
|
+
toolInstance = new tool();
|
|
78
82
|
}
|
|
79
83
|
catch (e) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
console.warn("Attempted to instantiate tool class but failed, adding as-is", e);
|
|
83
|
-
this.options.tools.push(tool);
|
|
84
|
+
console.error(`[NodeLLM] Failed to instantiate tool class: ${tool.name}`, e);
|
|
85
|
+
continue;
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
else {
|
|
87
|
-
|
|
89
|
+
toolInstance = tool;
|
|
90
|
+
}
|
|
91
|
+
// Normalized to standard ToolDefinition interface if it's a Tool class instance
|
|
92
|
+
if (toolInstance && typeof toolInstance.toLLMTool === "function") {
|
|
93
|
+
this.options.tools.push(toolInstance.toLLMTool());
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
// Fallback for legacy raw tool objects (defined as objects with type: 'function')
|
|
97
|
+
this.options.tools.push(toolInstance);
|
|
88
98
|
}
|
|
89
99
|
}
|
|
90
100
|
return this;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Message } from "./Message.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ToolDefinition } from "./Tool.js";
|
|
3
3
|
import { Schema } from "../schema/Schema.js";
|
|
4
4
|
export interface ChatOptions {
|
|
5
5
|
systemPrompt?: string;
|
|
6
6
|
messages?: Message[];
|
|
7
|
-
tools?:
|
|
7
|
+
tools?: ToolDefinition[];
|
|
8
8
|
temperature?: number;
|
|
9
9
|
maxTokens?: number;
|
|
10
10
|
onNewMessage?: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatOptions.d.ts","sourceRoot":"","sources":["../../src/chat/ChatOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"ChatOptions.d.ts","sourceRoot":"","sources":["../../src/chat/ChatOptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE;QAAE,IAAI,EAAE,aAAa,GAAG,MAAM,CAAA;KAAE,CAAC;IAClD,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB"}
|
package/dist/chat/Tool.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
1
2
|
export interface ToolCall {
|
|
2
3
|
id: string;
|
|
3
4
|
type: 'function';
|
|
@@ -6,7 +7,7 @@ export interface ToolCall {
|
|
|
6
7
|
arguments: string;
|
|
7
8
|
};
|
|
8
9
|
}
|
|
9
|
-
export interface
|
|
10
|
+
export interface ToolDefinition {
|
|
10
11
|
type: 'function';
|
|
11
12
|
function: {
|
|
12
13
|
name: string;
|
|
@@ -15,4 +16,37 @@ export interface Tool {
|
|
|
15
16
|
};
|
|
16
17
|
handler?: (args: any) => Promise<string>;
|
|
17
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* Subclass this to create tools with auto-generated schemas and type safety.
|
|
21
|
+
*/
|
|
22
|
+
export declare abstract class Tool<T = any> {
|
|
23
|
+
/**
|
|
24
|
+
* The name of the tool (must match [a-zA-Z0-9_-]+).
|
|
25
|
+
*/
|
|
26
|
+
abstract name: string;
|
|
27
|
+
/**
|
|
28
|
+
* A clear description of what the tool does, used by the LLM to decide when to call it.
|
|
29
|
+
*/
|
|
30
|
+
abstract description: string;
|
|
31
|
+
/**
|
|
32
|
+
* Parameters the tool accepts.
|
|
33
|
+
* Can be a Zod object (for auto-schema + type safety) or a raw JSON Schema.
|
|
34
|
+
*/
|
|
35
|
+
abstract schema: z.ZodObject<any> | Record<string, any>;
|
|
36
|
+
/**
|
|
37
|
+
* The core logic for the tool.
|
|
38
|
+
* 'args' will be parsed and validated based on 'schema'.
|
|
39
|
+
*/
|
|
40
|
+
abstract execute(args: T): Promise<any>;
|
|
41
|
+
/**
|
|
42
|
+
* Internal handler to bridge with LLM providers.
|
|
43
|
+
* Converts any result to a string (usually JSON).
|
|
44
|
+
*/
|
|
45
|
+
handler(args: T): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Converts the tool definition and logic into a standard ToolDefinition interface.
|
|
48
|
+
* This is called automatically by NodeLLM when registering tools.
|
|
49
|
+
*/
|
|
50
|
+
toLLMTool(): ToolDefinition;
|
|
51
|
+
}
|
|
18
52
|
//# sourceMappingURL=Tool.d.ts.map
|
package/dist/chat/Tool.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tool.d.ts","sourceRoot":"","sources":["../../src/chat/Tool.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"Tool.d.ts","sourceRoot":"","sources":["../../src/chat/Tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACjC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC1C;AAED;;GAEG;AACH,8BAAsB,IAAI,CAAC,CAAC,GAAG,GAAG;IAChC;;OAEG;IACH,SAAgB,IAAI,EAAE,MAAM,CAAC;IAE7B;;OAEG;IACH,SAAgB,WAAW,EAAE,MAAM,CAAC;IAEpC;;;OAGG;IACH,SAAgB,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAE/D;;;OAGG;aACa,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IAE9C;;;OAGG;IACU,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAM9C;;;OAGG;IACI,SAAS,IAAI,cAAc;CAoBnC"}
|
package/dist/chat/Tool.js
CHANGED
|
@@ -1 +1,38 @@
|
|
|
1
|
-
|
|
1
|
+
import { toJsonSchema } from "../schema/to-json-schema.js";
|
|
2
|
+
/**
|
|
3
|
+
* Subclass this to create tools with auto-generated schemas and type safety.
|
|
4
|
+
*/
|
|
5
|
+
export class Tool {
|
|
6
|
+
/**
|
|
7
|
+
* Internal handler to bridge with LLM providers.
|
|
8
|
+
* Converts any result to a string (usually JSON).
|
|
9
|
+
*/
|
|
10
|
+
async handler(args) {
|
|
11
|
+
const result = await this.execute(args);
|
|
12
|
+
if (result === undefined || result === null)
|
|
13
|
+
return "";
|
|
14
|
+
return typeof result === "string" ? result : JSON.stringify(result);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Converts the tool definition and logic into a standard ToolDefinition interface.
|
|
18
|
+
* This is called automatically by NodeLLM when registering tools.
|
|
19
|
+
*/
|
|
20
|
+
toLLMTool() {
|
|
21
|
+
const rawSchema = toJsonSchema(this.schema);
|
|
22
|
+
// We want the 'properties' and 'required' parts, not the full JSON Schema wrapper if present
|
|
23
|
+
const parameters = rawSchema.type === "object" ? rawSchema : {
|
|
24
|
+
type: "object",
|
|
25
|
+
properties: rawSchema.properties || {},
|
|
26
|
+
required: rawSchema.required || []
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
type: "function",
|
|
30
|
+
function: {
|
|
31
|
+
name: this.name,
|
|
32
|
+
description: this.description,
|
|
33
|
+
parameters: parameters,
|
|
34
|
+
},
|
|
35
|
+
handler: this.handler.bind(this),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
package/dist/errors/index.d.ts
CHANGED
package/dist/errors/index.js
CHANGED
package/dist/llm.d.ts
CHANGED
|
@@ -14,33 +14,45 @@ export interface RetryOptions {
|
|
|
14
14
|
type LLMConfig = {
|
|
15
15
|
provider?: Provider | string;
|
|
16
16
|
retry?: RetryOptions;
|
|
17
|
+
defaultChatModel?: string;
|
|
17
18
|
defaultTranscriptionModel?: string;
|
|
18
19
|
defaultModerationModel?: string;
|
|
19
20
|
defaultEmbeddingModel?: string;
|
|
20
21
|
} & Partial<NodeLLMConfig>;
|
|
21
|
-
declare class NodeLLMCore {
|
|
22
|
+
export declare class NodeLLMCore {
|
|
22
23
|
readonly models: typeof ModelRegistry;
|
|
23
|
-
readonly config:
|
|
24
|
-
openaiApiKey?: string;
|
|
25
|
-
openaiApiBase?: string;
|
|
26
|
-
anthropicApiKey?: string;
|
|
27
|
-
anthropicApiBase?: string;
|
|
28
|
-
geminiApiKey?: string;
|
|
29
|
-
geminiApiBase?: string;
|
|
30
|
-
deepseekApiKey?: string;
|
|
31
|
-
deepseekApiBase?: string;
|
|
32
|
-
ollamaApiBase?: string;
|
|
33
|
-
openrouterApiKey?: string;
|
|
34
|
-
openrouterApiBase?: string;
|
|
35
|
-
};
|
|
24
|
+
readonly config: NodeLLMConfig;
|
|
36
25
|
private provider?;
|
|
26
|
+
private defaultChatModelId?;
|
|
37
27
|
private defaultTranscriptionModelId?;
|
|
38
28
|
private defaultModerationModelId?;
|
|
39
29
|
private defaultEmbeddingModelId?;
|
|
40
30
|
private retry;
|
|
31
|
+
/**
|
|
32
|
+
* Create a new LLM instance. Defaults to the global config.
|
|
33
|
+
*/
|
|
34
|
+
constructor(customConfig?: NodeLLMConfig);
|
|
35
|
+
/**
|
|
36
|
+
* Returns a scoped LLM instance configured for a specific provider.
|
|
37
|
+
* This respects the current global configuration but avoids side effects
|
|
38
|
+
* on the main NodeLLM singleton.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* const openai = NodeLLM.withProvider("openai");
|
|
43
|
+
* const anthropic = NodeLLM.withProvider("anthropic");
|
|
44
|
+
*
|
|
45
|
+
* // These can now run in parallel without race conditions
|
|
46
|
+
* await Promise.all([
|
|
47
|
+
* openai.chat("gpt-4o").ask(prompt),
|
|
48
|
+
* anthropic.chat("claude-3-5-sonnet").ask(prompt),
|
|
49
|
+
* ]);
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
withProvider(providerName: string): NodeLLMCore;
|
|
41
53
|
configure(configOrCallback: LLMConfig | ((config: NodeLLMConfig) => void)): void;
|
|
42
54
|
private ensureProviderSupport;
|
|
43
|
-
chat(model
|
|
55
|
+
chat(model?: string, options?: ChatOptions): Chat;
|
|
44
56
|
listModels(): Promise<ModelInfo[]>;
|
|
45
57
|
paint(prompt: string, options?: {
|
|
46
58
|
model?: string;
|
package/dist/llm.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EACL,QAAQ,EACR,SAAS,EAIV,MAAM,yBAAyB,CAAC;AAUjC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AASrD,OAAO,EAAU,aAAa,EAAE,MAAM,aAAa,CAAC;AAEpD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,KAAK,SAAS,GAAG;IACf,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAY3B,
|
|
1
|
+
{"version":3,"file":"llm.d.ts","sourceRoot":"","sources":["../src/llm.ts"],"names":[],"mappings":"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"}
|
package/dist/llm.js
CHANGED
|
@@ -17,10 +17,11 @@ const PROVIDER_REGISTRARS = {
|
|
|
17
17
|
ollama: registerOllamaProvider,
|
|
18
18
|
openrouter: registerOpenRouterProvider,
|
|
19
19
|
};
|
|
20
|
-
class NodeLLMCore {
|
|
20
|
+
export class NodeLLMCore {
|
|
21
21
|
models = ModelRegistry;
|
|
22
|
-
config
|
|
22
|
+
config;
|
|
23
23
|
provider;
|
|
24
|
+
defaultChatModelId;
|
|
24
25
|
defaultTranscriptionModelId;
|
|
25
26
|
defaultModerationModelId;
|
|
26
27
|
defaultEmbeddingModelId;
|
|
@@ -28,6 +29,34 @@ class NodeLLMCore {
|
|
|
28
29
|
attempts: 1,
|
|
29
30
|
delayMs: 0,
|
|
30
31
|
};
|
|
32
|
+
/**
|
|
33
|
+
* Create a new LLM instance. Defaults to the global config.
|
|
34
|
+
*/
|
|
35
|
+
constructor(customConfig) {
|
|
36
|
+
this.config = customConfig || config;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Returns a scoped LLM instance configured for a specific provider.
|
|
40
|
+
* This respects the current global configuration but avoids side effects
|
|
41
|
+
* on the main NodeLLM singleton.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* ```ts
|
|
45
|
+
* const openai = NodeLLM.withProvider("openai");
|
|
46
|
+
* const anthropic = NodeLLM.withProvider("anthropic");
|
|
47
|
+
*
|
|
48
|
+
* // These can now run in parallel without race conditions
|
|
49
|
+
* await Promise.all([
|
|
50
|
+
* openai.chat("gpt-4o").ask(prompt),
|
|
51
|
+
* anthropic.chat("claude-3-5-sonnet").ask(prompt),
|
|
52
|
+
* ]);
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
withProvider(providerName) {
|
|
56
|
+
const scoped = new NodeLLMCore({ ...this.config });
|
|
57
|
+
scoped.configure({ provider: providerName });
|
|
58
|
+
return scoped;
|
|
59
|
+
}
|
|
31
60
|
configure(configOrCallback) {
|
|
32
61
|
// Callback style: for setting API keys
|
|
33
62
|
if (typeof configOrCallback === "function") {
|
|
@@ -37,9 +66,12 @@ class NodeLLMCore {
|
|
|
37
66
|
// Object style: for setting provider and other options
|
|
38
67
|
const options = configOrCallback;
|
|
39
68
|
// Extract known control keys
|
|
40
|
-
const { provider, retry, defaultTranscriptionModel, defaultModerationModel, defaultEmbeddingModel, ...apiConfig } = options;
|
|
69
|
+
const { provider, retry, defaultChatModel, defaultTranscriptionModel, defaultModerationModel, defaultEmbeddingModel, ...apiConfig } = options;
|
|
41
70
|
// Merge API keys into global config
|
|
42
71
|
Object.assign(this.config, apiConfig);
|
|
72
|
+
if (defaultChatModel) {
|
|
73
|
+
this.defaultChatModelId = defaultChatModel;
|
|
74
|
+
}
|
|
43
75
|
if (defaultTranscriptionModel) {
|
|
44
76
|
this.defaultTranscriptionModelId = defaultTranscriptionModel;
|
|
45
77
|
}
|
|
@@ -80,8 +112,8 @@ class NodeLLMCore {
|
|
|
80
112
|
if (!this.provider) {
|
|
81
113
|
throw new ProviderNotConfiguredError();
|
|
82
114
|
}
|
|
83
|
-
|
|
84
|
-
const resolvedModel = resolveModelAlias(
|
|
115
|
+
const rawModel = model || this.defaultChatModelId || this.provider.defaultModel("chat");
|
|
116
|
+
const resolvedModel = resolveModelAlias(rawModel, this.provider.id);
|
|
85
117
|
return new Chat(this.provider, resolvedModel, options, this.retry);
|
|
86
118
|
}
|
|
87
119
|
async listModels() {
|
|
@@ -10,6 +10,7 @@ export declare abstract class BaseProvider implements Provider {
|
|
|
10
10
|
abstract headers(): Record<string, string>;
|
|
11
11
|
protected abstract providerName(): string;
|
|
12
12
|
get id(): string;
|
|
13
|
+
defaultModel(feature?: string): string;
|
|
13
14
|
protected throwUnsupportedError(feature: string): never;
|
|
14
15
|
abstract chat(request: ChatRequest): Promise<ChatResponse>;
|
|
15
16
|
abstract capabilities?: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseProvider.d.ts","sourceRoot":"","sources":["../../src/providers/BaseProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB;;;;GAIG;AACH,8BAAsB,YAAa,YAAW,QAAQ;aACpC,OAAO,IAAI,MAAM;aACjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;aACjC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,MAAM;IAEzC,IAAI,EAAE,IAAI,MAAM,CAEf;
|
|
1
|
+
{"version":3,"file":"BaseProvider.d.ts","sourceRoot":"","sources":["../../src/providers/BaseProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,eAAe,CAAC;AAEvB;;;;GAIG;AACH,8BAAsB,YAAa,YAAW,QAAQ;aACpC,OAAO,IAAI,MAAM;aACjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;aACjC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,MAAM;IAEzC,IAAI,EAAE,IAAI,MAAM,CAEf;IAEM,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAI7C,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK;IAIvD,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAC1D,QAAQ,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC;IAErB,MAAM,CAAC,CAAC,OAAO,EAAE,WAAW,GAAG,aAAa,CAAC,SAAS,CAAC;IAIxD,UAAU,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAInC,KAAK,CAAC,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIrD,UAAU,CAAC,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAI1E,QAAQ,CAAC,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIlE,KAAK,CAAC,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGpE"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Message } from "../chat/Message.js";
|
|
2
|
-
import {
|
|
2
|
+
import { ToolDefinition, ToolCall } from "../chat/Tool.js";
|
|
3
3
|
export interface ChatRequest {
|
|
4
4
|
model: string;
|
|
5
5
|
messages: Message[];
|
|
6
|
-
tools?:
|
|
6
|
+
tools?: ToolDefinition[];
|
|
7
7
|
temperature?: number;
|
|
8
8
|
max_tokens?: number;
|
|
9
9
|
response_format?: any;
|
|
@@ -132,6 +132,7 @@ export interface Provider {
|
|
|
132
132
|
transcribe?(request: TranscriptionRequest): Promise<TranscriptionResponse>;
|
|
133
133
|
moderate?(request: ModerationRequest): Promise<ModerationResponse>;
|
|
134
134
|
embed?(request: EmbeddingRequest): Promise<EmbeddingResponse>;
|
|
135
|
+
defaultModel(feature?: string): string;
|
|
135
136
|
capabilities?: ProviderCapabilities;
|
|
136
137
|
}
|
|
137
138
|
//# sourceMappingURL=Provider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Provider.d.ts","sourceRoot":"","sources":["../../src/providers/Provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ export declare class AnthropicProvider extends BaseProvider implements Provider
|
|
|
25
25
|
apiBase(): string;
|
|
26
26
|
headers(): Record<string, string>;
|
|
27
27
|
protected providerName(): string;
|
|
28
|
+
defaultModel(feature?: string): string;
|
|
28
29
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
29
30
|
stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
|
|
30
31
|
listModels(): Promise<ModelInfo[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/AnthropicProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAwJ,MAAM,gBAAgB,CAAC;AACjP,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,SAAQ,YAAa,YAAW,QAAQ;IAkBzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEzC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;qCACX,MAAM;0CACD,MAAM;wCACR,MAAM;qCACT,MAAM;oCACP,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,wBAAwB;IAQvD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQxC,SAAS,CAAC,YAAY,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"AnthropicProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/anthropic/AnthropicProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAwJ,MAAM,gBAAgB,CAAC;AACjP,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,iBAAkB,SAAQ,YAAa,YAAW,QAAQ;IAkBzD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAgB;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkB;IAEzC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;qCACX,MAAM;0CACD,MAAM;wCACR,MAAM;qCACT,MAAM;oCACP,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,wBAAwB;IAQvD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAQxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAKzC"}
|
|
@@ -25,6 +25,7 @@ export declare class DeepSeekProvider extends BaseProvider implements Provider {
|
|
|
25
25
|
apiBase(): string;
|
|
26
26
|
headers(): Record<string, string>;
|
|
27
27
|
protected providerName(): string;
|
|
28
|
+
defaultModel(feature?: string): string;
|
|
28
29
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
29
30
|
stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
|
|
30
31
|
listModels(): Promise<ModelInfo[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DeepSeekProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/deepseek/DeepSeekProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,QAAQ;IAkBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAExC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE2B,OAAO,EAAE,uBAAuB;IAQtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"DeepSeekProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/deepseek/DeepSeekProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAMlD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,gBAAiB,SAAQ,YAAa,YAAW,QAAQ;IAkBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAjBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAe;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAoB;IACrD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAiB;IAExC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE2B,OAAO,EAAE,uBAAuB;IAQtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;CAKzC"}
|
|
@@ -28,6 +28,7 @@ export declare class GeminiProvider extends BaseProvider implements Provider {
|
|
|
28
28
|
apiBase(): string;
|
|
29
29
|
headers(): Record<string, string>;
|
|
30
30
|
protected providerName(): string;
|
|
31
|
+
defaultModel(feature?: string): string;
|
|
31
32
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
32
33
|
stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
|
|
33
34
|
listModels(): Promise<ModelInfo[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EAGrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAqBtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWpD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxC,SAAS,CAAC,YAAY,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"GeminiProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,SAAS,EACT,SAAS,EACT,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,qBAAqB,EAGrB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASlD,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAqBtD,OAAO,CAAC,QAAQ,CAAC,OAAO;IApBpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;IACzC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAsB;IAEpD,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;oCACN,MAAM;kCACR,MAAM;MAChC;gBAE2B,OAAO,EAAE,qBAAqB;IAWpD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAI5D,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAKhF"}
|
|
@@ -5,5 +5,6 @@ export interface OllamaProviderOptions {
|
|
|
5
5
|
export declare class OllamaProvider extends OpenAIProvider {
|
|
6
6
|
constructor(options?: OllamaProviderOptions);
|
|
7
7
|
protected providerName(): string;
|
|
8
|
+
defaultModel(feature?: string): string;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=OllamaProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IAwB/C,SAAS,CAAC,YAAY,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"OllamaProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/ollama/OllamaProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAM7D,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,cAAc;gBACpC,OAAO,GAAE,qBAA0B;IAwB/C,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;CAGvD"}
|
|
@@ -37,6 +37,7 @@ export declare class OpenAIProvider extends BaseProvider implements Provider {
|
|
|
37
37
|
apiBase(): string;
|
|
38
38
|
headers(): Record<string, string>;
|
|
39
39
|
protected providerName(): string;
|
|
40
|
+
defaultModel(feature?: string): string;
|
|
40
41
|
chat(request: ChatRequest): Promise<ChatResponse>;
|
|
41
42
|
stream(request: ChatRequest): AsyncGenerator<ChatChunk>;
|
|
42
43
|
listModels(): Promise<ModelInfo[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpM,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAsBtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IArB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAYtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;
|
|
1
|
+
{"version":3,"file":"OpenAIProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/openai/OpenAIProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACpM,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,cAAe,SAAQ,YAAa,YAAW,QAAQ;IAsBtD,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,qBAAqB;IArB7D,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC;IAC1B,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC;IAClC,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAC5C,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC;IACtC,SAAS,CAAC,YAAY,EAAE,WAAW,CAAC;IACpC,SAAS,CAAC,oBAAoB,EAAE,mBAAmB,CAAC;IACpD,SAAS,CAAC,iBAAiB,EAAE,gBAAgB,CAAC;IAC9C,SAAS,CAAC,gBAAgB,EAAE,eAAe,CAAC;IAErC,YAAY;gCACO,MAAM;+BACP,MAAM;0CACK,MAAM;oCACZ,MAAM;yCACD,MAAM;uCACR,MAAM;oCACT,MAAM;mCACP,MAAM;kCACP,MAAM;MAChC;gBAE6B,OAAO,EAAE,qBAAqB;IAYtD,OAAO,IAAI,MAAM;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxC,SAAS,CAAC,YAAY,IAAI,MAAM;IAIhB,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM;IAIhD,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAIhD,MAAM,CAAC,OAAO,EAAE,WAAW,GAAG,cAAc,CAAC,SAAS,CAAC;IAIxD,UAAU,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;IAIlC,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAIpD,UAAU,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAIzE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAIjE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGnE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FileLoader.d.ts","sourceRoot":"","sources":["../../src/utils/FileLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2CjD,qBAAa,UAAU;WACR,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"FileLoader.d.ts","sourceRoot":"","sources":["../../src/utils/FileLoader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA2CjD,qBAAa,UAAU;WACR,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAmF1D"}
|
package/dist/utils/FileLoader.js
CHANGED
|
@@ -47,7 +47,8 @@ export class FileLoader {
|
|
|
47
47
|
if (!response.ok)
|
|
48
48
|
throw new Error(`Failed to fetch file: ${response.statusText}`);
|
|
49
49
|
const buffer = await response.arrayBuffer();
|
|
50
|
-
const
|
|
50
|
+
const contentTypeFull = response.headers.get("content-type") || "image/jpeg";
|
|
51
|
+
const contentType = (contentTypeFull.split(";")[0] ?? "image/jpeg").trim();
|
|
51
52
|
const base64 = Buffer.from(buffer).toString("base64");
|
|
52
53
|
const dataUri = `data:${contentType};base64,${base64}`;
|
|
53
54
|
if (contentType.startsWith("image/")) {
|
package/dist/utils/logger.d.ts
CHANGED
package/dist/utils/logger.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@node-llm/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"description": "A provider-agnostic LLM core for Node.js, inspired by ruby-llm.",
|
|
14
|
-
"author": "
|
|
14
|
+
"author": "NodeLLM contributors",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"engines": {
|
|
17
17
|
"node": ">=20.0.0"
|