@derogab/llm-proxy 0.4.0 → 0.4.2
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 +22 -1
- package/dist/cjs/index.js +58 -46
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.js +58 -46
- package/dist/esm/index.js.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
# llm-proxy
|
|
2
2
|
A simple and lightweight proxy for seamless integration with multiple LLM providers including OpenAI, Ollama, Cloudflare AI, and Llama.cpp.
|
|
3
3
|
|
|
4
|
+
> **Proxy Collection**: This package is part of a plug-and-play proxy collection designed for easy integration into your projects:
|
|
5
|
+
> - [`@derogab/llm-proxy`](https://github.com/derogab/llm-proxy) - LLM provider proxy (this package)
|
|
6
|
+
> - [`@derogab/stt-proxy`](https://github.com/derogab/stt-proxy) - Speech-to-Text provider proxy
|
|
7
|
+
|
|
4
8
|
## Features
|
|
5
9
|
|
|
6
10
|
- **Multi-provider support**: Switch between OpenAI, Ollama, Cloudflare AI, and Llama.cpp with environment variables.
|
|
@@ -32,11 +36,26 @@ console.log(response.content);
|
|
|
32
36
|
The package automatically detects which LLM provider to use based on your environment variables.
|
|
33
37
|
Configure one or more providers:
|
|
34
38
|
|
|
39
|
+
### Provider Selection
|
|
40
|
+
```bash
|
|
41
|
+
LLM_PROVIDER=openai # Optional, explicitly select a provider (openai, cloudflare, ollama, llama.cpp)
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
When `LLM_PROVIDER` is set, the package will use that specific provider and skip automatic detection. This is useful when you have multiple providers configured but want to force a specific one. If the required credentials for the specified provider are not configured, an error will be thrown. If not set, consider [provider priority](#provider-priority).
|
|
45
|
+
|
|
46
|
+
> **Note:** The legacy `PROVIDER` environment variable is still supported as a fallback for backward compatibility, but `LLM_PROVIDER` takes precedence when both are set.
|
|
47
|
+
|
|
35
48
|
### OpenAI
|
|
36
49
|
```bash
|
|
37
50
|
OPENAI_API_KEY=your_openai_api_key # Required
|
|
38
51
|
OPENAI_BASE_URL=https://api.openai.com/v1 # Optional
|
|
39
52
|
OPENAI_MODEL=gpt-4o-mini # Optional, defaults to gpt-4o-mini
|
|
53
|
+
|
|
54
|
+
# Optional: When using OpenRouter (OPENAI_BASE_URL=https://openrouter.ai/api/v1),
|
|
55
|
+
# set these headers to appear in https://openrouter.ai/docs/app-attribution
|
|
56
|
+
OPENAI_OPENROUTER_REFERER=https://yourapp.com # Your app's URL
|
|
57
|
+
OPENAI_OPENROUTER_TITLE=Your App Name # Your app's display name
|
|
58
|
+
OPENAI_OPENROUTER_CATEGORIES=category1,category2 # Comma-separated categories
|
|
40
59
|
```
|
|
41
60
|
|
|
42
61
|
### Cloudflare AI
|
|
@@ -79,7 +98,9 @@ type MessageInputParam = {
|
|
|
79
98
|
|
|
80
99
|
## Provider Priority
|
|
81
100
|
|
|
82
|
-
|
|
101
|
+
If the `LLM_PROVIDER` environment variable is set (or the legacy `PROVIDER` as fallback), the specified provider will be used directly (valid values: `openai`, `cloudflare`, `ollama`, `llama.cpp`).
|
|
102
|
+
|
|
103
|
+
Otherwise, the package selects providers automatically in the following order:
|
|
83
104
|
1. **OpenAI** (if `OPENAI_API_KEY` is set)
|
|
84
105
|
2. **Cloudflare AI** (if `CLOUDFLARE_ACCOUNT_ID`, `CLOUDFLARE_AUTH_KEY`, and `CLOUDFLARE_MODEL` are set)
|
|
85
106
|
3. **Ollama** (if `OLLAMA_URI` is set)
|
package/dist/cjs/index.js
CHANGED
|
@@ -15,8 +15,23 @@ dotenv.config();
|
|
|
15
15
|
* @returns the response string from the OpenAI API.
|
|
16
16
|
*/
|
|
17
17
|
async function generate_openai(messages) {
|
|
18
|
+
// Build default headers for OpenRouter attribution (optional).
|
|
19
|
+
const defaultHeaders = {};
|
|
20
|
+
if (process.env.OPENAI_OPENROUTER_REFERER) {
|
|
21
|
+
defaultHeaders['HTTP-Referer'] = process.env.OPENAI_OPENROUTER_REFERER;
|
|
22
|
+
}
|
|
23
|
+
if (process.env.OPENAI_OPENROUTER_TITLE) {
|
|
24
|
+
defaultHeaders['X-OpenRouter-Title'] = process.env.OPENAI_OPENROUTER_TITLE;
|
|
25
|
+
}
|
|
26
|
+
if (process.env.OPENAI_OPENROUTER_CATEGORIES) {
|
|
27
|
+
defaultHeaders['X-OpenRouter-Categories'] = process.env.OPENAI_OPENROUTER_CATEGORIES;
|
|
28
|
+
}
|
|
18
29
|
// Create a new instance of the OpenAI class.
|
|
19
|
-
const openai = new openai_1.default({
|
|
30
|
+
const openai = new openai_1.default({
|
|
31
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
32
|
+
baseURL: process.env.OPENAI_BASE_URL,
|
|
33
|
+
defaultHeaders: Object.keys(defaultHeaders).length > 0 ? defaultHeaders : undefined,
|
|
34
|
+
});
|
|
20
35
|
// Call the OpenAI API.
|
|
21
36
|
const chatCompletion = await openai.chat.completions.create({
|
|
22
37
|
messages: messages,
|
|
@@ -138,53 +153,50 @@ async function generate_cloudflare(messages) {
|
|
|
138
153
|
* @returns the response string.
|
|
139
154
|
*/
|
|
140
155
|
async function generate(messages) {
|
|
141
|
-
//
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
}
|
|
162
|
-
return await generate_llama_cpp(messages);
|
|
163
|
-
default:
|
|
164
|
-
throw new Error(`Invalid PROVIDER: "${process.env.PROVIDER}". Valid options are: openai, cloudflare, ollama, llama.cpp`);
|
|
156
|
+
// Determine provider: either from env var or from priority-based auto-detection.
|
|
157
|
+
// LLM_PROVIDER is the preferred env var, with PROVIDER as a fallback for backward compatibility.
|
|
158
|
+
let provider = (process.env.LLM_PROVIDER || process.env.PROVIDER)?.toLowerCase();
|
|
159
|
+
const isExplicitProvider = !!provider;
|
|
160
|
+
// If LLM_PROVIDER/PROVIDER is not explicitly set, auto-detect based on priority order.
|
|
161
|
+
if (!provider) {
|
|
162
|
+
if (process.env.OPENAI_API_KEY) {
|
|
163
|
+
provider = 'openai';
|
|
164
|
+
}
|
|
165
|
+
else if (process.env.CLOUDFLARE_ACCOUNT_ID && process.env.CLOUDFLARE_AUTH_KEY && process.env.CLOUDFLARE_MODEL) {
|
|
166
|
+
provider = 'cloudflare';
|
|
167
|
+
}
|
|
168
|
+
else if (process.env.OLLAMA_URI) {
|
|
169
|
+
provider = 'ollama';
|
|
170
|
+
}
|
|
171
|
+
else if (process.env.LLAMA_CPP_MODEL_PATH) {
|
|
172
|
+
provider = 'llama.cpp';
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
throw new Error('No available LLM found.');
|
|
165
176
|
}
|
|
166
177
|
}
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
178
|
+
// Now provider is always set - handle each provider with a single switch.
|
|
179
|
+
switch (provider) {
|
|
180
|
+
case 'openai':
|
|
181
|
+
if (isExplicitProvider && !process.env.OPENAI_API_KEY) {
|
|
182
|
+
throw new Error('LLM_PROVIDER is set to "openai" but OPENAI_API_KEY is not configured.');
|
|
183
|
+
}
|
|
184
|
+
return await generate_openai(messages);
|
|
185
|
+
case 'cloudflare':
|
|
186
|
+
if (isExplicitProvider && (!process.env.CLOUDFLARE_ACCOUNT_ID || !process.env.CLOUDFLARE_AUTH_KEY || !process.env.CLOUDFLARE_MODEL)) {
|
|
187
|
+
throw new Error('LLM_PROVIDER is set to "cloudflare" but required credentials (CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AUTH_KEY, CLOUDFLARE_MODEL) are not fully configured.');
|
|
188
|
+
}
|
|
189
|
+
return await generate_cloudflare(messages);
|
|
190
|
+
case 'ollama':
|
|
191
|
+
// No validation needed - generate_ollama has default host
|
|
192
|
+
return await generate_ollama(messages);
|
|
193
|
+
case 'llama.cpp':
|
|
194
|
+
if (isExplicitProvider && !process.env.LLAMA_CPP_MODEL_PATH) {
|
|
195
|
+
throw new Error('LLM_PROVIDER is set to "llama.cpp" but LLAMA_CPP_MODEL_PATH is not configured.');
|
|
196
|
+
}
|
|
197
|
+
return await generate_llama_cpp(messages);
|
|
198
|
+
default:
|
|
199
|
+
throw new Error(`Invalid LLM_PROVIDER: "${process.env.LLM_PROVIDER || process.env.PROVIDER}". Valid options are: openai, cloudflare, ollama, llama.cpp`);
|
|
188
200
|
}
|
|
189
201
|
}
|
|
190
202
|
//# sourceMappingURL=index.js.map
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/index.js
CHANGED
|
@@ -12,8 +12,23 @@ dotenv.config();
|
|
|
12
12
|
* @returns the response string from the OpenAI API.
|
|
13
13
|
*/
|
|
14
14
|
async function generate_openai(messages) {
|
|
15
|
+
// Build default headers for OpenRouter attribution (optional).
|
|
16
|
+
const defaultHeaders = {};
|
|
17
|
+
if (process.env.OPENAI_OPENROUTER_REFERER) {
|
|
18
|
+
defaultHeaders['HTTP-Referer'] = process.env.OPENAI_OPENROUTER_REFERER;
|
|
19
|
+
}
|
|
20
|
+
if (process.env.OPENAI_OPENROUTER_TITLE) {
|
|
21
|
+
defaultHeaders['X-OpenRouter-Title'] = process.env.OPENAI_OPENROUTER_TITLE;
|
|
22
|
+
}
|
|
23
|
+
if (process.env.OPENAI_OPENROUTER_CATEGORIES) {
|
|
24
|
+
defaultHeaders['X-OpenRouter-Categories'] = process.env.OPENAI_OPENROUTER_CATEGORIES;
|
|
25
|
+
}
|
|
15
26
|
// Create a new instance of the OpenAI class.
|
|
16
|
-
const openai = new OpenAI({
|
|
27
|
+
const openai = new OpenAI({
|
|
28
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
29
|
+
baseURL: process.env.OPENAI_BASE_URL,
|
|
30
|
+
defaultHeaders: Object.keys(defaultHeaders).length > 0 ? defaultHeaders : undefined,
|
|
31
|
+
});
|
|
17
32
|
// Call the OpenAI API.
|
|
18
33
|
const chatCompletion = await openai.chat.completions.create({
|
|
19
34
|
messages: messages,
|
|
@@ -135,53 +150,50 @@ async function generate_cloudflare(messages) {
|
|
|
135
150
|
* @returns the response string.
|
|
136
151
|
*/
|
|
137
152
|
export async function generate(messages) {
|
|
138
|
-
//
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
}
|
|
159
|
-
return await generate_llama_cpp(messages);
|
|
160
|
-
default:
|
|
161
|
-
throw new Error(`Invalid PROVIDER: "${process.env.PROVIDER}". Valid options are: openai, cloudflare, ollama, llama.cpp`);
|
|
153
|
+
// Determine provider: either from env var or from priority-based auto-detection.
|
|
154
|
+
// LLM_PROVIDER is the preferred env var, with PROVIDER as a fallback for backward compatibility.
|
|
155
|
+
let provider = (process.env.LLM_PROVIDER || process.env.PROVIDER)?.toLowerCase();
|
|
156
|
+
const isExplicitProvider = !!provider;
|
|
157
|
+
// If LLM_PROVIDER/PROVIDER is not explicitly set, auto-detect based on priority order.
|
|
158
|
+
if (!provider) {
|
|
159
|
+
if (process.env.OPENAI_API_KEY) {
|
|
160
|
+
provider = 'openai';
|
|
161
|
+
}
|
|
162
|
+
else if (process.env.CLOUDFLARE_ACCOUNT_ID && process.env.CLOUDFLARE_AUTH_KEY && process.env.CLOUDFLARE_MODEL) {
|
|
163
|
+
provider = 'cloudflare';
|
|
164
|
+
}
|
|
165
|
+
else if (process.env.OLLAMA_URI) {
|
|
166
|
+
provider = 'ollama';
|
|
167
|
+
}
|
|
168
|
+
else if (process.env.LLAMA_CPP_MODEL_PATH) {
|
|
169
|
+
provider = 'llama.cpp';
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
throw new Error('No available LLM found.');
|
|
162
173
|
}
|
|
163
174
|
}
|
|
164
|
-
//
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
175
|
+
// Now provider is always set - handle each provider with a single switch.
|
|
176
|
+
switch (provider) {
|
|
177
|
+
case 'openai':
|
|
178
|
+
if (isExplicitProvider && !process.env.OPENAI_API_KEY) {
|
|
179
|
+
throw new Error('LLM_PROVIDER is set to "openai" but OPENAI_API_KEY is not configured.');
|
|
180
|
+
}
|
|
181
|
+
return await generate_openai(messages);
|
|
182
|
+
case 'cloudflare':
|
|
183
|
+
if (isExplicitProvider && (!process.env.CLOUDFLARE_ACCOUNT_ID || !process.env.CLOUDFLARE_AUTH_KEY || !process.env.CLOUDFLARE_MODEL)) {
|
|
184
|
+
throw new Error('LLM_PROVIDER is set to "cloudflare" but required credentials (CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_AUTH_KEY, CLOUDFLARE_MODEL) are not fully configured.');
|
|
185
|
+
}
|
|
186
|
+
return await generate_cloudflare(messages);
|
|
187
|
+
case 'ollama':
|
|
188
|
+
// No validation needed - generate_ollama has default host
|
|
189
|
+
return await generate_ollama(messages);
|
|
190
|
+
case 'llama.cpp':
|
|
191
|
+
if (isExplicitProvider && !process.env.LLAMA_CPP_MODEL_PATH) {
|
|
192
|
+
throw new Error('LLM_PROVIDER is set to "llama.cpp" but LLAMA_CPP_MODEL_PATH is not configured.');
|
|
193
|
+
}
|
|
194
|
+
return await generate_llama_cpp(messages);
|
|
195
|
+
default:
|
|
196
|
+
throw new Error(`Invalid LLM_PROVIDER: "${process.env.LLM_PROVIDER || process.env.PROVIDER}". Valid options are: openai, cloudflare, ollama, llama.cpp`);
|
|
185
197
|
}
|
|
186
198
|
}
|
|
187
199
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,gBAAgB;AAChB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAa5B,WAAW;AACX,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,QAAsC;IACnE,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,GAAG,OAAO,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,0BAA0B,GAAG,OAAO,GAAG,iBAAiB,CAAC;AAqJzF;;;;;GAKG;AACH,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4CxF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@derogab/llm-proxy",
|
|
3
3
|
"description": "A simple and lightweight proxy for seamless integration with multiple LLM providers including OpenAI, Ollama, and Cloudflare AI",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.2",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "derogab",
|
|
7
7
|
"license": "MIT",
|
|
@@ -45,15 +45,15 @@
|
|
|
45
45
|
],
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "25.0.6",
|
|
48
|
-
"@vitest/coverage-v8": "4.0.
|
|
48
|
+
"@vitest/coverage-v8": "4.0.18",
|
|
49
49
|
"typescript": "5.9.3",
|
|
50
|
-
"vitest": "4.0.
|
|
50
|
+
"vitest": "4.0.18"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"axios": "1.13.
|
|
53
|
+
"axios": "1.13.4",
|
|
54
54
|
"dotenv": "17.2.3",
|
|
55
55
|
"node-llama-cpp": "3.15.0",
|
|
56
56
|
"ollama": "0.6.3",
|
|
57
|
-
"openai": "6.
|
|
57
|
+
"openai": "6.17.0"
|
|
58
58
|
}
|
|
59
59
|
}
|