@miller-tech/uap 1.136.2 → 1.137.2
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/.tsbuildinfo +1 -1
- package/dist/benchmarks/paired/report.d.ts +13 -0
- package/dist/benchmarks/paired/report.d.ts.map +1 -1
- package/dist/benchmarks/paired/report.js +29 -3
- package/dist/benchmarks/paired/report.js.map +1 -1
- package/dist/benchmarks/paired/types.d.ts +59 -0
- package/dist/benchmarks/paired/types.d.ts.map +1 -1
- package/dist/benchmarks/paired/types.js +60 -0
- package/dist/benchmarks/paired/types.js.map +1 -1
- package/dist/bin/cli.js +30 -0
- package/dist/bin/cli.js.map +1 -1
- package/dist/cli/deliver.d.ts.map +1 -1
- package/dist/cli/deliver.js +111 -7
- package/dist/cli/deliver.js.map +1 -1
- package/dist/cli/react.d.ts.map +1 -1
- package/dist/cli/react.js +18 -0
- package/dist/cli/react.js.map +1 -1
- package/dist/cli/self-tuning.d.ts +33 -0
- package/dist/cli/self-tuning.d.ts.map +1 -0
- package/dist/cli/self-tuning.js +139 -0
- package/dist/cli/self-tuning.js.map +1 -0
- package/dist/cli/tune-adapter.d.ts +8 -0
- package/dist/cli/tune-adapter.d.ts.map +1 -0
- package/dist/cli/tune-adapter.js +26 -0
- package/dist/cli/tune-adapter.js.map +1 -0
- package/dist/config/settings-registry.d.ts.map +1 -1
- package/dist/config/settings-registry.js +10 -0
- package/dist/config/settings-registry.js.map +1 -1
- package/dist/coordination/adaptation-signal.d.ts +19 -0
- package/dist/coordination/adaptation-signal.d.ts.map +1 -0
- package/dist/coordination/adaptation-signal.js +36 -0
- package/dist/coordination/adaptation-signal.js.map +1 -0
- package/dist/delivery/agentic-executor.d.ts +16 -1
- package/dist/delivery/agentic-executor.d.ts.map +1 -1
- package/dist/delivery/agentic-executor.js +45 -4
- package/dist/delivery/agentic-executor.js.map +1 -1
- package/dist/delivery/decompose.d.ts +27 -0
- package/dist/delivery/decompose.d.ts.map +1 -1
- package/dist/delivery/decompose.js +31 -1
- package/dist/delivery/decompose.js.map +1 -1
- package/dist/delivery/repair-escalation.d.ts +49 -0
- package/dist/delivery/repair-escalation.d.ts.map +1 -0
- package/dist/delivery/repair-escalation.js +83 -0
- package/dist/delivery/repair-escalation.js.map +1 -0
- package/dist/delivery/verifier-ladder.d.ts +47 -0
- package/dist/delivery/verifier-ladder.d.ts.map +1 -1
- package/dist/delivery/verifier-ladder.js +87 -1
- package/dist/delivery/verifier-ladder.js.map +1 -1
- package/dist/self-harness/mods.d.ts +20 -1
- package/dist/self-harness/mods.d.ts.map +1 -1
- package/dist/self-harness/mods.js +41 -0
- package/dist/self-harness/mods.js.map +1 -1
- package/dist/self-harness/orchestrator.js +4 -0
- package/dist/self-harness/orchestrator.js.map +1 -1
- package/dist/self-harness/transfer.d.ts.map +1 -1
- package/dist/self-harness/transfer.js +2 -0
- package/dist/self-harness/transfer.js.map +1 -1
- package/dist/self-tuning/flag-writer.d.ts +48 -0
- package/dist/self-tuning/flag-writer.d.ts.map +1 -0
- package/dist/self-tuning/flag-writer.js +102 -0
- package/dist/self-tuning/flag-writer.js.map +1 -0
- package/dist/self-tuning/flags.d.ts +88 -0
- package/dist/self-tuning/flags.d.ts.map +1 -0
- package/dist/self-tuning/flags.js +189 -0
- package/dist/self-tuning/flags.js.map +1 -0
- package/dist/self-tuning/index.d.ts +25 -0
- package/dist/self-tuning/index.d.ts.map +1 -0
- package/dist/self-tuning/index.js +25 -0
- package/dist/self-tuning/index.js.map +1 -0
- package/dist/self-tuning/judge.d.ts +66 -0
- package/dist/self-tuning/judge.d.ts.map +1 -0
- package/dist/self-tuning/judge.js +145 -0
- package/dist/self-tuning/judge.js.map +1 -0
- package/dist/self-tuning/llm-tuner.d.ts +83 -0
- package/dist/self-tuning/llm-tuner.d.ts.map +1 -0
- package/dist/self-tuning/llm-tuner.js +191 -0
- package/dist/self-tuning/llm-tuner.js.map +1 -0
- package/dist/self-tuning/orchestrator.d.ts +90 -0
- package/dist/self-tuning/orchestrator.d.ts.map +1 -0
- package/dist/self-tuning/orchestrator.js +126 -0
- package/dist/self-tuning/orchestrator.js.map +1 -0
- package/dist/self-tuning/paired-validator.d.ts +50 -0
- package/dist/self-tuning/paired-validator.d.ts.map +1 -0
- package/dist/self-tuning/paired-validator.js +78 -0
- package/dist/self-tuning/paired-validator.js.map +1 -0
- package/dist/self-tuning/profiles/index.d.ts +11 -0
- package/dist/self-tuning/profiles/index.d.ts.map +1 -0
- package/dist/self-tuning/profiles/index.js +15 -0
- package/dist/self-tuning/profiles/index.js.map +1 -0
- package/dist/self-tuning/profiles/opus48.d.ts +11 -0
- package/dist/self-tuning/profiles/opus48.d.ts.map +1 -0
- package/dist/self-tuning/profiles/opus48.js +27 -0
- package/dist/self-tuning/profiles/opus48.js.map +1 -0
- package/dist/self-tuning/profiles/qwen36.d.ts +11 -0
- package/dist/self-tuning/profiles/qwen36.d.ts.map +1 -0
- package/dist/self-tuning/profiles/qwen36.js +33 -0
- package/dist/self-tuning/profiles/qwen36.js.map +1 -0
- package/dist/self-tuning/quality-scorer.d.ts +90 -0
- package/dist/self-tuning/quality-scorer.d.ts.map +1 -0
- package/dist/self-tuning/quality-scorer.js +180 -0
- package/dist/self-tuning/quality-scorer.js.map +1 -0
- package/dist/self-tuning/realtime-adaptor.d.ts +78 -0
- package/dist/self-tuning/realtime-adaptor.d.ts.map +1 -0
- package/dist/self-tuning/realtime-adaptor.js +127 -0
- package/dist/self-tuning/realtime-adaptor.js.map +1 -0
- package/dist/self-tuning/run.d.ts +61 -0
- package/dist/self-tuning/run.d.ts.map +1 -0
- package/dist/self-tuning/run.js +122 -0
- package/dist/self-tuning/run.js.map +1 -0
- package/dist/self-tuning/search-reducer.d.ts +76 -0
- package/dist/self-tuning/search-reducer.d.ts.map +1 -0
- package/dist/self-tuning/search-reducer.js +349 -0
- package/dist/self-tuning/search-reducer.js.map +1 -0
- package/dist/self-tuning/tuning-profile.d.ts +72 -0
- package/dist/self-tuning/tuning-profile.d.ts.map +1 -0
- package/dist/self-tuning/tuning-profile.js +134 -0
- package/dist/self-tuning/tuning-profile.js.map +1 -0
- package/dist/telemetry/session-telemetry.d.ts +25 -0
- package/dist/telemetry/session-telemetry.d.ts.map +1 -1
- package/dist/telemetry/session-telemetry.js +32 -0
- package/dist/telemetry/session-telemetry.js.map +1 -1
- package/dist/types/config.d.ts +13 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +3 -0
- package/dist/types/config.js.map +1 -1
- package/docs/INDEX.md +7 -4
- package/docs/design/LLM_SELF_TUNING_ANALYSIS.md +617 -0
- package/docs/guides/AUTOMATIC_FEATURES.md +8 -0
- package/docs/guides/DROIDS_AND_SKILLS.md +1 -1
- package/docs/guides/SELF_TUNING.md +137 -0
- package/docs/reference/CLI.md +262 -1
- package/docs/reference/CONFIGURATION_REFERENCE.md +24 -0
- package/docs/reference/FEATURES.md +20 -5
- package/package.json +1 -1
- package/src/policies/enforcers/__pycache__/_common.cpython-312.pyc +0 -0
- package/tools/agents/scripts/__pycache__/toolcall_path_normalizer.cpython-312.pyc +0 -0
- package/tools/agents/scripts/anthropic_proxy.py +355 -29
- package/tools/agents/scripts/confidence_escalation.py +60 -4
- package/tools/agents/tests/test_confidence_escalation.py +77 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Self-Tuning — the Search-Space Reducer (P1): a real Gaussian-process
|
|
3
|
+
* Bayesian optimizer over the tunable-flag space.
|
|
4
|
+
*
|
|
5
|
+
* With 16 flags of mixed type the naive grid is intractable (design §3.3.3), so
|
|
6
|
+
* this module implements the three reduction techniques the design calls for as
|
|
7
|
+
* an actual GP-BO loop:
|
|
8
|
+
* 1. DEPENDENCY AWARENESS — inactive flags (whose parent gates them off) do
|
|
9
|
+
* not contribute to the kernel distance and are never perturbed, so the
|
|
10
|
+
* optimizer never wastes samples on a knob that has no effect.
|
|
11
|
+
* 2. BAYESIAN OPTIMIZATION — a Gaussian process with an ARD kernel over mixed
|
|
12
|
+
* numeric (squared-exponential) + categorical (Hamming) dimensions models
|
|
13
|
+
* the quality surface; the next point maximizes Expected Improvement.
|
|
14
|
+
* 3. TRANSFER LEARNING — prior good configs (from other models) are injected
|
|
15
|
+
* into the candidate pool as high-value seeds.
|
|
16
|
+
*
|
|
17
|
+
* The GP math is dependency-free: standardized targets, a Cholesky solve of
|
|
18
|
+
* (K+σ²I), a small log-marginal-likelihood grid over the lengthscales, and the
|
|
19
|
+
* closed-form EI acquisition. Everything is seeded for reproducible reports.
|
|
20
|
+
*/
|
|
21
|
+
import { FlagConfig } from './flags.js';
|
|
22
|
+
/** One observed (config, quality) datapoint the GP is conditioned on. */
|
|
23
|
+
export interface Observation {
|
|
24
|
+
config: FlagConfig;
|
|
25
|
+
/** Composite quality score (0-100) measured for this config. */
|
|
26
|
+
quality: number;
|
|
27
|
+
}
|
|
28
|
+
/** The four search phases (design §3.3.2). Bias which flags get perturbed. */
|
|
29
|
+
export type SearchPhase = 'coarse' | 'medium' | 'fine' | 'combinatorial';
|
|
30
|
+
export interface SearchOptions {
|
|
31
|
+
/** RNG seed for reproducibility. Default 1. */
|
|
32
|
+
seed?: number;
|
|
33
|
+
/** Candidate pool size to score with the acquisition. Default 256. */
|
|
34
|
+
poolSize?: number;
|
|
35
|
+
/** EI exploration margin (ξ). Higher = more exploratory. Default 1.0 (std units). */
|
|
36
|
+
xi?: number;
|
|
37
|
+
/** Observation noise variance on the standardized scale. Default 0.05. */
|
|
38
|
+
noise?: number;
|
|
39
|
+
/** Prior good configs (e.g. cross-model transfer) seeded into the pool. */
|
|
40
|
+
priors?: FlagConfig[];
|
|
41
|
+
/** Search phase controlling candidate generation. Default 'combinatorial'. */
|
|
42
|
+
phase?: SearchPhase;
|
|
43
|
+
/**
|
|
44
|
+
* Cold-start anchor: the config to explore around when there are NO
|
|
45
|
+
* observations yet (nothing to fit a GP on). Lets the loop bootstrap its first
|
|
46
|
+
* proposal from the current config instead of stalling.
|
|
47
|
+
*/
|
|
48
|
+
seedConfig?: FlagConfig;
|
|
49
|
+
}
|
|
50
|
+
export interface Suggestion {
|
|
51
|
+
config: FlagConfig;
|
|
52
|
+
/** Expected Improvement (standardized units) of this config. */
|
|
53
|
+
ei: number;
|
|
54
|
+
/** GP predictive mean quality (0-100). */
|
|
55
|
+
mean: number;
|
|
56
|
+
/** GP predictive std (0-100 scale). */
|
|
57
|
+
std: number;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Generate a de-duplicated candidate pool around `best`: single- and
|
|
61
|
+
* double-flag perturbations (phase-scoped) + priors + a few random configs.
|
|
62
|
+
*/
|
|
63
|
+
export declare function generateCandidates(best: FlagConfig, opts?: SearchOptions): FlagConfig[];
|
|
64
|
+
/**
|
|
65
|
+
* The core BO step: fit a GP on `observations` and return the candidate config
|
|
66
|
+
* that maximizes Expected Improvement over the current best observed quality.
|
|
67
|
+
* With <2 observations there is nothing to model, so it returns the best
|
|
68
|
+
* single-flag neighbor deterministically (pure exploration).
|
|
69
|
+
*/
|
|
70
|
+
export declare function proposeNext(observations: Observation[], opts?: SearchOptions): Suggestion | null;
|
|
71
|
+
/** Expose the fitted-GP prediction for callers that want the surface directly. */
|
|
72
|
+
export declare function fitAndPredict(observations: Observation[], at: FlagConfig, noise?: number): {
|
|
73
|
+
mean: number;
|
|
74
|
+
std: number;
|
|
75
|
+
} | null;
|
|
76
|
+
//# sourceMappingURL=search-reducer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-reducer.d.ts","sourceRoot":"","sources":["../../src/self-tuning/search-reducer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAGL,UAAU,EAKX,MAAM,YAAY,CAAC;AAEpB,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,8EAA8E;AAC9E,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,eAAe,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qFAAqF;IACrF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,8EAA8E;IAC9E,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,gEAAgE;IAChE,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,uCAAuC;IACvC,GAAG,EAAE,MAAM,CAAC;CACb;AA+OD;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,UAAU,EAChB,IAAI,GAAE,aAAkB,GACvB,UAAU,EAAE,CAsDd;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,WAAW,EAAE,EAAE,IAAI,GAAE,aAAkB,GAAG,UAAU,GAAG,IAAI,CAsCpG;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAC3B,YAAY,EAAE,WAAW,EAAE,EAC3B,EAAE,EAAE,UAAU,EACd,KAAK,SAAO,GACX;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAItC"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Self-Tuning — the Search-Space Reducer (P1): a real Gaussian-process
|
|
3
|
+
* Bayesian optimizer over the tunable-flag space.
|
|
4
|
+
*
|
|
5
|
+
* With 16 flags of mixed type the naive grid is intractable (design §3.3.3), so
|
|
6
|
+
* this module implements the three reduction techniques the design calls for as
|
|
7
|
+
* an actual GP-BO loop:
|
|
8
|
+
* 1. DEPENDENCY AWARENESS — inactive flags (whose parent gates them off) do
|
|
9
|
+
* not contribute to the kernel distance and are never perturbed, so the
|
|
10
|
+
* optimizer never wastes samples on a knob that has no effect.
|
|
11
|
+
* 2. BAYESIAN OPTIMIZATION — a Gaussian process with an ARD kernel over mixed
|
|
12
|
+
* numeric (squared-exponential) + categorical (Hamming) dimensions models
|
|
13
|
+
* the quality surface; the next point maximizes Expected Improvement.
|
|
14
|
+
* 3. TRANSFER LEARNING — prior good configs (from other models) are injected
|
|
15
|
+
* into the candidate pool as high-value seeds.
|
|
16
|
+
*
|
|
17
|
+
* The GP math is dependency-free: standardized targets, a Cholesky solve of
|
|
18
|
+
* (K+σ²I), a small log-marginal-likelihood grid over the lengthscales, and the
|
|
19
|
+
* closed-form EI acquisition. Everything is seeded for reproducible reports.
|
|
20
|
+
*/
|
|
21
|
+
import { mulberry32 } from '../benchmarks/paired/stats.js';
|
|
22
|
+
import { TUNABLE_FLAGS, flagValue, isFlagActive, coerceToDomain, } from './flags.js';
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Normal helpers (erf-based CDF) for the EI closed form.
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
function erf(x) {
|
|
27
|
+
// Abramowitz & Stegun 7.1.26 — max error 1.5e-7.
|
|
28
|
+
const t = 1 / (1 + 0.3275911 * Math.abs(x));
|
|
29
|
+
const y = 1 -
|
|
30
|
+
((((1.061405429 * t - 1.453152027) * t + 1.421413741) * t - 0.284496736) * t + 0.254829592) *
|
|
31
|
+
t *
|
|
32
|
+
Math.exp(-x * x);
|
|
33
|
+
return x >= 0 ? y : -y;
|
|
34
|
+
}
|
|
35
|
+
function normCdf(z) {
|
|
36
|
+
return 0.5 * (1 + erf(z / Math.SQRT2));
|
|
37
|
+
}
|
|
38
|
+
function normPdf(z) {
|
|
39
|
+
return Math.exp(-0.5 * z * z) / Math.sqrt(2 * Math.PI);
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Mixed numeric/categorical ARD kernel.
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
/** Normalize a flag's value to a comparable scalar, or a categorical token. */
|
|
45
|
+
function normNumeric(flag, v) {
|
|
46
|
+
const d = flag.domain;
|
|
47
|
+
if (d.kind === 'number') {
|
|
48
|
+
const n = typeof v === 'number' ? v : Number(v);
|
|
49
|
+
if (!Number.isFinite(n))
|
|
50
|
+
return 0;
|
|
51
|
+
return (Math.max(d.min, Math.min(d.max, n)) - d.min) / Math.max(1e-9, d.max - d.min);
|
|
52
|
+
}
|
|
53
|
+
// bool as 0/1
|
|
54
|
+
return v === true || v === 'true' || v === 1 ? 1 : 0;
|
|
55
|
+
}
|
|
56
|
+
/** k(a,b) with signal variance 1. Inactive-in-both dims contribute nothing. */
|
|
57
|
+
function kernel(a, b, p) {
|
|
58
|
+
let exponent = 0;
|
|
59
|
+
for (const flag of TUNABLE_FLAGS) {
|
|
60
|
+
const activeA = isFlagActive(flag, a);
|
|
61
|
+
const activeB = isFlagActive(flag, b);
|
|
62
|
+
if (!activeA && !activeB)
|
|
63
|
+
continue; // both agree the dim is irrelevant
|
|
64
|
+
const va = flagValue(a, flag.key);
|
|
65
|
+
const vb = flagValue(b, flag.key);
|
|
66
|
+
if (flag.domain.kind === 'enum') {
|
|
67
|
+
// Categorical (Hamming): mismatch OR active-in-one-only is a full mismatch.
|
|
68
|
+
const mism = activeA !== activeB || String(va) !== String(vb) ? 1 : 0;
|
|
69
|
+
exponent += mism / (p.lenCat * p.lenCat);
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
const ua = activeA ? normNumeric(flag, va) : normNumeric(flag, undefined);
|
|
73
|
+
const ub = activeB ? normNumeric(flag, vb) : normNumeric(flag, undefined);
|
|
74
|
+
// active-in-one-only adds a structural penalty on top of the value gap.
|
|
75
|
+
const struct = activeA !== activeB ? 0.5 : 0;
|
|
76
|
+
const diff = ua - ub;
|
|
77
|
+
exponent += (diff * diff + struct) / (p.lenNum * p.lenNum);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return Math.exp(-0.5 * exponent);
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Linear algebra: Cholesky of an SPD matrix + triangular solves.
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function cholesky(A) {
|
|
86
|
+
const n = A.length;
|
|
87
|
+
const L = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
88
|
+
for (let i = 0; i < n; i++) {
|
|
89
|
+
for (let j = 0; j <= i; j++) {
|
|
90
|
+
let sum = A[i][j];
|
|
91
|
+
for (let k = 0; k < j; k++)
|
|
92
|
+
sum -= L[i][k] * L[j][k];
|
|
93
|
+
if (i === j) {
|
|
94
|
+
L[i][j] = Math.sqrt(Math.max(sum, 1e-10));
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
L[i][j] = sum / L[j][j];
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return L;
|
|
102
|
+
}
|
|
103
|
+
/** Solve L y = b (forward) then Lᵀ x = y (back) for A x = b given A=LLᵀ. */
|
|
104
|
+
function cholSolve(L, b) {
|
|
105
|
+
const n = L.length;
|
|
106
|
+
const y = new Array(n).fill(0);
|
|
107
|
+
for (let i = 0; i < n; i++) {
|
|
108
|
+
let s = b[i];
|
|
109
|
+
for (let k = 0; k < i; k++)
|
|
110
|
+
s -= L[i][k] * y[k];
|
|
111
|
+
y[i] = s / L[i][i];
|
|
112
|
+
}
|
|
113
|
+
const x = new Array(n).fill(0);
|
|
114
|
+
for (let i = n - 1; i >= 0; i--) {
|
|
115
|
+
let s = y[i];
|
|
116
|
+
for (let k = i + 1; k < n; k++)
|
|
117
|
+
s -= L[k][i] * x[k];
|
|
118
|
+
x[i] = s / L[i][i];
|
|
119
|
+
}
|
|
120
|
+
return x;
|
|
121
|
+
}
|
|
122
|
+
function buildK(configs, p, noise) {
|
|
123
|
+
const n = configs.length;
|
|
124
|
+
const K = Array.from({ length: n }, () => new Array(n).fill(0));
|
|
125
|
+
for (let i = 0; i < n; i++) {
|
|
126
|
+
for (let j = i; j < n; j++) {
|
|
127
|
+
const k = kernel(configs[i], configs[j], p);
|
|
128
|
+
K[i][j] = k;
|
|
129
|
+
K[j][i] = k;
|
|
130
|
+
}
|
|
131
|
+
K[i][i] += noise; // jitter + observation noise on the diagonal
|
|
132
|
+
}
|
|
133
|
+
return K;
|
|
134
|
+
}
|
|
135
|
+
/** Log marginal likelihood (up to constants) for hyperparameter selection. */
|
|
136
|
+
function logMarginalLikelihood(configs, yStd, p, noise) {
|
|
137
|
+
const K = buildK(configs, p, noise);
|
|
138
|
+
const L = cholesky(K);
|
|
139
|
+
const alpha = cholSolve(L, yStd);
|
|
140
|
+
let dataFit = 0;
|
|
141
|
+
for (let i = 0; i < yStd.length; i++)
|
|
142
|
+
dataFit += yStd[i] * alpha[i];
|
|
143
|
+
let logDet = 0;
|
|
144
|
+
for (let i = 0; i < L.length; i++)
|
|
145
|
+
logDet += Math.log(L[i][i]);
|
|
146
|
+
return -0.5 * dataFit - logDet - 0.5 * yStd.length * Math.log(2 * Math.PI);
|
|
147
|
+
}
|
|
148
|
+
function fitGP(obs, noise) {
|
|
149
|
+
const configs = obs.map((o) => o.config);
|
|
150
|
+
const ys = obs.map((o) => o.quality);
|
|
151
|
+
const yMean = ys.reduce((a, b) => a + b, 0) / ys.length;
|
|
152
|
+
const varY = ys.reduce((a, b) => a + (b - yMean) * (b - yMean), 0) / Math.max(1, ys.length - 1);
|
|
153
|
+
const yStd = Math.max(1e-6, Math.sqrt(varY));
|
|
154
|
+
const yz = ys.map((y) => (y - yMean) / yStd);
|
|
155
|
+
// Light hyperparameter search: pick (lenNum, lenCat) maximizing log-ML over a
|
|
156
|
+
// small grid. This is standard GP model selection, kept cheap.
|
|
157
|
+
const numGrid = [0.15, 0.3, 0.5, 0.8];
|
|
158
|
+
const catGrid = [0.5, 1.0, 2.0];
|
|
159
|
+
let best = { lenNum: 0.3, lenCat: 1.0 };
|
|
160
|
+
let bestLml = -Infinity;
|
|
161
|
+
for (const lenNum of numGrid) {
|
|
162
|
+
for (const lenCat of catGrid) {
|
|
163
|
+
const lml = logMarginalLikelihood(configs, yz, { lenNum, lenCat }, noise);
|
|
164
|
+
if (Number.isFinite(lml) && lml > bestLml) {
|
|
165
|
+
bestLml = lml;
|
|
166
|
+
best = { lenNum, lenCat };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
const K = buildK(configs, best, noise);
|
|
171
|
+
const L = cholesky(K);
|
|
172
|
+
const alpha = cholSolve(L, yz);
|
|
173
|
+
return { L, alpha, yMean, yStd, params: best, configs, noise };
|
|
174
|
+
}
|
|
175
|
+
/** Predict (mean, std) in ORIGINAL quality units at a candidate config. */
|
|
176
|
+
function predict(gp, x) {
|
|
177
|
+
const ks = gp.configs.map((c) => kernel(x, c, gp.params));
|
|
178
|
+
let mz = 0;
|
|
179
|
+
for (let i = 0; i < ks.length; i++)
|
|
180
|
+
mz += ks[i] * gp.alpha[i];
|
|
181
|
+
const v = cholSolve(gp.L, ks);
|
|
182
|
+
let kxx = kernel(x, x, gp.params) + gp.noise;
|
|
183
|
+
for (let i = 0; i < ks.length; i++)
|
|
184
|
+
kxx -= ks[i] * v[i];
|
|
185
|
+
const varz = Math.max(0, kxx);
|
|
186
|
+
return { mean: gp.yMean + mz * gp.yStd, std: Math.sqrt(varz) * gp.yStd };
|
|
187
|
+
}
|
|
188
|
+
// ---------------------------------------------------------------------------
|
|
189
|
+
// Candidate generation (phase-aware, dependency-respecting).
|
|
190
|
+
// ---------------------------------------------------------------------------
|
|
191
|
+
function configKey(cfg) {
|
|
192
|
+
// Only active flags define identity — two configs differing solely in an
|
|
193
|
+
// inactive flag are the same point.
|
|
194
|
+
return TUNABLE_FLAGS.filter((f) => isFlagActive(f, cfg))
|
|
195
|
+
.map((f) => `${f.key}=${flagValue(cfg, f.key)}`)
|
|
196
|
+
.sort()
|
|
197
|
+
.join('|');
|
|
198
|
+
}
|
|
199
|
+
/** The set of flag values reachable for a numeric flag (grid over its range). */
|
|
200
|
+
function numericGrid(flag) {
|
|
201
|
+
if (flag.domain.kind !== 'number')
|
|
202
|
+
return [];
|
|
203
|
+
const { min, max, step, int } = flag.domain;
|
|
204
|
+
const out = [];
|
|
205
|
+
for (let v = min; v <= max + 1e-9; v += step)
|
|
206
|
+
out.push(int ? Math.round(v) : Number(v.toFixed(6)));
|
|
207
|
+
return out.length ? out : [int ? Math.round(min) : min];
|
|
208
|
+
}
|
|
209
|
+
/** All alternative values for a flag (excluding its current value). */
|
|
210
|
+
function alternatives(flag, current) {
|
|
211
|
+
if (flag.domain.kind === 'bool')
|
|
212
|
+
return [!(current === true)];
|
|
213
|
+
if (flag.domain.kind === 'enum')
|
|
214
|
+
return flag.domain.values.filter((v) => v !== current);
|
|
215
|
+
return numericGrid(flag).filter((v) => v !== current);
|
|
216
|
+
}
|
|
217
|
+
/** Which flags a phase is allowed to perturb. */
|
|
218
|
+
function phaseFlags(phase, cfg) {
|
|
219
|
+
const active = TUNABLE_FLAGS.filter((f) => isFlagActive(f, cfg) || f.dependsOn.length === 0);
|
|
220
|
+
switch (phase) {
|
|
221
|
+
case 'coarse': // toggle the top-level boolean enablers only
|
|
222
|
+
return active.filter((f) => f.domain.kind === 'bool' && f.dependsOn.length === 0);
|
|
223
|
+
case 'medium': // enum choices (recipe type, intensity)
|
|
224
|
+
return active.filter((f) => f.domain.kind === 'enum');
|
|
225
|
+
case 'fine': // numeric refinement
|
|
226
|
+
return active.filter((f) => f.domain.kind === 'number');
|
|
227
|
+
case 'combinatorial':
|
|
228
|
+
default:
|
|
229
|
+
return active;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
function mutate(cfg, flag, value) {
|
|
233
|
+
const next = { ...cfg };
|
|
234
|
+
const coerced = coerceToDomain(flag.key, value);
|
|
235
|
+
if (coerced !== null)
|
|
236
|
+
next[flag.key] = coerced;
|
|
237
|
+
return next;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Generate a de-duplicated candidate pool around `best`: single- and
|
|
241
|
+
* double-flag perturbations (phase-scoped) + priors + a few random configs.
|
|
242
|
+
*/
|
|
243
|
+
export function generateCandidates(best, opts = {}) {
|
|
244
|
+
const rng = mulberry32(opts.seed ?? 1);
|
|
245
|
+
const phase = opts.phase ?? 'combinatorial';
|
|
246
|
+
const poolSize = opts.poolSize ?? 256;
|
|
247
|
+
const seen = new Set([configKey(best)]);
|
|
248
|
+
const pool = [];
|
|
249
|
+
const push = (c) => {
|
|
250
|
+
const k = configKey(c);
|
|
251
|
+
if (!seen.has(k)) {
|
|
252
|
+
seen.add(k);
|
|
253
|
+
pool.push(c);
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
const flags = phaseFlags(phase, best);
|
|
257
|
+
// Priors (transfer seeds) first — highest-value candidates.
|
|
258
|
+
for (const prior of opts.priors ?? [])
|
|
259
|
+
push({ ...best, ...prior });
|
|
260
|
+
// Single-flag neighbors.
|
|
261
|
+
for (const flag of flags) {
|
|
262
|
+
for (const v of alternatives(flag, flagValue(best, flag.key))) {
|
|
263
|
+
push(mutate(best, flag, v));
|
|
264
|
+
if (pool.length >= poolSize)
|
|
265
|
+
return pool;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
// Double-flag neighbors (combinatorial phase captures interactions).
|
|
269
|
+
if (phase === 'combinatorial') {
|
|
270
|
+
for (let i = 0; i < flags.length && pool.length < poolSize; i++) {
|
|
271
|
+
for (let j = i + 1; j < flags.length && pool.length < poolSize; j++) {
|
|
272
|
+
const av = alternatives(flags[i], flagValue(best, flags[i].key));
|
|
273
|
+
const bv = alternatives(flags[j], flagValue(best, flags[j].key));
|
|
274
|
+
if (!av.length || !bv.length)
|
|
275
|
+
continue;
|
|
276
|
+
const a = av[(rng() * av.length) | 0];
|
|
277
|
+
const b = bv[(rng() * bv.length) | 0];
|
|
278
|
+
push(mutate(mutate(best, flags[i], a), flags[j], b));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
// A few fully-random configs for exploration.
|
|
283
|
+
const nRandom = Math.min(32, poolSize - pool.length);
|
|
284
|
+
for (let r = 0; r < nRandom; r++) {
|
|
285
|
+
let c = { ...best };
|
|
286
|
+
for (const flag of flags) {
|
|
287
|
+
if (rng() < 0.5)
|
|
288
|
+
continue;
|
|
289
|
+
const alts = alternatives(flag, flagValue(c, flag.key));
|
|
290
|
+
if (alts.length)
|
|
291
|
+
c = mutate(c, flag, alts[(rng() * alts.length) | 0]);
|
|
292
|
+
}
|
|
293
|
+
push(c);
|
|
294
|
+
}
|
|
295
|
+
return pool;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* The core BO step: fit a GP on `observations` and return the candidate config
|
|
299
|
+
* that maximizes Expected Improvement over the current best observed quality.
|
|
300
|
+
* With <2 observations there is nothing to model, so it returns the best
|
|
301
|
+
* single-flag neighbor deterministically (pure exploration).
|
|
302
|
+
*/
|
|
303
|
+
export function proposeNext(observations, opts = {}) {
|
|
304
|
+
if (observations.length === 0) {
|
|
305
|
+
// Cold start with no data: explore around the seed config if given.
|
|
306
|
+
if (!opts.seedConfig)
|
|
307
|
+
return null;
|
|
308
|
+
const cands = generateCandidates(opts.seedConfig, opts);
|
|
309
|
+
return cands.length ? { config: cands[0], ei: Number.POSITIVE_INFINITY, mean: 0, std: 0 } : null;
|
|
310
|
+
}
|
|
311
|
+
const noise = opts.noise ?? 0.05;
|
|
312
|
+
const xi = opts.xi ?? 1.0;
|
|
313
|
+
const best = observations.reduce((a, b) => (b.quality > a.quality ? b : a));
|
|
314
|
+
const candidates = generateCandidates(best.config, opts);
|
|
315
|
+
if (candidates.length === 0)
|
|
316
|
+
return null;
|
|
317
|
+
// Cold start: not enough data to condition a GP — explore the first neighbor.
|
|
318
|
+
if (observations.length < 3) {
|
|
319
|
+
const c = candidates[0];
|
|
320
|
+
return { config: c, ei: Number.POSITIVE_INFINITY, mean: best.quality, std: 0 };
|
|
321
|
+
}
|
|
322
|
+
const gp = fitGP(observations, noise);
|
|
323
|
+
const fBestZ = (best.quality - gp.yMean) / gp.yStd;
|
|
324
|
+
let bestCand = null;
|
|
325
|
+
for (const c of candidates) {
|
|
326
|
+
const { mean, std } = predict(gp, c);
|
|
327
|
+
const stdZ = std / gp.yStd;
|
|
328
|
+
let ei;
|
|
329
|
+
if (stdZ < 1e-9) {
|
|
330
|
+
ei = 0;
|
|
331
|
+
}
|
|
332
|
+
else {
|
|
333
|
+
const muZ = (mean - gp.yMean) / gp.yStd;
|
|
334
|
+
const z = (muZ - fBestZ - xi) / stdZ;
|
|
335
|
+
ei = (muZ - fBestZ - xi) * normCdf(z) + stdZ * normPdf(z);
|
|
336
|
+
}
|
|
337
|
+
if (!bestCand || ei > bestCand.ei)
|
|
338
|
+
bestCand = { config: c, ei, mean, std };
|
|
339
|
+
}
|
|
340
|
+
return bestCand;
|
|
341
|
+
}
|
|
342
|
+
/** Expose the fitted-GP prediction for callers that want the surface directly. */
|
|
343
|
+
export function fitAndPredict(observations, at, noise = 0.05) {
|
|
344
|
+
if (observations.length < 2)
|
|
345
|
+
return null;
|
|
346
|
+
const gp = fitGP(observations, noise);
|
|
347
|
+
return predict(gp, at);
|
|
348
|
+
}
|
|
349
|
+
//# sourceMappingURL=search-reducer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-reducer.js","sourceRoot":"","sources":["../../src/self-tuning/search-reducer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LLM Self-Tuning — model-specific tuning profiles (P1/P3).
|
|
3
|
+
*
|
|
4
|
+
* A `TuningProfile` is the best-known flag configuration for one executor model
|
|
5
|
+
* family, plus the accepted-step history that produced it. It is the durable
|
|
6
|
+
* output of the tuning loop and the prior for a fresh run on the same model.
|
|
7
|
+
* Persisted as JSON under `.uap/self-tuning/<model>.json`, mirroring the
|
|
8
|
+
* self-harness profile-snapshot pattern.
|
|
9
|
+
*
|
|
10
|
+
* Bundled starter profiles (qwen3.6, opus4.8) ship as typed constants (see
|
|
11
|
+
* ./profiles) so they are always present at runtime, and are used as the seed
|
|
12
|
+
* config + as cross-model transfer priors.
|
|
13
|
+
*/
|
|
14
|
+
import { FlagChange, FlagConfig } from './flags.js';
|
|
15
|
+
/** One accepted (or recorded-rejected) tuning step. */
|
|
16
|
+
export interface TuningRecord {
|
|
17
|
+
at: string;
|
|
18
|
+
changes: FlagChange[];
|
|
19
|
+
/** Composite quality measured for the resulting config. */
|
|
20
|
+
quality: number;
|
|
21
|
+
/** Quality delta vs the config it was compared against. */
|
|
22
|
+
delta: number;
|
|
23
|
+
accepted: boolean;
|
|
24
|
+
provenance: string;
|
|
25
|
+
}
|
|
26
|
+
export interface TuningProfile {
|
|
27
|
+
/** Normalized model family (see normalizeModel). */
|
|
28
|
+
model: string;
|
|
29
|
+
/** Best-known flag configuration for this model. */
|
|
30
|
+
config: FlagConfig;
|
|
31
|
+
/** Composite quality (0-100) of `config` when it was accepted. */
|
|
32
|
+
quality: number;
|
|
33
|
+
updatedAt: string;
|
|
34
|
+
provenance: string;
|
|
35
|
+
/** Append-only accepted/rejected step history. */
|
|
36
|
+
history: TuningRecord[];
|
|
37
|
+
/** Monotonic version (bumped each accepted step). */
|
|
38
|
+
version: number;
|
|
39
|
+
}
|
|
40
|
+
/** A fresh profile seeded from the bundled starter (or all-defaults). */
|
|
41
|
+
export declare function seedProfile(model: string, now: string): TuningProfile;
|
|
42
|
+
/**
|
|
43
|
+
* Look up a bundled starter config by (normalized) model family. Matches the
|
|
44
|
+
* bundled key against the normalized model so `qwen3.6-a3b-q4` → `qwen36` etc.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getBundledProfile(model: string): FlagConfig | null;
|
|
47
|
+
/**
|
|
48
|
+
* Cross-model transfer priors: the best-known configs from OTHER model families
|
|
49
|
+
* — bundled starters plus any stored profiles — used to seed the optimizer for
|
|
50
|
+
* `model` (design §3.3.3 transfer learning). A config that worked elsewhere is a
|
|
51
|
+
* high-value candidate, not a shortcut: it still goes through full validation.
|
|
52
|
+
*/
|
|
53
|
+
export declare function crossModelPriors(model: string, store?: TuningProfileStore): FlagConfig[];
|
|
54
|
+
/** JSON-file-backed profile store, one file per model under a base dir. */
|
|
55
|
+
export declare class TuningProfileStore {
|
|
56
|
+
private readonly baseDir;
|
|
57
|
+
constructor(baseDir: string);
|
|
58
|
+
/** The model families with a stored profile (basenames under the base dir). */
|
|
59
|
+
knownModels(): string[];
|
|
60
|
+
private pathFor;
|
|
61
|
+
load(model: string): TuningProfile | null;
|
|
62
|
+
/** Load the stored profile, or a fresh seeded one when none exists yet. */
|
|
63
|
+
loadOrSeed(model: string, now: string): TuningProfile;
|
|
64
|
+
save(profile: TuningProfile): void;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Fold an accepted step into a profile: adopt the new config, bump the version,
|
|
68
|
+
* update quality, and append the record. Rejected steps are appended to history
|
|
69
|
+
* (for learning) without changing the adopted config.
|
|
70
|
+
*/
|
|
71
|
+
export declare function recordStep(profile: TuningProfile, record: TuningRecord, newConfig: FlagConfig): TuningProfile;
|
|
72
|
+
//# sourceMappingURL=tuning-profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tuning-profile.d.ts","sourceRoot":"","sources":["../../src/self-tuning/tuning-profile.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAqB,MAAM,YAAY,CAAC;AAGvE,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,2DAA2D;IAC3D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,oDAAoD;IACpD,KAAK,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,MAAM,EAAE,UAAU,CAAC;IACnB,kEAAkE;IAClE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,yEAAyE;AACzE,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa,CAYrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAQlE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,kBAAkB,GAAG,UAAU,EAAE,CAiBxF;AAED,2EAA2E;AAC3E,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,MAAM;IAE5C,+EAA+E;IAC/E,WAAW,IAAI,MAAM,EAAE;IAUvB,OAAO,CAAC,OAAO;IAIf,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAUzC,2EAA2E;IAC3E,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAIrD,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;CAKnC;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,GAAG,aAAa,CAa7G"}
|