huxy-llm-api 1.1.3 → 1.1.4

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 (2) hide show
  1. package/package.json +1 -1
  2. package/src/index.js +160 -149
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "huxy-llm-api",
3
- "version": "1.1.3",
3
+ "version": "1.1.4",
4
4
  "description": "一个简洁、易用的用于简化 Ollama 和 OpenAI API 调用的 Node.js 库。",
5
5
  "type": "module",
6
6
  "module": "./src/index.js",
package/src/index.js CHANGED
@@ -1,221 +1,232 @@
1
1
  var B = Object.defineProperty;
2
- var U = (t, o) => {
3
- for (var e in o) B(t, e, {get: o[e], enumerable: !0});
2
+ var U = (t, r) => {
3
+ for (var e in r) B(t, e, {get: r[e], enumerable: !0});
4
4
  };
5
- import {Ollama as rt} from 'ollama';
6
- import at from 'openai';
7
- import {fetch as F, Agent as M} from 'undici';
5
+ import {Ollama as at} from 'ollama';
6
+ import it from 'openai';
7
+ import {fetch as z, Agent as M} from 'undici';
8
8
  var T = 3600 * 1e3,
9
- z = t => (o, e) => F(o, {...e, dispatcher: new M({headersTimeout: T, ...t})}),
10
- y = z;
11
- var N = {config: {apiKey: process.env.OLLM_API_KEY || 'ollm_key', host: process.env.OLLM_API_HOST}, params: {}, options: {}},
12
- w = N;
13
- var S = {config: {apiKey: process.env.LLM_API_KEY || 'llm_key', baseURL: process.env.LLM_API_BASEURL}, params: {}, options: {}},
14
- _ = S;
15
- var Y = ['temperature', 'seed', 'stop', 'top_p'],
16
- H = t => {
17
- let {max_tokens: o, options: e = {}, ...s} = t,
9
+ N = t => (r, e) => z(r, {...e, dispatcher: new M({headersTimeout: T, ...t})}),
10
+ y = N;
11
+ var S = {config: {apiKey: process.env.OLLM_API_KEY || 'ollm_key', host: process.env.OLLM_API_HOST}, params: {}, options: {}},
12
+ w = S;
13
+ var Y = {config: {apiKey: process.env.LLM_API_KEY || 'llm_key', baseURL: process.env.LLM_API_BASEURL}, params: {}, options: {}},
14
+ v = Y;
15
+ var H = ['temperature', 'seed', 'stop', 'top_p'],
16
+ V = t => {
17
+ let {max_tokens: r, options: e = {}, ...o} = t,
18
18
  {num_ctx: a, ...n} = e;
19
19
  return (
20
- (s.max_tokens = o ?? a),
21
- Object.keys(n).map(r => {
22
- Y.includes(r) ? (s[r] = n[r]) : (s.extra_body || (s.extra_body = {}), (s.extra_body[r] = n[r]));
20
+ (o.max_tokens = r ?? a),
21
+ Object.keys(n).map(s => {
22
+ H.includes(s) ? (o[s] = n[s]) : (o.extra_body || (o.extra_body = {}), (o.extra_body[s] = n[s]));
23
23
  }),
24
- s
24
+ o
25
25
  );
26
26
  },
27
- V = (t, o = {}, e = 'chat') => {
27
+ W = (t, r = {}, e = 'chat') => {
28
28
  if (!t) throw Error('\u8BF7\u4F20\u5165\u4F60\u7684 prompt !');
29
- if (!o.model) throw Error('\u8BF7\u914D\u7F6E\u8981\u4F7F\u7528\u7684\u5927\u6A21\u578B model !');
29
+ if (!r.model) throw Error('\u8BF7\u914D\u7F6E\u8981\u4F7F\u7528\u7684\u5927\u6A21\u578B model !');
30
30
  if (e === 'chat') {
31
31
  let a = Array.isArray(t) ? t : [{role: 'user', content: t}],
32
- {system: n, ...r} = o;
33
- return (n && (a = [{role: 'system', content: n}, ...a]), {messages: a, ...r});
32
+ {system: n, ...s} = r;
33
+ return (n && (a = [{role: 'system', content: n}, ...a]), {messages: a, ...s});
34
34
  }
35
35
  if (e === 'responses') {
36
- let {instructions: a, system: n, ...r} = o;
37
- return (a || (r.instructions = n), {input: t, ...r});
36
+ let {instructions: a, system: n, ...s} = r;
37
+ return (a || (s.instructions = n), {input: t, ...s});
38
38
  }
39
- return {prompt: Array.isArray(t) ? t.slice(-1)[0]?.content : t, ...o};
39
+ return {prompt: Array.isArray(t) ? t.slice(-1)[0]?.content : t, ...r};
40
40
  };
41
41
  var R =
42
- ({params: t, options: o} = {}, e) =>
43
- (s, a = {}, n) => {
44
- let {options: r, extra_body: i, ...p} = a,
45
- c = V(s, {...t, ...p}, n);
46
- return ((c.options = {...o, ...i, ...r}), e === 'openai' ? H(c) : c);
42
+ ({params: t, options: r} = {}, e) =>
43
+ (o, a = {}, n) => {
44
+ let {options: s, extra_body: i, ...c} = a,
45
+ p = W(o, {...t, ...c}, n);
46
+ return ((p.options = {...r, ...i, ...s}), e === 'openai' ? V(p) : p);
47
47
  };
48
- var W = ['response.reasoning_text.delta', 'response.reasoning_summary_text.delta'],
49
- A = async (t, o, e) => {
50
- if (o) {
51
- let r = '',
48
+ var q = ['response.reasoning_text.delta', 'response.reasoning_summary_text.delta'],
49
+ A = async (t, r, e) => {
50
+ if (r) {
51
+ let s = '',
52
52
  i = '';
53
- for await (let p of t) {
54
- let {type: c, delta: m} = p;
55
- (W.includes(c) && (i += m), c === 'response.output_text.delta' && (r += m), e?.({content: r, reasoning: i}, p));
53
+ for await (let c of t) {
54
+ let {type: p, delta: m} = c;
55
+ (q.includes(p) && (i += m), p === 'response.output_text.delta' && (s += m), e?.({content: s, reasoning: i}, c));
56
56
  }
57
- return {content: r, reasoning: i};
57
+ return {content: s, reasoning: i};
58
58
  }
59
59
  let a = (t.output?.[0]?.content ?? t.output?.[0]?.summary)?.[0]?.text,
60
60
  n = t.output_text;
61
61
  return (e?.({content: n, reasoning: a}, t), {content: n, reasoning: a});
62
62
  },
63
- b = async (t, o, e) => {
64
- if (o) {
65
- let r = '',
63
+ $ = async (t, r, e) => {
64
+ if (r) {
65
+ let s = '',
66
66
  i = '';
67
- for await (let p of t) {
68
- let {delta: c} = p.choices?.[0] ?? {},
69
- {reasoning: m, content: f} = c ?? {};
70
- (m && (i += m), f && (r += f), e?.({content: r, reasoning: i}, p));
67
+ for await (let c of t) {
68
+ let {delta: p} = c.choices?.[0] ?? {},
69
+ {reasoning: m, content: u} = p ?? {};
70
+ (m && (i += m), u && (s += u), e?.({content: s, reasoning: i}, c));
71
71
  }
72
- return {content: r, reasoning: i};
72
+ return {content: s, reasoning: i};
73
73
  }
74
- let {message: s} = t.choices?.[0] ?? {},
75
- {content: a, reasoning: n} = s;
74
+ let {message: o} = t.choices?.[0] ?? {},
75
+ {content: a, reasoning: n} = o;
76
76
  return (e?.({content: a, reasoning: n}, t), {content: a, reasoning: n});
77
77
  };
78
- var d = {};
79
- U(d, {chat: () => u, default: () => Q, generate: () => G, image: () => J, responses: () => x});
80
- var D = ['response.reasoning_text.delta', 'response.reasoning_summary_text.delta'],
81
- x = async (t, o, e) => {
82
- if (o) {
83
- let r = '',
78
+ var _ = {};
79
+ U(_, {chat: () => g, default: () => X, generate: () => J, image: () => Q, responses: () => x});
80
+ var G = ['response.reasoning_text.delta', 'response.reasoning_summary_text.delta'],
81
+ f = t => {
82
+ let {total_duration: r, load_duration: e, prompt_eval_count: o, prompt_eval_duration: a, eval_count: n, eval_duration: s} = t;
83
+ t.analyze = `total duration: ${(r / 1e9).toFixed(2)} s
84
+ load duration: ${(e / 1e6).toFixed(2)} ms
85
+ prompt eval count: ${o} token(s)
86
+ prompt eval duration: ${(a / 1e6).toFixed(2)} ms
87
+ prompt eval rate: ${(o / (a / 1e9)).toFixed(2)} tokens/s
88
+ eval count: ${n} token(s)
89
+ eval duration: ${(s / 1e9).toFixed(2)} s
90
+ eval rate: ${(n / (s / 1e9)).toFixed(2)} tokens/s`;
91
+ },
92
+ x = async (t, r, e) => {
93
+ if (r) {
94
+ let s = '',
84
95
  i = '';
85
- for await (let p of t) {
86
- let {type: c, delta: m} = p;
87
- (D.includes(c) && (i += m), c === 'response.output_text.delta' && (r += m), e?.({content: r, reasoning: i}, p));
96
+ for await (let c of t) {
97
+ let {type: p, delta: m} = c;
98
+ (G.includes(p) && (i += m), p === 'response.output_text.delta' && (s += m), c.done && f(c), e?.({content: s, reasoning: i}, c));
88
99
  }
89
- return {content: r, reasoning: i};
100
+ return {content: s, reasoning: i};
90
101
  }
91
102
  let a = (t.output?.[0]?.content ?? t.output?.[0]?.summary)?.[0]?.text,
92
103
  n = t.output_text;
93
- return (e?.({content: n, reasoning: a}, t), {content: n, reasoning: a});
104
+ return (f(t), e?.({content: n, reasoning: a}, t), {content: n, reasoning: a});
94
105
  },
95
- G = async (t, o, e) => {
96
- if (o) {
106
+ J = async (t, r, e) => {
107
+ if (r) {
97
108
  let n = '',
98
- r = '';
109
+ s = '';
99
110
  for await (let i of t) {
100
- let p = i.reasoning ?? i.thinking,
101
- c = i.content ?? i.response;
102
- (p && (r += p), c && (n += c), e?.({content: n, reasoning: r}, i));
111
+ let c = i.reasoning ?? i.thinking,
112
+ p = i.content ?? i.response;
113
+ (c && (s += c), p && (n += p), i.done && f(i), e?.({content: n, reasoning: s}, i));
103
114
  }
104
- return {content: n, reasoning: r};
115
+ return {content: n, reasoning: s};
105
116
  }
106
- let s = t.reasoning ?? t.thinking,
117
+ let o = t.reasoning ?? t.thinking,
107
118
  a = t.content ?? t.response;
108
- return (e?.({content: a, reasoning: s}, t), {content: a, reasoning: s});
119
+ return (f(t), e?.({content: a, reasoning: o}, t), {content: a, reasoning: o});
109
120
  },
110
- J = async (t, o, e) => {
111
- for await (let s of t) e?.(s);
121
+ Q = async (t, r, e) => {
122
+ for await (let o of t) e?.(o);
112
123
  },
113
- u = async (t, o, e) => {
114
- if (o) {
115
- let r = '',
124
+ g = async (t, r, e) => {
125
+ if (r) {
126
+ let s = '',
116
127
  i = '';
117
- for await (let p of t) {
118
- let {message: c} = p,
119
- m = c.reasoning ?? c.thinking,
120
- f = c.content ?? c.response;
121
- (m && (i += m), f && (r += f), e?.({content: r, reasoning: i}, p));
128
+ for await (let c of t) {
129
+ let {message: p} = c,
130
+ m = p.reasoning ?? p.thinking,
131
+ u = p.content ?? p.response;
132
+ (m && (i += m), u && (s += u), c.done && f(c), e?.({content: s, reasoning: i}, c));
122
133
  }
123
- return {content: r, reasoning: i};
134
+ return {content: s, reasoning: i};
124
135
  }
125
- let {message: s} = t,
126
- a = s.reasoning ?? s.thinking,
127
- n = s.content ?? s.response;
128
- return (e?.({content: n, reasoning: a}, t), {content: n, reasoning: a});
136
+ let {message: o} = t,
137
+ a = o.reasoning ?? o.thinking,
138
+ n = o.content ?? o.response;
139
+ return (f(t), e?.({content: n, reasoning: a}, t), {content: n, reasoning: a});
129
140
  },
130
- Q = u;
131
- import C from 'node:fs/promises';
132
- var g = {'.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif', '.webp': 'image/webp', '.bmp': 'image/bmp', '.svg': 'image/svg+xml', '.tiff': 'image/tiff'},
141
+ X = g;
142
+ import I from 'node:fs/promises';
143
+ var l = {'.jpg': 'image/jpeg', '.jpeg': 'image/jpeg', '.png': 'image/png', '.gif': 'image/gif', '.webp': 'image/webp', '.bmp': 'image/bmp', '.svg': 'image/svg+xml', '.tiff': 'image/tiff'},
133
144
  h = '.png',
134
- X = t => Object.fromEntries(Object.entries(t).map(([o, e]) => [e, o])),
135
- I = X(g);
136
- var Z = t => {
137
- let o = /^data:(image\/[a-z]+);base64,(.+)$/i,
138
- e = t.match(o);
139
- return e ? {ext: I[e[1]] ?? h, data: e[2]} : {ext: h, data: t};
145
+ Z = t => Object.fromEntries(Object.entries(t).map(([r, e]) => [e, r])),
146
+ b = Z(l);
147
+ var tt = t => {
148
+ let r = /^data:(image\/[a-z]+);base64,(.+)$/i,
149
+ e = t.match(r);
150
+ return e ? {ext: b[e[1]] ?? h, data: e[2]} : {ext: h, data: t};
140
151
  },
141
- tt = async (t, o = './images', e) => {
152
+ et = async (t, r = './images', e) => {
142
153
  try {
143
- await C.mkdir(o, {recursive: !0});
144
- let {ext: s, data: a} = Z(t),
145
- n = `${o}/image_${e || Date.now()}${s}`;
146
- return (await C.writeFile(n, Buffer.from(a, 'base64')), n);
147
- } catch (s) {
148
- throw (console.error('\u4FDD\u5B58\u56FE\u7247\u5931\u8D25:', s.message), s);
154
+ await I.mkdir(r, {recursive: !0});
155
+ let {ext: o, data: a} = tt(t),
156
+ n = `${r}/image_${e || Date.now()}${o}`;
157
+ return (await I.writeFile(n, Buffer.from(a, 'base64')), n);
158
+ } catch (o) {
159
+ throw (console.error('\u4FDD\u5B58\u56FE\u7247\u5931\u8D25:', o.message), o);
149
160
  }
150
161
  },
151
- L = tt;
152
- import {readFile as et} from 'fs/promises';
153
- import {extname as nt} from 'path';
154
- var ot = async (t, o = !1) => {
162
+ C = et;
163
+ import {readFile as nt} from 'fs/promises';
164
+ import {extname as ot} from 'path';
165
+ var st = async (t, r = !1) => {
155
166
  try {
156
- let e = nt(t).toLowerCase();
157
- if (!g[e]) throw new Error(`\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F: ${e}`);
158
- let s = await et(t, 'base64');
159
- return o ? `data:${g[e]};base64,${s}` : s;
167
+ let e = ot(t).toLowerCase();
168
+ if (!l[e]) throw new Error(`\u4E0D\u652F\u6301\u7684\u56FE\u7247\u683C\u5F0F: ${e}`);
169
+ let o = await nt(t, 'base64');
170
+ return r ? `data:${l[e]};base64,${o}` : o;
160
171
  } catch (e) {
161
172
  throw e.code === 'ENOENT' ? new Error(`\u6587\u4EF6\u4E0D\u5B58\u5728: ${t}`) : e;
162
173
  }
163
174
  },
164
- O = ot;
165
- var st = t => (t?.startsWith('x/') ? 'image' : 'generate'),
166
- E = {
167
- openai: (t, o) => ({
168
- chat: async (e, s = {}, a) => {
169
- let n = o(e, s, 'chat'),
170
- r = b,
175
+ L = st;
176
+ var rt = t => (t?.startsWith('x/') ? 'image' : 'generate'),
177
+ O = {
178
+ openai: (t, r) => ({
179
+ chat: async (e, o = {}, a) => {
180
+ let n = r(e, o, 'chat'),
181
+ s = $,
171
182
  i = await t.chat.completions.create(n);
172
- return r(i, n.stream, a);
183
+ return s(i, n.stream, a);
173
184
  },
174
- responses: async (e, s = {}, a) => {
175
- let n = o(e, s, 'responses'),
176
- r = A,
185
+ responses: async (e, o = {}, a) => {
186
+ let n = r(e, o, 'responses'),
187
+ s = A,
177
188
  i = await t.responses.create(n);
178
- return r(i, n.stream, a);
189
+ return s(i, n.stream, a);
179
190
  },
180
191
  }),
181
- ollama: (t, o) => ({
182
- chat: async (e, s = {}, a) => {
183
- let n = o(e, s, 'chat'),
184
- r = u,
192
+ ollama: (t, r) => ({
193
+ chat: async (e, o = {}, a) => {
194
+ let n = r(e, o, 'chat'),
195
+ s = g,
185
196
  i = await t.chat(n);
186
- return r(i, n.stream, a);
197
+ return s(i, n.stream, a);
187
198
  },
188
- generate: async (e, s = {}, a) => {
189
- let n = o(e, s, 'generate'),
190
- r = d[st(n.model)],
199
+ generate: async (e, o = {}, a) => {
200
+ let n = r(e, o, 'generate'),
201
+ s = _[rt(n.model)],
191
202
  i = await t.generate(n);
192
- return r(i, n.stream, a);
203
+ return s(i, n.stream, a);
193
204
  },
194
- responses: async (e, s = {}, a) => {
195
- let n = o(e, s, 'responses'),
196
- r = x,
205
+ responses: async (e, o = {}, a) => {
206
+ let n = r(e, o, 'responses'),
207
+ s = x,
197
208
  i = await t.responses(n);
198
- return r(i, n.stream, a);
209
+ return s(i, n.stream, a);
199
210
  },
200
- saveImage: L,
201
- imageToBase64: O,
211
+ saveImage: C,
212
+ imageToBase64: L,
202
213
  }),
203
214
  };
204
- var it = {
205
- ollama: {hostKey: 'host', envConfig: w, API: ({apiKey: t, headers: o, ...e}) => new rt({headers: {Authorization: t ? `Bearer ${t}` : void 0, ...o}, ...e})},
206
- openai: {hostKey: 'baseURL', envConfig: _, API: t => new at(t)},
215
+ var ct = {
216
+ ollama: {hostKey: 'host', envConfig: w, API: ({apiKey: t, headers: r, ...e}) => new at({headers: {Authorization: t ? `Bearer ${t}` : void 0, ...r}, ...e})},
217
+ openai: {hostKey: 'baseURL', envConfig: v, API: t => new it(t)},
207
218
  },
208
- ct = (t = 'ollama', o = {}, e = {}) => {
219
+ pt = (t = 'ollama', r = {}, e = {}) => {
209
220
  t = ['ollama', 'openai'].includes(t) ? t : 'ollama';
210
- let {hostKey: s, envConfig: a, API: n} = it[t],
211
- {config: r, params: i, options: p} = a,
212
- {baseURL: c, host: m, dispatcher: f, ...l} = {...r, ...o};
213
- if (((l[s] = m || c), !l[s])) throw Error('\u8BF7\u914D\u7F6E\u5927\u6A21\u578B API \u5730\u5740 host/baseURL !');
214
- let P = n({fetch: y(f), ...l}),
215
- {options: v, extra_body: K, ...$} = e,
216
- j = {params: {...i, ...$}, options: {...p, ...K, ...v}},
217
- k = R(j, t);
218
- return E[t](P, k);
221
+ let {hostKey: o, envConfig: a, API: n} = ct[t],
222
+ {config: s, params: i, options: c} = a,
223
+ {baseURL: p, host: m, dispatcher: u, ...d} = {...s, ...r};
224
+ if (((d[o] = m || p), !d[o])) throw Error('\u8BF7\u914D\u7F6E\u5927\u6A21\u578B API \u5730\u5740 host/baseURL !');
225
+ let E = n({fetch: y(u), ...d}),
226
+ {options: P, extra_body: k, ...F} = e,
227
+ K = {params: {...i, ...F}, options: {...c, ...k, ...P}},
228
+ j = R(K, t);
229
+ return O[t](E, j);
219
230
  },
220
- jt = ct;
221
- export {jt as default, ct as startApi};
231
+ Kt = pt;
232
+ export {Kt as default, pt as startApi};