@actuate-media/cms-core 0.42.0 → 0.44.0
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/__tests__/ai/ai.test.d.ts +2 -0
- package/dist/__tests__/ai/ai.test.d.ts.map +1 -0
- package/dist/__tests__/ai/ai.test.js +261 -0
- package/dist/__tests__/ai/ai.test.js.map +1 -0
- package/dist/__tests__/ai/resolve.test.d.ts +2 -0
- package/dist/__tests__/ai/resolve.test.d.ts.map +1 -0
- package/dist/__tests__/ai/resolve.test.js +164 -0
- package/dist/__tests__/ai/resolve.test.js.map +1 -0
- package/dist/ai/catalog.d.ts +29 -0
- package/dist/ai/catalog.d.ts.map +1 -0
- package/dist/ai/catalog.js +340 -0
- package/dist/ai/catalog.js.map +1 -0
- package/dist/ai/config-store.d.ts +55 -0
- package/dist/ai/config-store.d.ts.map +1 -0
- package/dist/ai/config-store.js +177 -0
- package/dist/ai/config-store.js.map +1 -0
- package/dist/ai/feature-defaults.d.ts +20 -0
- package/dist/ai/feature-defaults.d.ts.map +1 -0
- package/dist/ai/feature-defaults.js +104 -0
- package/dist/ai/feature-defaults.js.map +1 -0
- package/dist/ai/index.d.ts +14 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/ai/index.js +14 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/models.d.ts +37 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +126 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/providers/anthropic.d.ts +9 -0
- package/dist/ai/providers/anthropic.d.ts.map +1 -0
- package/dist/ai/providers/anthropic.js +36 -0
- package/dist/ai/providers/anthropic.js.map +1 -0
- package/dist/ai/providers/custom.d.ts +11 -0
- package/dist/ai/providers/custom.d.ts.map +1 -0
- package/dist/ai/providers/custom.js +70 -0
- package/dist/ai/providers/custom.js.map +1 -0
- package/dist/ai/providers/http.d.ts +32 -0
- package/dist/ai/providers/http.d.ts.map +1 -0
- package/dist/ai/providers/http.js +90 -0
- package/dist/ai/providers/http.js.map +1 -0
- package/dist/ai/providers/index.d.ts +16 -0
- package/dist/ai/providers/index.d.ts.map +1 -0
- package/dist/ai/providers/index.js +25 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/openai.d.ts +10 -0
- package/dist/ai/providers/openai.d.ts.map +1 -0
- package/dist/ai/providers/openai.js +41 -0
- package/dist/ai/providers/openai.js.map +1 -0
- package/dist/ai/providers/xai.d.ts +9 -0
- package/dist/ai/providers/xai.d.ts.map +1 -0
- package/dist/ai/providers/xai.js +35 -0
- package/dist/ai/providers/xai.js.map +1 -0
- package/dist/ai/resolve.d.ts +41 -0
- package/dist/ai/resolve.d.ts.map +1 -0
- package/dist/ai/resolve.js +142 -0
- package/dist/ai/resolve.js.map +1 -0
- package/dist/ai/types.d.ts +161 -0
- package/dist/ai/types.d.ts.map +1 -0
- package/dist/ai/types.js +11 -0
- package/dist/ai/types.js.map +1 -0
- package/dist/ai/usage.d.ts +18 -0
- package/dist/ai/usage.d.ts.map +1 -0
- package/dist/ai/usage.js +70 -0
- package/dist/ai/usage.js.map +1 -0
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +523 -0
- package/dist/api/handlers.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider adapter dispatcher. Selects the right adapter by provider key and
|
|
3
|
+
* exposes a uniform `testConnection` / `listModels` surface to the catalog and
|
|
4
|
+
* route layers.
|
|
5
|
+
*/
|
|
6
|
+
import * as anthropic from './anthropic.js';
|
|
7
|
+
import * as custom from './custom.js';
|
|
8
|
+
import * as openai from './openai.js';
|
|
9
|
+
import * as xai from './xai.js';
|
|
10
|
+
const ADAPTERS = {
|
|
11
|
+
openai,
|
|
12
|
+
anthropic,
|
|
13
|
+
xai,
|
|
14
|
+
custom,
|
|
15
|
+
};
|
|
16
|
+
export function getAdapter(provider) {
|
|
17
|
+
return ADAPTERS[provider] ?? custom;
|
|
18
|
+
}
|
|
19
|
+
export function testConnection(provider, ctx) {
|
|
20
|
+
return getAdapter(provider).testConnection(ctx);
|
|
21
|
+
}
|
|
22
|
+
export function listModels(provider, ctx) {
|
|
23
|
+
return getAdapter(provider).listModels(ctx);
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAC3C,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AAErC,OAAO,KAAK,MAAM,MAAM,aAAa,CAAA;AACrC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAA;AAS/B,MAAM,QAAQ,GAA2C;IACvD,MAAM;IACN,SAAS;IACT,GAAG;IACH,MAAM;CACP,CAAA;AAED,MAAM,UAAU,UAAU,CAAC,QAAuB;IAChD,OAAO,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,GAAmB;IAEnB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAA;AACjD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,QAAuB,EAAE,GAAmB;IACrE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;AAC7C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI (and OpenAI-compatible) adapter. Uses the `/v1/models` listing
|
|
3
|
+
* endpoint with Bearer auth. Hostname is fixed (api.openai.com) so no SSRF
|
|
4
|
+
* validation is needed here.
|
|
5
|
+
*/
|
|
6
|
+
import type { AIConnectionTestResult } from '../types.js';
|
|
7
|
+
import { type AdapterContext } from './http.js';
|
|
8
|
+
export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
9
|
+
export declare function listModels(ctx: AdapterContext): Promise<string[]>;
|
|
10
|
+
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,WAAW,CAAA;AAWlB,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAqBzF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAQvE"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI (and OpenAI-compatible) adapter. Uses the `/v1/models` listing
|
|
3
|
+
* endpoint with Bearer auth. Hostname is fixed (api.openai.com) so no SSRF
|
|
4
|
+
* validation is needed here.
|
|
5
|
+
*/
|
|
6
|
+
import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
|
|
7
|
+
const OPENAI_BASE = 'https://api.openai.com/v1';
|
|
8
|
+
function headers(ctx) {
|
|
9
|
+
const h = { authorization: `Bearer ${ctx.apiKey}` };
|
|
10
|
+
if (ctx.organizationId)
|
|
11
|
+
h['openai-organization'] = ctx.organizationId;
|
|
12
|
+
if (ctx.projectId)
|
|
13
|
+
h['openai-project'] = ctx.projectId;
|
|
14
|
+
return h;
|
|
15
|
+
}
|
|
16
|
+
export async function testConnection(ctx) {
|
|
17
|
+
const testedAt = new Date().toISOString();
|
|
18
|
+
if (!ctx.apiKey) {
|
|
19
|
+
return { ok: false, status: 'needs_setup', message: messageFromStatus('needs_setup'), testedAt };
|
|
20
|
+
}
|
|
21
|
+
try {
|
|
22
|
+
const res = await timedFetch(`${OPENAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
|
|
23
|
+
const status = statusFromHttp(res.status);
|
|
24
|
+
return { ok: status === 'connected', status, message: messageFromStatus(status), testedAt };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
return {
|
|
28
|
+
ok: false,
|
|
29
|
+
status: 'provider_down',
|
|
30
|
+
message: messageFromStatus('provider_down'),
|
|
31
|
+
testedAt,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export async function listModels(ctx) {
|
|
36
|
+
const res = await timedFetch(`${OPENAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
|
|
37
|
+
if (!res.ok)
|
|
38
|
+
throw new Error(`OpenAI model listing failed (${res.status})`);
|
|
39
|
+
return extractModelIds(await res.json());
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAElB,MAAM,WAAW,GAAG,2BAA2B,CAAA;AAE/C,SAAS,OAAO,CAAC,GAAmB;IAClC,MAAM,CAAC,GAA2B,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;IAC3E,IAAI,GAAG,CAAC,cAAc;QAAE,CAAC,CAAC,qBAAqB,CAAC,GAAG,GAAG,CAAC,cAAc,CAAA;IACrE,IAAI,GAAG,CAAC,SAAS;QAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,GAAG,CAAC,SAAS,CAAA;IACtD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,WAAW,SAAS,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC;YAC3C,QAAQ;SACT,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB;IAClD,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,WAAW,SAAS,EACvB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;IACD,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IAC3E,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI (Grok) adapter. xAI's API is OpenAI-compatible: `/v1/models` with Bearer
|
|
3
|
+
* auth. Hostname is fixed (api.x.ai).
|
|
4
|
+
*/
|
|
5
|
+
import type { AIConnectionTestResult } from '../types.js';
|
|
6
|
+
import { type AdapterContext } from './http.js';
|
|
7
|
+
export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
8
|
+
export declare function listModels(ctx: AdapterContext): Promise<string[]>;
|
|
9
|
+
//# sourceMappingURL=xai.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EAKpB,MAAM,WAAW,CAAA;AAQlB,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAqBzF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAIvE"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* xAI (Grok) adapter. xAI's API is OpenAI-compatible: `/v1/models` with Bearer
|
|
3
|
+
* auth. Hostname is fixed (api.x.ai).
|
|
4
|
+
*/
|
|
5
|
+
import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
|
|
6
|
+
const XAI_BASE = 'https://api.x.ai/v1';
|
|
7
|
+
function headers(ctx) {
|
|
8
|
+
return { authorization: `Bearer ${ctx.apiKey}` };
|
|
9
|
+
}
|
|
10
|
+
export async function testConnection(ctx) {
|
|
11
|
+
const testedAt = new Date().toISOString();
|
|
12
|
+
if (!ctx.apiKey) {
|
|
13
|
+
return { ok: false, status: 'needs_setup', message: messageFromStatus('needs_setup'), testedAt };
|
|
14
|
+
}
|
|
15
|
+
try {
|
|
16
|
+
const res = await timedFetch(`${XAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
|
|
17
|
+
const status = statusFromHttp(res.status);
|
|
18
|
+
return { ok: status === 'connected', status, message: messageFromStatus(status), testedAt };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return {
|
|
22
|
+
ok: false,
|
|
23
|
+
status: 'provider_down',
|
|
24
|
+
message: messageFromStatus('provider_down'),
|
|
25
|
+
testedAt,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export async function listModels(ctx) {
|
|
30
|
+
const res = await timedFetch(`${XAI_BASE}/models`, { method: 'GET', headers: headers(ctx) }, ctx);
|
|
31
|
+
if (!res.ok)
|
|
32
|
+
throw new Error(`xAI model listing failed (${res.status})`);
|
|
33
|
+
return extractModelIds(await res.json());
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=xai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAEL,eAAe,EACf,iBAAiB,EACjB,cAAc,EACd,UAAU,GACX,MAAM,WAAW,CAAA;AAElB,MAAM,QAAQ,GAAG,qBAAqB,CAAA;AAEtC,SAAS,OAAO,CAAC,GAAmB;IAClC,OAAO,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAmB;IACtD,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;IACzC,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAChB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,iBAAiB,CAAC,aAAa,CAAC,EAAE,QAAQ,EAAE,CAAA;IAClG,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,UAAU,CAC1B,GAAG,QAAQ,SAAS,EACpB,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EACxC,GAAG,CACJ,CAAA;QACD,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QACzC,OAAO,EAAE,EAAE,EAAE,MAAM,KAAK,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAA;IAC7F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,EAAE,EAAE,KAAK;YACT,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,iBAAiB,CAAC,eAAe,CAAC;YAC3C,QAAQ;SACT,CAAA;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAmB;IAClD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,GAAG,QAAQ,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;IACjG,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,GAAG,CAAC,CAAA;IACxE,OAAO,eAAe,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,CAAA;AAC1C,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature → model routing resolution.
|
|
3
|
+
*
|
|
4
|
+
* This is the authoritative runtime resolver: given the stored AI config and the
|
|
5
|
+
* current model catalog, it decides which provider connection + model a feature
|
|
6
|
+
* should use. Resolution order for each feature:
|
|
7
|
+
*
|
|
8
|
+
* 1. The feature's explicit `modelId` override (if it exists in the catalog).
|
|
9
|
+
* 2. A capability-typed default that matches the feature's dominant required
|
|
10
|
+
* capability (e.g. a vision feature falls back to `defaultVisionModelId`).
|
|
11
|
+
* 3. The global `defaultModelId`.
|
|
12
|
+
* 4. Any `fallbackModelIds` listed on the feature.
|
|
13
|
+
*
|
|
14
|
+
* The first candidate that is present in the catalog, available, AND satisfies
|
|
15
|
+
* every required capability wins. If none fully satisfy, we still return the
|
|
16
|
+
* best candidate we found and report the missing capabilities so callers (UI +
|
|
17
|
+
* enforcement) can warn rather than silently misroute. The admin UI mirrors a
|
|
18
|
+
* simplified version of this for live preview, but THIS function is the source
|
|
19
|
+
* of truth consumed by the AI runtime.
|
|
20
|
+
*/
|
|
21
|
+
import type { AIConfigDocument, AIModel } from './types.js';
|
|
22
|
+
/** Where the resolved model came from in the precedence chain above. */
|
|
23
|
+
export type FeatureModelSource = 'feature-override' | 'capability-default' | 'global-default' | 'fallback' | 'none';
|
|
24
|
+
export interface ResolvedFeatureModel {
|
|
25
|
+
featureKey: string;
|
|
26
|
+
/** Catalog model id (`provider:modelId`), or the raw override when uncatalogued. */
|
|
27
|
+
modelId?: string;
|
|
28
|
+
/** Provider connection id that owns the resolved model. */
|
|
29
|
+
providerId?: string;
|
|
30
|
+
model?: AIModel;
|
|
31
|
+
source: FeatureModelSource;
|
|
32
|
+
/** True when a usable model was found that satisfies every required capability. */
|
|
33
|
+
satisfiesCapabilities: boolean;
|
|
34
|
+
/** Required capabilities the resolved model is missing (empty when satisfied). */
|
|
35
|
+
missingCapabilities: string[];
|
|
36
|
+
}
|
|
37
|
+
/** Resolve the provider + model a single feature should use. */
|
|
38
|
+
export declare function resolveFeatureModel(config: AIConfigDocument, featureKey: string, catalog: AIModel[]): ResolvedFeatureModel;
|
|
39
|
+
/** Resolve routing for every configured feature, keyed by feature key. */
|
|
40
|
+
export declare function resolveAllFeatureModels(config: AIConfigDocument, catalog: AIModel[]): Record<string, ResolvedFeatureModel>;
|
|
41
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/ai/resolve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAChB,OAAO,EAIR,MAAM,YAAY,CAAA;AAEnB,wEAAwE;AACxE,MAAM,MAAM,kBAAkB,GAC1B,kBAAkB,GAClB,oBAAoB,GACpB,gBAAgB,GAChB,UAAU,GACV,MAAM,CAAA;AAEV,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAA;IAClB,oFAAoF;IACpF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,kBAAkB,CAAA;IAC1B,mFAAmF;IACnF,qBAAqB,EAAE,OAAO,CAAA;IAC9B,kFAAkF;IAClF,mBAAmB,EAAE,MAAM,EAAE,CAAA;CAC9B;AAiFD,gEAAgE;AAChE,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,EAAE,GACjB,oBAAoB,CA2DtB;AAED,0EAA0E;AAC1E,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,OAAO,EAAE,GACjB,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAMtC"}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Feature → model routing resolution.
|
|
3
|
+
*
|
|
4
|
+
* This is the authoritative runtime resolver: given the stored AI config and the
|
|
5
|
+
* current model catalog, it decides which provider connection + model a feature
|
|
6
|
+
* should use. Resolution order for each feature:
|
|
7
|
+
*
|
|
8
|
+
* 1. The feature's explicit `modelId` override (if it exists in the catalog).
|
|
9
|
+
* 2. A capability-typed default that matches the feature's dominant required
|
|
10
|
+
* capability (e.g. a vision feature falls back to `defaultVisionModelId`).
|
|
11
|
+
* 3. The global `defaultModelId`.
|
|
12
|
+
* 4. Any `fallbackModelIds` listed on the feature.
|
|
13
|
+
*
|
|
14
|
+
* The first candidate that is present in the catalog, available, AND satisfies
|
|
15
|
+
* every required capability wins. If none fully satisfy, we still return the
|
|
16
|
+
* best candidate we found and report the missing capabilities so callers (UI +
|
|
17
|
+
* enforcement) can warn rather than silently misroute. The admin UI mirrors a
|
|
18
|
+
* simplified version of this for live preview, but THIS function is the source
|
|
19
|
+
* of truth consumed by the AI runtime.
|
|
20
|
+
*/
|
|
21
|
+
/** Capability flags recognized on {@link AIModel.capabilities}. */
|
|
22
|
+
const CAPABILITY_KEYS = new Set([
|
|
23
|
+
'text',
|
|
24
|
+
'vision',
|
|
25
|
+
'imageGeneration',
|
|
26
|
+
'embeddings',
|
|
27
|
+
'toolCalling',
|
|
28
|
+
'structuredOutput',
|
|
29
|
+
'streaming',
|
|
30
|
+
'reasoning',
|
|
31
|
+
'longContext',
|
|
32
|
+
]);
|
|
33
|
+
function findModel(catalog, id) {
|
|
34
|
+
if (!id)
|
|
35
|
+
return undefined;
|
|
36
|
+
return catalog.find((m) => m.id === id || m.providerModelId === id);
|
|
37
|
+
}
|
|
38
|
+
/** Required capabilities a model is missing. Unknown capability strings are ignored. */
|
|
39
|
+
function missingCaps(model, required) {
|
|
40
|
+
const wanted = required.filter((c) => CAPABILITY_KEYS.has(c));
|
|
41
|
+
if (!model)
|
|
42
|
+
return wanted;
|
|
43
|
+
const caps = model.capabilities;
|
|
44
|
+
return wanted.filter((c) => !caps[c]);
|
|
45
|
+
}
|
|
46
|
+
/** Map a feature's dominant required capability to its typed default model id. */
|
|
47
|
+
function capabilityDefault(settings, required) {
|
|
48
|
+
if (required.includes('imageGeneration'))
|
|
49
|
+
return settings.defaultImageGenerationModelId;
|
|
50
|
+
if (required.includes('embeddings'))
|
|
51
|
+
return settings.defaultEmbeddingModelId;
|
|
52
|
+
if (required.includes('vision'))
|
|
53
|
+
return settings.defaultVisionModelId;
|
|
54
|
+
if (required.includes('reasoning'))
|
|
55
|
+
return settings.defaultReasoningModelId;
|
|
56
|
+
if (required.includes('text'))
|
|
57
|
+
return settings.defaultTextModelId;
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Resolve a provider connection id for a model's provider key. Prefers an
|
|
62
|
+
* explicit feature override, then the global default provider when it matches,
|
|
63
|
+
* then the first enabled connection, then any connection of that provider.
|
|
64
|
+
*/
|
|
65
|
+
function providerConnId(providers, providerKey, preferredId) {
|
|
66
|
+
if (preferredId) {
|
|
67
|
+
const pref = providers.find((p) => p.id === preferredId && p.provider === providerKey);
|
|
68
|
+
if (pref)
|
|
69
|
+
return pref.id;
|
|
70
|
+
}
|
|
71
|
+
const enabled = providers.find((p) => p.provider === providerKey && p.enabled);
|
|
72
|
+
if (enabled)
|
|
73
|
+
return enabled.id;
|
|
74
|
+
return providers.find((p) => p.provider === providerKey)?.id;
|
|
75
|
+
}
|
|
76
|
+
function build(featureKey, model, source, config, required, preferredProviderId) {
|
|
77
|
+
const missing = missingCaps(model, required);
|
|
78
|
+
return {
|
|
79
|
+
featureKey,
|
|
80
|
+
modelId: model.id,
|
|
81
|
+
providerId: providerConnId(config.providers, model.provider, preferredProviderId ?? config.settings.defaultProviderId),
|
|
82
|
+
model,
|
|
83
|
+
source,
|
|
84
|
+
satisfiesCapabilities: missing.length === 0 && model.status !== 'unavailable',
|
|
85
|
+
missingCapabilities: missing,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/** Resolve the provider + model a single feature should use. */
|
|
89
|
+
export function resolveFeatureModel(config, featureKey, catalog) {
|
|
90
|
+
const { settings } = config;
|
|
91
|
+
const feature = settings.features.find((f) => f.key === featureKey);
|
|
92
|
+
const required = feature?.requiredCapabilities ?? [];
|
|
93
|
+
const candidates = [
|
|
94
|
+
{ id: feature?.modelId, source: 'feature-override' },
|
|
95
|
+
{ id: capabilityDefault(settings, required), source: 'capability-default' },
|
|
96
|
+
{ id: settings.defaultModelId, source: 'global-default' },
|
|
97
|
+
...(feature?.fallbackModelIds ?? []).map((id) => ({ id, source: 'fallback' })),
|
|
98
|
+
];
|
|
99
|
+
// Best case: first candidate that is catalogued, available, and capable.
|
|
100
|
+
let firstFound;
|
|
101
|
+
for (const candidate of candidates) {
|
|
102
|
+
const model = findModel(catalog, candidate.id);
|
|
103
|
+
if (!model)
|
|
104
|
+
continue;
|
|
105
|
+
if (!firstFound)
|
|
106
|
+
firstFound = { model, source: candidate.source };
|
|
107
|
+
if (model.status !== 'unavailable' && missingCaps(model, required).length === 0) {
|
|
108
|
+
return build(featureKey, model, candidate.source, config, required, feature?.providerId);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// A model was found but it's unavailable or capability-short — return it with a warning.
|
|
112
|
+
if (firstFound) {
|
|
113
|
+
return build(featureKey, firstFound.model, firstFound.source, config, required, feature?.providerId);
|
|
114
|
+
}
|
|
115
|
+
// An explicit override that isn't in the catalog yet (provider not synced).
|
|
116
|
+
if (feature?.modelId) {
|
|
117
|
+
return {
|
|
118
|
+
featureKey,
|
|
119
|
+
modelId: feature.modelId,
|
|
120
|
+
providerId: feature.providerId ??
|
|
121
|
+
providerConnId(config.providers, feature.modelId.split(':')[0] ?? 'custom', config.settings.defaultProviderId),
|
|
122
|
+
source: 'feature-override',
|
|
123
|
+
satisfiesCapabilities: false,
|
|
124
|
+
missingCapabilities: required.filter((c) => CAPABILITY_KEYS.has(c)),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
featureKey,
|
|
129
|
+
source: 'none',
|
|
130
|
+
satisfiesCapabilities: required.filter((c) => CAPABILITY_KEYS.has(c)).length === 0,
|
|
131
|
+
missingCapabilities: missingCaps(undefined, required),
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
/** Resolve routing for every configured feature, keyed by feature key. */
|
|
135
|
+
export function resolveAllFeatureModels(config, catalog) {
|
|
136
|
+
const out = {};
|
|
137
|
+
for (const feature of config.settings.features) {
|
|
138
|
+
out[feature.key] = resolveFeatureModel(config, feature.key, catalog);
|
|
139
|
+
}
|
|
140
|
+
return out;
|
|
141
|
+
}
|
|
142
|
+
//# sourceMappingURL=resolve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/ai/resolve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the Settings > AI governance layer.
|
|
3
|
+
*
|
|
4
|
+
* Phases 1-2 cover provider connections (encrypted keys) and a dynamic,
|
|
5
|
+
* normalized model catalog. Feature config, budget, and data-policy shapes are
|
|
6
|
+
* declared here for forward-compatibility (enforcement + metering land in later
|
|
7
|
+
* phases) but only `features[].enabled` and `budget.monthlyTokenLimit` are
|
|
8
|
+
* wired into the UI for now.
|
|
9
|
+
*/
|
|
10
|
+
/** Provider keys are stable code identifiers. `openai` covers OpenAI/ChatGPT. */
|
|
11
|
+
export type AIProviderKey = 'openai' | 'anthropic' | 'xai' | 'custom';
|
|
12
|
+
/** Where a provider's API key actually comes from at runtime. */
|
|
13
|
+
export type AIKeySource = 'environment' | 'database' | 'config';
|
|
14
|
+
/** Connection health surfaced in the UI (always rendered as text, not color-only). */
|
|
15
|
+
export type AIConnectionStatus = 'connected' | 'invalid_key' | 'rate_limited' | 'provider_down' | 'needs_setup' | 'unknown';
|
|
16
|
+
/** Availability of a catalog model relative to the connected account. */
|
|
17
|
+
export type AIModelStatus = 'available' | 'unavailable' | 'deprecated' | 'unknown';
|
|
18
|
+
export interface AIModelCapabilities {
|
|
19
|
+
text: boolean;
|
|
20
|
+
vision: boolean;
|
|
21
|
+
imageGeneration: boolean;
|
|
22
|
+
embeddings: boolean;
|
|
23
|
+
toolCalling: boolean;
|
|
24
|
+
structuredOutput: boolean;
|
|
25
|
+
streaming: boolean;
|
|
26
|
+
reasoning: boolean;
|
|
27
|
+
longContext: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface AIModelPricing {
|
|
30
|
+
inputPerMillion?: number;
|
|
31
|
+
outputPerMillion?: number;
|
|
32
|
+
image?: number;
|
|
33
|
+
search?: number;
|
|
34
|
+
}
|
|
35
|
+
/** Normalized model record (merged from live listing + curated metadata). */
|
|
36
|
+
export interface AIModel {
|
|
37
|
+
/** Stable internal id: `${provider}:${providerModelId}`. */
|
|
38
|
+
id: string;
|
|
39
|
+
provider: AIProviderKey;
|
|
40
|
+
providerModelId: string;
|
|
41
|
+
displayName: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
status: AIModelStatus;
|
|
44
|
+
capabilities: AIModelCapabilities;
|
|
45
|
+
contextWindow?: number;
|
|
46
|
+
maxOutputTokens?: number;
|
|
47
|
+
inputModalities: string[];
|
|
48
|
+
outputModalities: string[];
|
|
49
|
+
pricing?: AIModelPricing;
|
|
50
|
+
aliases?: string[];
|
|
51
|
+
lastSyncedAt: string;
|
|
52
|
+
source: 'provider' | 'manual' | 'config';
|
|
53
|
+
metadata: Record<string, unknown>;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Stored provider connection. The encrypted key NEVER leaves the server — API
|
|
57
|
+
* responses use {@link AIProviderConnectionPublic}.
|
|
58
|
+
*/
|
|
59
|
+
export interface AIProviderConnection {
|
|
60
|
+
id: string;
|
|
61
|
+
provider: AIProviderKey;
|
|
62
|
+
displayName: string;
|
|
63
|
+
enabled: boolean;
|
|
64
|
+
status: AIConnectionStatus;
|
|
65
|
+
/** Encrypted via `encryptSecret`. Absent when the key is env-managed. */
|
|
66
|
+
apiKeyEncrypted?: string;
|
|
67
|
+
apiKeyLast4?: string;
|
|
68
|
+
baseUrl?: string;
|
|
69
|
+
organizationId?: string;
|
|
70
|
+
projectId?: string;
|
|
71
|
+
lastTestedAt?: string;
|
|
72
|
+
lastSuccessfulRunAt?: string;
|
|
73
|
+
lastModelSyncAt?: string;
|
|
74
|
+
createdAt: string;
|
|
75
|
+
updatedAt: string;
|
|
76
|
+
updatedBy: string;
|
|
77
|
+
}
|
|
78
|
+
/** Client-safe provider view: no key material, source resolved dynamically. */
|
|
79
|
+
export type AIProviderConnectionPublic = Omit<AIProviderConnection, 'apiKeyEncrypted'> & {
|
|
80
|
+
apiKeySource: AIKeySource;
|
|
81
|
+
/** True when the key is env-managed and therefore not editable in the UI. */
|
|
82
|
+
keyManagedExternally: boolean;
|
|
83
|
+
hasKey: boolean;
|
|
84
|
+
};
|
|
85
|
+
export type AIFeatureCategory = 'seo' | 'media' | 'content' | 'forms' | 'security' | 'developer' | 'search';
|
|
86
|
+
export interface AIFeatureConfig {
|
|
87
|
+
key: string;
|
|
88
|
+
label: string;
|
|
89
|
+
description: string;
|
|
90
|
+
enabled: boolean;
|
|
91
|
+
category: AIFeatureCategory;
|
|
92
|
+
requiredCapabilities: string[];
|
|
93
|
+
providerId?: string;
|
|
94
|
+
modelId?: string;
|
|
95
|
+
fallbackModelIds?: string[];
|
|
96
|
+
approvalRequired: boolean;
|
|
97
|
+
allowBulkApply: boolean;
|
|
98
|
+
maxMonthlyTokens?: number;
|
|
99
|
+
maxRequestsPerDay?: number;
|
|
100
|
+
rolesAllowed: string[];
|
|
101
|
+
permissionsRequired: string[];
|
|
102
|
+
dataPolicyKey?: string;
|
|
103
|
+
}
|
|
104
|
+
export interface AIBudgetSettings {
|
|
105
|
+
monthlyTokenLimit?: number;
|
|
106
|
+
monthlyCostLimit?: number;
|
|
107
|
+
alertAtPercentages: number[];
|
|
108
|
+
disableWhenExceeded: boolean;
|
|
109
|
+
perFeatureLimits?: Record<string, number>;
|
|
110
|
+
perUserLimits?: Record<string, number>;
|
|
111
|
+
}
|
|
112
|
+
export interface AISettings {
|
|
113
|
+
defaultProviderId?: string;
|
|
114
|
+
defaultModelId?: string;
|
|
115
|
+
defaultTextModelId?: string;
|
|
116
|
+
defaultReasoningModelId?: string;
|
|
117
|
+
defaultVisionModelId?: string;
|
|
118
|
+
defaultEmbeddingModelId?: string;
|
|
119
|
+
defaultImageGenerationModelId?: string;
|
|
120
|
+
features: AIFeatureConfig[];
|
|
121
|
+
budget: AIBudgetSettings;
|
|
122
|
+
logsRetentionDays: number;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Cached, normalized model catalog keyed by provider connection id. Persisted in
|
|
126
|
+
* the `__ai_config__` document so the model selector renders without a live call.
|
|
127
|
+
*/
|
|
128
|
+
export interface AICatalogEntry {
|
|
129
|
+
models: AIModel[];
|
|
130
|
+
lastSyncedAt: string;
|
|
131
|
+
/** True when the entry came from the curated fallback (no live listing). */
|
|
132
|
+
fromFallback: boolean;
|
|
133
|
+
}
|
|
134
|
+
/** Shape of the `data` blob on the `__ai_config__` Document. */
|
|
135
|
+
export interface AIConfigDocument {
|
|
136
|
+
providers: AIProviderConnection[];
|
|
137
|
+
settings: AISettings;
|
|
138
|
+
catalog?: Record<string, AICatalogEntry>;
|
|
139
|
+
updatedAt?: string;
|
|
140
|
+
updatedBy?: string;
|
|
141
|
+
}
|
|
142
|
+
/** Monthly usage summary for the budget meter (real counts; 0 until Phase 4). */
|
|
143
|
+
export interface AIUsageSummary {
|
|
144
|
+
totalTokens: number;
|
|
145
|
+
promptTokens: number;
|
|
146
|
+
completionTokens: number;
|
|
147
|
+
estimatedCost?: number;
|
|
148
|
+
monthlyTokenLimit?: number;
|
|
149
|
+
periodStart: string;
|
|
150
|
+
periodEnd: string;
|
|
151
|
+
runCount: number;
|
|
152
|
+
}
|
|
153
|
+
/** Result of an adapter connection test. */
|
|
154
|
+
export interface AIConnectionTestResult {
|
|
155
|
+
ok: boolean;
|
|
156
|
+
status: AIConnectionStatus;
|
|
157
|
+
/** Human-readable detail (safe to show; never contains the key). */
|
|
158
|
+
message: string;
|
|
159
|
+
testedAt: string;
|
|
160
|
+
}
|
|
161
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"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"}
|
package/dist/ai/types.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the Settings > AI governance layer.
|
|
3
|
+
*
|
|
4
|
+
* Phases 1-2 cover provider connections (encrypted keys) and a dynamic,
|
|
5
|
+
* normalized model catalog. Feature config, budget, and data-policy shapes are
|
|
6
|
+
* declared here for forward-compatibility (enforcement + metering land in later
|
|
7
|
+
* phases) but only `features[].enabled` and `budget.monthlyTokenLimit` are
|
|
8
|
+
* wired into the UI for now.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/ai/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI usage aggregation.
|
|
3
|
+
*
|
|
4
|
+
* Until the dedicated per-run metering table lands (Phase 4), usage is derived
|
|
5
|
+
* from token totals already recorded in `actuate_audit_logs` (`details
|
|
6
|
+
* .totalTokensUsed` / `details.tokensUsed`). This returns REAL counts — it is 0
|
|
7
|
+
* when nothing has run, never a fabricated number.
|
|
8
|
+
*/
|
|
9
|
+
import type { AIUsageSummary } from './types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Sum token usage from audit-log entries within the period. Recognizes the
|
|
12
|
+
* fields current AI handlers write today and is tolerant of missing data.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getUsageSummary(db: unknown, period?: {
|
|
15
|
+
start?: Date;
|
|
16
|
+
end?: Date;
|
|
17
|
+
}): Promise<AIUsageSummary>;
|
|
18
|
+
//# sourceMappingURL=usage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.d.ts","sourceRoot":"","sources":["../../src/ai/usage.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAgBhD;;;GAGG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,OAAO,EACX,MAAM,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,IAAI,CAAC;IAAC,GAAG,CAAC,EAAE,IAAI,CAAA;CAAE,GACpC,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
|
package/dist/ai/usage.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI usage aggregation.
|
|
3
|
+
*
|
|
4
|
+
* Until the dedicated per-run metering table lands (Phase 4), usage is derived
|
|
5
|
+
* from token totals already recorded in `actuate_audit_logs` (`details
|
|
6
|
+
* .totalTokensUsed` / `details.tokensUsed`). This returns REAL counts — it is 0
|
|
7
|
+
* when nothing has run, never a fabricated number.
|
|
8
|
+
*/
|
|
9
|
+
import { getAIConfig } from './config-store.js';
|
|
10
|
+
/** First instant of the current calendar month (UTC). */
|
|
11
|
+
function monthStart(now = new Date()) {
|
|
12
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), 1, 0, 0, 0, 0));
|
|
13
|
+
}
|
|
14
|
+
/** First instant of the next calendar month (UTC). */
|
|
15
|
+
function nextMonthStart(now = new Date()) {
|
|
16
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1, 0, 0, 0, 0));
|
|
17
|
+
}
|
|
18
|
+
function num(value) {
|
|
19
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0 ? value : 0;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Sum token usage from audit-log entries within the period. Recognizes the
|
|
23
|
+
* fields current AI handlers write today and is tolerant of missing data.
|
|
24
|
+
*/
|
|
25
|
+
export async function getUsageSummary(db, period) {
|
|
26
|
+
const start = period?.start ?? monthStart();
|
|
27
|
+
const end = period?.end ?? nextMonthStart();
|
|
28
|
+
const config = await getAIConfig(db);
|
|
29
|
+
const monthlyTokenLimit = config.settings.budget.monthlyTokenLimit;
|
|
30
|
+
const base = {
|
|
31
|
+
totalTokens: 0,
|
|
32
|
+
promptTokens: 0,
|
|
33
|
+
completionTokens: 0,
|
|
34
|
+
monthlyTokenLimit,
|
|
35
|
+
periodStart: start.toISOString(),
|
|
36
|
+
periodEnd: end.toISOString(),
|
|
37
|
+
runCount: 0,
|
|
38
|
+
};
|
|
39
|
+
const d = db;
|
|
40
|
+
if (!d?.auditLog?.findMany)
|
|
41
|
+
return base;
|
|
42
|
+
let rows = [];
|
|
43
|
+
try {
|
|
44
|
+
rows = await d.auditLog.findMany({
|
|
45
|
+
where: { timestamp: { gte: start, lt: end } },
|
|
46
|
+
select: { details: true },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return base;
|
|
51
|
+
}
|
|
52
|
+
let totalTokens = 0;
|
|
53
|
+
let promptTokens = 0;
|
|
54
|
+
let completionTokens = 0;
|
|
55
|
+
let runCount = 0;
|
|
56
|
+
for (const row of rows) {
|
|
57
|
+
const details = (row?.details ?? {});
|
|
58
|
+
const total = num(details.totalTokensUsed) + num(details.tokensUsed) + num(details.totalTokens);
|
|
59
|
+
const prompt = num(details.promptTokens);
|
|
60
|
+
const completion = num(details.completionTokens);
|
|
61
|
+
if (total > 0 || prompt > 0 || completion > 0) {
|
|
62
|
+
runCount += 1;
|
|
63
|
+
totalTokens += total > 0 ? total : prompt + completion;
|
|
64
|
+
promptTokens += prompt;
|
|
65
|
+
completionTokens += completion;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { ...base, totalTokens, promptTokens, completionTokens, runCount };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=usage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usage.js","sourceRoot":"","sources":["../../src/ai/usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../src/api/handlers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAwhC5C,iFAAiF;AACjF,wBAAgB,wBAAwB,IAAI,IAAI,CAE/C;AA8JD,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAS9E;AAiVD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqlYzD"}
|