@seanhogg/builderforce-memory 2026.9.29 → 2026.9.30
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/bridges/AnthropicBridge.d.ts.map +1 -1
- package/dist/bridges/AnthropicBridge.js +24 -65
- package/dist/bridges/AnthropicBridge.js.map +1 -1
- package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
- package/dist/bridges/OpenAIBridge.js +12 -46
- package/dist/bridges/OpenAIBridge.js.map +1 -1
- package/dist/bridges/VertexAIBridge.d.ts.map +1 -1
- package/dist/bridges/VertexAIBridge.js +3 -34
- package/dist/bridges/VertexAIBridge.js.map +1 -1
- package/dist/distillation/DistillationEngine.d.ts +71 -54
- package/dist/distillation/DistillationEngine.d.ts.map +1 -1
- package/dist/distillation/DistillationEngine.js +112 -95
- package/dist/distillation/DistillationEngine.js.map +1 -1
- package/dist/distillation/index.d.ts +7 -1
- package/dist/distillation/index.d.ts.map +1 -1
- package/dist/distillation/index.js +5 -0
- package/dist/distillation/index.js.map +1 -1
- package/dist/distillation/ports.d.ts +43 -0
- package/dist/distillation/ports.d.ts.map +1 -0
- package/dist/distillation/ports.js +29 -0
- package/dist/distillation/ports.js.map +1 -0
- package/dist/eval/EvalHarness.d.ts +2 -1
- package/dist/eval/EvalHarness.d.ts.map +1 -1
- package/dist/eval/EvalHarness.js +13 -1
- package/dist/eval/EvalHarness.js.map +1 -1
- package/dist/eval/baseline.d.ts +33 -0
- package/dist/eval/baseline.d.ts.map +1 -0
- package/dist/eval/baseline.js +41 -0
- package/dist/eval/baseline.js.map +1 -0
- package/dist/eval/index.d.ts +1 -0
- package/dist/eval/index.d.ts.map +1 -1
- package/dist/eval/index.js +1 -0
- package/dist/eval/index.js.map +1 -1
- package/dist/eval/types.d.ts +7 -0
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/rag/EnterpriseRetriever.d.ts.map +1 -1
- package/dist/rag/EnterpriseRetriever.js +2 -1
- package/dist/rag/EnterpriseRetriever.js.map +1 -1
- package/dist/retrieval/HybridRetriever.d.ts.map +1 -1
- package/dist/retrieval/HybridRetriever.js +2 -1
- package/dist/retrieval/HybridRetriever.js.map +1 -1
- package/dist/retrieval/decay.d.ts +24 -0
- package/dist/retrieval/decay.d.ts.map +1 -0
- package/dist/retrieval/decay.js +29 -0
- package/dist/retrieval/decay.js.map +1 -0
- package/dist/retrieval/fusion.d.ts +13 -19
- package/dist/retrieval/fusion.d.ts.map +1 -1
- package/dist/retrieval/fusion.js +17 -44
- package/dist/retrieval/fusion.js.map +1 -1
- package/dist/retrieval/index.d.ts +13 -6
- package/dist/retrieval/index.d.ts.map +1 -1
- package/dist/retrieval/index.js +10 -5
- package/dist/retrieval/index.js.map +1 -1
- package/dist/retrieval/mmr.d.ts +60 -0
- package/dist/retrieval/mmr.d.ts.map +1 -0
- package/dist/retrieval/mmr.js +94 -0
- package/dist/retrieval/mmr.js.map +1 -0
- package/dist/retrieval/weightedFusion.d.ts +64 -0
- package/dist/retrieval/weightedFusion.d.ts.map +1 -0
- package/dist/retrieval/weightedFusion.js +80 -0
- package/dist/retrieval/weightedFusion.js.map +1 -0
- package/dist/similarity/index.d.ts +6 -4
- package/dist/similarity/index.d.ts.map +1 -1
- package/dist/similarity/index.js +5 -3
- package/dist/similarity/index.js.map +1 -1
- package/dist/wire/index.d.ts +18 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +17 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/sse.d.ts +29 -0
- package/dist/wire/sse.d.ts.map +1 -0
- package/dist/wire/sse.js +81 -0
- package/dist/wire/sse.js.map +1 -0
- package/dist/wire/usage.d.ts +46 -0
- package/dist/wire/usage.d.ts.map +1 -0
- package/dist/wire/usage.js +78 -0
- package/dist/wire/usage.js.map +1 -0
- package/package.json +11 -3
- package/src/bridges/AnthropicBridge.ts +24 -68
- package/src/bridges/OpenAIBridge.ts +11 -50
- package/src/bridges/VertexAIBridge.ts +3 -32
- package/src/distillation/DistillationEngine.ts +176 -141
- package/src/distillation/index.ts +15 -1
- package/src/distillation/ports.ts +55 -0
- package/src/eval/EvalHarness.ts +12 -1
- package/src/eval/baseline.ts +51 -0
- package/src/eval/index.ts +1 -0
- package/src/eval/types.ts +7 -0
- package/src/index.ts +5 -2
- package/src/rag/EnterpriseRetriever.ts +2 -1
- package/src/retrieval/HybridRetriever.ts +2 -1
- package/src/retrieval/decay.ts +29 -0
- package/src/retrieval/fusion.ts +19 -52
- package/src/retrieval/index.ts +24 -6
- package/src/retrieval/mmr.ts +126 -0
- package/src/retrieval/weightedFusion.ts +101 -0
- package/src/similarity/index.ts +6 -4
- package/src/wire/index.ts +18 -0
- package/src/wire/sse.ts +74 -0
- package/src/wire/usage.ts +95 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnthropicBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/AnthropicBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"AnthropicBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/AnthropicBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGvG,MAAM,WAAW,sBAAsB;IACnC,yBAAyB;IACzB,MAAM,EAAU,MAAM,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,2DAA2D;IAC3D,UAAU,CAAC,EAAK,MAAM,CAAC;IACvB,4CAA4C;IAC5C,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,iEAAiE;IACjE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAI,OAAO,CAAC;CAC3B;AAID,qBAAa,eAAgB,YAAW,iBAAiB;IACrD,QAAQ,CAAC,iBAAiB,EAAG,IAAI,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAW;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAW;IAExC,OAAO,CAAC,SAAS,CAA6B;gBAElC,IAAI,EAAE,sBAAsB;IASxC;;;;;OAKG;IACH,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IA0B1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IAwCtF,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,MAAM;CAWjB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* `system` field (not a message role), per the Anthropic spec.
|
|
6
6
|
*/
|
|
7
7
|
import { SSMError } from '../errors/SSMError.js';
|
|
8
|
+
import { readSseDataFrames, readUsageFields, AnthropicStreamUsage } from '../wire/index.js';
|
|
8
9
|
const API_URL = 'https://api.anthropic.com/v1/messages';
|
|
9
10
|
export class AnthropicBridge {
|
|
10
11
|
supportsStreaming = true;
|
|
@@ -59,30 +60,25 @@ export class AnthropicBridge {
|
|
|
59
60
|
if (!res.body) {
|
|
60
61
|
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'Anthropic streaming response has no body.');
|
|
61
62
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
const
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
input = Math.max(input, Number(usage.input_tokens) || 0);
|
|
75
|
-
output = Math.max(output, Number(usage.output_tokens) || 0);
|
|
76
|
-
cacheRead = Math.max(cacheRead, Number(usage.cache_read_input_tokens) || 0);
|
|
77
|
-
cacheWrite = Math.max(cacheWrite, Number(usage.cache_creation_input_tokens) || 0);
|
|
78
|
-
});
|
|
63
|
+
// `message_start` carries the input split; `message_delta` the running
|
|
64
|
+
// output count. Both are folded so the final usage is provider-measured.
|
|
65
|
+
const usage = new AnthropicStreamUsage();
|
|
66
|
+
for await (const frame of readSseDataFrames(res.body)) {
|
|
67
|
+
usage.observe(frame);
|
|
68
|
+
const ev = frame;
|
|
69
|
+
// content_block_delta events carry the streamed text
|
|
70
|
+
if (ev.type === 'content_block_delta' && typeof ev.delta?.text === 'string' && ev.delta.text.length > 0) {
|
|
71
|
+
yield ev.delta.text;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const totals = usage.result();
|
|
79
75
|
this._lastCall = {
|
|
80
76
|
usage: {
|
|
81
|
-
model:
|
|
82
|
-
inputTokens:
|
|
83
|
-
outputTokens:
|
|
84
|
-
cachedInputTokens:
|
|
85
|
-
cacheWriteTokens:
|
|
77
|
+
model: totals.model ?? opts.model ?? this._model,
|
|
78
|
+
inputTokens: totals.inputTokens,
|
|
79
|
+
outputTokens: totals.outputTokens,
|
|
80
|
+
cachedInputTokens: totals.cacheReadTokens,
|
|
81
|
+
cacheWriteTokens: totals.cacheCreationTokens,
|
|
86
82
|
},
|
|
87
83
|
};
|
|
88
84
|
}
|
|
@@ -118,44 +114,6 @@ export class AnthropicBridge {
|
|
|
118
114
|
});
|
|
119
115
|
}
|
|
120
116
|
}
|
|
121
|
-
// ── SSE parser (Anthropic event format) ──────────────────────────────────────
|
|
122
|
-
async function* parseAnthropicStream(body, onEvent) {
|
|
123
|
-
const reader = body.getReader();
|
|
124
|
-
const decoder = new TextDecoder();
|
|
125
|
-
let buffer = '';
|
|
126
|
-
try {
|
|
127
|
-
while (true) {
|
|
128
|
-
const { done, value } = await reader.read();
|
|
129
|
-
if (done)
|
|
130
|
-
break;
|
|
131
|
-
buffer += decoder.decode(value, { stream: true });
|
|
132
|
-
const lines = buffer.split('\n');
|
|
133
|
-
buffer = lines.pop(); // split() always yields ≥1 element → never undefined
|
|
134
|
-
for (const line of lines) {
|
|
135
|
-
const trimmed = line.trim();
|
|
136
|
-
if (!trimmed.startsWith('data: '))
|
|
137
|
-
continue;
|
|
138
|
-
const data = trimmed.slice(6);
|
|
139
|
-
try {
|
|
140
|
-
const event = JSON.parse(data);
|
|
141
|
-
onEvent?.(event);
|
|
142
|
-
// content_block_delta events carry the streamed text
|
|
143
|
-
if (event['type'] === 'content_block_delta') {
|
|
144
|
-
const text = event.delta?.text;
|
|
145
|
-
if (typeof text === 'string' && text.length > 0)
|
|
146
|
-
yield text;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
catch {
|
|
150
|
-
// Skip malformed SSE lines
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
finally {
|
|
156
|
-
reader.releaseLock();
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
117
|
/**
|
|
160
118
|
* Maps an Anthropic `usage` object onto the canonical {@link LlmUsage} shape.
|
|
161
119
|
* Absent when the response omits usage (an older gateway shim), in which case
|
|
@@ -164,13 +122,14 @@ async function* parseAnthropicStream(body, onEvent) {
|
|
|
164
122
|
function readAnthropicUsage(usage, model) {
|
|
165
123
|
if (!usage || typeof usage !== 'object')
|
|
166
124
|
return undefined;
|
|
167
|
-
|
|
125
|
+
// Anthropic's `input_tokens` already excludes both cache counts.
|
|
126
|
+
const u = readUsageFields(usage);
|
|
168
127
|
return {
|
|
169
128
|
model,
|
|
170
|
-
inputTokens:
|
|
171
|
-
outputTokens:
|
|
172
|
-
cachedInputTokens:
|
|
173
|
-
cacheWriteTokens:
|
|
129
|
+
inputTokens: u.promptTokens ?? 0,
|
|
130
|
+
outputTokens: u.completionTokens ?? 0,
|
|
131
|
+
cachedInputTokens: u.cacheReadTokens ?? 0,
|
|
132
|
+
cacheWriteTokens: u.cacheCreationTokens ?? 0,
|
|
174
133
|
};
|
|
175
134
|
}
|
|
176
135
|
//# sourceMappingURL=AnthropicBridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AnthropicBridge.js","sourceRoot":"","sources":["../../src/bridges/AnthropicBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"AnthropicBridge.js","sourceRoot":"","sources":["../../src/bridges/AnthropicBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGvG,MAAM,WAAW,mBAAmB;IAChC,kDAAkD;IAClD,MAAM,EAAU,MAAM,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,0DAA0D;IAC1D,OAAO,CAAC,EAAQ,MAAM,CAAC;IACvB,qDAAqD;IACrD,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,wCAAwC;IACxC,SAAS,CAAC,EAAM,MAAM,CAAC;CAC1B;AAED,qBAAa,YAAa,YAAW,iBAAiB;IAClD,OAAO,CAAC,SAAS,CAA6B;IAE9C,QAAQ,CAAC,iBAAiB,EAAG,IAAI,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;gBAE3B,IAAI,EAAE,mBAAmB;IAQrC,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAuB1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IA+BtF,OAAO,CAAC,UAAU;IAoBlB,OAAO,CAAC,MAAM;CAUjB"}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
6
|
*/
|
|
7
7
|
import { SSMError } from '../errors/SSMError.js';
|
|
8
|
+
import { readSseDataFrames, readUsageFields } from '../wire/index.js';
|
|
8
9
|
export class OpenAIBridge {
|
|
9
10
|
_lastCall;
|
|
10
11
|
supportsStreaming = true;
|
|
@@ -53,13 +54,16 @@ export class OpenAIBridge {
|
|
|
53
54
|
}
|
|
54
55
|
const model = opts.model ?? this._model;
|
|
55
56
|
let usage;
|
|
56
|
-
|
|
57
|
-
//
|
|
57
|
+
for await (const chunk of readSseDataFrames(res.body)) {
|
|
58
|
+
// Usage is only emitted because `_buildBody` sets `stream_options.include_usage`;
|
|
58
59
|
// without it OpenAI streams no usage at all and cost would be a guess.
|
|
59
|
-
const reported = readOpenAIUsage(
|
|
60
|
+
const reported = readOpenAIUsage(chunk.usage, chunk.model ?? model);
|
|
60
61
|
if (reported)
|
|
61
62
|
usage = reported;
|
|
62
|
-
|
|
63
|
+
const delta = chunk.choices?.[0]?.delta?.content;
|
|
64
|
+
if (typeof delta === 'string' && delta.length > 0)
|
|
65
|
+
yield delta;
|
|
66
|
+
}
|
|
63
67
|
this._lastCall = usage ? { usage } : {};
|
|
64
68
|
}
|
|
65
69
|
_buildBody(prompt, opts, stream) {
|
|
@@ -92,56 +96,18 @@ export class OpenAIBridge {
|
|
|
92
96
|
});
|
|
93
97
|
}
|
|
94
98
|
}
|
|
95
|
-
// ── SSE parser ────────────────────────────────────────────────────────────────
|
|
96
|
-
async function* parseOpenAIStream(body, onEvent) {
|
|
97
|
-
const reader = body.getReader();
|
|
98
|
-
const decoder = new TextDecoder();
|
|
99
|
-
let buffer = '';
|
|
100
|
-
try {
|
|
101
|
-
while (true) {
|
|
102
|
-
const { done, value } = await reader.read();
|
|
103
|
-
if (done)
|
|
104
|
-
break;
|
|
105
|
-
buffer += decoder.decode(value, { stream: true });
|
|
106
|
-
const lines = buffer.split('\n');
|
|
107
|
-
buffer = lines.pop(); // keep the last (possibly partial) line; split() always yields ≥1 element
|
|
108
|
-
for (const line of lines) {
|
|
109
|
-
const trimmed = line.trim();
|
|
110
|
-
if (!trimmed.startsWith('data: '))
|
|
111
|
-
continue;
|
|
112
|
-
const data = trimmed.slice(6);
|
|
113
|
-
if (data === '[DONE]')
|
|
114
|
-
return;
|
|
115
|
-
try {
|
|
116
|
-
const chunk = JSON.parse(data);
|
|
117
|
-
onEvent?.(chunk);
|
|
118
|
-
const delta = chunk.choices?.[0]?.delta?.content;
|
|
119
|
-
if (typeof delta === 'string' && delta.length > 0)
|
|
120
|
-
yield delta;
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
// Malformed JSON in stream — skip silently
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
finally {
|
|
129
|
-
reader.releaseLock();
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
99
|
/** Maps an OpenAI `usage` object onto the canonical {@link LlmUsage} shape. */
|
|
133
100
|
function readOpenAIUsage(usage, model) {
|
|
134
101
|
if (!usage || typeof usage !== 'object')
|
|
135
102
|
return undefined;
|
|
136
|
-
const u = usage;
|
|
137
|
-
const cached =
|
|
138
|
-
const prompt = Number(u['prompt_tokens']) || 0;
|
|
103
|
+
const u = readUsageFields(usage);
|
|
104
|
+
const cached = u.cacheReadTokens ?? 0;
|
|
139
105
|
return {
|
|
140
106
|
model,
|
|
141
107
|
// OpenAI reports `prompt_tokens` INCLUSIVE of cached tokens; the canonical
|
|
142
108
|
// shape keeps them disjoint so the two rates are applied exactly once each.
|
|
143
|
-
inputTokens: Math.max(0,
|
|
144
|
-
outputTokens:
|
|
109
|
+
inputTokens: Math.max(0, (u.promptTokens ?? 0) - cached),
|
|
110
|
+
outputTokens: u.completionTokens ?? 0,
|
|
145
111
|
cachedInputTokens: cached,
|
|
146
112
|
};
|
|
147
113
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VertexAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/VertexAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"VertexAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/VertexAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAGvG,MAAM,WAAW,qBAAqB;IAClC,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC5B;AAED,qBAAa,cAAe,YAAW,iBAAiB;IACpD,QAAQ,CAAC,iBAAiB,EAAG,IAAI,CAAU;IAE3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;IAEtC,OAAO,CAAC,SAAS,CAA6B;gBAElC,IAAI,EAAE,qBAAqB;IAYvC,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAa1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;YAkBxE,KAAK;CAqCtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,uBAAuB;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uDAAuD;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,oBAAoB,GAAG,iBAAiB,GAAG,qBAAqB,GAAG,gBAAgB,CAAC;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,IAAI,EAAE,uBAAuB;IAUzC,iFAAiF;IACjF,UAAU,GAAU,OAAO,MAAM,EAAE,KAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAmC3D;IAEF,oEAAoE;IACpE,KAAK,GAAU,MAAM,MAAM,KAAG,OAAO,CAAC,YAAY,CAAC,CAGjD;CACL"}
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
* that differ from the first-party API, so supply a matching `PriceBook`.
|
|
23
23
|
*/
|
|
24
24
|
import { SSMError } from '../errors/SSMError.js';
|
|
25
|
+
import { readSseDataFrames } from '../wire/index.js';
|
|
25
26
|
export class VertexAIBridge {
|
|
26
27
|
supportsStreaming = true;
|
|
27
28
|
_projectId;
|
|
@@ -64,7 +65,8 @@ export class VertexAIBridge {
|
|
|
64
65
|
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'Vertex AI streaming response has no body.');
|
|
65
66
|
}
|
|
66
67
|
let usage;
|
|
67
|
-
for await (const
|
|
68
|
+
for await (const frame of readSseDataFrames(res.body)) {
|
|
69
|
+
const event = frame;
|
|
68
70
|
const text = readCandidateText(event);
|
|
69
71
|
if (text)
|
|
70
72
|
yield text;
|
|
@@ -188,37 +190,4 @@ function readVertexUsage(usage, model) {
|
|
|
188
190
|
cachedInputTokens: cached,
|
|
189
191
|
};
|
|
190
192
|
}
|
|
191
|
-
/** Parses an `alt=sse` stream into JSON events. */
|
|
192
|
-
async function* parseSseJson(body) {
|
|
193
|
-
const reader = body.getReader();
|
|
194
|
-
const decoder = new TextDecoder();
|
|
195
|
-
let buffer = '';
|
|
196
|
-
try {
|
|
197
|
-
while (true) {
|
|
198
|
-
const { done, value } = await reader.read();
|
|
199
|
-
if (done)
|
|
200
|
-
break;
|
|
201
|
-
buffer += decoder.decode(value, { stream: true });
|
|
202
|
-
const lines = buffer.split('\n');
|
|
203
|
-
buffer = lines.pop();
|
|
204
|
-
for (const line of lines) {
|
|
205
|
-
const trimmed = line.trim();
|
|
206
|
-
if (!trimmed.startsWith('data:'))
|
|
207
|
-
continue;
|
|
208
|
-
const payload = trimmed.slice(5).trim();
|
|
209
|
-
if (!payload || payload === '[DONE]')
|
|
210
|
-
continue;
|
|
211
|
-
try {
|
|
212
|
-
yield JSON.parse(payload);
|
|
213
|
-
}
|
|
214
|
-
catch {
|
|
215
|
-
// Skip malformed SSE frames rather than failing the stream.
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
finally {
|
|
221
|
-
reader.releaseLock();
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
193
|
//# sourceMappingURL=VertexAIBridge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VertexAIBridge.js","sourceRoot":"","sources":["../../src/bridges/VertexAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"VertexAIBridge.js","sourceRoot":"","sources":["../../src/bridges/VertexAIBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* DistillationEngine –
|
|
2
|
+
* DistillationEngine – online knowledge distillation.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* This runs entirely in the browser with no Python or full-retraining required.
|
|
4
|
+
* A *teacher* (a frontier model) writes the ideal response; the *student* is adapted
|
|
5
|
+
* on it. Runs with no Python and no full retraining.
|
|
7
6
|
*
|
|
8
7
|
* Distillation flow:
|
|
9
|
-
* 1.
|
|
10
|
-
* 2.
|
|
11
|
-
* 3.
|
|
8
|
+
* 1. teacher.generate(input) → exemplar
|
|
9
|
+
* 2. quality gate (length / already-learned) → skip, or fall back to the caller's text
|
|
10
|
+
* 3. student.adapt(input + exemplar, + rehearsed past exemplars)
|
|
11
|
+
* 4. log the outcome
|
|
12
|
+
*
|
|
13
|
+
* Teacher and student are ports ({@link ./ports}). Passing an `SSMRuntime` and a
|
|
14
|
+
* `TransformerBridge` — the original pairing — still works unchanged.
|
|
12
15
|
*/
|
|
13
16
|
import type { AdaptOptions, AdaptResult } from '../session/index.js';
|
|
14
17
|
import type { SSMRuntime } from '../runtime/SSMRuntime.js';
|
|
15
|
-
import type {
|
|
18
|
+
import type { BridgeGenerateOptions } from '../bridges/TransformerBridge.js';
|
|
19
|
+
import { type DistillationStudent, type DistillationTeacher } from './ports.js';
|
|
16
20
|
export interface QualityGate {
|
|
17
21
|
/**
|
|
18
22
|
* Minimum character length of the teacher output.
|
|
@@ -20,36 +24,40 @@ export interface QualityGate {
|
|
|
20
24
|
*/
|
|
21
25
|
minLength?: number;
|
|
22
26
|
/**
|
|
23
|
-
* Maximum
|
|
24
|
-
* When the
|
|
27
|
+
* Maximum student perplexity threshold (needs a student with `evaluate`).
|
|
28
|
+
* When the student already achieves perplexity below this value on the teacher
|
|
25
29
|
* output, the content is considered already learned and adaptation is skipped.
|
|
26
30
|
*/
|
|
27
31
|
maxPerplexity?: number;
|
|
28
32
|
}
|
|
29
|
-
export interface DistillOptions {
|
|
30
|
-
/**
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
* WSLA is preferred because it is fast and targets the selective
|
|
34
|
-
* projection rows — exactly the parameters that encode token routing.
|
|
35
|
-
*/
|
|
36
|
-
adapt?: AdaptOptions;
|
|
37
|
-
/**
|
|
38
|
-
* Options forwarded to `bridge.generate()`.
|
|
39
|
-
*/
|
|
33
|
+
export interface DistillOptions<O = AdaptOptions> {
|
|
34
|
+
/** Options forwarded to the student's `adapt()`. */
|
|
35
|
+
adapt?: O;
|
|
36
|
+
/** Options forwarded to the teacher's `generate()` (system prompt, max tokens, …). */
|
|
40
37
|
generate?: BridgeGenerateOptions;
|
|
41
38
|
/**
|
|
42
39
|
* Quality gate filters that can skip adaptation for low-quality or
|
|
43
40
|
* already-learned inputs.
|
|
44
41
|
*/
|
|
45
42
|
qualityGate?: QualityGate;
|
|
43
|
+
/**
|
|
44
|
+
* What to learn when the teacher yields nothing usable — it threw, or its output
|
|
45
|
+
* failed the `minLength` gate. Without it such an input is skipped (a teacher
|
|
46
|
+
* error is thrown); with it the student learns this text instead, so the
|
|
47
|
+
* contribution is never lost, and the result says it was not distilled.
|
|
48
|
+
*/
|
|
49
|
+
fallbackText?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Cap on the characters of `input` that prefix the exemplar in the training text,
|
|
52
|
+
* so a long input can never crowd the exemplar out of the student's window.
|
|
53
|
+
*/
|
|
54
|
+
contextChars?: number;
|
|
46
55
|
}
|
|
47
56
|
/**
|
|
48
|
-
* Catastrophic-forgetting guard (EVM-5). Online
|
|
49
|
-
* weights toward the newest exemplar, which can erode previously-learned
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* reinforced instead of overwritten.
|
|
57
|
+
* Catastrophic-forgetting guard (EVM-5). Online adaptation moves a narrow set of
|
|
58
|
+
* weights toward the newest exemplar, which can erode previously-learned knowledge.
|
|
59
|
+
* A rehearsal (experience-replay) buffer mitigates this: each adapt also trains on a
|
|
60
|
+
* sample of past exemplars, so old knowledge is continually reinforced.
|
|
53
61
|
*/
|
|
54
62
|
export interface RehearsalOptions {
|
|
55
63
|
/** Ring-buffer capacity of past exemplars. 0 disables rehearsal. Default 0. */
|
|
@@ -59,26 +67,31 @@ export interface RehearsalOptions {
|
|
|
59
67
|
/** Deterministic sampling seed. Default 1. */
|
|
60
68
|
seed?: number;
|
|
61
69
|
}
|
|
62
|
-
|
|
70
|
+
/** Why an input was not learned from a teacher exemplar. */
|
|
71
|
+
export type DistillSkipReason = 'low_quality' | 'already_learned' | 'teacher_failed';
|
|
72
|
+
export interface DistillResult<R = AdaptResult> {
|
|
63
73
|
/** The input prompt that was distilled. */
|
|
64
74
|
input: string;
|
|
65
|
-
/** The teacher's
|
|
75
|
+
/** The teacher's response to the input ('' when the teacher failed). */
|
|
66
76
|
teacherOutput: string;
|
|
67
|
-
/** The
|
|
68
|
-
adaptResult:
|
|
69
|
-
/**
|
|
77
|
+
/** The student's result — its skipped result when nothing was adapted. */
|
|
78
|
+
adaptResult: R;
|
|
79
|
+
/** True when nothing was adapted at all. */
|
|
70
80
|
skipped?: boolean;
|
|
71
|
-
/**
|
|
72
|
-
|
|
81
|
+
/** True when the student learned the teacher's exemplar (not a fallback). */
|
|
82
|
+
distilled: boolean;
|
|
83
|
+
/** Why the exemplar was not learned, when it was not. */
|
|
84
|
+
skipReason?: DistillSkipReason;
|
|
85
|
+
/** What the teacher threw, when `skipReason` is `teacher_failed`. */
|
|
86
|
+
teacherError?: unknown;
|
|
73
87
|
/** Number of past exemplars rehearsed alongside this one (EVM-5). */
|
|
74
88
|
rehearsed?: number;
|
|
75
89
|
/** Student's pre-adapt perplexity on the teacher output, when the quality gate
|
|
76
|
-
* measured it — a "how novel was this exemplar" signal.
|
|
77
|
-
* exemplar was NOT skipped (previously discarded on the trained path). */
|
|
90
|
+
* measured it — a "how novel was this exemplar" signal. */
|
|
78
91
|
gatePerplexity?: number;
|
|
79
92
|
}
|
|
80
|
-
export interface DistillBatchResult {
|
|
81
|
-
results: DistillResult[];
|
|
93
|
+
export interface DistillBatchResult<R = AdaptResult> {
|
|
94
|
+
results: DistillResult<R>[];
|
|
82
95
|
/** Total number of adapt epochs run across all inputs. */
|
|
83
96
|
totalEpochs: number;
|
|
84
97
|
/** Wall-clock time for the entire batch in milliseconds. */
|
|
@@ -89,29 +102,29 @@ export interface DistillationLog {
|
|
|
89
102
|
input: string;
|
|
90
103
|
teacherOutputLength: number;
|
|
91
104
|
skipped: boolean;
|
|
92
|
-
|
|
105
|
+
/** True when the exemplar (not a fallback) was learned. */
|
|
106
|
+
distilled: boolean;
|
|
107
|
+
skipReason?: DistillSkipReason;
|
|
93
108
|
finalLoss?: number;
|
|
94
109
|
epochs: number;
|
|
95
110
|
/** Pre-adapt perplexity on the teacher output (when the quality gate measured it). */
|
|
96
111
|
gatePerplexity?: number;
|
|
97
112
|
}
|
|
98
|
-
export declare class DistillationEngine {
|
|
99
|
-
private readonly
|
|
100
|
-
private readonly
|
|
113
|
+
export declare class DistillationEngine<R = AdaptResult, O = AdaptOptions> {
|
|
114
|
+
private readonly _student;
|
|
115
|
+
private readonly _teacher;
|
|
101
116
|
private readonly _log;
|
|
102
117
|
private readonly _rehearsalSize;
|
|
103
118
|
private readonly _rehearsalK;
|
|
104
119
|
private readonly _rehearsal;
|
|
105
120
|
private _rehearsalState;
|
|
106
121
|
/**
|
|
107
|
-
* @param
|
|
108
|
-
* @param
|
|
109
|
-
*
|
|
110
|
-
*
|
|
111
|
-
* `bufferSize > 0`, each adapt also trains on a sample of past
|
|
112
|
-
* exemplars to guard against catastrophic forgetting.
|
|
122
|
+
* @param student What learns: an `SSMRuntime`, or any {@link DistillationStudent}.
|
|
123
|
+
* @param teacher What teaches: any `TransformerBridge`, or any {@link DistillationTeacher}.
|
|
124
|
+
* @param rehearsal Optional experience-replay config (EVM-5). When `bufferSize > 0`,
|
|
125
|
+
* each adapt also trains on a sample of past exemplars.
|
|
113
126
|
*/
|
|
114
|
-
constructor(
|
|
127
|
+
constructor(student: SSMRuntime | DistillationStudent<R, O>, teacher: DistillationTeacher, rehearsal?: RehearsalOptions);
|
|
115
128
|
/** Current number of exemplars held in the rehearsal buffer (EVM-5). */
|
|
116
129
|
getRehearsalBufferSize(): number;
|
|
117
130
|
/** Deterministic [0,1) draw for reproducible rehearsal sampling. */
|
|
@@ -123,22 +136,26 @@ export declare class DistillationEngine {
|
|
|
123
136
|
* Runs a single distillation pass:
|
|
124
137
|
* 1. Teacher generates a response for `input`
|
|
125
138
|
* 2. Quality gate is evaluated (if configured)
|
|
126
|
-
* 3.
|
|
139
|
+
* 3. Student is adapted on `input` + the teacher's output
|
|
127
140
|
*
|
|
128
|
-
* The training signal is the teacher's full response — this teaches the
|
|
129
|
-
*
|
|
130
|
-
* labelled data or a loss function beyond the standard LM objective.
|
|
141
|
+
* The training signal is the teacher's full response — this teaches the student
|
|
142
|
+
* what a good response to that prompt looks like, without labelled data.
|
|
131
143
|
*/
|
|
132
|
-
distill(input: string, opts?: DistillOptions): Promise<DistillResult
|
|
144
|
+
distill(input: string, opts?: DistillOptions<O>): Promise<DistillResult<R>>;
|
|
133
145
|
/**
|
|
134
146
|
* Runs distillation for each input in sequence.
|
|
135
147
|
* Aggregate statistics are returned alongside individual results.
|
|
136
148
|
*/
|
|
137
|
-
distillBatch(inputs: string[], opts?: DistillOptions): Promise<DistillBatchResult
|
|
149
|
+
distillBatch(inputs: string[], opts?: DistillOptions<O>): Promise<DistillBatchResult<R>>;
|
|
138
150
|
/**
|
|
139
151
|
* Returns a copy of the in-memory distillation log (last 200 entries).
|
|
140
152
|
*/
|
|
141
153
|
getLog(): DistillationLog[];
|
|
154
|
+
private _adapt;
|
|
155
|
+
/** No exemplar worth learning: learn the caller's fallback text instead. */
|
|
156
|
+
private _learnFallback;
|
|
157
|
+
/** Nothing adapted. */
|
|
158
|
+
private _skip;
|
|
142
159
|
private _appendLog;
|
|
143
160
|
}
|
|
144
161
|
//# sourceMappingURL=DistillationEngine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DistillationEngine.d.ts","sourceRoot":"","sources":["../../src/distillation/DistillationEngine.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"DistillationEngine.d.ts","sourceRoot":"","sources":["../../src/distillation/DistillationEngine.ts"],"names":[],"mappings":"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"}
|