@actuate-media/cms-core 0.43.0 → 0.46.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/brand-voice.test.d.ts +2 -0
- package/dist/__tests__/ai/brand-voice.test.d.ts.map +1 -0
- package/dist/__tests__/ai/brand-voice.test.js +82 -0
- package/dist/__tests__/ai/brand-voice.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/__tests__/ai/runtime.test.d.ts +2 -0
- package/dist/__tests__/ai/runtime.test.d.ts.map +1 -0
- package/dist/__tests__/ai/runtime.test.js +292 -0
- package/dist/__tests__/ai/runtime.test.js.map +1 -0
- package/dist/__tests__/api/ai-quality.test.js +178 -0
- package/dist/__tests__/api/ai-quality.test.js.map +1 -1
- package/dist/__tests__/api/health.test.js +9 -5
- package/dist/__tests__/api/health.test.js.map +1 -1
- package/dist/ai/brand-voice.d.ts +37 -0
- package/dist/ai/brand-voice.d.ts.map +1 -0
- package/dist/ai/brand-voice.js +85 -0
- package/dist/ai/brand-voice.js.map +1 -0
- package/dist/ai/index.d.ts +7 -4
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +7 -4
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/providers/anthropic.d.ts +2 -1
- package/dist/ai/providers/anthropic.d.ts.map +1 -1
- package/dist/ai/providers/anthropic.js +28 -1
- package/dist/ai/providers/anthropic.js.map +1 -1
- package/dist/ai/providers/custom.d.ts +2 -1
- package/dist/ai/providers/custom.d.ts.map +1 -1
- package/dist/ai/providers/custom.js +7 -1
- package/dist/ai/providers/custom.js.map +1 -1
- package/dist/ai/providers/http.d.ts +30 -0
- package/dist/ai/providers/http.d.ts.map +1 -1
- package/dist/ai/providers/http.js +51 -0
- package/dist/ai/providers/http.js.map +1 -1
- package/dist/ai/providers/index.d.ts +4 -2
- package/dist/ai/providers/index.d.ts.map +1 -1
- package/dist/ai/providers/index.js +3 -0
- package/dist/ai/providers/index.js.map +1 -1
- package/dist/ai/providers/openai.d.ts +2 -1
- package/dist/ai/providers/openai.d.ts.map +1 -1
- package/dist/ai/providers/openai.js +4 -1
- package/dist/ai/providers/openai.js.map +1 -1
- package/dist/ai/providers/xai.d.ts +2 -1
- package/dist/ai/providers/xai.d.ts.map +1 -1
- package/dist/ai/providers/xai.js +4 -1
- package/dist/ai/providers/xai.js.map +1 -1
- 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/runtime.d.ts +86 -0
- package/dist/ai/runtime.d.ts.map +1 -0
- package/dist/ai/runtime.js +177 -0
- package/dist/ai/runtime.js.map +1 -0
- package/dist/ai/types.d.ts +24 -0
- package/dist/ai/types.d.ts.map +1 -1
- package/dist/ai/usage.js +1 -1
- package/dist/api/handlers.d.ts.map +1 -1
- package/dist/api/handlers.js +359 -124
- package/dist/api/handlers.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/custom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,
|
|
1
|
+
{"version":3,"file":"custom.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/custom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAA;AACzD,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAQxB,MAAM,WAAW,CAAA;AAMlB,wBAAsB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAiDzF;AAED,wBAAsB,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAWvE;AAED,wBAAsB,YAAY,CAChC,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAI7B"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* empty model list (manual entry in the UI) when the endpoint doesn't support
|
|
5
5
|
* `/models`.
|
|
6
6
|
*/
|
|
7
|
-
import { assertSafeBaseUrl, extractModelIds, messageFromStatus, statusFromHttp, timedFetch, trimTrailingSlash, } from './http.js';
|
|
7
|
+
import { assertSafeBaseUrl, extractModelIds, messageFromStatus, openAiChat, statusFromHttp, timedFetch, trimTrailingSlash, } from './http.js';
|
|
8
8
|
function headers(ctx) {
|
|
9
9
|
return { authorization: `Bearer ${ctx.apiKey}` };
|
|
10
10
|
}
|
|
@@ -67,4 +67,10 @@ export async function listModels(ctx) {
|
|
|
67
67
|
throw new Error(`Custom provider model listing failed (${res.status})`);
|
|
68
68
|
return extractModelIds(await res.json());
|
|
69
69
|
}
|
|
70
|
+
export async function generateText(ctx, opts) {
|
|
71
|
+
if (!ctx.baseUrl)
|
|
72
|
+
throw new Error('A base URL is required for a custom provider.');
|
|
73
|
+
await assertSafeBaseUrl(ctx.baseUrl);
|
|
74
|
+
return openAiChat(ctx.baseUrl, { authorization: `Bearer ${ctx.apiKey}` }, ctx, opts);
|
|
75
|
+
}
|
|
70
76
|
//# sourceMappingURL=custom.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../src/ai/providers/custom.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../src/ai/providers/custom.ts"],"names":[],"mappings":"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"}
|
|
@@ -27,6 +27,36 @@ export declare function timedFetch(url: string, init: RequestInit, ctx: AdapterC
|
|
|
27
27
|
export declare function assertSafeBaseUrl(baseUrl: string): Promise<void>;
|
|
28
28
|
/** Strip a trailing slash so we can append `/models` etc. cleanly. */
|
|
29
29
|
export declare function trimTrailingSlash(url: string): string;
|
|
30
|
+
export interface GenerateTextOptions {
|
|
31
|
+
/** Provider-native model id (e.g. `gpt-4o`, `claude-sonnet-4-latest`). */
|
|
32
|
+
model: string;
|
|
33
|
+
prompt: string;
|
|
34
|
+
system?: string;
|
|
35
|
+
maxTokens?: number;
|
|
36
|
+
temperature?: number;
|
|
37
|
+
}
|
|
38
|
+
export interface GenerateTextResult {
|
|
39
|
+
text: string;
|
|
40
|
+
usage: {
|
|
41
|
+
promptTokens: number;
|
|
42
|
+
completionTokens: number;
|
|
43
|
+
totalTokens: number;
|
|
44
|
+
};
|
|
45
|
+
/** Provider-native model id that produced the result. */
|
|
46
|
+
model: string;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Call an OpenAI-compatible `/chat/completions` endpoint. Shared by the OpenAI,
|
|
50
|
+
* xAI, and custom adapters (all speak the same wire format). `base` must already
|
|
51
|
+
* be validated/SSRF-checked by the caller for admin-controlled endpoints.
|
|
52
|
+
*/
|
|
53
|
+
export declare function openAiChat(base: string, headers: Record<string, string>, ctx: AdapterContext, opts: GenerateTextOptions): Promise<GenerateTextResult>;
|
|
54
|
+
/** Error carrying a mapped connection status so the runtime can react sensibly. */
|
|
55
|
+
export declare class AdapterHttpError extends Error {
|
|
56
|
+
readonly connectionStatus: AIConnectionStatus;
|
|
57
|
+
readonly httpStatus: number;
|
|
58
|
+
constructor(connectionStatus: AIConnectionStatus, httpStatus: number);
|
|
59
|
+
}
|
|
30
60
|
/** Best-effort extraction of model ids from an OpenAI-compatible list payload. */
|
|
31
61
|
export declare function extractModelIds(payload: unknown): string[];
|
|
32
62
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAMjE;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAepE;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAetE;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAS1D"}
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/http.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAErD,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,gEAAgE;AAChE,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB,CAMjE;AAED,mEAAmE;AACnE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAepE;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,EACjB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,QAAQ,CAAC,CAYnB;AAED;;;;GAIG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAetE;AAED,sEAAsE;AACtE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,MAAM,WAAW,mBAAmB;IAClC,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9E,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAA;CACd;AAMD;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAsC7B;AAED,mFAAmF;AACnF,qBAAa,gBAAiB,SAAQ,KAAK;IAEvC,QAAQ,CAAC,gBAAgB,EAAE,kBAAkB;IAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM;gBADlB,gBAAgB,EAAE,kBAAkB,EACpC,UAAU,EAAE,MAAM;CAK9B;AAED,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CAS1D"}
|
|
@@ -74,6 +74,57 @@ export async function assertSafeBaseUrl(baseUrl) {
|
|
|
74
74
|
export function trimTrailingSlash(url) {
|
|
75
75
|
return url.replace(/\/+$/, '');
|
|
76
76
|
}
|
|
77
|
+
function num(value) {
|
|
78
|
+
return typeof value === 'number' && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Call an OpenAI-compatible `/chat/completions` endpoint. Shared by the OpenAI,
|
|
82
|
+
* xAI, and custom adapters (all speak the same wire format). `base` must already
|
|
83
|
+
* be validated/SSRF-checked by the caller for admin-controlled endpoints.
|
|
84
|
+
*/
|
|
85
|
+
export async function openAiChat(base, headers, ctx, opts) {
|
|
86
|
+
const messages = [];
|
|
87
|
+
if (opts.system)
|
|
88
|
+
messages.push({ role: 'system', content: opts.system });
|
|
89
|
+
messages.push({ role: 'user', content: opts.prompt });
|
|
90
|
+
const res = await timedFetch(`${trimTrailingSlash(base)}/chat/completions`, {
|
|
91
|
+
method: 'POST',
|
|
92
|
+
headers: { ...headers, 'content-type': 'application/json' },
|
|
93
|
+
body: JSON.stringify({
|
|
94
|
+
model: opts.model,
|
|
95
|
+
messages,
|
|
96
|
+
max_tokens: opts.maxTokens ?? 1024,
|
|
97
|
+
...(typeof opts.temperature === 'number' ? { temperature: opts.temperature } : {}),
|
|
98
|
+
}),
|
|
99
|
+
}, ctx);
|
|
100
|
+
if (!res.ok) {
|
|
101
|
+
throw new AdapterHttpError(statusFromHttp(res.status), res.status);
|
|
102
|
+
}
|
|
103
|
+
const payload = (await res.json());
|
|
104
|
+
const text = payload.choices?.[0]?.message?.content;
|
|
105
|
+
const promptTokens = num(payload.usage?.prompt_tokens);
|
|
106
|
+
const completionTokens = num(payload.usage?.completion_tokens);
|
|
107
|
+
return {
|
|
108
|
+
text: typeof text === 'string' ? text : '',
|
|
109
|
+
usage: {
|
|
110
|
+
promptTokens,
|
|
111
|
+
completionTokens,
|
|
112
|
+
totalTokens: num(payload.usage?.total_tokens) || promptTokens + completionTokens,
|
|
113
|
+
},
|
|
114
|
+
model: opts.model,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/** Error carrying a mapped connection status so the runtime can react sensibly. */
|
|
118
|
+
export class AdapterHttpError extends Error {
|
|
119
|
+
connectionStatus;
|
|
120
|
+
httpStatus;
|
|
121
|
+
constructor(connectionStatus, httpStatus) {
|
|
122
|
+
super(messageFromStatus(connectionStatus));
|
|
123
|
+
this.connectionStatus = connectionStatus;
|
|
124
|
+
this.httpStatus = httpStatus;
|
|
125
|
+
this.name = 'AdapterHttpError';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
77
128
|
/** Best-effort extraction of model ids from an OpenAI-compatible list payload. */
|
|
78
129
|
export function extractModelIds(payload) {
|
|
79
130
|
const data = payload?.data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/ai/providers/http.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/ai/providers/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,13 +4,15 @@
|
|
|
4
4
|
* route layers.
|
|
5
5
|
*/
|
|
6
6
|
import type { AIConnectionTestResult, AIProviderKey } from '../types.js';
|
|
7
|
-
import type { AdapterContext } from './http.js';
|
|
8
|
-
export type { AdapterContext } from './http.js';
|
|
7
|
+
import type { AdapterContext, GenerateTextOptions, GenerateTextResult } from './http.js';
|
|
8
|
+
export type { AdapterContext, GenerateTextOptions, GenerateTextResult } from './http.js';
|
|
9
9
|
interface ProviderAdapter {
|
|
10
10
|
testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
11
11
|
listModels(ctx: AdapterContext): Promise<string[]>;
|
|
12
|
+
generateText(ctx: AdapterContext, opts: GenerateTextOptions): Promise<GenerateTextResult>;
|
|
12
13
|
}
|
|
13
14
|
export declare function getAdapter(provider: AIProviderKey): ProviderAdapter;
|
|
14
15
|
export declare function testConnection(provider: AIProviderKey, ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
15
16
|
export declare function listModels(provider: AIProviderKey, ctx: AdapterContext): Promise<string[]>;
|
|
17
|
+
export declare function generateText(provider: AIProviderKey, ctx: AdapterContext, opts: GenerateTextOptions): Promise<GenerateTextResult>;
|
|
16
18
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ai/providers/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAGxE,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAIxF,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAExF,UAAU,eAAe;IACvB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;IACpE,UAAU,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAClD,YAAY,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAA;CAC1F;AASD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,eAAe,CAEnE;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,sBAAsB,CAAC,CAEjC;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE,GAAG,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE1F;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,aAAa,EACvB,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAE7B"}
|
|
@@ -22,4 +22,7 @@ export function testConnection(provider, ctx) {
|
|
|
22
22
|
export function listModels(provider, ctx) {
|
|
23
23
|
return getAdapter(provider).listModels(ctx);
|
|
24
24
|
}
|
|
25
|
+
export function generateText(provider, ctx, opts) {
|
|
26
|
+
return getAdapter(provider).generateText(ctx, opts);
|
|
27
|
+
}
|
|
25
28
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +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;
|
|
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;AAU/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;AAED,MAAM,UAAU,YAAY,CAC1B,QAAuB,EACvB,GAAmB,EACnB,IAAyB;IAEzB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACrD,CAAC"}
|
|
@@ -4,7 +4,8 @@
|
|
|
4
4
|
* validation is needed here.
|
|
5
5
|
*/
|
|
6
6
|
import type { AIConnectionTestResult } from '../types.js';
|
|
7
|
-
import { type AdapterContext } from './http.js';
|
|
7
|
+
import { type AdapterContext, type GenerateTextOptions, type GenerateTextResult } from './http.js';
|
|
8
8
|
export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
9
9
|
export declare function listModels(ctx: AdapterContext): Promise<string[]>;
|
|
10
|
+
export declare function generateText(ctx: AdapterContext, opts: GenerateTextOptions): Promise<GenerateTextResult>;
|
|
10
11
|
//# sourceMappingURL=openai.d.ts.map
|
|
@@ -1 +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,
|
|
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,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAMxB,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;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAE7B"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* endpoint with Bearer auth. Hostname is fixed (api.openai.com) so no SSRF
|
|
4
4
|
* validation is needed here.
|
|
5
5
|
*/
|
|
6
|
-
import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
|
|
6
|
+
import { extractModelIds, messageFromStatus, openAiChat, statusFromHttp, timedFetch, } from './http.js';
|
|
7
7
|
const OPENAI_BASE = 'https://api.openai.com/v1';
|
|
8
8
|
function headers(ctx) {
|
|
9
9
|
const h = { authorization: `Bearer ${ctx.apiKey}` };
|
|
@@ -38,4 +38,7 @@ export async function listModels(ctx) {
|
|
|
38
38
|
throw new Error(`OpenAI model listing failed (${res.status})`);
|
|
39
39
|
return extractModelIds(await res.json());
|
|
40
40
|
}
|
|
41
|
+
export function generateText(ctx, opts) {
|
|
42
|
+
return openAiChat(OPENAI_BASE, headers(ctx), ctx, opts);
|
|
43
|
+
}
|
|
41
44
|
//# sourceMappingURL=openai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../src/ai/providers/openai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAIL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,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;AAED,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,IAAyB;IAEzB,OAAO,UAAU,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACzD,CAAC"}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* auth. Hostname is fixed (api.x.ai).
|
|
4
4
|
*/
|
|
5
5
|
import type { AIConnectionTestResult } from '../types.js';
|
|
6
|
-
import { type AdapterContext } from './http.js';
|
|
6
|
+
import { type AdapterContext, type GenerateTextOptions, type GenerateTextResult } from './http.js';
|
|
7
7
|
export declare function testConnection(ctx: AdapterContext): Promise<AIConnectionTestResult>;
|
|
8
8
|
export declare function listModels(ctx: AdapterContext): Promise<string[]>;
|
|
9
|
+
export declare function generateText(ctx: AdapterContext, opts: GenerateTextOptions): Promise<GenerateTextResult>;
|
|
9
10
|
//# sourceMappingURL=xai.d.ts.map
|
|
@@ -1 +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,
|
|
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,EACnB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAMxB,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;AAED,wBAAgB,YAAY,CAC1B,GAAG,EAAE,cAAc,EACnB,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAE7B"}
|
package/dist/ai/providers/xai.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* xAI (Grok) adapter. xAI's API is OpenAI-compatible: `/v1/models` with Bearer
|
|
3
3
|
* auth. Hostname is fixed (api.x.ai).
|
|
4
4
|
*/
|
|
5
|
-
import { extractModelIds, messageFromStatus, statusFromHttp, timedFetch, } from './http.js';
|
|
5
|
+
import { extractModelIds, messageFromStatus, openAiChat, statusFromHttp, timedFetch, } from './http.js';
|
|
6
6
|
const XAI_BASE = 'https://api.x.ai/v1';
|
|
7
7
|
function headers(ctx) {
|
|
8
8
|
return { authorization: `Bearer ${ctx.apiKey}` };
|
|
@@ -32,4 +32,7 @@ export async function listModels(ctx) {
|
|
|
32
32
|
throw new Error(`xAI model listing failed (${res.status})`);
|
|
33
33
|
return extractModelIds(await res.json());
|
|
34
34
|
}
|
|
35
|
+
export function generateText(ctx, opts) {
|
|
36
|
+
return openAiChat(XAI_BASE, headers(ctx), ctx, opts);
|
|
37
|
+
}
|
|
35
38
|
//# sourceMappingURL=xai.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,
|
|
1
|
+
{"version":3,"file":"xai.js","sourceRoot":"","sources":["../../../src/ai/providers/xai.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAIL,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,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;AAED,MAAM,UAAU,YAAY,CAC1B,GAAmB,EACnB,IAAyB;IAEzB,OAAO,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;AACtD,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,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Governed AI runtime — the single execution path that turns the Settings > AI
|
|
3
|
+
* configuration into actual model calls.
|
|
4
|
+
*
|
|
5
|
+
* Everything that wants to run an LLM inside Actuate should go through here so
|
|
6
|
+
* that one DB-backed config drives behavior end-to-end:
|
|
7
|
+
* - feature toggles are ENFORCED (a disabled feature can't run),
|
|
8
|
+
* - per-feature model routing is RESOLVED ({@link resolveFeatureModel}),
|
|
9
|
+
* - the API key is resolved from env or the encrypted store,
|
|
10
|
+
* - the monthly token budget is checked (when `disableWhenExceeded`),
|
|
11
|
+
* - real token usage is RECORDED so the usage meter reflects reality.
|
|
12
|
+
*
|
|
13
|
+
* It is intentionally provider-agnostic: the provider adapters
|
|
14
|
+
* (`./providers/*`) speak HTTP, this module decides *whether* and *with what*
|
|
15
|
+
* to call them.
|
|
16
|
+
*/
|
|
17
|
+
import type { AIProviderKey } from './types.js';
|
|
18
|
+
/** Why a feature could not run. Distinct codes let callers map to HTTP status. */
|
|
19
|
+
export type RuntimeErrorCode = 'feature_disabled' | 'no_provider' | 'no_model' | 'no_key' | 'budget_exceeded' | 'provider_error';
|
|
20
|
+
export interface RuntimeError {
|
|
21
|
+
ok: false;
|
|
22
|
+
code: RuntimeErrorCode;
|
|
23
|
+
message: string;
|
|
24
|
+
}
|
|
25
|
+
/** A fully-resolved, ready-to-call runtime for a feature. */
|
|
26
|
+
export interface ResolvedFeatureRuntime {
|
|
27
|
+
ok: true;
|
|
28
|
+
featureKey: string;
|
|
29
|
+
providerKey: AIProviderKey;
|
|
30
|
+
connectionId: string;
|
|
31
|
+
baseUrl?: string;
|
|
32
|
+
apiKey: string;
|
|
33
|
+
/** Catalog id (`provider:modelId`) selected for this feature. */
|
|
34
|
+
modelId: string;
|
|
35
|
+
/** Provider-native model id sent on the wire. */
|
|
36
|
+
providerModelId: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Is a configured AI feature turned on? Unknown keys default to enabled so that
|
|
40
|
+
* callers gating on a key the config doesn't track yet don't silently break.
|
|
41
|
+
*/
|
|
42
|
+
export declare function isAiFeatureEnabled(db: unknown, featureKey: string): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Resolve provider + model + key + budget for a feature, enforcing the toggle.
|
|
45
|
+
* Pure resolution — performs no model call. Returns a discriminated result so
|
|
46
|
+
* callers can branch (e.g. fall back to a legacy provider on `no_provider`).
|
|
47
|
+
*/
|
|
48
|
+
export declare function resolveFeatureRuntime(db: unknown, featureKey: string): Promise<ResolvedFeatureRuntime | RuntimeError>;
|
|
49
|
+
export interface GenerateForFeatureInput {
|
|
50
|
+
prompt: string;
|
|
51
|
+
system?: string;
|
|
52
|
+
maxTokens?: number;
|
|
53
|
+
temperature?: number;
|
|
54
|
+
/** Recorded on the usage audit entry so spend is attributable. */
|
|
55
|
+
userId?: string;
|
|
56
|
+
/**
|
|
57
|
+
* Prepend the active brand voice (if enabled) to the system prompt. Content
|
|
58
|
+
* features (co-author, SEO copy) opt in; structured/metadata features leave
|
|
59
|
+
* it off. Defaults to false so callers are explicit.
|
|
60
|
+
*/
|
|
61
|
+
useBrandVoice?: boolean;
|
|
62
|
+
/** Injectable fetch for tests; forwarded to the provider adapter. */
|
|
63
|
+
fetchImpl?: typeof fetch;
|
|
64
|
+
/** Per-call timeout override (ms). */
|
|
65
|
+
timeoutMs?: number;
|
|
66
|
+
}
|
|
67
|
+
export interface GenerateForFeatureSuccess {
|
|
68
|
+
ok: true;
|
|
69
|
+
text: string;
|
|
70
|
+
usage: {
|
|
71
|
+
promptTokens: number;
|
|
72
|
+
completionTokens: number;
|
|
73
|
+
totalTokens: number;
|
|
74
|
+
};
|
|
75
|
+
modelId: string;
|
|
76
|
+
providerModelId: string;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Run a text generation for a feature through the governed path: resolve →
|
|
80
|
+
* enforce → call → record usage. Returns a discriminated result; never throws
|
|
81
|
+
* for the expected "not configured / disabled / budget" cases (those are
|
|
82
|
+
* {@link RuntimeError}). Genuine provider/transport failures surface as a
|
|
83
|
+
* `provider_error` RuntimeError too, so callers have a single shape to handle.
|
|
84
|
+
*/
|
|
85
|
+
export declare function generateTextForFeature(db: unknown, featureKey: string, input: GenerateForFeatureInput): Promise<GenerateForFeatureSuccess | RuntimeError>;
|
|
86
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/ai/runtime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAQH,OAAO,KAAK,EAAwB,aAAa,EAAE,MAAM,YAAY,CAAA;AAGrE,kFAAkF;AAClF,MAAM,MAAM,gBAAgB,GACxB,kBAAkB,GAClB,aAAa,GACb,UAAU,GACV,QAAQ,GACR,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,KAAK,CAAA;IACT,IAAI,EAAE,gBAAgB,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,6DAA6D;AAC7D,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,IAAI,CAAA;IACR,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,aAAa,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAA;IACf,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAA;CACxB;AAMD;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAI1F;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CACzC,EAAE,EAAE,OAAO,EACX,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,GAAG,YAAY,CAAC,CAuDhD;AAQD,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;IACxB,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,IAAI,CAAA;IACR,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,gBAAgB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9E,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,EAAE,EAAE,OAAO,EACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,uBAAuB,GAC7B,OAAO,CAAC,yBAAyB,GAAG,YAAY,CAAC,CAsDnD"}
|