@x12i/optimixer 0.1.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/LICENSE +7 -0
- package/README.md +96 -0
- package/dist/Optimixer.d.ts +22 -0
- package/dist/Optimixer.d.ts.map +1 -0
- package/dist/Optimixer.js +78 -0
- package/dist/Optimixer.js.map +1 -0
- package/dist/adapters/standalone-activix.d.ts +8 -0
- package/dist/adapters/standalone-activix.d.ts.map +1 -0
- package/dist/adapters/standalone-activix.js +23 -0
- package/dist/adapters/standalone-activix.js.map +1 -0
- package/dist/contracts/optimixer-types.d.ts +68 -0
- package/dist/contracts/optimixer-types.d.ts.map +1 -0
- package/dist/contracts/optimixer-types.js +3 -0
- package/dist/contracts/optimixer-types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/persistence/activix-writer.d.ts +26 -0
- package/dist/persistence/activix-writer.d.ts.map +1 -0
- package/dist/persistence/activix-writer.js +72 -0
- package/dist/persistence/activix-writer.js.map +1 -0
- package/dist/pipelines/ai-max-tokens-v1.d.ts +18 -0
- package/dist/pipelines/ai-max-tokens-v1.d.ts.map +1 -0
- package/dist/pipelines/ai-max-tokens-v1.js +96 -0
- package/dist/pipelines/ai-max-tokens-v1.js.map +1 -0
- package/dist/state/bucket-store.d.ts +14 -0
- package/dist/state/bucket-store.d.ts.map +1 -0
- package/dist/state/bucket-store.js +24 -0
- package/dist/state/bucket-store.js.map +1 -0
- package/dist/state/quantile-stats.d.ts +12 -0
- package/dist/state/quantile-stats.d.ts.map +1 -0
- package/dist/state/quantile-stats.js +48 -0
- package/dist/state/quantile-stats.js.map +1 -0
- package/dist-cjs/Optimixer.d.ts +22 -0
- package/dist-cjs/Optimixer.d.ts.map +1 -0
- package/dist-cjs/Optimixer.js +82 -0
- package/dist-cjs/Optimixer.js.map +1 -0
- package/dist-cjs/adapters/standalone-activix.d.ts +8 -0
- package/dist-cjs/adapters/standalone-activix.d.ts.map +1 -0
- package/dist-cjs/adapters/standalone-activix.js +26 -0
- package/dist-cjs/adapters/standalone-activix.js.map +1 -0
- package/dist-cjs/contracts/optimixer-types.d.ts +68 -0
- package/dist-cjs/contracts/optimixer-types.d.ts.map +1 -0
- package/dist-cjs/contracts/optimixer-types.js +6 -0
- package/dist-cjs/contracts/optimixer-types.js.map +1 -0
- package/dist-cjs/index.d.ts +6 -0
- package/dist-cjs/index.d.ts.map +1 -0
- package/dist-cjs/index.js +15 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/persistence/activix-writer.d.ts +26 -0
- package/dist-cjs/persistence/activix-writer.d.ts.map +1 -0
- package/dist-cjs/persistence/activix-writer.js +77 -0
- package/dist-cjs/persistence/activix-writer.js.map +1 -0
- package/dist-cjs/pipelines/ai-max-tokens-v1.d.ts +18 -0
- package/dist-cjs/pipelines/ai-max-tokens-v1.d.ts.map +1 -0
- package/dist-cjs/pipelines/ai-max-tokens-v1.js +101 -0
- package/dist-cjs/pipelines/ai-max-tokens-v1.js.map +1 -0
- package/dist-cjs/state/bucket-store.d.ts +14 -0
- package/dist-cjs/state/bucket-store.d.ts.map +1 -0
- package/dist-cjs/state/bucket-store.js +29 -0
- package/dist-cjs/state/bucket-store.js.map +1 -0
- package/dist-cjs/state/quantile-stats.d.ts +12 -0
- package/dist-cjs/state/quantile-stats.d.ts.map +1 -0
- package/dist-cjs/state/quantile-stats.js +53 -0
- package/dist-cjs/state/quantile-stats.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { QuantileStats } from './quantile-stats.js';
|
|
2
|
+
export function buildBucketKey(parts) {
|
|
3
|
+
const provider = parts.provider?.trim() || '*';
|
|
4
|
+
const model = parts.model?.trim() || '*';
|
|
5
|
+
return `${parts.actionTypeId}|${provider}|${model}`;
|
|
6
|
+
}
|
|
7
|
+
export class BucketStore {
|
|
8
|
+
buckets = new Map();
|
|
9
|
+
getOrCreate(key) {
|
|
10
|
+
let stats = this.buckets.get(key);
|
|
11
|
+
if (!stats) {
|
|
12
|
+
stats = new QuantileStats();
|
|
13
|
+
this.buckets.set(key, stats);
|
|
14
|
+
}
|
|
15
|
+
return stats;
|
|
16
|
+
}
|
|
17
|
+
observe(key, completionTokens) {
|
|
18
|
+
this.getOrCreate(key).observe(completionTokens);
|
|
19
|
+
}
|
|
20
|
+
statsFor(key) {
|
|
21
|
+
return this.buckets.get(key);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=bucket-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket-store.js","sourceRoot":"","sources":["../../src/state/bucket-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAQpD,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC;IAC/C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC;IACzC,OAAO,GAAG,KAAK,CAAC,YAAY,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,OAAO,WAAW;IACL,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5D,WAAW,CAAC,GAAW;QACrB,IAAI,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,aAAa,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,gBAAwB;QAC3C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAClD,CAAC;IAED,QAAQ,CAAC,GAAW;QAClB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory quantile statistics for completion token observations.
|
|
3
|
+
*/
|
|
4
|
+
export declare class QuantileStats {
|
|
5
|
+
private readonly values;
|
|
6
|
+
observe(value: number): void;
|
|
7
|
+
get count(): number;
|
|
8
|
+
percentile(p: number): number | undefined;
|
|
9
|
+
max(): number | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function riskToPercentile(risk: import('../contracts/optimixer-types.js').OptimixerAcceptableRisk): number;
|
|
12
|
+
//# sourceMappingURL=quantile-stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantile-stats.d.ts","sourceRoot":"","sources":["../../src/state/quantile-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IAEvC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ5B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IASzC,GAAG,IAAI,MAAM,GAAG,SAAS;CAM1B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,iCAAiC,EAAE,uBAAuB,GAAG,MAAM,CAgBhH"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory quantile statistics for completion token observations.
|
|
3
|
+
*/
|
|
4
|
+
export class QuantileStats {
|
|
5
|
+
values = [];
|
|
6
|
+
observe(value) {
|
|
7
|
+
if (!Number.isFinite(value) || value < 0) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
this.values.push(value);
|
|
11
|
+
this.values.sort((a, b) => a - b);
|
|
12
|
+
}
|
|
13
|
+
get count() {
|
|
14
|
+
return this.values.length;
|
|
15
|
+
}
|
|
16
|
+
percentile(p) {
|
|
17
|
+
if (this.values.length === 0) {
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
const clamped = Math.min(1, Math.max(0, p));
|
|
21
|
+
const idx = Math.ceil(clamped * this.values.length) - 1;
|
|
22
|
+
return this.values[Math.max(0, idx)];
|
|
23
|
+
}
|
|
24
|
+
max() {
|
|
25
|
+
if (this.values.length === 0) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return this.values[this.values.length - 1];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export function riskToPercentile(risk) {
|
|
32
|
+
if (typeof risk === 'number') {
|
|
33
|
+
return Math.min(1, Math.max(0, risk));
|
|
34
|
+
}
|
|
35
|
+
switch (risk) {
|
|
36
|
+
case 'very-low':
|
|
37
|
+
return 0.99;
|
|
38
|
+
case 'low':
|
|
39
|
+
return 0.95;
|
|
40
|
+
case 'medium':
|
|
41
|
+
return 0.85;
|
|
42
|
+
case 'high':
|
|
43
|
+
return 0.7;
|
|
44
|
+
default:
|
|
45
|
+
return 0.85;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=quantile-stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quantile-stats.js","sourceRoot":"","sources":["../../src/state/quantile-stats.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,aAAa;IACP,MAAM,GAAa,EAAE,CAAC;IAEvC,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,UAAU,CAAC,CAAS;QAClB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,GAAG;QACD,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAuE;IACtG,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,UAAU;YACb,OAAO,IAAI,CAAC;QACd,KAAK,KAAK;YACR,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC;QACd,KAAK,MAAM;YACT,OAAO,GAAG,CAAC;QACb;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { AiMaxTokensCompleteInput, AiMaxTokensPredictionInput, AiMaxTokensPredictionResult, OptimixerCreateOptions } from './contracts/optimixer-types.js';
|
|
2
|
+
export declare class Optimixer {
|
|
3
|
+
private readonly client;
|
|
4
|
+
private readonly collection?;
|
|
5
|
+
private readonly bucketStore;
|
|
6
|
+
private readonly aiMaxTokensEnabled;
|
|
7
|
+
private readonly aiMaxTokensConfig;
|
|
8
|
+
private readonly writer;
|
|
9
|
+
private readonly closeHook?;
|
|
10
|
+
private constructor();
|
|
11
|
+
static create(options: OptimixerCreateOptions): Promise<Optimixer>;
|
|
12
|
+
close(): Promise<void>;
|
|
13
|
+
warmup(limit?: number): Promise<number>;
|
|
14
|
+
predictAiMaxTokens(input: AiMaxTokensPredictionInput): Promise<AiMaxTokensPredictionResult>;
|
|
15
|
+
completeAiMaxTokensPrediction(input: AiMaxTokensCompleteInput): Promise<{
|
|
16
|
+
learning: {
|
|
17
|
+
bucketKey: string;
|
|
18
|
+
observedCompletionTokens: number;
|
|
19
|
+
};
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=Optimixer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Optimixer.d.ts","sourceRoot":"","sources":["../src/Optimixer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACvB,MAAM,gCAAgC,CAAC;AAgBxC,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAC7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAsB;IAEjD,OAAO;WAgBM,MAAM,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,SAAS,CAAC;IAoBlE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAMtB,MAAM,CAAC,KAAK,SAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBpC,kBAAkB,CAAC,KAAK,EAAE,0BAA0B,GAAG,OAAO,CAAC,2BAA2B,CAAC;IAQ3F,6BAA6B,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC;QAC5E,QAAQ,EAAE;YAAE,SAAS,EAAE,MAAM,CAAC;YAAC,wBAAwB,EAAE,MAAM,CAAA;SAAE,CAAC;KACnE,CAAC;CASH"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Optimixer = void 0;
|
|
4
|
+
const standalone_activix_js_1 = require("./adapters/standalone-activix.js");
|
|
5
|
+
const optimixer_types_js_1 = require("./contracts/optimixer-types.js");
|
|
6
|
+
const ai_max_tokens_v1_js_1 = require("./pipelines/ai-max-tokens-v1.js");
|
|
7
|
+
const activix_writer_js_1 = require("./persistence/activix-writer.js");
|
|
8
|
+
const bucket_store_js_1 = require("./state/bucket-store.js");
|
|
9
|
+
class Optimixer {
|
|
10
|
+
client;
|
|
11
|
+
collection;
|
|
12
|
+
bucketStore = new bucket_store_js_1.BucketStore();
|
|
13
|
+
aiMaxTokensEnabled;
|
|
14
|
+
aiMaxTokensConfig;
|
|
15
|
+
writer;
|
|
16
|
+
closeHook;
|
|
17
|
+
constructor(client, options) {
|
|
18
|
+
this.client = client;
|
|
19
|
+
this.collection = options.collection ?? options.activixCollection;
|
|
20
|
+
this.aiMaxTokensEnabled = options.pipelines?.aiMaxTokens?.enabled !== false;
|
|
21
|
+
this.aiMaxTokensConfig = options.pipelines?.aiMaxTokens;
|
|
22
|
+
this.closeHook = options.closeHook;
|
|
23
|
+
this.writer = new activix_writer_js_1.ActivixOptimixerWriter(client, {
|
|
24
|
+
collection: this.collection,
|
|
25
|
+
pipelineId: optimixer_types_js_1.AI_MAX_TOKENS_V1_PIPELINE_ID,
|
|
26
|
+
algorithmVersion: optimixer_types_js_1.AI_MAX_TOKENS_V1_ALGORITHM_VERSION,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
static async create(options) {
|
|
30
|
+
let client = options.activixClient;
|
|
31
|
+
let collection = options.activixCollection ?? options.activix?.collection;
|
|
32
|
+
let closeHook;
|
|
33
|
+
if (!client) {
|
|
34
|
+
if (!options.activix) {
|
|
35
|
+
throw new Error('Optimixer.create requires activixClient or activix standalone config');
|
|
36
|
+
}
|
|
37
|
+
const standalone = await (0, standalone_activix_js_1.createStandaloneActivixClient)(options.activix);
|
|
38
|
+
client = standalone.client;
|
|
39
|
+
collection = standalone.collection;
|
|
40
|
+
closeHook = standalone.close;
|
|
41
|
+
}
|
|
42
|
+
const optimixer = new Optimixer(client, { ...options, collection, closeHook });
|
|
43
|
+
await optimixer.warmup(options.warmupLimit ?? options.pipelines?.aiMaxTokens?.warmupLimit ?? 500);
|
|
44
|
+
return optimixer;
|
|
45
|
+
}
|
|
46
|
+
async close() {
|
|
47
|
+
if (this.closeHook) {
|
|
48
|
+
await this.closeHook();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
async warmup(limit = 500) {
|
|
52
|
+
if (!this.aiMaxTokensEnabled) {
|
|
53
|
+
return 0;
|
|
54
|
+
}
|
|
55
|
+
return (0, activix_writer_js_1.warmupBucketStoreFromActivix)(this.client, {
|
|
56
|
+
collection: this.collection,
|
|
57
|
+
pipelineId: optimixer_types_js_1.AI_MAX_TOKENS_V1_PIPELINE_ID,
|
|
58
|
+
limit,
|
|
59
|
+
onObservation: (actionTypeId, provider, model, completionTokens) => {
|
|
60
|
+
this.bucketStore.observe(`${actionTypeId}|${provider ?? '*'}|${model ?? '*'}`, completionTokens);
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async predictAiMaxTokens(input) {
|
|
65
|
+
if (!this.aiMaxTokensEnabled) {
|
|
66
|
+
throw new Error('Optimixer ai.max_tokens.v1 pipeline is disabled');
|
|
67
|
+
}
|
|
68
|
+
const prediction = (0, ai_max_tokens_v1_js_1.predictAiMaxTokensV1)(input, this.bucketStore, this.aiMaxTokensConfig);
|
|
69
|
+
return (0, ai_max_tokens_v1_js_1.recordAiMaxTokensPrediction)(this.writer, input, prediction);
|
|
70
|
+
}
|
|
71
|
+
async completeAiMaxTokensPrediction(input) {
|
|
72
|
+
if (!this.aiMaxTokensEnabled) {
|
|
73
|
+
throw new Error('Optimixer ai.max_tokens.v1 pipeline is disabled');
|
|
74
|
+
}
|
|
75
|
+
return (0, ai_max_tokens_v1_js_1.completeAiMaxTokensPredictionV1)(this.client, this.writer, this.bucketStore, {
|
|
76
|
+
...input,
|
|
77
|
+
collection: this.collection,
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
exports.Optimixer = Optimixer;
|
|
82
|
+
//# sourceMappingURL=Optimixer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Optimixer.js","sourceRoot":"","sources":["../src/Optimixer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ActivixActivityClient } from '@x12i/activix-contracts';
|
|
2
|
+
import type { OptimixerStandaloneActivixConfig } from '../contracts/optimixer-types.js';
|
|
3
|
+
export declare function createStandaloneActivixClient(config: OptimixerStandaloneActivixConfig): Promise<{
|
|
4
|
+
client: ActivixActivityClient;
|
|
5
|
+
collection: string;
|
|
6
|
+
close?: () => Promise<void>;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=standalone-activix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-activix.d.ts","sourceRoot":"","sources":["../../src/adapters/standalone-activix.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AAExF,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC;IAAE,MAAM,EAAE,qBAAqB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC,CAwB7F"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createStandaloneActivixClient = createStandaloneActivixClient;
|
|
4
|
+
async function createStandaloneActivixClient(config) {
|
|
5
|
+
let ActivixCtor;
|
|
6
|
+
try {
|
|
7
|
+
({ Activix: ActivixCtor } = await Promise.resolve().then(() => require('@x12i/activix')));
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
throw new Error('Optimixer standalone mode requires optional peer dependency @x12i/activix. Install it or pass activixClient instead.');
|
|
11
|
+
}
|
|
12
|
+
const ax = await ActivixCtor.create({
|
|
13
|
+
collection: config.collection,
|
|
14
|
+
mongoUri: config.mongoUri,
|
|
15
|
+
storageMode: config.storageMode ?? 'automatic',
|
|
16
|
+
playground: config.playground,
|
|
17
|
+
collectionRegistry: false,
|
|
18
|
+
autoCost: false,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
client: ax,
|
|
22
|
+
collection: config.collection,
|
|
23
|
+
close: () => ax.close(),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=standalone-activix.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone-activix.js","sourceRoot":"","sources":["../../src/adapters/standalone-activix.ts"],"names":[],"mappings":";;AAGA,sEA0BC;AA1BM,KAAK,UAAU,6BAA6B,CACjD,MAAwC;IAExC,IAAI,WAAmD,CAAC;IACxD,IAAI,CAAC;QACH,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,2CAAa,eAAe,EAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,sHAAsH,CACvH,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,WAAW;QAC9C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,kBAAkB,EAAE,KAAK;QACzB,QAAQ,EAAE,KAAK;KAChB,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,EAAsC;QAC9C,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE;KACxB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { ActivixRunContext } from '@x12i/activix-contracts';
|
|
2
|
+
export type OptimixerPipelineId = 'ai.max_tokens.v1' | (string & {});
|
|
3
|
+
export declare const AI_MAX_TOKENS_V1_PIPELINE_ID: OptimixerPipelineId;
|
|
4
|
+
export declare const AI_MAX_TOKENS_V1_ALGORITHM_VERSION = "1.0.0";
|
|
5
|
+
export type OptimixerAcceptableRisk = 'very-low' | 'low' | 'medium' | 'high' | number;
|
|
6
|
+
export type OptimixerPredictionRecord = {
|
|
7
|
+
requestId: string;
|
|
8
|
+
pipelineId: OptimixerPipelineId;
|
|
9
|
+
algorithmVersion: string;
|
|
10
|
+
prediction: unknown;
|
|
11
|
+
actual?: unknown;
|
|
12
|
+
learning?: unknown;
|
|
13
|
+
};
|
|
14
|
+
export type AiMaxTokensPredictionInput = {
|
|
15
|
+
runContext?: ActivixRunContext;
|
|
16
|
+
actionTypeId: string;
|
|
17
|
+
inputSize: number;
|
|
18
|
+
contextSize: number;
|
|
19
|
+
plannedTools?: string[];
|
|
20
|
+
acceptableRisk: OptimixerAcceptableRisk;
|
|
21
|
+
provider?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
};
|
|
24
|
+
export type AiMaxTokensActualUsage = {
|
|
25
|
+
promptTokens: number;
|
|
26
|
+
completionTokens: number;
|
|
27
|
+
totalTokens: number;
|
|
28
|
+
finishReason?: string;
|
|
29
|
+
latencyMs?: number;
|
|
30
|
+
};
|
|
31
|
+
export type AiMaxTokensPredictionResult = {
|
|
32
|
+
requestId: string;
|
|
33
|
+
pipelineId: typeof AI_MAX_TOKENS_V1_PIPELINE_ID;
|
|
34
|
+
algorithmVersion: string;
|
|
35
|
+
recommendedMaxTokens: number;
|
|
36
|
+
confidence: 'cold-start' | 'warm';
|
|
37
|
+
bucketKey: string;
|
|
38
|
+
riskLevel: OptimixerAcceptableRisk;
|
|
39
|
+
};
|
|
40
|
+
export type AiMaxTokensCompleteInput = {
|
|
41
|
+
requestId: string;
|
|
42
|
+
actual: AiMaxTokensActualUsage;
|
|
43
|
+
};
|
|
44
|
+
export type OptimixerPipelineConfig = {
|
|
45
|
+
enabled?: boolean;
|
|
46
|
+
warmupLimit?: number;
|
|
47
|
+
defaultMaxTokens?: number;
|
|
48
|
+
};
|
|
49
|
+
export type OptimixerPipelinesConfig = {
|
|
50
|
+
aiMaxTokens?: OptimixerPipelineConfig;
|
|
51
|
+
};
|
|
52
|
+
export type OptimixerStandaloneActivixConfig = {
|
|
53
|
+
collection: string;
|
|
54
|
+
mongoUri?: string;
|
|
55
|
+
storageMode?: 'automatic' | 'database' | 'local';
|
|
56
|
+
playground?: {
|
|
57
|
+
outputDir?: string;
|
|
58
|
+
runId?: string;
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export type OptimixerCreateOptions = {
|
|
62
|
+
activixClient?: import('@x12i/activix-contracts').ActivixActivityClient;
|
|
63
|
+
activix?: OptimixerStandaloneActivixConfig;
|
|
64
|
+
activixCollection?: string;
|
|
65
|
+
pipelines?: OptimixerPipelinesConfig;
|
|
66
|
+
warmupLimit?: number;
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=optimixer-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimixer-types.d.ts","sourceRoot":"","sources":["../../src/contracts/optimixer-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAEjE,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAErE,eAAO,MAAM,4BAA4B,EAAE,mBAAwC,CAAC;AAEpF,eAAO,MAAM,kCAAkC,UAAU,CAAC;AAE1D,MAAM,MAAM,uBAAuB,GAAG,UAAU,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtF,MAAM,MAAM,yBAAyB,GAAG;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,mBAAmB,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,CAAC,EAAE,iBAAiB,CAAC;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,4BAA4B,CAAC;IAChD,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,UAAU,EAAE,YAAY,GAAG,MAAM,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,uBAAuB,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,gCAAgC,GAAG;IAC7C,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,WAAW,GAAG,UAAU,GAAG,OAAO,CAAC;IACjD,UAAU,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACrD,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,aAAa,CAAC,EAAE,OAAO,yBAAyB,EAAE,qBAAqB,CAAC;IACxE,OAAO,CAAC,EAAE,gCAAgC,CAAC;IAC3C,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AI_MAX_TOKENS_V1_ALGORITHM_VERSION = exports.AI_MAX_TOKENS_V1_PIPELINE_ID = void 0;
|
|
4
|
+
exports.AI_MAX_TOKENS_V1_PIPELINE_ID = 'ai.max_tokens.v1';
|
|
5
|
+
exports.AI_MAX_TOKENS_V1_ALGORITHM_VERSION = '1.0.0';
|
|
6
|
+
//# sourceMappingURL=optimixer-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimixer-types.js","sourceRoot":"","sources":["../../src/contracts/optimixer-types.ts"],"names":[],"mappings":";;;AAIa,QAAA,4BAA4B,GAAwB,kBAAkB,CAAC;AAEvE,QAAA,kCAAkC,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { Optimixer } from './Optimixer.js';
|
|
2
|
+
export type { AiMaxTokensActualUsage, AiMaxTokensCompleteInput, AiMaxTokensPredictionInput, AiMaxTokensPredictionResult, OptimixerAcceptableRisk, OptimixerCreateOptions, OptimixerPipelineConfig, OptimixerPipelineId, OptimixerPipelinesConfig, OptimixerPredictionRecord, OptimixerStandaloneActivixConfig, } from './contracts/optimixer-types.js';
|
|
3
|
+
export { AI_MAX_TOKENS_V1_ALGORITHM_VERSION, AI_MAX_TOKENS_V1_PIPELINE_ID, } from './contracts/optimixer-types.js';
|
|
4
|
+
export { BucketStore, buildBucketKey } from './state/bucket-store.js';
|
|
5
|
+
export { QuantileStats, riskToPercentile } from './state/quantile-stats.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,YAAY,EACV,sBAAsB,EACtB,wBAAwB,EACxB,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,gCAAgC,GACjC,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,kCAAkC,EAClC,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.riskToPercentile = exports.QuantileStats = exports.buildBucketKey = exports.BucketStore = exports.AI_MAX_TOKENS_V1_PIPELINE_ID = exports.AI_MAX_TOKENS_V1_ALGORITHM_VERSION = exports.Optimixer = void 0;
|
|
4
|
+
var Optimixer_js_1 = require("./Optimixer.js");
|
|
5
|
+
Object.defineProperty(exports, "Optimixer", { enumerable: true, get: function () { return Optimixer_js_1.Optimixer; } });
|
|
6
|
+
var optimixer_types_js_1 = require("./contracts/optimixer-types.js");
|
|
7
|
+
Object.defineProperty(exports, "AI_MAX_TOKENS_V1_ALGORITHM_VERSION", { enumerable: true, get: function () { return optimixer_types_js_1.AI_MAX_TOKENS_V1_ALGORITHM_VERSION; } });
|
|
8
|
+
Object.defineProperty(exports, "AI_MAX_TOKENS_V1_PIPELINE_ID", { enumerable: true, get: function () { return optimixer_types_js_1.AI_MAX_TOKENS_V1_PIPELINE_ID; } });
|
|
9
|
+
var bucket_store_js_1 = require("./state/bucket-store.js");
|
|
10
|
+
Object.defineProperty(exports, "BucketStore", { enumerable: true, get: function () { return bucket_store_js_1.BucketStore; } });
|
|
11
|
+
Object.defineProperty(exports, "buildBucketKey", { enumerable: true, get: function () { return bucket_store_js_1.buildBucketKey; } });
|
|
12
|
+
var quantile_stats_js_1 = require("./state/quantile-stats.js");
|
|
13
|
+
Object.defineProperty(exports, "QuantileStats", { enumerable: true, get: function () { return quantile_stats_js_1.QuantileStats; } });
|
|
14
|
+
Object.defineProperty(exports, "riskToPercentile", { enumerable: true, get: function () { return quantile_stats_js_1.riskToPercentile; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA2C;AAAlC,yGAAA,SAAS,OAAA;AAgBlB,qEAGwC;AAFtC,wIAAA,kCAAkC,OAAA;AAClC,kIAAA,4BAA4B,OAAA;AAG9B,2DAAsE;AAA7D,8GAAA,WAAW,OAAA;AAAE,iHAAA,cAAc,OAAA;AACpC,+DAA4E;AAAnE,kHAAA,aAAa,OAAA;AAAE,qHAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { ActivixActivityClient, ActivixActivityRecord, ActivixRunContext } from '@x12i/activix-contracts';
|
|
2
|
+
export type ActivixWriterOptions = {
|
|
3
|
+
collection?: string;
|
|
4
|
+
pipelineId: string;
|
|
5
|
+
algorithmVersion: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class ActivixOptimixerWriter {
|
|
8
|
+
private readonly client;
|
|
9
|
+
private readonly options;
|
|
10
|
+
constructor(client: ActivixActivityClient, options: ActivixWriterOptions);
|
|
11
|
+
startPredictionRecord(input: {
|
|
12
|
+
runContext?: ActivixRunContext;
|
|
13
|
+
outerInput: unknown;
|
|
14
|
+
outerOutput: unknown;
|
|
15
|
+
outerMetadata?: Record<string, unknown>;
|
|
16
|
+
}): Promise<string>;
|
|
17
|
+
completePredictionRecord(activityId: string, updates: Partial<ActivixActivityRecord>): Promise<void>;
|
|
18
|
+
patchPredictionRecord(activityId: string, fields: Partial<ActivixActivityRecord>): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
export declare function warmupBucketStoreFromActivix(client: ActivixActivityClient, opts: {
|
|
21
|
+
collection?: string;
|
|
22
|
+
pipelineId: string;
|
|
23
|
+
limit: number;
|
|
24
|
+
onObservation: (actionTypeId: string, provider: string | undefined, model: string | undefined, completionTokens: number) => void;
|
|
25
|
+
}): Promise<number>;
|
|
26
|
+
//# sourceMappingURL=activix-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activix-writer.d.ts","sourceRoot":"","sources":["../../src/persistence/activix-writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,qBAAqB,EACrB,iBAAiB,EAClB,MAAM,yBAAyB,CAAC;AAMjC,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,qBAAa,sBAAsB;IAE/B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,MAAM,EAAE,qBAAqB,EAC7B,OAAO,EAAE,oBAAoB;IAG1C,qBAAqB,CAAC,KAAK,EAAE;QACjC,UAAU,CAAC,EAAE,iBAAiB,CAAC;QAC/B,UAAU,EAAE,OAAO,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC,GAAG,OAAO,CAAC,MAAM,CAAC;IAqBb,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACtC,OAAO,CAAC,IAAI,CAAC;IAMV,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC;CAWjB;AAED,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE;IACJ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,KAAK,IAAI,CAAC;CAClI,GACA,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ActivixOptimixerWriter = void 0;
|
|
4
|
+
exports.warmupBucketStoreFromActivix = warmupBucketStoreFromActivix;
|
|
5
|
+
const activix_contracts_1 = require("@x12i/activix-contracts");
|
|
6
|
+
class ActivixOptimixerWriter {
|
|
7
|
+
client;
|
|
8
|
+
options;
|
|
9
|
+
constructor(client, options) {
|
|
10
|
+
this.client = client;
|
|
11
|
+
this.options = options;
|
|
12
|
+
}
|
|
13
|
+
async startPredictionRecord(input) {
|
|
14
|
+
const result = await this.client.startRecord({
|
|
15
|
+
runContext: input.runContext,
|
|
16
|
+
outer: {
|
|
17
|
+
input: input.outerInput,
|
|
18
|
+
output: input.outerOutput,
|
|
19
|
+
metadata: {
|
|
20
|
+
kind: activix_contracts_1.ACTIVIX_METADATA_KIND_OPTIMIXER_PREDICTION,
|
|
21
|
+
optimizer: activix_contracts_1.ACTIVIX_METADATA_OPTIMIZER_OPTIMIXER,
|
|
22
|
+
pipelineId: this.options.pipelineId,
|
|
23
|
+
algorithmVersion: this.options.algorithmVersion,
|
|
24
|
+
...(input.outerMetadata ?? {}),
|
|
25
|
+
},
|
|
26
|
+
},
|
|
27
|
+
}, { collection: this.options.collection });
|
|
28
|
+
return result.activityId;
|
|
29
|
+
}
|
|
30
|
+
async completePredictionRecord(activityId, updates) {
|
|
31
|
+
await this.client.completeRecord(activityId, updates, {
|
|
32
|
+
collection: this.options.collection,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async patchPredictionRecord(activityId, fields) {
|
|
36
|
+
if (this.client.patchRecord) {
|
|
37
|
+
await this.client.patchRecord(activityId, fields, {
|
|
38
|
+
collection: this.options.collection,
|
|
39
|
+
});
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await this.client.completeRecord(activityId, fields, {
|
|
43
|
+
collection: this.options.collection,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.ActivixOptimixerWriter = ActivixOptimixerWriter;
|
|
48
|
+
async function warmupBucketStoreFromActivix(client, opts) {
|
|
49
|
+
if (!client.findRecords) {
|
|
50
|
+
return 0;
|
|
51
|
+
}
|
|
52
|
+
const rows = await client.findRecords({
|
|
53
|
+
'outer.metadata.pipelineId': opts.pipelineId,
|
|
54
|
+
'outer.metadata.optimizer': activix_contracts_1.ACTIVIX_METADATA_OPTIMIZER_OPTIMIXER,
|
|
55
|
+
status: 'completed',
|
|
56
|
+
}, {
|
|
57
|
+
collection: opts.collection,
|
|
58
|
+
limit: opts.limit,
|
|
59
|
+
sort: { startTime: -1 },
|
|
60
|
+
});
|
|
61
|
+
let loaded = 0;
|
|
62
|
+
for (const row of rows) {
|
|
63
|
+
const outer = row.outer;
|
|
64
|
+
const input = outer?.input;
|
|
65
|
+
const output = outer?.output;
|
|
66
|
+
const actual = (output?.actual ?? output);
|
|
67
|
+
const completionTokens = actual?.completionTokens ?? actual?.completion_tokens;
|
|
68
|
+
const actionTypeId = input?.actionTypeId;
|
|
69
|
+
if (typeof actionTypeId !== 'string' || typeof completionTokens !== 'number' || !input) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
opts.onObservation(actionTypeId, typeof input.provider === 'string' ? input.provider : undefined, typeof input.model === 'string' ? input.model : undefined, completionTokens);
|
|
73
|
+
loaded += 1;
|
|
74
|
+
}
|
|
75
|
+
return loaded;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=activix-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activix-writer.js","sourceRoot":"","sources":["../../src/persistence/activix-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ActivixActivityClient } from '@x12i/activix-contracts';
|
|
2
|
+
import type { AiMaxTokensActualUsage, AiMaxTokensPredictionInput, AiMaxTokensPredictionResult, OptimixerAcceptableRisk, OptimixerPipelineConfig } from '../contracts/optimixer-types.js';
|
|
3
|
+
import { ActivixOptimixerWriter } from '../persistence/activix-writer.js';
|
|
4
|
+
import { type BucketStore } from '../state/bucket-store.js';
|
|
5
|
+
export declare function predictAiMaxTokensV1(input: AiMaxTokensPredictionInput, bucketStore: BucketStore, config?: OptimixerPipelineConfig): Omit<AiMaxTokensPredictionResult, 'requestId'>;
|
|
6
|
+
export declare function recordAiMaxTokensPrediction(writer: ActivixOptimixerWriter, input: AiMaxTokensPredictionInput, prediction: Omit<AiMaxTokensPredictionResult, 'requestId'>): Promise<AiMaxTokensPredictionResult>;
|
|
7
|
+
export declare function completeAiMaxTokensPredictionV1(client: ActivixActivityClient, writer: ActivixOptimixerWriter, bucketStore: BucketStore, input: {
|
|
8
|
+
requestId: string;
|
|
9
|
+
actual: AiMaxTokensActualUsage;
|
|
10
|
+
collection?: string;
|
|
11
|
+
acceptableRisk?: OptimixerAcceptableRisk;
|
|
12
|
+
}): Promise<{
|
|
13
|
+
learning: {
|
|
14
|
+
bucketKey: string;
|
|
15
|
+
observedCompletionTokens: number;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=ai-max-tokens-v1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-max-tokens-v1.d.ts","sourceRoot":"","sources":["../../src/pipelines/ai-max-tokens-v1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAErE,OAAO,KAAK,EACV,sBAAsB,EACtB,0BAA0B,EAC1B,2BAA2B,EAC3B,uBAAuB,EACvB,uBAAuB,EACxB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAO5E,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,0BAA0B,EACjC,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,uBAAuB,GAC/B,IAAI,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAuChD;AAED,wBAAsB,2BAA2B,CAC/C,MAAM,EAAE,sBAAsB,EAC9B,KAAK,EAAE,0BAA0B,EACjC,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,WAAW,CAAC,GACzD,OAAO,CAAC,2BAA2B,CAAC,CAgBtC;AAED,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,qBAAqB,EAC7B,MAAM,EAAE,sBAAsB,EAC9B,WAAW,EAAE,WAAW,EACxB,KAAK,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,sBAAsB,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,uBAAuB,CAAC;CAC1C,GACA,OAAO,CAAC;IAAE,QAAQ,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,wBAAwB,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CA4ChF"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.predictAiMaxTokensV1 = predictAiMaxTokensV1;
|
|
4
|
+
exports.recordAiMaxTokensPrediction = recordAiMaxTokensPrediction;
|
|
5
|
+
exports.completeAiMaxTokensPredictionV1 = completeAiMaxTokensPredictionV1;
|
|
6
|
+
const activix_contracts_1 = require("@x12i/activix-contracts");
|
|
7
|
+
const optimixer_types_js_1 = require("../contracts/optimixer-types.js");
|
|
8
|
+
const bucket_store_js_1 = require("../state/bucket-store.js");
|
|
9
|
+
const quantile_stats_js_1 = require("../state/quantile-stats.js");
|
|
10
|
+
const DEFAULT_MAX_TOKENS = 4096;
|
|
11
|
+
const MIN_MAX_TOKENS = 64;
|
|
12
|
+
const HEADROOM_RATIO = 1.15;
|
|
13
|
+
function predictAiMaxTokensV1(input, bucketStore, config) {
|
|
14
|
+
const bucketKey = (0, bucket_store_js_1.buildBucketKey)({
|
|
15
|
+
actionTypeId: input.actionTypeId,
|
|
16
|
+
provider: input.provider,
|
|
17
|
+
model: input.model,
|
|
18
|
+
});
|
|
19
|
+
const stats = bucketStore.statsFor(bucketKey);
|
|
20
|
+
const defaultMax = config?.defaultMaxTokens ?? DEFAULT_MAX_TOKENS;
|
|
21
|
+
if (!stats || stats.count === 0) {
|
|
22
|
+
const baseline = Math.max(MIN_MAX_TOKENS, Math.ceil((input.inputSize + input.contextSize) * 0.25) + 256);
|
|
23
|
+
return {
|
|
24
|
+
pipelineId: optimixer_types_js_1.AI_MAX_TOKENS_V1_PIPELINE_ID,
|
|
25
|
+
algorithmVersion: optimixer_types_js_1.AI_MAX_TOKENS_V1_ALGORITHM_VERSION,
|
|
26
|
+
recommendedMaxTokens: Math.min(defaultMax, baseline),
|
|
27
|
+
confidence: 'cold-start',
|
|
28
|
+
bucketKey,
|
|
29
|
+
riskLevel: input.acceptableRisk,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
const percentile = (0, quantile_stats_js_1.riskToPercentile)(input.acceptableRisk);
|
|
33
|
+
const observed = stats.percentile(percentile) ?? stats.max() ?? defaultMax;
|
|
34
|
+
const recommended = Math.max(MIN_MAX_TOKENS, Math.ceil(observed * HEADROOM_RATIO));
|
|
35
|
+
return {
|
|
36
|
+
pipelineId: optimixer_types_js_1.AI_MAX_TOKENS_V1_PIPELINE_ID,
|
|
37
|
+
algorithmVersion: optimixer_types_js_1.AI_MAX_TOKENS_V1_ALGORITHM_VERSION,
|
|
38
|
+
recommendedMaxTokens: Math.min(defaultMax, recommended),
|
|
39
|
+
confidence: 'warm',
|
|
40
|
+
bucketKey,
|
|
41
|
+
riskLevel: input.acceptableRisk,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async function recordAiMaxTokensPrediction(writer, input, prediction) {
|
|
45
|
+
const requestId = await writer.startPredictionRecord({
|
|
46
|
+
runContext: input.runContext,
|
|
47
|
+
outerInput: input,
|
|
48
|
+
outerOutput: {
|
|
49
|
+
recommendedMaxTokens: prediction.recommendedMaxTokens,
|
|
50
|
+
confidence: prediction.confidence,
|
|
51
|
+
bucketKey: prediction.bucketKey,
|
|
52
|
+
riskLevel: prediction.riskLevel,
|
|
53
|
+
},
|
|
54
|
+
outerMetadata: {
|
|
55
|
+
actionTypeId: input.actionTypeId,
|
|
56
|
+
},
|
|
57
|
+
});
|
|
58
|
+
return { ...prediction, requestId };
|
|
59
|
+
}
|
|
60
|
+
async function completeAiMaxTokensPredictionV1(client, writer, bucketStore, input) {
|
|
61
|
+
const existing = await client.getRecord(input.requestId, {
|
|
62
|
+
collection: input.collection,
|
|
63
|
+
});
|
|
64
|
+
const outerInput = (existing?.outer?.input ?? {});
|
|
65
|
+
const actionTypeId = typeof outerInput.actionTypeId === 'string' ? outerInput.actionTypeId : 'unknown';
|
|
66
|
+
const bucketKey = (0, bucket_store_js_1.buildBucketKey)({
|
|
67
|
+
actionTypeId,
|
|
68
|
+
provider: typeof outerInput.provider === 'string' ? outerInput.provider : undefined,
|
|
69
|
+
model: typeof outerInput.model === 'string' ? outerInput.model : undefined,
|
|
70
|
+
});
|
|
71
|
+
bucketStore.observe(bucketKey, input.actual.completionTokens);
|
|
72
|
+
const cost = (0, activix_contracts_1.normalizeToActivixCostShape)({
|
|
73
|
+
prompt_tokens: input.actual.promptTokens,
|
|
74
|
+
completion_tokens: input.actual.completionTokens,
|
|
75
|
+
total_tokens: input.actual.totalTokens,
|
|
76
|
+
provider: outerInput.provider,
|
|
77
|
+
model: outerInput.model,
|
|
78
|
+
});
|
|
79
|
+
await writer.completePredictionRecord(input.requestId, {
|
|
80
|
+
outer: {
|
|
81
|
+
input: existing?.outer?.input ?? outerInput,
|
|
82
|
+
output: {
|
|
83
|
+
...existing?.outer?.output,
|
|
84
|
+
actual: input.actual,
|
|
85
|
+
learning: {
|
|
86
|
+
bucketKey,
|
|
87
|
+
observedCompletionTokens: input.actual.completionTokens,
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
metadata: existing?.outer?.metadata ?? {},
|
|
91
|
+
...(cost ? { cost } : {}),
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
learning: {
|
|
96
|
+
bucketKey,
|
|
97
|
+
observedCompletionTokens: input.actual.completionTokens,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=ai-max-tokens-v1.js.map
|