@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.
Files changed (68) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +96 -0
  3. package/dist/Optimixer.d.ts +22 -0
  4. package/dist/Optimixer.d.ts.map +1 -0
  5. package/dist/Optimixer.js +78 -0
  6. package/dist/Optimixer.js.map +1 -0
  7. package/dist/adapters/standalone-activix.d.ts +8 -0
  8. package/dist/adapters/standalone-activix.d.ts.map +1 -0
  9. package/dist/adapters/standalone-activix.js +23 -0
  10. package/dist/adapters/standalone-activix.js.map +1 -0
  11. package/dist/contracts/optimixer-types.d.ts +68 -0
  12. package/dist/contracts/optimixer-types.d.ts.map +1 -0
  13. package/dist/contracts/optimixer-types.js +3 -0
  14. package/dist/contracts/optimixer-types.js.map +1 -0
  15. package/dist/index.d.ts +6 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +5 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/persistence/activix-writer.d.ts +26 -0
  20. package/dist/persistence/activix-writer.d.ts.map +1 -0
  21. package/dist/persistence/activix-writer.js +72 -0
  22. package/dist/persistence/activix-writer.js.map +1 -0
  23. package/dist/pipelines/ai-max-tokens-v1.d.ts +18 -0
  24. package/dist/pipelines/ai-max-tokens-v1.d.ts.map +1 -0
  25. package/dist/pipelines/ai-max-tokens-v1.js +96 -0
  26. package/dist/pipelines/ai-max-tokens-v1.js.map +1 -0
  27. package/dist/state/bucket-store.d.ts +14 -0
  28. package/dist/state/bucket-store.d.ts.map +1 -0
  29. package/dist/state/bucket-store.js +24 -0
  30. package/dist/state/bucket-store.js.map +1 -0
  31. package/dist/state/quantile-stats.d.ts +12 -0
  32. package/dist/state/quantile-stats.d.ts.map +1 -0
  33. package/dist/state/quantile-stats.js +48 -0
  34. package/dist/state/quantile-stats.js.map +1 -0
  35. package/dist-cjs/Optimixer.d.ts +22 -0
  36. package/dist-cjs/Optimixer.d.ts.map +1 -0
  37. package/dist-cjs/Optimixer.js +82 -0
  38. package/dist-cjs/Optimixer.js.map +1 -0
  39. package/dist-cjs/adapters/standalone-activix.d.ts +8 -0
  40. package/dist-cjs/adapters/standalone-activix.d.ts.map +1 -0
  41. package/dist-cjs/adapters/standalone-activix.js +26 -0
  42. package/dist-cjs/adapters/standalone-activix.js.map +1 -0
  43. package/dist-cjs/contracts/optimixer-types.d.ts +68 -0
  44. package/dist-cjs/contracts/optimixer-types.d.ts.map +1 -0
  45. package/dist-cjs/contracts/optimixer-types.js +6 -0
  46. package/dist-cjs/contracts/optimixer-types.js.map +1 -0
  47. package/dist-cjs/index.d.ts +6 -0
  48. package/dist-cjs/index.d.ts.map +1 -0
  49. package/dist-cjs/index.js +15 -0
  50. package/dist-cjs/index.js.map +1 -0
  51. package/dist-cjs/package.json +3 -0
  52. package/dist-cjs/persistence/activix-writer.d.ts +26 -0
  53. package/dist-cjs/persistence/activix-writer.d.ts.map +1 -0
  54. package/dist-cjs/persistence/activix-writer.js +77 -0
  55. package/dist-cjs/persistence/activix-writer.js.map +1 -0
  56. package/dist-cjs/pipelines/ai-max-tokens-v1.d.ts +18 -0
  57. package/dist-cjs/pipelines/ai-max-tokens-v1.d.ts.map +1 -0
  58. package/dist-cjs/pipelines/ai-max-tokens-v1.js +101 -0
  59. package/dist-cjs/pipelines/ai-max-tokens-v1.js.map +1 -0
  60. package/dist-cjs/state/bucket-store.d.ts +14 -0
  61. package/dist-cjs/state/bucket-store.d.ts.map +1 -0
  62. package/dist-cjs/state/bucket-store.js +29 -0
  63. package/dist-cjs/state/bucket-store.js.map +1 -0
  64. package/dist-cjs/state/quantile-stats.d.ts +12 -0
  65. package/dist-cjs/state/quantile-stats.d.ts.map +1 -0
  66. package/dist-cjs/state/quantile-stats.js +53 -0
  67. package/dist-cjs/state/quantile-stats.js.map +1 -0
  68. 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,3 @@
1
+ {
2
+ "type": "commonjs"
3
+ }
@@ -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