@layer-ai/core 0.9.1 → 0.9.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/dist/lib/key-resolver.d.ts +6 -2
- package/dist/lib/key-resolver.d.ts.map +1 -1
- package/dist/lib/key-resolver.js +3 -3
- package/dist/services/providers/anthropic-adapter.d.ts.map +1 -1
- package/dist/services/providers/anthropic-adapter.js +4 -3
- package/dist/services/providers/google-adapter.d.ts.map +1 -1
- package/dist/services/providers/google-adapter.js +16 -11
- package/dist/services/providers/mistral-adapter.d.ts.map +1 -1
- package/dist/services/providers/mistral-adapter.js +10 -7
- package/dist/services/providers/openai-adapter.d.ts.map +1 -1
- package/dist/services/providers/openai-adapter.js +13 -9
- package/package.json +2 -2
|
@@ -5,12 +5,16 @@
|
|
|
5
5
|
* Priority: User's BYOK key → Platform key → Error
|
|
6
6
|
*/
|
|
7
7
|
import type { Provider } from './provider-constants.js';
|
|
8
|
+
export interface ResolvedKey {
|
|
9
|
+
key: string;
|
|
10
|
+
usedPlatformKey: boolean;
|
|
11
|
+
}
|
|
8
12
|
/**
|
|
9
13
|
* Resolves the API key to use for a provider
|
|
10
14
|
* @param provider - The provider name
|
|
11
15
|
* @param userId - Optional user ID for BYOK lookup
|
|
12
16
|
* @param platformKey - The platform's API key (fallback)
|
|
13
|
-
* @returns The API key to use
|
|
17
|
+
* @returns The API key to use and whether platform key was used
|
|
14
18
|
*/
|
|
15
|
-
export declare function resolveApiKey(provider: Provider, userId: string | undefined, platformKey: string | undefined): Promise<
|
|
19
|
+
export declare function resolveApiKey(provider: Provider, userId: string | undefined, platformKey: string | undefined): Promise<ResolvedKey>;
|
|
16
20
|
//# sourceMappingURL=key-resolver.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"key-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/key-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"key-resolver.d.ts","sourceRoot":"","sources":["../../src/lib/key-resolver.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGxD,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,WAAW,EAAE,MAAM,GAAG,SAAS,GAC9B,OAAO,CAAC,WAAW,CAAC,CAoBtB"}
|
package/dist/lib/key-resolver.js
CHANGED
|
@@ -10,7 +10,7 @@ import { decrypt } from './encryption.js';
|
|
|
10
10
|
* @param provider - The provider name
|
|
11
11
|
* @param userId - Optional user ID for BYOK lookup
|
|
12
12
|
* @param platformKey - The platform's API key (fallback)
|
|
13
|
-
* @returns The API key to use
|
|
13
|
+
* @returns The API key to use and whether platform key was used
|
|
14
14
|
*/
|
|
15
15
|
export async function resolveApiKey(provider, userId, platformKey) {
|
|
16
16
|
// If userId is provided, check for BYOK key
|
|
@@ -18,7 +18,7 @@ export async function resolveApiKey(provider, userId, platformKey) {
|
|
|
18
18
|
try {
|
|
19
19
|
const byokKey = await getUserProviderKey(userId, provider);
|
|
20
20
|
if (byokKey) {
|
|
21
|
-
return byokKey;
|
|
21
|
+
return { key: byokKey, usedPlatformKey: false };
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
catch (error) {
|
|
@@ -28,7 +28,7 @@ export async function resolveApiKey(provider, userId, platformKey) {
|
|
|
28
28
|
}
|
|
29
29
|
// Fallback to platform key
|
|
30
30
|
if (platformKey) {
|
|
31
|
-
return platformKey;
|
|
31
|
+
return { key: platformKey, usedPlatformKey: true };
|
|
32
32
|
}
|
|
33
33
|
throw new Error(`No API key available for provider: ${provider}`);
|
|
34
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/anthropic-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,UAAU,EACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAsB;IAElD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAI3D;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM1D;IAEF,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAalE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;
|
|
1
|
+
{"version":3,"file":"anthropic-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/anthropic-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,UAAU,EACX,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAsB;IAElD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAI3D;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM1D;IAEF,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;IAalE,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;CA6JzB"}
|
|
@@ -55,10 +55,10 @@ export class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
55
55
|
}
|
|
56
56
|
async call(request, userId) {
|
|
57
57
|
// Resolve API key (BYOK → Platform key)
|
|
58
|
-
const
|
|
58
|
+
const resolved = await resolveApiKey(this.provider, userId, process.env.ANTHROPIC_API_KEY);
|
|
59
59
|
switch (request.type) {
|
|
60
60
|
case 'chat':
|
|
61
|
-
return this.handleChat(request,
|
|
61
|
+
return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
|
|
62
62
|
case 'image':
|
|
63
63
|
throw new Error('Image generation not yet supported by Anthropic');
|
|
64
64
|
case 'embeddings':
|
|
@@ -71,7 +71,7 @@ export class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
71
71
|
throw new Error(`Unknown modality: ${request.type}`);
|
|
72
72
|
}
|
|
73
73
|
}
|
|
74
|
-
async handleChat(request, apiKey) {
|
|
74
|
+
async handleChat(request, apiKey, usedPlatformKey) {
|
|
75
75
|
const startTime = Date.now();
|
|
76
76
|
const client = getAnthropicClient(apiKey);
|
|
77
77
|
const { data: chat, model } = request;
|
|
@@ -211,6 +211,7 @@ export class AnthropicAdapter extends BaseProviderAdapter {
|
|
|
211
211
|
},
|
|
212
212
|
cost,
|
|
213
213
|
latencyMs: Date.now() - startTime,
|
|
214
|
+
usedPlatformKey,
|
|
214
215
|
raw: response,
|
|
215
216
|
};
|
|
216
217
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"google-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/google-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,yBAAyB,EAI1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAkB1E,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAmB;IAE/C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAGF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAO1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAIrE;IAGF,SAAS,CAAC,eAAe,EAAE,MAAM,CAC/B,SAAS,EACT;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC5C,CAKC;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;
|
|
1
|
+
{"version":3,"file":"google-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/google-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,yBAAyB,EAI1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EACZ,SAAS,EACV,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAkB1E,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAmB;IAE/C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAGF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAO1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAIrE;IAGF,SAAS,CAAC,eAAe,EAAE,MAAM,CAC/B,SAAS,EACT;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC5C,CAKC;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;YAwLV,qBAAqB;YAqCrB,gBAAgB;YAsChB,qBAAqB;YAsHrB,kBAAkB;IA2ChC,OAAO,CAAC,KAAK;CAGd"}
|
|
@@ -52,23 +52,23 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
52
52
|
}
|
|
53
53
|
async call(request, userId) {
|
|
54
54
|
// Resolve API key (BYOK → Platform key)
|
|
55
|
-
const
|
|
55
|
+
const resolved = await resolveApiKey(this.provider, userId, process.env.GOOGLE_API_KEY);
|
|
56
56
|
switch (request.type) {
|
|
57
57
|
case 'chat':
|
|
58
|
-
return this.handleChat(request,
|
|
58
|
+
return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
|
|
59
59
|
case 'image':
|
|
60
|
-
return this.handleImageGeneration(request,
|
|
60
|
+
return this.handleImageGeneration(request, resolved.key, resolved.usedPlatformKey);
|
|
61
61
|
case 'embeddings':
|
|
62
|
-
return this.handleEmbeddings(request,
|
|
62
|
+
return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
|
|
63
63
|
case 'tts':
|
|
64
|
-
return this.handleTextToSpeech(request,
|
|
64
|
+
return this.handleTextToSpeech(request, resolved.key, resolved.usedPlatformKey);
|
|
65
65
|
case 'video':
|
|
66
|
-
return this.handleVideoGeneration(request,
|
|
66
|
+
return this.handleVideoGeneration(request, resolved.key, resolved.usedPlatformKey);
|
|
67
67
|
default:
|
|
68
68
|
throw new Error(`Unknown modality: ${request.type}`);
|
|
69
69
|
}
|
|
70
70
|
}
|
|
71
|
-
async handleChat(request, apiKey) {
|
|
71
|
+
async handleChat(request, apiKey, usedPlatformKey) {
|
|
72
72
|
const startTime = Date.now();
|
|
73
73
|
const client = getGoogleClient(apiKey);
|
|
74
74
|
const { data: chat, model } = request;
|
|
@@ -220,10 +220,11 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
220
220
|
},
|
|
221
221
|
cost,
|
|
222
222
|
latencyMs: Date.now() - startTime,
|
|
223
|
+
usedPlatformKey,
|
|
223
224
|
raw: response,
|
|
224
225
|
};
|
|
225
226
|
}
|
|
226
|
-
async handleImageGeneration(request, apiKey) {
|
|
227
|
+
async handleImageGeneration(request, apiKey, usedPlatformKey) {
|
|
227
228
|
const startTime = Date.now();
|
|
228
229
|
const client = getGoogleClient(apiKey);
|
|
229
230
|
const { data: image, model } = request;
|
|
@@ -246,10 +247,11 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
246
247
|
images,
|
|
247
248
|
model: model,
|
|
248
249
|
latencyMs: Date.now() - startTime,
|
|
250
|
+
usedPlatformKey,
|
|
249
251
|
raw: response,
|
|
250
252
|
};
|
|
251
253
|
}
|
|
252
|
-
async handleEmbeddings(request, apiKey) {
|
|
254
|
+
async handleEmbeddings(request, apiKey, usedPlatformKey) {
|
|
253
255
|
const startTime = Date.now();
|
|
254
256
|
const client = getGoogleClient(apiKey);
|
|
255
257
|
const { data: embedding, model } = request;
|
|
@@ -273,10 +275,11 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
273
275
|
totalTokens: 0,
|
|
274
276
|
},
|
|
275
277
|
latencyMs: Date.now() - startTime,
|
|
278
|
+
usedPlatformKey,
|
|
276
279
|
raw: response,
|
|
277
280
|
};
|
|
278
281
|
}
|
|
279
|
-
async handleVideoGeneration(request, apiKey) {
|
|
282
|
+
async handleVideoGeneration(request, apiKey, usedPlatformKey) {
|
|
280
283
|
const startTime = Date.now();
|
|
281
284
|
const client = getGoogleClient(apiKey);
|
|
282
285
|
const { data: video, model } = request;
|
|
@@ -376,10 +379,11 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
376
379
|
videos: videos.filter((v) => v.url),
|
|
377
380
|
model: model,
|
|
378
381
|
latencyMs: Date.now() - startTime,
|
|
382
|
+
usedPlatformKey,
|
|
379
383
|
raw: operation.response,
|
|
380
384
|
};
|
|
381
385
|
}
|
|
382
|
-
async handleTextToSpeech(request, apiKey) {
|
|
386
|
+
async handleTextToSpeech(request, apiKey, usedPlatformKey) {
|
|
383
387
|
const startTime = Date.now();
|
|
384
388
|
const client = getGoogleClient(apiKey);
|
|
385
389
|
const { data: tts, model } = request;
|
|
@@ -408,6 +412,7 @@ export class GoogleAdapter extends BaseProviderAdapter {
|
|
|
408
412
|
},
|
|
409
413
|
model: model,
|
|
410
414
|
latencyMs: Date.now() - startTime,
|
|
415
|
+
usedPlatformKey,
|
|
411
416
|
raw: response,
|
|
412
417
|
};
|
|
413
418
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mistral-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/mistral-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EAEb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,cAAe,SAAQ,mBAAmB;IACrD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAoB;IAEhD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAGF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlD;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAsB5D,UAAU;
|
|
1
|
+
{"version":3,"file":"mistral-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/mistral-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,YAAY,EAEb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,cAAe,SAAQ,mBAAmB;IACrD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAoB;IAEhD,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAGF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAM1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIlD;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAsB5D,UAAU;YAiMV,gBAAgB;YA0ChB,SAAS;CA8ExB"}
|
|
@@ -46,14 +46,14 @@ export class MistralAdapter extends BaseProviderAdapter {
|
|
|
46
46
|
}
|
|
47
47
|
async call(request, userId) {
|
|
48
48
|
// Resolve API key (BYOK → Platform key)
|
|
49
|
-
const
|
|
49
|
+
const resolved = await resolveApiKey(this.provider, userId, process.env.MISTRAL_API_KEY);
|
|
50
50
|
switch (request.type) {
|
|
51
51
|
case 'chat':
|
|
52
|
-
return this.handleChat(request,
|
|
52
|
+
return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
|
|
53
53
|
case 'embeddings':
|
|
54
|
-
return this.handleEmbeddings(request,
|
|
54
|
+
return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
|
|
55
55
|
case 'ocr':
|
|
56
|
-
return this.handleOCR(request,
|
|
56
|
+
return this.handleOCR(request, resolved.key, resolved.usedPlatformKey);
|
|
57
57
|
case 'image':
|
|
58
58
|
throw new Error('Image generation not supported by Mistral');
|
|
59
59
|
case 'tts':
|
|
@@ -64,7 +64,7 @@ export class MistralAdapter extends BaseProviderAdapter {
|
|
|
64
64
|
throw new Error(`Unknown modality: ${request.type}`);
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
|
-
async handleChat(request, apiKey) {
|
|
67
|
+
async handleChat(request, apiKey, usedPlatformKey) {
|
|
68
68
|
const startTime = Date.now();
|
|
69
69
|
const mistral = getMistralClient(apiKey);
|
|
70
70
|
const { data: chat, model } = request;
|
|
@@ -214,10 +214,11 @@ export class MistralAdapter extends BaseProviderAdapter {
|
|
|
214
214
|
},
|
|
215
215
|
cost,
|
|
216
216
|
latencyMs: Date.now() - startTime,
|
|
217
|
+
usedPlatformKey,
|
|
217
218
|
raw: response,
|
|
218
219
|
};
|
|
219
220
|
}
|
|
220
|
-
async handleEmbeddings(request, apiKey) {
|
|
221
|
+
async handleEmbeddings(request, apiKey, usedPlatformKey) {
|
|
221
222
|
const startTime = Date.now();
|
|
222
223
|
const mistral = getMistralClient(apiKey);
|
|
223
224
|
const { data: embedding, model } = request;
|
|
@@ -244,10 +245,11 @@ export class MistralAdapter extends BaseProviderAdapter {
|
|
|
244
245
|
},
|
|
245
246
|
cost,
|
|
246
247
|
latencyMs: Date.now() - startTime,
|
|
248
|
+
usedPlatformKey,
|
|
247
249
|
raw: response,
|
|
248
250
|
};
|
|
249
251
|
}
|
|
250
|
-
async handleOCR(request, apiKey) {
|
|
252
|
+
async handleOCR(request, apiKey, usedPlatformKey) {
|
|
251
253
|
const startTime = Date.now();
|
|
252
254
|
const mistral = getMistralClient(apiKey);
|
|
253
255
|
const { data: ocr, model } = request;
|
|
@@ -313,6 +315,7 @@ export class MistralAdapter extends BaseProviderAdapter {
|
|
|
313
315
|
},
|
|
314
316
|
model: response.model || ocrModel,
|
|
315
317
|
latencyMs: Date.now() - startTime,
|
|
318
|
+
usedPlatformKey,
|
|
316
319
|
raw: response,
|
|
317
320
|
};
|
|
318
321
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAmB;IAE/C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAEF,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAIxD;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAK1D;IAEF,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAQpD;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAG1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAGtD;IAEF,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAKpD;IAEF,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAOxD;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;
|
|
1
|
+
{"version":3,"file":"openai-adapter.d.ts","sourceRoot":"","sources":["../../../src/services/providers/openai-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EACL,YAAY,EACZ,aAAa,EACb,IAAI,EACJ,WAAW,EACX,SAAS,EACT,YAAY,EACZ,UAAU,EACV,SAAS,EACT,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAY,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAoB1E,qBAAa,aAAc,SAAQ,mBAAmB;IACpD,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAmB;IAE/C,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAQ1C;IAEF,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAIxD;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAK1D;IAEF,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAQpD;IAEF,SAAS,CAAC,oBAAoB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAG1D;IAEF,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAGtD;IAEF,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,CAKpD;IAEF,SAAS,CAAC,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAOxD;IAEI,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;YAoB5D,UAAU;YA4GV,qBAAqB;YA8BrB,gBAAgB;YAkChB,kBAAkB;CA+BjC"}
|
|
@@ -74,23 +74,23 @@ export class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
74
74
|
}
|
|
75
75
|
async call(request, userId) {
|
|
76
76
|
// Resolve API key (BYOK → Platform key)
|
|
77
|
-
const
|
|
77
|
+
const resolved = await resolveApiKey(this.provider, userId, process.env.OPENAI_API_KEY);
|
|
78
78
|
switch (request.type) {
|
|
79
79
|
case 'chat':
|
|
80
|
-
return this.handleChat(request,
|
|
80
|
+
return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
|
|
81
81
|
case 'image':
|
|
82
|
-
return this.handleImageGeneration(request,
|
|
82
|
+
return this.handleImageGeneration(request, resolved.key, resolved.usedPlatformKey);
|
|
83
83
|
case 'embeddings':
|
|
84
|
-
return this.handleEmbeddings(request,
|
|
84
|
+
return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
|
|
85
85
|
case 'tts':
|
|
86
|
-
return this.handleTextToSpeech(request,
|
|
86
|
+
return this.handleTextToSpeech(request, resolved.key, resolved.usedPlatformKey);
|
|
87
87
|
case 'video':
|
|
88
88
|
throw new Error('Video generation not yet supported by OpenAI');
|
|
89
89
|
default:
|
|
90
90
|
throw new Error(`Unknown modality: ${request.type}`);
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
-
async handleChat(request, apiKey) {
|
|
93
|
+
async handleChat(request, apiKey, usedPlatformKey) {
|
|
94
94
|
const startTime = Date.now();
|
|
95
95
|
const client = getOpenAIClient(apiKey);
|
|
96
96
|
const { data: chat, model } = request;
|
|
@@ -181,10 +181,11 @@ export class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
181
181
|
},
|
|
182
182
|
cost,
|
|
183
183
|
latencyMs: Date.now() - startTime,
|
|
184
|
+
usedPlatformKey,
|
|
184
185
|
raw: response,
|
|
185
186
|
};
|
|
186
187
|
}
|
|
187
|
-
async handleImageGeneration(request, apiKey) {
|
|
188
|
+
async handleImageGeneration(request, apiKey, usedPlatformKey) {
|
|
188
189
|
const startTime = Date.now();
|
|
189
190
|
const client = getOpenAIClient(apiKey);
|
|
190
191
|
const { data: image, model } = request;
|
|
@@ -206,10 +207,11 @@ export class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
206
207
|
})),
|
|
207
208
|
model: model,
|
|
208
209
|
latencyMs: Date.now() - startTime,
|
|
210
|
+
usedPlatformKey,
|
|
209
211
|
raw: response,
|
|
210
212
|
};
|
|
211
213
|
}
|
|
212
|
-
async handleEmbeddings(request, apiKey) {
|
|
214
|
+
async handleEmbeddings(request, apiKey, usedPlatformKey) {
|
|
213
215
|
const startTime = Date.now();
|
|
214
216
|
const client = getOpenAIClient(apiKey);
|
|
215
217
|
const { data: embedding, model } = request;
|
|
@@ -234,10 +236,11 @@ export class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
234
236
|
},
|
|
235
237
|
cost,
|
|
236
238
|
latencyMs: Date.now() - startTime,
|
|
239
|
+
usedPlatformKey,
|
|
237
240
|
raw: response,
|
|
238
241
|
};
|
|
239
242
|
}
|
|
240
|
-
async handleTextToSpeech(request, apiKey) {
|
|
243
|
+
async handleTextToSpeech(request, apiKey, usedPlatformKey) {
|
|
241
244
|
const startTime = Date.now();
|
|
242
245
|
const client = getOpenAIClient(apiKey);
|
|
243
246
|
const { data: tts, model } = request;
|
|
@@ -260,6 +263,7 @@ export class OpenAIAdapter extends BaseProviderAdapter {
|
|
|
260
263
|
},
|
|
261
264
|
model: model,
|
|
262
265
|
latencyMs: Date.now() - startTime,
|
|
266
|
+
usedPlatformKey,
|
|
263
267
|
};
|
|
264
268
|
}
|
|
265
269
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layer-ai/core",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.2",
|
|
4
4
|
"description": "Core API routes and services for Layer AI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"nanoid": "^5.0.4",
|
|
37
37
|
"openai": "^4.24.0",
|
|
38
38
|
"pg": "^8.11.3",
|
|
39
|
-
"@layer-ai/sdk": "^1.0.
|
|
39
|
+
"@layer-ai/sdk": "^1.0.3"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/bcryptjs": "^2.4.6",
|