@layer-ai/core 0.9.0 → 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.
@@ -46,6 +46,7 @@ export declare const db: {
46
46
  authTag: string;
47
47
  }, keyPrefix: string): Promise<ProviderKey | null>;
48
48
  deleteProviderKey(userId: string, provider: string): Promise<boolean>;
49
+ toggleProviderKeyActive(userId: string, provider: string, isActive: boolean): Promise<ProviderKey | null>;
49
50
  hardDeleteProviderKey(userId: string, provider: string): Promise<boolean>;
50
51
  getDeletedProviderKeys(daysOld?: number): Promise<ProviderKey[]>;
51
52
  createGateHistory(gateId: string, gate: Partial<Gate>, appliedBy: "user" | "auto", changedFields?: string[]): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/lib/db/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../../src/lib/db/postgres.ts"],"names":[],"mappings":"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"}
@@ -254,7 +254,7 @@ export const db = {
254
254
  },
255
255
  async updateProviderKey(userId, provider, encryptedKey, keyPrefix) {
256
256
  const result = await getPool().query(`UPDATE provider_keys
257
- SET encrypted_key = $3, key_prefix = $4, deleted_at = NULL, updated_at = NOW()
257
+ SET encrypted_key = $3, key_prefix = $4, deleted_at = NULL, is_active = true, updated_at = NOW()
258
258
  WHERE user_id = $1 AND provider = $2
259
259
  RETURNING *`, [userId, provider, JSON.stringify(encryptedKey), keyPrefix]);
260
260
  return result.rows[0] ? toCamelCase(result.rows[0]) : null;
@@ -263,6 +263,13 @@ export const db = {
263
263
  const result = await getPool().query('UPDATE provider_keys SET deleted_at = NOW() WHERE user_id = $1 AND provider = $2 AND deleted_at IS NULL', [userId, provider]);
264
264
  return (result.rowCount ?? 0) > 0;
265
265
  },
266
+ async toggleProviderKeyActive(userId, provider, isActive) {
267
+ const result = await getPool().query(`UPDATE provider_keys
268
+ SET is_active = $3, updated_at = NOW()
269
+ WHERE user_id = $1 AND provider = $2 AND deleted_at IS NULL
270
+ RETURNING *`, [userId, provider, isActive]);
271
+ return result.rows[0] ? toCamelCase(result.rows[0]) : null;
272
+ },
266
273
  async hardDeleteProviderKey(userId, provider) {
267
274
  const result = await getPool().query('DELETE FROM provider_keys WHERE user_id = $1 AND provider = $2', [userId, provider]);
268
275
  return (result.rowCount ?? 0) > 0;
@@ -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<string>;
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,MAAM,CAAC,CAoBjB"}
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"}
@@ -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
  }
@@ -50,6 +50,10 @@ async function getUserProviderKey(userId, provider) {
50
50
  if (!providerKey) {
51
51
  return null;
52
52
  }
53
+ // Check if key is active
54
+ if (!providerKey.isActive) {
55
+ return null;
56
+ }
53
57
  // Decrypt the key
54
58
  const decryptedKey = decrypt(providerKey.encryptedKey, encryptionKey);
55
59
  return decryptedKey;
@@ -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;CA4JzB"}
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 apiKey = await resolveApiKey(this.provider, userId, process.env.ANTHROPIC_API_KEY);
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, apiKey);
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;YAsLV,qBAAqB;YAmCrB,gBAAgB;YAoChB,qBAAqB;YAoHrB,kBAAkB;IAyChC,OAAO,CAAC,KAAK;CAGd"}
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 apiKey = await resolveApiKey(this.provider, userId, process.env.GOOGLE_API_KEY);
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, apiKey);
58
+ return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
59
59
  case 'image':
60
- return this.handleImageGeneration(request, apiKey);
60
+ return this.handleImageGeneration(request, resolved.key, resolved.usedPlatformKey);
61
61
  case 'embeddings':
62
- return this.handleEmbeddings(request, apiKey);
62
+ return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
63
63
  case 'tts':
64
- return this.handleTextToSpeech(request, apiKey);
64
+ return this.handleTextToSpeech(request, resolved.key, resolved.usedPlatformKey);
65
65
  case 'video':
66
- return this.handleVideoGeneration(request, apiKey);
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;YA+LV,gBAAgB;YAwChB,SAAS;CA4ExB"}
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 apiKey = await resolveApiKey(this.provider, userId, process.env.MISTRAL_API_KEY);
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, apiKey);
52
+ return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
53
53
  case 'embeddings':
54
- return this.handleEmbeddings(request, apiKey);
54
+ return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
55
55
  case 'ocr':
56
- return this.handleOCR(request, apiKey);
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;YA2GV,qBAAqB;YA6BrB,gBAAgB;YAiChB,kBAAkB;CA8BjC"}
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 apiKey = await resolveApiKey(this.provider, userId, process.env.OPENAI_API_KEY);
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, apiKey);
80
+ return this.handleChat(request, resolved.key, resolved.usedPlatformKey);
81
81
  case 'image':
82
- return this.handleImageGeneration(request, apiKey);
82
+ return this.handleImageGeneration(request, resolved.key, resolved.usedPlatformKey);
83
83
  case 'embeddings':
84
- return this.handleEmbeddings(request, apiKey);
84
+ return this.handleEmbeddings(request, resolved.key, resolved.usedPlatformKey);
85
85
  case 'tts':
86
- return this.handleTextToSpeech(request, apiKey);
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.0",
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.1"
39
+ "@layer-ai/sdk": "^1.0.3"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@types/bcryptjs": "^2.4.6",