@kybernesis/brain-embed-openai 0.8.0 → 0.8.1
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/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -6
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.d.ts
CHANGED
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
* setEmbeddingProvider(createOpenAIEmbedder());
|
|
21
21
|
*/
|
|
22
22
|
import type { TenantContext } from '@kybernesis/brain-contracts';
|
|
23
|
+
import { EMBEDDING_MODEL } from '@kybernesis/brain-contracts';
|
|
23
24
|
import type { EmbeddingProvider } from '@kybernesis/brain-core';
|
|
24
|
-
export
|
|
25
|
+
export { EMBEDDING_MODEL };
|
|
25
26
|
/** The slice of the OpenAI SDK surface we use — keeps us decoupled from its types. */
|
|
26
27
|
export interface OpenAILike {
|
|
27
28
|
embeddings: {
|
|
@@ -37,11 +38,25 @@ export interface OpenAILike {
|
|
|
37
38
|
}
|
|
38
39
|
/** Build an OpenAI-like client from a resolved key. May be async (the default dynamic-imports `openai`). */
|
|
39
40
|
export type OpenAIClientFactory = (apiKey: string) => OpenAILike | Promise<OpenAILike>;
|
|
41
|
+
/** Where a swallowed embedding failure happened. */
|
|
42
|
+
export type EmbedErrorStage = 'sdk-load' | 'api-call';
|
|
40
43
|
export interface OpenAIEmbedderOptions {
|
|
41
44
|
/** Inject a client factory (tests pass a fake; default dynamically imports `openai`). */
|
|
42
45
|
clientFactory?: OpenAIClientFactory;
|
|
43
46
|
/** Override the embedding model (default `text-embedding-3-small`). */
|
|
44
47
|
model?: string;
|
|
48
|
+
/**
|
|
49
|
+
* Optional failure hook. Without it, failures degrade silently to `null`
|
|
50
|
+
* (the contract's "no embedding" path) — which is operationally blind: a
|
|
51
|
+
* missing `openai` SDK, a revoked key, and a network error all look the same.
|
|
52
|
+
* Wire this to your logger to tell them apart. The hook receives the raw
|
|
53
|
+
* error; do not log it somewhere that would expose request headers.
|
|
54
|
+
*/
|
|
55
|
+
onError?: (info: {
|
|
56
|
+
stage: EmbedErrorStage;
|
|
57
|
+
tenantSlug: string;
|
|
58
|
+
error: unknown;
|
|
59
|
+
}) => void;
|
|
45
60
|
}
|
|
46
61
|
/** Resolve the OpenAI key for a tenant: `<home>/.env` first, then `process.env`. */
|
|
47
62
|
export declare function resolveOpenAIKey(t: TenantContext): string | null;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAsC,MAAM,6BAA6B,CAAC;AAClG,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,OAAO,EAAE,eAAe,EAAE,CAAC;AAE3B,sFAAsF;AACtF,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE;QACV,MAAM,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GAAG,OAAO,CAAC;YAAE,IAAI,EAAE,KAAK,CAAC;gBAAE,SAAS,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC,CAAA;SAAE,CAAC,CAAC;KACnG,CAAC;CACH;AAED,4GAA4G;AAC5G,MAAM,MAAM,mBAAmB,GAAG,CAAC,MAAM,EAAE,MAAM,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEvF,oDAAoD;AACpD,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,yFAAyF;IACzF,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC;CAC1F;AAiCD,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,GAAG,IAAI,CAKhE;AAcD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,GAAE,qBAA0B,GAAG,iBAAiB,CAuCxF"}
|
package/dist/index.js
CHANGED
|
@@ -21,9 +21,10 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { existsSync, readFileSync } from 'node:fs';
|
|
23
23
|
import { join } from 'node:path';
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
24
|
+
import { EMBEDDING_MODEL, EMBEDDING_DIM, EMBEDDING_INPUT_CAP } from '@kybernesis/brain-contracts';
|
|
25
|
+
// Single source of truth for these lives in brain-contracts (the schema-binding
|
|
26
|
+
// invariants). Re-export the model alias for convenience; never redeclare them.
|
|
27
|
+
export { EMBEDDING_MODEL };
|
|
27
28
|
/**
|
|
28
29
|
* Parse `<home>/.env` into a key→value map. Trivial KEY=VALUE parser (strips
|
|
29
30
|
* `#` comments and surrounding quotes) — we only need OPENAI_API_KEY, so a full
|
|
@@ -85,6 +86,7 @@ async function defaultClientFactory(apiKey) {
|
|
|
85
86
|
export function createOpenAIEmbedder(opts = {}) {
|
|
86
87
|
const model = opts.model ?? EMBEDDING_MODEL;
|
|
87
88
|
const makeClient = opts.clientFactory ?? defaultClientFactory;
|
|
89
|
+
const onError = opts.onError;
|
|
88
90
|
const clients = new Map(); // by t.slug; null = resolved-no-key
|
|
89
91
|
async function getClient(t) {
|
|
90
92
|
if (clients.has(t.slug))
|
|
@@ -99,7 +101,8 @@ export function createOpenAIEmbedder(opts = {}) {
|
|
|
99
101
|
clients.set(t.slug, client);
|
|
100
102
|
return client;
|
|
101
103
|
}
|
|
102
|
-
catch {
|
|
104
|
+
catch (error) {
|
|
105
|
+
onError?.({ stage: 'sdk-load', tenantSlug: t.slug, error });
|
|
103
106
|
clients.set(t.slug, null);
|
|
104
107
|
return null;
|
|
105
108
|
}
|
|
@@ -110,13 +113,14 @@ export function createOpenAIEmbedder(opts = {}) {
|
|
|
110
113
|
if (!client)
|
|
111
114
|
return null;
|
|
112
115
|
try {
|
|
113
|
-
const res = await client.embeddings.create({ model, input: text.slice(0,
|
|
116
|
+
const res = await client.embeddings.create({ model, input: text.slice(0, EMBEDDING_INPUT_CAP) });
|
|
114
117
|
const vec = res.data?.[0]?.embedding ?? null;
|
|
115
118
|
if (!vec || vec.length !== EMBEDDING_DIM)
|
|
116
119
|
return null;
|
|
117
120
|
return vec;
|
|
118
121
|
}
|
|
119
|
-
catch {
|
|
122
|
+
catch (error) {
|
|
123
|
+
onError?.({ stage: 'api-call', tenantSlug: t.slug, error });
|
|
120
124
|
return null;
|
|
121
125
|
}
|
|
122
126
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kybernesis/brain-embed-openai",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"description": "OpenAI text-embedding provider for brain-core (inference-plane EmbeddingProvider)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "David Cruwys (AppyDave)",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
],
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"openai": ">=4",
|
|
31
|
-
"@kybernesis/brain-contracts": "0.8.
|
|
32
|
-
"@kybernesis/brain-core": "0.8.
|
|
31
|
+
"@kybernesis/brain-contracts": "0.8.1",
|
|
32
|
+
"@kybernesis/brain-core": "0.8.1"
|
|
33
33
|
},
|
|
34
34
|
"peerDependenciesMeta": {
|
|
35
35
|
"openai": {
|
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
}
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
|
-
"@kybernesis/brain-contracts": "0.8.
|
|
41
|
-
"@kybernesis/brain-core": "0.8.
|
|
42
|
-
"@kybernesis/brain-testkit": "0.8.
|
|
40
|
+
"@kybernesis/brain-contracts": "0.8.1",
|
|
41
|
+
"@kybernesis/brain-core": "0.8.1",
|
|
42
|
+
"@kybernesis/brain-testkit": "0.8.1"
|
|
43
43
|
},
|
|
44
44
|
"publishConfig": {
|
|
45
45
|
"access": "public"
|