@fllf/agent-sdk 0.1.1 → 0.1.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 +34 -0
- package/dist/rag/embeddings/openai-compatible-embedder.d.ts +22 -4
- package/dist/rag/embeddings/openai-compatible-embedder.d.ts.map +1 -1
- package/dist/rag/embeddings/openai-compatible-embedder.js +108 -14
- package/dist/rag/embeddings/openai-compatible-embedder.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -47,6 +47,7 @@ OpenAI:
|
|
|
47
47
|
```bash
|
|
48
48
|
OPENAI_API_KEY=...
|
|
49
49
|
OPENAI_MODEL=gpt-4o-mini
|
|
50
|
+
OPENAI_BASE_URL=https://api.openai.com/v1
|
|
50
51
|
OPENAI_EMBEDDING_MODEL=text-embedding-3-small
|
|
51
52
|
```
|
|
52
53
|
|
|
@@ -61,6 +62,11 @@ LOCAL_API_KEY=local-key
|
|
|
61
62
|
If no OpenAI key is configured, the default `LLM` auto-detection falls back to
|
|
62
63
|
the local OpenAI-compatible provider.
|
|
63
64
|
|
|
65
|
+
`OPENAI_BASE_URL` also applies to `OpenAIEmbedder`. For OpenAI-compatible
|
|
66
|
+
embedding providers, configure it as the API root, for example
|
|
67
|
+
`https://gateway.example.test/v1`; the SDK posts embedding requests to
|
|
68
|
+
`{OPENAI_BASE_URL}/embeddings`.
|
|
69
|
+
|
|
64
70
|
## Basic chat integration
|
|
65
71
|
|
|
66
72
|
```ts
|
|
@@ -278,6 +284,34 @@ export const ragPipeline = new DefaultRagPipeline({
|
|
|
278
284
|
});
|
|
279
285
|
```
|
|
280
286
|
|
|
287
|
+
`OpenAIEmbedder` and `OpenAICompatibleEmbedder` send embedding requests with
|
|
288
|
+
`encoding_format: "float"` and validate that the returned embedding length
|
|
289
|
+
matches `embedder.dimensions`. When using a third-party OpenAI-compatible
|
|
290
|
+
embedding model whose dimension is not known by the SDK, pass `dimensions`
|
|
291
|
+
explicitly and create the vector store with the same value:
|
|
292
|
+
|
|
293
|
+
```ts
|
|
294
|
+
import {
|
|
295
|
+
InMemoryVectorStore,
|
|
296
|
+
OpenAICompatibleEmbedder,
|
|
297
|
+
} from '@fllf/agent-sdk';
|
|
298
|
+
|
|
299
|
+
const embedder = new OpenAICompatibleEmbedder({
|
|
300
|
+
apiKey: process.env.OPENAI_API_KEY,
|
|
301
|
+
baseURL: 'https://gateway.example.test/v1',
|
|
302
|
+
model: 'bge-m3',
|
|
303
|
+
dimensions: 1024,
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
const vectorStore = new InMemoryVectorStore({
|
|
307
|
+
dimensions: embedder.dimensions,
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
If you change the embedding model or dimensions, build a new vector collection
|
|
312
|
+
or re-ingest documents. Vectors from different models or dimensions must not be
|
|
313
|
+
mixed in the same index.
|
|
314
|
+
|
|
281
315
|
### Ingest documents
|
|
282
316
|
|
|
283
317
|
Your application should run ingestion from an admin API, background worker, or
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import OpenAI from 'openai';
|
|
2
1
|
import type { Embedder } from './embedder';
|
|
3
|
-
|
|
2
|
+
export interface OpenAIEmbeddingRequestBody {
|
|
3
|
+
model: string;
|
|
4
|
+
input: string[];
|
|
5
|
+
encoding_format: 'float';
|
|
6
|
+
dimensions?: number;
|
|
7
|
+
}
|
|
4
8
|
export interface OpenAIEmbeddingResponseLike {
|
|
5
9
|
data: Array<{
|
|
6
10
|
embedding: unknown;
|
|
@@ -9,9 +13,21 @@ export interface OpenAIEmbeddingResponseLike {
|
|
|
9
13
|
}
|
|
10
14
|
export interface OpenAIEmbeddingsClientLike {
|
|
11
15
|
embeddings: {
|
|
12
|
-
create(body:
|
|
16
|
+
create(body: OpenAIEmbeddingRequestBody): Promise<OpenAIEmbeddingResponseLike>;
|
|
13
17
|
};
|
|
14
18
|
}
|
|
19
|
+
export type OpenAIEmbeddingFetchLike = (input: string, init?: {
|
|
20
|
+
method?: string;
|
|
21
|
+
headers?: Record<string, string>;
|
|
22
|
+
body?: string;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}) => Promise<OpenAIEmbeddingHttpResponseLike>;
|
|
25
|
+
export interface OpenAIEmbeddingHttpResponseLike {
|
|
26
|
+
ok: boolean;
|
|
27
|
+
status: number;
|
|
28
|
+
statusText: string;
|
|
29
|
+
text(): Promise<string>;
|
|
30
|
+
}
|
|
15
31
|
export interface OpenAICompatibleEmbedderOptions {
|
|
16
32
|
apiKey?: string;
|
|
17
33
|
model: string;
|
|
@@ -19,6 +35,9 @@ export interface OpenAICompatibleEmbedderOptions {
|
|
|
19
35
|
baseURL?: string;
|
|
20
36
|
batchSize?: number;
|
|
21
37
|
sendDimensions?: boolean;
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
headers?: Record<string, string>;
|
|
40
|
+
fetch?: OpenAIEmbeddingFetchLike;
|
|
22
41
|
client?: OpenAIEmbeddingsClientLike;
|
|
23
42
|
}
|
|
24
43
|
export interface OpenAIEmbedderOptions extends Omit<OpenAICompatibleEmbedderOptions, 'model'> {
|
|
@@ -42,5 +61,4 @@ export declare class OpenAICompatibleEmbedder implements Embedder {
|
|
|
42
61
|
export declare class OpenAIEmbedder extends OpenAICompatibleEmbedder {
|
|
43
62
|
constructor(options?: OpenAIEmbedderOptions);
|
|
44
63
|
}
|
|
45
|
-
export {};
|
|
46
64
|
//# sourceMappingURL=openai-compatible-embedder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible-embedder.d.ts","sourceRoot":"","sources":["../../../src/rag/embeddings/openai-compatible-embedder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-compatible-embedder.d.ts","sourceRoot":"","sources":["../../../src/rag/embeddings/openai-compatible-embedder.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACR,QAAQ,EACX,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,eAAe,EAAE,OAAO,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IACxC,IAAI,EAAE,KAAK,CAAC;QACR,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACN;AAED,MAAM,WAAW,0BAA0B;IACvC,UAAU,EAAE;QACR,MAAM,CAAC,IAAI,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC,CAAC;KAClF,CAAC;CACL;AAED,MAAM,MAAM,wBAAwB,GAAG,CACnC,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,WAAW,CAAC;CACxB,KACA,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAE9C,MAAM,WAAW,+BAA+B;IAC5C,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC,MAAM,CAAC,EAAE,0BAA0B,CAAC;CACvC;AAED,MAAM,WAAW,qBAAsB,SAAQ,IAAI,CAAC,+BAA+B,EAAE,OAAO,CAAC;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAYD;;;GAGG;AACH,qBAAa,wBAAyB,YAAW,QAAQ;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IACpD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;gBAE7B,OAAO,EAAE,+BAA+B;IAQ9C,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAcpD,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAUnC,gBAAgB;CAkBjC;AAED,qBAAa,cAAe,SAAQ,wBAAwB;gBAC5C,OAAO,GAAE,qBAA0B;CAgBlD"}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.OpenAIEmbedder = exports.OpenAICompatibleEmbedder = void 0;
|
|
7
|
-
const openai_1 = __importDefault(require("openai"));
|
|
8
4
|
const embedder_1 = require("./embedder");
|
|
9
5
|
const DEFAULT_OPENAI_EMBEDDING_MODEL = 'text-embedding-3-small';
|
|
6
|
+
const DEFAULT_OPENAI_BASE_URL = 'https://api.openai.com/v1';
|
|
10
7
|
const DEFAULT_BATCH_SIZE = 100;
|
|
8
|
+
const DEFAULT_TIMEOUT_MS = 30000;
|
|
11
9
|
const DEFAULT_OPENAI_EMBEDDING_DIMENSIONS = {
|
|
12
10
|
'text-embedding-3-small': 1536,
|
|
13
11
|
'text-embedding-3-large': 3072,
|
|
@@ -27,9 +25,8 @@ class OpenAICompatibleEmbedder {
|
|
|
27
25
|
this.model = options.model;
|
|
28
26
|
this.dimensions = resolveEmbeddingDimensions(options.model, options.dimensions);
|
|
29
27
|
this.batchSize = resolveBatchSize(options.batchSize);
|
|
30
|
-
this.sendDimensions = options.sendDimensions
|
|
31
|
-
|
|
32
|
-
this.client = options.client ?? createOpenAIClient(options);
|
|
28
|
+
this.sendDimensions = options.sendDimensions ?? options.dimensions !== undefined;
|
|
29
|
+
this.client = options.client ?? createHttpEmbeddingsClient(options);
|
|
33
30
|
}
|
|
34
31
|
async embedDocuments(texts) {
|
|
35
32
|
const embeddings = [];
|
|
@@ -56,6 +53,7 @@ class OpenAICompatibleEmbedder {
|
|
|
56
53
|
const body = {
|
|
57
54
|
model: this.model,
|
|
58
55
|
input: texts,
|
|
56
|
+
encoding_format: 'float',
|
|
59
57
|
};
|
|
60
58
|
if (this.sendDimensions) {
|
|
61
59
|
body.dimensions = this.dimensions;
|
|
@@ -83,17 +81,22 @@ class OpenAIEmbedder extends OpenAICompatibleEmbedder {
|
|
|
83
81
|
}
|
|
84
82
|
}
|
|
85
83
|
exports.OpenAIEmbedder = OpenAIEmbedder;
|
|
86
|
-
function
|
|
84
|
+
function createHttpEmbeddingsClient(options) {
|
|
87
85
|
if (!options.apiKey) {
|
|
88
86
|
throw new Error('OpenAI-compatible embedder requires an apiKey.');
|
|
89
87
|
}
|
|
90
88
|
const clientOptions = {
|
|
91
89
|
apiKey: options.apiKey,
|
|
90
|
+
baseURL: options.baseURL ?? DEFAULT_OPENAI_BASE_URL,
|
|
91
|
+
timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,
|
|
92
92
|
};
|
|
93
|
-
if (options.
|
|
94
|
-
clientOptions.
|
|
93
|
+
if (options.headers !== undefined) {
|
|
94
|
+
clientOptions.headers = options.headers;
|
|
95
|
+
}
|
|
96
|
+
if (options.fetch !== undefined) {
|
|
97
|
+
clientOptions.fetch = options.fetch;
|
|
95
98
|
}
|
|
96
|
-
return new
|
|
99
|
+
return new HttpOpenAIEmbeddingsClient(clientOptions);
|
|
97
100
|
}
|
|
98
101
|
function resolveEmbeddingDimensions(model, dimensions) {
|
|
99
102
|
if (dimensions !== undefined) {
|
|
@@ -114,9 +117,6 @@ function resolveBatchSize(batchSize) {
|
|
|
114
117
|
}
|
|
115
118
|
return batchSize;
|
|
116
119
|
}
|
|
117
|
-
function supportsDimensionsParam(model) {
|
|
118
|
-
return model === 'text-embedding-3-small' || model === 'text-embedding-3-large';
|
|
119
|
-
}
|
|
120
120
|
function toOrderedEmbeddings(response, expectedSize, expectedDimensions) {
|
|
121
121
|
(0, embedder_1.assertEmbeddingBatchSize)(response.data, expectedSize);
|
|
122
122
|
const ordered = new Array(expectedSize);
|
|
@@ -142,4 +142,98 @@ function readEmbedding(value) {
|
|
|
142
142
|
}
|
|
143
143
|
return value;
|
|
144
144
|
}
|
|
145
|
+
class HttpOpenAIEmbeddingsClient {
|
|
146
|
+
embeddings = {
|
|
147
|
+
create: async (body) => {
|
|
148
|
+
const controller = this.timeoutMs > 0 ? new AbortController() : undefined;
|
|
149
|
+
const timeoutId = controller === undefined
|
|
150
|
+
? undefined
|
|
151
|
+
: setTimeout(() => controller.abort(), this.timeoutMs);
|
|
152
|
+
try {
|
|
153
|
+
const request = {
|
|
154
|
+
method: 'POST',
|
|
155
|
+
headers: this.createHeaders(),
|
|
156
|
+
body: JSON.stringify(body),
|
|
157
|
+
};
|
|
158
|
+
if (controller !== undefined) {
|
|
159
|
+
request.signal = controller.signal;
|
|
160
|
+
}
|
|
161
|
+
const response = await this.fetchImpl(this.url, request);
|
|
162
|
+
const text = await response.text();
|
|
163
|
+
if (!response.ok) {
|
|
164
|
+
throw new Error(`Embedding API failed: ${response.status} ${response.statusText}${formatBody(text)}`);
|
|
165
|
+
}
|
|
166
|
+
return parseEmbeddingResponse(text);
|
|
167
|
+
}
|
|
168
|
+
finally {
|
|
169
|
+
if (timeoutId !== undefined) {
|
|
170
|
+
clearTimeout(timeoutId);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
},
|
|
174
|
+
};
|
|
175
|
+
url;
|
|
176
|
+
apiKey;
|
|
177
|
+
timeoutMs;
|
|
178
|
+
headers;
|
|
179
|
+
fetchImpl;
|
|
180
|
+
constructor(options) {
|
|
181
|
+
this.url = joinURL(options.baseURL, '/embeddings');
|
|
182
|
+
this.apiKey = options.apiKey;
|
|
183
|
+
this.timeoutMs = options.timeoutMs;
|
|
184
|
+
this.headers = { ...(options.headers ?? {}) };
|
|
185
|
+
this.fetchImpl = options.fetch ?? getGlobalFetch();
|
|
186
|
+
}
|
|
187
|
+
createHeaders() {
|
|
188
|
+
const headers = {
|
|
189
|
+
'content-type': 'application/json',
|
|
190
|
+
...this.headers,
|
|
191
|
+
};
|
|
192
|
+
const hasAuthorization = Object.keys(headers).some((key) => key.toLowerCase() === 'authorization');
|
|
193
|
+
if (!hasAuthorization) {
|
|
194
|
+
headers.authorization = `Bearer ${this.apiKey}`;
|
|
195
|
+
}
|
|
196
|
+
return headers;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
function parseEmbeddingResponse(text) {
|
|
200
|
+
const parsed = JSON.parse(text);
|
|
201
|
+
if (!isRecord(parsed) || !Array.isArray(parsed.data)) {
|
|
202
|
+
throw new TypeError('Embedding API response must contain a data array.');
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
data: parsed.data.map((item) => {
|
|
206
|
+
if (!isRecord(item)) {
|
|
207
|
+
throw new TypeError('Embedding API response data items must be objects.');
|
|
208
|
+
}
|
|
209
|
+
const embedding = item.embedding;
|
|
210
|
+
const result = { embedding };
|
|
211
|
+
if (item.index !== undefined) {
|
|
212
|
+
if (typeof item.index !== 'number') {
|
|
213
|
+
throw new TypeError('Embedding API response item index must be a number.');
|
|
214
|
+
}
|
|
215
|
+
result.index = item.index;
|
|
216
|
+
}
|
|
217
|
+
return result;
|
|
218
|
+
}),
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
function joinURL(baseURL, endpoint) {
|
|
222
|
+
return `${baseURL.replace(/\/+$/, '')}/${endpoint.replace(/^\/+/, '')}`;
|
|
223
|
+
}
|
|
224
|
+
function getGlobalFetch() {
|
|
225
|
+
if (typeof fetch !== 'function') {
|
|
226
|
+
throw new Error('OpenAI-compatible embedder requires fetch support or a custom fetch option.');
|
|
227
|
+
}
|
|
228
|
+
return fetch;
|
|
229
|
+
}
|
|
230
|
+
function isRecord(value) {
|
|
231
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
232
|
+
}
|
|
233
|
+
function formatBody(text) {
|
|
234
|
+
if (text.length === 0) {
|
|
235
|
+
return '';
|
|
236
|
+
}
|
|
237
|
+
return `: ${text}`;
|
|
238
|
+
}
|
|
145
239
|
//# sourceMappingURL=openai-compatible-embedder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-compatible-embedder.js","sourceRoot":"","sources":["../../../src/rag/embeddings/openai-compatible-embedder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"openai-compatible-embedder.js","sourceRoot":"","sources":["../../../src/rag/embeddings/openai-compatible-embedder.ts"],"names":[],"mappings":"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"}
|