@seanhogg/builderforce-memory 2026.9.29 → 2026.9.31
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/FetchBridge.d.ts +12 -5
- package/dist/bridges/FetchBridge.d.ts.map +1 -1
- package/dist/bridges/FetchBridge.js +6 -4
- package/dist/bridges/FetchBridge.js.map +1 -1
- package/dist/bridges/OpenAIBridge.d.ts +17 -4
- package/dist/bridges/OpenAIBridge.d.ts.map +1 -1
- package/dist/bridges/OpenAIBridge.js +71 -94
- package/dist/bridges/OpenAIBridge.js.map +1 -1
- package/dist/bridges/TransformerBridge.d.ts +6 -0
- package/dist/bridges/TransformerBridge.d.ts.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/chatClient.d.ts +100 -0
- package/dist/wire/chatClient.d.ts.map +1 -0
- package/dist/wire/chatClient.js +123 -0
- package/dist/wire/chatClient.js.map +1 -0
- package/dist/wire/index.d.ts +20 -0
- package/dist/wire/index.d.ts.map +1 -0
- package/dist/wire/index.js +18 -0
- package/dist/wire/index.js.map +1 -0
- package/dist/wire/sse.d.ts +37 -0
- package/dist/wire/sse.d.ts.map +1 -0
- package/dist/wire/sse.js +104 -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/FetchBridge.ts +15 -6
- package/src/bridges/OpenAIBridge.ts +84 -113
- package/src/bridges/TransformerBridge.ts +6 -0
- 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/chatClient.ts +196 -0
- package/src/wire/index.ts +20 -0
- package/src/wire/sse.ts +96 -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":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AA4B5F,MAAM,OAAO,GAAG,uCAAuC,CAAC;AAExD,MAAM,OAAO,eAAe;IACf,iBAAiB,GAAG,IAAa,CAAC;IAE1B,OAAO,CAAe;IACtB,MAAM,CAAgB;IACtB,WAAW,CAAW;IACtB,aAAa,CAAS;IACtB,UAAU,CAAY;IACtB,YAAY,CAAW;IAEhC,SAAS,CAA6B;IAE9C,YAAY,IAA4B;QACpC,IAAI,CAAC,OAAO,GAAS,IAAI,CAAC,MAAM,CAAC;QACjC,IAAI,CAAC,MAAM,GAAU,IAAI,CAAC,KAAK,IAAS,kBAAkB,CAAC;QAC3D,IAAI,CAAC,WAAW,GAAK,IAAI,CAAC,UAAU,IAAI,YAAY,CAAC;QACrD,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAM,IAAI,CAAC,SAAS,IAAO,IAAI,CAAC;QAC/C,IAAI,CAAC,YAAY,GAAI,IAAI,CAAC,WAAW,IAAK,IAAI,CAAC;IACnD,CAAC;IAED;;;;;OAKG;IACH,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,MAAc,EAAE,OAA8B,EAAE;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAClD,MAAM,GAAG,GAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,QAAQ,CACd,uBAAuB,EACvB,0BAA0B,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAClD,CAAC;QACN,CAAC;QAED,MAAM,IAAI,GAAM,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC;QAC5D,MAAM,OAAO,GAAI,IAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;QACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,sCAAsC,CAAC,CAAC;QAC1F,CAAC;QACD,IAAI,CAAC,SAAS,GAAG;YACb,KAAK,EAAE,kBAAkB,CACpB,IAAY,CAAC,KAAK,EAClB,IAAY,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CACnD;SACJ,CAAC;QACF,OAAO,OAAO,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,CAAC,MAAM,CAAC,MAAc,EAAE,OAA8B,EAAE;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,GAAG,GAAI,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAErC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,QAAQ,CACd,uBAAuB,EACvB,oCAAoC,GAAG,CAAC,MAAM,KAAK,IAAI,EAAE,CAC5D,CAAC;QACN,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;YACZ,MAAM,IAAI,QAAQ,CAAC,yBAAyB,EAAE,2CAA2C,CAAC,CAAC;QAC/F,CAAC;QAED,uEAAuE;QACvE,yEAAyE;QACzE,MAAM,KAAK,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACzC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpD,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACrB,MAAM,EAAE,GAAG,KAAuD,CAAC;YACnE,qDAAqD;YACrD,IAAI,EAAE,CAAC,IAAI,KAAK,qBAAqB,IAAI,OAAO,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACtG,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;YACxB,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG;YACb,KAAK,EAAE;gBACH,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;gBAChD,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,iBAAiB,EAAE,MAAM,CAAC,eAAe;gBACzC,gBAAgB,EAAE,MAAM,CAAC,mBAAmB;aAC/C;SACJ,CAAC;IACN,CAAC;IAEO,UAAU,CAAC,MAAc,EAAE,IAA2B,EAAE,MAAe;QAC3E,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,CAAC;QACpD,MAAM,IAAI,GAA4B;YAClC,KAAK,EAAO,IAAI,CAAC,KAAK,IAAQ,IAAI,CAAC,MAAM;YACzC,UAAU,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU;YAC7C,QAAQ,EAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;SAClD,CAAC;QACF,IAAI,GAAG,EAAE,CAAC;YACN,kEAAkE;YAClE,qEAAqE;YACrE,mEAAmE;YACnE,2DAA2D;YAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,YAAY;gBAC9B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;gBACrE,CAAC,CAAC,GAAG,CAAC;QACd,CAAC;QACD,IAAI,MAAM;YAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAEO,MAAM,CAAC,IAAY;QACvB,OAAO,KAAK,CAAC,OAAO,EAAE;YAClB,MAAM,EAAG,MAAM;YACf,OAAO,EAAE;gBACL,cAAc,EAAQ,kBAAkB;gBACxC,WAAW,EAAW,IAAI,CAAC,OAAO;gBAClC,mBAAmB,EAAG,IAAI,CAAC,WAAW;aACzC;YACD,IAAI;SACP,CAAC,CAAC;IACP,CAAC;CACJ;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAc,EAAE,KAAa;IACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,iEAAiE;IACjE,MAAM,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO;QACH,KAAK;QACL,WAAW,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC;QAChC,YAAY,EAAE,CAAC,CAAC,gBAAgB,IAAI,CAAC;QACrC,iBAAiB,EAAE,CAAC,CAAC,eAAe,IAAI,CAAC;QACzC,gBAAgB,EAAE,CAAC,CAAC,mBAAmB,IAAI,CAAC;KAC/C,CAAC;AACN,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
3
3
|
*
|
|
4
|
-
* Works with Ollama, LM Studio, vLLM, llama.cpp server, or any
|
|
5
|
-
* exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
-
* and response schema.
|
|
4
|
+
* Works with Ollama, LM Studio, vLLM, llama.cpp server, a routing gateway, or any
|
|
5
|
+
* service that exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
+
* request and response schema.
|
|
7
7
|
*/
|
|
8
8
|
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
9
|
import type { BridgeGenerateOptions } from './TransformerBridge.js';
|
|
@@ -12,12 +12,19 @@ export interface FetchBridgeOptions {
|
|
|
12
12
|
baseUrl: string;
|
|
13
13
|
/** API key — many local servers require any non-empty string. Default: 'local'. */
|
|
14
14
|
apiKey?: string;
|
|
15
|
-
/** Model name understood by the server. Default: 'default'. */
|
|
15
|
+
/** Model name understood by the server. Default: 'default' (none with `serverDefaults`). */
|
|
16
16
|
model?: string;
|
|
17
17
|
/** Default system prompt. */
|
|
18
18
|
systemPrompt?: string;
|
|
19
|
-
/** Default max tokens. Default: 512. */
|
|
19
|
+
/** Default max tokens. Default: 512 (none with `serverDefaults`). */
|
|
20
20
|
maxTokens?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Send only what a call states, so a routing gateway picks the model and the
|
|
23
|
+
* sampling settings. Default false.
|
|
24
|
+
*/
|
|
25
|
+
serverDefaults?: boolean;
|
|
26
|
+
/** Abort a request after this long. */
|
|
27
|
+
timeoutMs?: number;
|
|
21
28
|
}
|
|
22
29
|
/**
|
|
23
30
|
* FetchBridge is a thin re-configuration of OpenAIBridge pointed at a custom
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAC/B,iFAAiF;IACjF,OAAO,EAAS,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,CAAC,EAAS,MAAM,CAAC;IACvB
|
|
1
|
+
{"version":3,"file":"FetchBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEpE,MAAM,WAAW,kBAAkB;IAC/B,iFAAiF;IACjF,OAAO,EAAS,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,CAAC,EAAS,MAAM,CAAC;IACvB,4FAA4F;IAC5F,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB,6BAA6B;IAC7B,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,qEAAqE;IACrE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,SAAS,CAAC,EAAM,MAAM,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,WAAY,SAAQ,YAAY;gBAC7B,IAAI,EAAE,kBAAkB;CAWvC;AAED,YAAY,EAAE,qBAAqB,EAAE,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* FetchBridge – generic OpenAI-compatible bridge for local or hosted endpoints.
|
|
3
3
|
*
|
|
4
|
-
* Works with Ollama, LM Studio, vLLM, llama.cpp server, or any
|
|
5
|
-
* exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
-
* and response schema.
|
|
4
|
+
* Works with Ollama, LM Studio, vLLM, llama.cpp server, a routing gateway, or any
|
|
5
|
+
* service that exposes a /chat/completions endpoint compatible with the OpenAI
|
|
6
|
+
* request and response schema.
|
|
7
7
|
*/
|
|
8
8
|
import { OpenAIBridge } from './OpenAIBridge.js';
|
|
9
9
|
/**
|
|
@@ -14,10 +14,12 @@ export class FetchBridge extends OpenAIBridge {
|
|
|
14
14
|
constructor(opts) {
|
|
15
15
|
super({
|
|
16
16
|
apiKey: opts.apiKey ?? 'local',
|
|
17
|
-
model: opts.model ?? 'default',
|
|
17
|
+
model: opts.model ?? (opts.serverDefaults ? undefined : 'default'),
|
|
18
18
|
baseUrl: opts.baseUrl,
|
|
19
19
|
systemPrompt: opts.systemPrompt,
|
|
20
20
|
maxTokens: opts.maxTokens,
|
|
21
|
+
serverDefaults: opts.serverDefaults,
|
|
22
|
+
timeoutMs: opts.timeoutMs,
|
|
21
23
|
});
|
|
22
24
|
}
|
|
23
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FetchBridge.js","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"FetchBridge.js","sourceRoot":"","sources":["../../src/bridges/FetchBridge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBjD;;;GAGG;AACH,MAAM,OAAO,WAAY,SAAQ,YAAY;IACzC,YAAY,IAAwB;QAChC,KAAK,CAAC;YACF,MAAM,EAAS,IAAI,CAAC,MAAM,IAAW,OAAO;YAC5C,KAAK,EAAU,IAAI,CAAC,KAAK,IAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YAClF,OAAO,EAAQ,IAAI,CAAC,OAAO;YAC3B,YAAY,EAAG,IAAI,CAAC,YAAY;YAChC,SAAS,EAAM,IAAI,CAAC,SAAS;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,SAAS,EAAM,IAAI,CAAC,SAAS;SAChC,CAAC,CAAC;IACP,CAAC;CACJ"}
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
5
|
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*
|
|
7
|
+
* The request, error mapping and stream reading are the `/wire` chat client's — the
|
|
8
|
+
* same one a host uses for tool-calling turns — so this class only supplies the
|
|
9
|
+
* bridge's defaults and maps usage onto {@link LlmUsage}.
|
|
6
10
|
*/
|
|
7
11
|
import type { TransformerBridge, BridgeGenerateOptions, BridgeCallInfo } from './TransformerBridge.js';
|
|
8
12
|
export interface OpenAIBridgeOptions {
|
|
@@ -16,21 +20,30 @@ export interface OpenAIBridgeOptions {
|
|
|
16
20
|
systemPrompt?: string;
|
|
17
21
|
/** Default max tokens. Default: 512. */
|
|
18
22
|
maxTokens?: number;
|
|
23
|
+
/**
|
|
24
|
+
* Send only what a call states — no model, max-tokens, temperature or top-p
|
|
25
|
+
* defaults — so a routing gateway picks them. Default false.
|
|
26
|
+
*/
|
|
27
|
+
serverDefaults?: boolean;
|
|
28
|
+
/** Abort a request after this long. */
|
|
29
|
+
timeoutMs?: number;
|
|
19
30
|
}
|
|
20
31
|
export declare class OpenAIBridge implements TransformerBridge {
|
|
21
32
|
private _lastCall;
|
|
22
33
|
readonly supportsStreaming: true;
|
|
23
|
-
private readonly
|
|
34
|
+
private readonly _client;
|
|
24
35
|
private readonly _model;
|
|
25
|
-
private readonly _baseUrl;
|
|
26
36
|
private readonly _systemPrompt;
|
|
27
37
|
private readonly _maxTokens;
|
|
38
|
+
private readonly _serverDefaults;
|
|
28
39
|
constructor(opts: OpenAIBridgeOptions);
|
|
29
40
|
/** Provider-reported usage for the last call — see {@link BridgeCallInfo}. */
|
|
30
41
|
get lastCall(): BridgeCallInfo | undefined;
|
|
31
42
|
generate(prompt: string, opts?: BridgeGenerateOptions): Promise<string>;
|
|
32
43
|
stream(prompt: string, opts?: BridgeGenerateOptions): AsyncIterable<string>;
|
|
33
|
-
|
|
34
|
-
private
|
|
44
|
+
/** Text deltas out; the closing event records usage (sent because of `includeUsage`). */
|
|
45
|
+
private _text;
|
|
46
|
+
private _request;
|
|
47
|
+
private _requestError;
|
|
35
48
|
}
|
|
36
49
|
//# sourceMappingURL=OpenAIBridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAYvG,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;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,uCAAuC;IACvC,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,CAAmB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAwB;IACnD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;gBAE9B,IAAI,EAAE,mBAAmB;IAYrC,8EAA8E;IAC9E,IAAI,QAAQ,IAAI,cAAc,GAAG,SAAS,CAEzC;IAEK,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB1E,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,aAAa,CAAC,MAAM,CAAC;IActF,yFAAyF;IACzF,OAAO,CAAE,KAAK;IAQd,OAAO,CAAC,QAAQ;IAoBhB,OAAO,CAAC,aAAa;CAWxB"}
|
|
@@ -3,145 +3,122 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Supports both non-streaming and streaming (SSE) completions.
|
|
5
5
|
* Compatible with any OpenAI-compatible endpoint via the `baseUrl` option.
|
|
6
|
+
*
|
|
7
|
+
* The request, error mapping and stream reading are the `/wire` chat client's — the
|
|
8
|
+
* same one a host uses for tool-calling turns — so this class only supplies the
|
|
9
|
+
* bridge's defaults and maps usage onto {@link LlmUsage}.
|
|
6
10
|
*/
|
|
7
11
|
import { SSMError } from '../errors/SSMError.js';
|
|
12
|
+
import { chatComplete, chatStream, ChatCompletionError, readUsageFields, } from '../wire/index.js';
|
|
8
13
|
export class OpenAIBridge {
|
|
9
14
|
_lastCall;
|
|
10
15
|
supportsStreaming = true;
|
|
11
|
-
|
|
16
|
+
_client;
|
|
12
17
|
_model;
|
|
13
|
-
_baseUrl;
|
|
14
18
|
_systemPrompt;
|
|
15
19
|
_maxTokens;
|
|
20
|
+
_serverDefaults;
|
|
16
21
|
constructor(opts) {
|
|
17
|
-
this.
|
|
18
|
-
this.
|
|
19
|
-
|
|
22
|
+
this._serverDefaults = opts.serverDefaults ?? false;
|
|
23
|
+
this._client = {
|
|
24
|
+
apiKey: opts.apiKey,
|
|
25
|
+
baseUrl: opts.baseUrl ?? 'https://api.openai.com/v1',
|
|
26
|
+
...(opts.timeoutMs ? { timeoutMs: opts.timeoutMs } : {}),
|
|
27
|
+
};
|
|
28
|
+
this._model = opts.model ?? (this._serverDefaults ? undefined : 'gpt-4o-mini');
|
|
20
29
|
this._systemPrompt = opts.systemPrompt ?? '';
|
|
21
|
-
this._maxTokens = opts.maxTokens ?? 512;
|
|
30
|
+
this._maxTokens = opts.maxTokens ?? (this._serverDefaults ? undefined : 512);
|
|
22
31
|
}
|
|
23
32
|
/** Provider-reported usage for the last call — see {@link BridgeCallInfo}. */
|
|
24
33
|
get lastCall() {
|
|
25
34
|
return this._lastCall;
|
|
26
35
|
}
|
|
27
36
|
async generate(prompt, opts = {}) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
37
|
+
let result;
|
|
38
|
+
try {
|
|
39
|
+
result = await chatComplete(this._client, this._request(prompt, opts));
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
throw this._requestError('OpenAI API', err);
|
|
33
43
|
}
|
|
34
|
-
|
|
35
|
-
const content = json.choices?.[0]?.message?.content;
|
|
36
|
-
if (typeof content !== 'string') {
|
|
44
|
+
if (!result.hasTextContent) {
|
|
37
45
|
throw new SSMError('BRIDGE_RESPONSE_INVALID', 'Unexpected OpenAI response shape.');
|
|
38
46
|
}
|
|
39
47
|
this._lastCall = {
|
|
40
|
-
usage: readOpenAIUsage(
|
|
48
|
+
usage: readOpenAIUsage(result.usage, result.model ?? opts.model ?? this._model ?? ''),
|
|
41
49
|
};
|
|
42
|
-
return content;
|
|
50
|
+
return result.content;
|
|
43
51
|
}
|
|
44
52
|
async *stream(prompt, opts = {}) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
53
|
+
let events;
|
|
54
|
+
try {
|
|
55
|
+
events = chatStream(this._client, { ...this._request(prompt, opts), includeUsage: true });
|
|
56
|
+
// The request is sent on the first pull; surface a failed request as a bridge error.
|
|
57
|
+
const first = await events.next();
|
|
58
|
+
if (first.done)
|
|
59
|
+
return;
|
|
60
|
+
yield* this._text(first.value);
|
|
50
61
|
}
|
|
51
|
-
|
|
52
|
-
throw
|
|
62
|
+
catch (err) {
|
|
63
|
+
throw this._requestError('OpenAI streaming API', err);
|
|
64
|
+
}
|
|
65
|
+
for await (const event of events)
|
|
66
|
+
yield* this._text(event);
|
|
67
|
+
}
|
|
68
|
+
/** Text deltas out; the closing event records usage (sent because of `includeUsage`). */
|
|
69
|
+
*_text(event) {
|
|
70
|
+
if (event.type === 'text-delta')
|
|
71
|
+
yield event.delta;
|
|
72
|
+
else if (event.type === 'done') {
|
|
73
|
+
const usage = readOpenAIUsage(event.result.usage, event.result.model ?? this._model ?? '');
|
|
74
|
+
this._lastCall = usage ? { usage } : {};
|
|
53
75
|
}
|
|
54
|
-
const model = opts.model ?? this._model;
|
|
55
|
-
let usage;
|
|
56
|
-
yield* parseOpenAIStream(res.body, (event) => {
|
|
57
|
-
// Only emitted because `_buildBody` sets `stream_options.include_usage`;
|
|
58
|
-
// without it OpenAI streams no usage at all and cost would be a guess.
|
|
59
|
-
const reported = readOpenAIUsage(event.usage, event.model ?? model);
|
|
60
|
-
if (reported)
|
|
61
|
-
usage = reported;
|
|
62
|
-
});
|
|
63
|
-
this._lastCall = usage ? { usage } : {};
|
|
64
76
|
}
|
|
65
|
-
|
|
77
|
+
_request(prompt, opts) {
|
|
66
78
|
const sys = opts.systemPrompt ?? this._systemPrompt;
|
|
67
79
|
const messages = [];
|
|
68
80
|
if (sys)
|
|
69
81
|
messages.push({ role: 'system', content: sys });
|
|
70
82
|
messages.push({ role: 'user', content: prompt });
|
|
71
|
-
|
|
72
|
-
|
|
83
|
+
const d = !this._serverDefaults;
|
|
84
|
+
const model = opts.model ?? this._model;
|
|
85
|
+
const maxTokens = opts.maxTokens ?? this._maxTokens;
|
|
86
|
+
const temperature = opts.temperature ?? (d ? 0.7 : undefined);
|
|
87
|
+
const topP = opts.topP ?? (d ? 0.9 : undefined);
|
|
88
|
+
return {
|
|
73
89
|
messages,
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
// estimate. Non-streaming requests reject the field, hence the guard.
|
|
81
|
-
...(stream ? { stream_options: { include_usage: true } } : {}),
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
_fetch(body) {
|
|
85
|
-
return fetch(`${this._baseUrl}/chat/completions`, {
|
|
86
|
-
method: 'POST',
|
|
87
|
-
headers: {
|
|
88
|
-
'Content-Type': 'application/json',
|
|
89
|
-
'Authorization': `Bearer ${this._apiKey}`,
|
|
90
|
-
},
|
|
91
|
-
body,
|
|
92
|
-
});
|
|
90
|
+
...(model ? { model } : {}),
|
|
91
|
+
...(maxTokens !== undefined ? { maxTokens } : {}),
|
|
92
|
+
...(temperature !== undefined ? { temperature } : {}),
|
|
93
|
+
...(topP !== undefined ? { topP } : {}),
|
|
94
|
+
...(opts.extra ? { extra: opts.extra } : {}),
|
|
95
|
+
};
|
|
93
96
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
}
|
|
97
|
+
_requestError(what, err) {
|
|
98
|
+
if (err instanceof SSMError)
|
|
99
|
+
return err;
|
|
100
|
+
if (err instanceof ChatCompletionError) {
|
|
101
|
+
// A 2xx that still failed is a stream with no body: the server answered, badly.
|
|
102
|
+
if (err.status >= 200 && err.status < 300) {
|
|
103
|
+
return new SSMError('BRIDGE_RESPONSE_INVALID', `${what} returned no response body.`);
|
|
125
104
|
}
|
|
105
|
+
return new SSMError('BRIDGE_REQUEST_FAILED', `${what} returned ${err.status}: ${err.body}`);
|
|
126
106
|
}
|
|
127
|
-
|
|
128
|
-
finally {
|
|
129
|
-
reader.releaseLock();
|
|
107
|
+
return new SSMError('BRIDGE_REQUEST_FAILED', `${what} request failed: ${err instanceof Error ? err.message : String(err)}`, err);
|
|
130
108
|
}
|
|
131
109
|
}
|
|
132
110
|
/** Maps an OpenAI `usage` object onto the canonical {@link LlmUsage} shape. */
|
|
133
111
|
function readOpenAIUsage(usage, model) {
|
|
134
112
|
if (!usage || typeof usage !== 'object')
|
|
135
113
|
return undefined;
|
|
136
|
-
const u = usage;
|
|
137
|
-
const cached =
|
|
138
|
-
const prompt = Number(u['prompt_tokens']) || 0;
|
|
114
|
+
const u = readUsageFields(usage);
|
|
115
|
+
const cached = u.cacheReadTokens ?? 0;
|
|
139
116
|
return {
|
|
140
117
|
model,
|
|
141
118
|
// OpenAI reports `prompt_tokens` INCLUSIVE of cached tokens; the canonical
|
|
142
119
|
// shape keeps them disjoint so the two rates are applied exactly once each.
|
|
143
|
-
inputTokens: Math.max(0,
|
|
144
|
-
outputTokens:
|
|
120
|
+
inputTokens: Math.max(0, (u.promptTokens ?? 0) - cached),
|
|
121
|
+
outputTokens: u.completionTokens ?? 0,
|
|
145
122
|
cachedInputTokens: cached,
|
|
146
123
|
};
|
|
147
124
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"OpenAIBridge.js","sourceRoot":"","sources":["../../src/bridges/OpenAIBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,6 +19,12 @@ export interface BridgeGenerateOptions {
|
|
|
19
19
|
systemPrompt?: string;
|
|
20
20
|
/** Model string, overriding the adapter's default. */
|
|
21
21
|
model?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Vendor extras merged into an OpenAI-compatible request body (a gateway's
|
|
24
|
+
* routing `provider`, `response_format`, …). Bridges that do not speak that
|
|
25
|
+
* wire format ignore it.
|
|
26
|
+
*/
|
|
27
|
+
extra?: Record<string, unknown>;
|
|
22
28
|
}
|
|
23
29
|
export interface TransformerBridge {
|
|
24
30
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TransformerBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IAClC,mEAAmE;IACnE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAI,MAAM,CAAC;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAW,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAU,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"TransformerBridge.d.ts","sourceRoot":"","sources":["../../src/bridges/TransformerBridge.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAE5D,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,qBAAqB;IAClC,mEAAmE;IACnE,SAAS,CAAC,EAAM,MAAM,CAAC;IACvB,iEAAiE;IACjE,WAAW,CAAC,EAAI,MAAM,CAAC;IACvB,+DAA+D;IAC/D,IAAI,CAAC,EAAW,MAAM,CAAC;IACvB,wEAAwE;IACxE,YAAY,CAAC,EAAG,MAAM,CAAC;IACvB,sDAAsD;IACtD,KAAK,CAAC,EAAU,MAAM,CAAC;IACvB;;;;OAIG;IACH,KAAK,CAAC,EAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,iBAAiB;IAC9B;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAExE;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IAEnC;;;OAGG;IACH,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IAE7E,4DAA4D;IAC5D,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;CACvC"}
|
|
@@ -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"}
|