@animalabs/membrane 0.5.75 → 0.5.77
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/formatters/native.d.ts.map +1 -1
- package/dist/formatters/native.js +13 -0
- package/dist/formatters/native.js.map +1 -1
- package/dist/membrane.d.ts.map +1 -1
- package/dist/membrane.js +282 -25
- package/dist/membrane.js.map +1 -1
- package/dist/providers/bedrock.d.ts +17 -0
- package/dist/providers/bedrock.d.ts.map +1 -1
- package/dist/providers/bedrock.js +95 -13
- package/dist/providers/bedrock.js.map +1 -1
- package/dist/types/config.d.ts +31 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js +8 -0
- package/dist/types/config.js.map +1 -1
- package/dist/types/errors.d.ts +12 -0
- package/dist/types/errors.d.ts.map +1 -1
- package/dist/types/errors.js +19 -0
- package/dist/types/errors.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/response.d.ts +1 -1
- package/dist/types/response.d.ts.map +1 -1
- package/dist/types/response.js.map +1 -1
- package/dist/types/streaming.d.ts +10 -0
- package/dist/types/streaming.d.ts.map +1 -1
- package/dist/types/yielding-stream.d.ts +12 -0
- package/dist/types/yielding-stream.d.ts.map +1 -1
- package/dist/types/yielding-stream.js.map +1 -1
- package/package.json +1 -1
- package/src/formatters/native.ts +12 -0
- package/src/membrane.ts +308 -23
- package/src/providers/bedrock.ts +109 -13
- package/src/types/config.ts +48 -4
- package/src/types/errors.ts +18 -0
- package/src/types/index.ts +1 -0
- package/src/types/response.ts +5 -1
- package/src/types/streaming.ts +11 -0
- package/src/types/yielding-stream.ts +13 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEZ,QAAQ,EACR,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EAMhB,MAAM,YAAY,CAAC;AAIpB;;;yEAGyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAMtF;AAMD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyGD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,qBAA0B;IAY9C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW;
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EAEZ,QAAQ,EACR,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,eAAe,EAMhB,MAAM,YAAY,CAAC;AAIpB;;;yEAGyE;AACzE,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAMtF;AAMD,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAC5D;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAyGD,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,WAAW,SAAS;IAE7B,OAAO,CAAC,MAAM,CAAkC;gBAEpC,MAAM,GAAE,qBAA0B;IAY9C,aAAa,CAAC,QAAQ,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,WAAW;IAiKhF,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM;IAchD,kBAAkB,IAAI,YAAY;IAIlC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,EAAE;IAM3C,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAKpC,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE;IAYnD;yEACqE;IACrE,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAiBxC,OAAO,CAAC,cAAc;IA0GtB,OAAO,CAAC,oBAAoB;CAO7B"}
|
|
@@ -191,6 +191,19 @@ export class NativeFormatter {
|
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
193
|
}
|
|
194
|
+
// Block-level cache_control can also arrive via convertContent passthrough
|
|
195
|
+
// (stale request-time markers on imported/stored blocks — Arc exports carry
|
|
196
|
+
// them). Recount ALL message-level cache_control blocks — deliberate marks
|
|
197
|
+
// and passthroughs alike — so the system fallback below can't stack on top.
|
|
198
|
+
markedBreakpoints = 0;
|
|
199
|
+
for (const msg of providerMessages) {
|
|
200
|
+
if (!Array.isArray(msg.content))
|
|
201
|
+
continue;
|
|
202
|
+
for (const b of msg.content) {
|
|
203
|
+
if (b.cache_control)
|
|
204
|
+
markedBreakpoints++;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
194
207
|
// Tool-pair normalizer: wire-boundary safety net for Anthropic's
|
|
195
208
|
// structural rules on tool cycles. See `normalize-tool-pairs.ts`
|
|
196
209
|
// for the full rationale. Runs BEFORE mergeConsecutiveRoles so the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../src/formatters/native.ts"],"names":[],"mappings":"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"}
|
package/dist/membrane.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"membrane.d.ts","sourceRoot":"","sources":["../src/membrane.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,eAAe,EAYhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"membrane.d.ts","sourceRoot":"","sources":["../src/membrane.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EAEf,eAAe,EAEf,cAAc,EACd,aAAa,EACb,eAAe,EAYhB,MAAM,kBAAkB,CAAC;AAqB1B,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAGtB,MAAM,4BAA4B,CAAC;AAiBpC,qBAAa,QAAQ;IACnB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,SAAS,CAAmB;gBAGlC,OAAO,EAAE,eAAe,EACxB,MAAM,GAAE,cAAmB;IAkB7B;;OAEG;IACG,QAAQ,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,kBAAkB,CAAC;IAwF9B;;;;;;;;;;;;;;;;;OAiBG;IACG,MAAM,CACV,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,kBAAkB,GAAG,eAAe,CAAC;IA8FhD;;OAEG;IACH,OAAO,CAAC,eAAe;IAsBvB;;;;;;OAMG;YACW,kBAAkB;IA8kBhC;;OAEG;YACW,qBAAqB;IAwOnC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAwN9B;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAuD5B;;;;;OAKG;IACH,OAAO,CAAC,6BAA6B;IAkBrC;;;;;;;;;OASG;IACH,OAAO,CAAC,2BAA2B;IA+BnC;;;;;;;OAOG;YACW,sBAAsB;IASpC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAqB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;YA4EV,UAAU;IA+BxB,OAAO,CAAC,wBAAwB;IA8ChC;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,kCAAkC;IAoD1C,OAAO,CAAC,iBAAiB;IAqIzB,OAAO,CAAC,kBAAkB;IAkF1B,OAAO,CAAC,aAAa;IAoBrB,OAAO,CAAC,sBAAsB;IAO9B,OAAO,CAAC,cAAc;IAItB,qFAAqF;IACrF,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,KAAK;IAcb;;OAEG;IACH,OAAO,CAAC,YAAY;IAcpB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA4B5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,cAAc,CACZ,OAAO,EAAE,iBAAiB,EAC1B,OAAO,GAAE,qBAA0B,GAClC,cAAc;IAWjB;;OAEG;YACW,mBAAmB;IAokBjC;;OAEG;YACW,sBAAsB;CAqTrC"}
|
package/dist/membrane.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* A selective boundary that transforms what passes through.
|
|
5
5
|
*/
|
|
6
6
|
import { lastCacheableBlockIndex } from './formatters/native.js';
|
|
7
|
-
import { DEFAULT_RETRY_CONFIG, MembraneError, classifyError, } from './types/index.js';
|
|
7
|
+
import { DEFAULT_RETRY_CONFIG, MembraneError, classifyError, isOverloadedError, } from './types/index.js';
|
|
8
8
|
import { parseToolCalls, formatToolResults, parseAccumulatedIntoBlocks, hasImageInToolResults, formatToolResultsForSplitTurn, } from './utils/tool-parser.js';
|
|
9
9
|
import { AnthropicXmlFormatter } from './formatters/anthropic-xml.js';
|
|
10
10
|
import { normalizeToolPairs, mergeConsecutiveRoles } from './formatters/normalize-tool-pairs.js';
|
|
@@ -24,7 +24,11 @@ export class Membrane {
|
|
|
24
24
|
constructor(adapter, config = {}) {
|
|
25
25
|
this.adapter = adapter;
|
|
26
26
|
this.registry = config.registry;
|
|
27
|
-
this.retryConfig = {
|
|
27
|
+
this.retryConfig = {
|
|
28
|
+
...DEFAULT_RETRY_CONFIG,
|
|
29
|
+
...config.retry,
|
|
30
|
+
overloaded: { ...DEFAULT_RETRY_CONFIG.overloaded, ...config.retry?.overloaded },
|
|
31
|
+
};
|
|
28
32
|
this.config = config;
|
|
29
33
|
// Use provided formatter or default to AnthropicXmlFormatter
|
|
30
34
|
this.formatter = config.formatter ?? new AnthropicXmlFormatter();
|
|
@@ -69,12 +73,22 @@ export class Membrane {
|
|
|
69
73
|
catch (error) {
|
|
70
74
|
const errorInfo = classifyError(error);
|
|
71
75
|
errorInfo.rawRequest = rawRequest;
|
|
72
|
-
// Rate limits (429) always retry up to 5 attempts regardless of
|
|
73
|
-
//
|
|
76
|
+
// Rate limits (429) always retry up to 5 attempts regardless of
|
|
77
|
+
// config, and overloaded (529) always retries on its own longer
|
|
78
|
+
// schedule — both are transient by definition, and the default
|
|
79
|
+
// maxRetries of 0 would otherwise turn a capacity blip into a dead
|
|
80
|
+
// turn. Other retryable errors only retry when maxRetries > 0.
|
|
81
|
+
// overloaded.maxRetries: 0 disables the dedicated policy entirely;
|
|
82
|
+
// the 529 then follows the base config like any retryable server
|
|
83
|
+
// error (exactly the pre-policy behavior), rather than being
|
|
84
|
+
// silently re-promoted to the long schedule by a positive base limit.
|
|
74
85
|
const isRateLimit = errorInfo.type === 'rate_limit';
|
|
86
|
+
const isOverloaded = isOverloadedError(errorInfo) && this.retryConfig.overloaded.maxRetries > 0;
|
|
75
87
|
const effectiveMax = isRateLimit
|
|
76
88
|
? Math.max(this.retryConfig.maxRetries, 5)
|
|
77
|
-
:
|
|
89
|
+
: isOverloaded
|
|
90
|
+
? Math.max(this.retryConfig.maxRetries, this.retryConfig.overloaded.maxRetries)
|
|
91
|
+
: this.retryConfig.maxRetries;
|
|
78
92
|
if (errorInfo.retryable && attempts < effectiveMax) {
|
|
79
93
|
// Check hook for retry decision
|
|
80
94
|
if (this.config.hooks?.onError) {
|
|
@@ -84,7 +98,7 @@ export class Membrane {
|
|
|
84
98
|
}
|
|
85
99
|
}
|
|
86
100
|
// Wait before retry (abort-aware)
|
|
87
|
-
const delay = this.calculateRetryDelay(attempts);
|
|
101
|
+
const delay = this.calculateRetryDelay(attempts, isOverloaded);
|
|
88
102
|
await this.sleep(delay, options.signal);
|
|
89
103
|
continue;
|
|
90
104
|
}
|
|
@@ -132,11 +146,69 @@ export class Membrane {
|
|
|
132
146
|
}
|
|
133
147
|
// Determine tool mode
|
|
134
148
|
const toolMode = this.resolveToolMode(request);
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
149
|
+
const useNative = toolMode === 'native' && !!request.tools && request.tools.length > 0;
|
|
150
|
+
// Overloaded (529) pre-emission retry. The streaming paths have no retry
|
|
151
|
+
// loop of their own, so a capacity error used to kill the turn outright —
|
|
152
|
+
// and 529s most often arrive INSTEAD of a stream, before anything reaches
|
|
153
|
+
// the caller, where retrying is transparent. Once any callback has
|
|
154
|
+
// delivered output (tokens, blocks, usage), retrying would replay content
|
|
155
|
+
// the caller already consumed, so mid-stream errors still throw.
|
|
156
|
+
let attempts = 0;
|
|
157
|
+
const retryDelaysMs = [];
|
|
158
|
+
while (true) {
|
|
159
|
+
attempts++;
|
|
160
|
+
let emitted = false;
|
|
161
|
+
const mark = (fn) => fn && ((...args) => { emitted = true; return fn(...args); });
|
|
162
|
+
const tracked = {
|
|
163
|
+
...options,
|
|
164
|
+
onChunk: mark(options.onChunk),
|
|
165
|
+
onContentBlockUpdate: mark(options.onContentBlockUpdate),
|
|
166
|
+
onToolCalls: mark(options.onToolCalls),
|
|
167
|
+
onPreToolContent: mark(options.onPreToolContent),
|
|
168
|
+
onUsage: mark(options.onUsage),
|
|
169
|
+
onBlock: mark(options.onBlock),
|
|
170
|
+
onResponse: mark(options.onResponse),
|
|
171
|
+
// onRequest fires before the send — it is not an emission.
|
|
172
|
+
};
|
|
173
|
+
try {
|
|
174
|
+
const result = useNative
|
|
175
|
+
? await this.streamWithNativeTools(request, tracked)
|
|
176
|
+
: await this.streamWithXmlTools(request, tracked);
|
|
177
|
+
// The inner paths report attempts: 1 — they can't see this wrapper.
|
|
178
|
+
// A call that succeeded after N overloaded retries must not look like
|
|
179
|
+
// a first-attempt success in durable logs, so patch the real count
|
|
180
|
+
// (and the waits) into the response telemetry.
|
|
181
|
+
if (attempts > 1 && 'details' in result) {
|
|
182
|
+
result.details.timing.attempts = attempts;
|
|
183
|
+
result.details.timing.retryDelaysMs = retryDelaysMs;
|
|
184
|
+
}
|
|
185
|
+
return result;
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
const errorInfo = classifyError(error);
|
|
189
|
+
// Same semantics as complete(): maxRetries bounds total attempts,
|
|
190
|
+
// the overloaded floor applies over the base config, and
|
|
191
|
+
// overloaded.maxRetries: 0 opts out of stream retries entirely
|
|
192
|
+
// (streaming had no retry before this policy existed).
|
|
193
|
+
const overloadedEnabled = this.retryConfig.overloaded.maxRetries > 0;
|
|
194
|
+
const maxOverloaded = Math.max(this.retryConfig.maxRetries, this.retryConfig.overloaded.maxRetries);
|
|
195
|
+
if (!emitted && overloadedEnabled && isOverloadedError(errorInfo) && attempts < maxOverloaded) {
|
|
196
|
+
// Honor the same pre-retry hook contract as complete(): hosts use
|
|
197
|
+
// onError for circuit-breaking, and its 'abort' decision must work
|
|
198
|
+
// on the streaming path too.
|
|
199
|
+
if (this.config.hooks?.onError) {
|
|
200
|
+
const decision = await this.config.hooks.onError(errorInfo, attempts);
|
|
201
|
+
if (decision === 'abort') {
|
|
202
|
+
throw error;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
const delay = this.calculateRetryDelay(attempts, true);
|
|
206
|
+
retryDelaysMs.push(delay);
|
|
207
|
+
await this.sleep(delay, options.signal);
|
|
208
|
+
continue;
|
|
209
|
+
}
|
|
210
|
+
throw error;
|
|
211
|
+
}
|
|
140
212
|
}
|
|
141
213
|
}
|
|
142
214
|
/**
|
|
@@ -216,13 +288,56 @@ export class Membrane {
|
|
|
216
288
|
// blocks inherited from prefill context (e.g., unclosed <thinking> from other bots)
|
|
217
289
|
// from blocks the model itself opened during generation
|
|
218
290
|
const prefillDepths = parser.getDepths();
|
|
291
|
+
// Resumption spin guards (issue #39). Observed live on Ash 2026-07-26:
|
|
292
|
+
// each automatic resumption re-sent ~172k input tokens, streamed ~6
|
|
293
|
+
// output tokens, and stopped on the same (dropped) stop sequence — 43
|
|
294
|
+
// rounds, ~7M input tokens, zero progress, found only because a human
|
|
295
|
+
// noticed. Two guards, both scoped to AUTOMATIC false-positive
|
|
296
|
+
// resumptions — tool rounds are real caller-governed work (maxToolDepth
|
|
297
|
+
// / the yielding API's uncapped contract) and are never counted here:
|
|
298
|
+
// - stall guard: several CONSECUTIVE resumptions that each stream
|
|
299
|
+
// almost nothing and stop identically end the turn ('no_progress').
|
|
300
|
+
// One short repeated round is low progress, not proof of none — a
|
|
301
|
+
// stop sequence inside legitimate tool-argument text can cause a
|
|
302
|
+
// couple of short resumptions on the way to completing.
|
|
303
|
+
// - round cap: a hard bound on resumptions per turn ('round_limit'),
|
|
304
|
+
// the backstop for a spin that keeps technically progressing.
|
|
305
|
+
const MIN_ROUND_PROGRESS_CHARS = 16;
|
|
306
|
+
const MAX_CONSECUTIVE_STALLED_RESUMPTIONS = 3;
|
|
307
|
+
const RESUMPTION_WARN_ROUNDS = 5;
|
|
308
|
+
const maxResumptionRounds = options.maxResumptionRounds ?? 24;
|
|
309
|
+
let resumptionRounds = 0;
|
|
310
|
+
let consecutiveStalledResumptions = 0;
|
|
311
|
+
let enteredViaResumption = false;
|
|
312
|
+
let prevRoundStopSequence;
|
|
313
|
+
const warnLog = this.config.logger ?? console;
|
|
314
|
+
/** Count an automatic resumption; emits the visibility warning at the
|
|
315
|
+
* threshold and returns false when the cap says the turn should end. */
|
|
316
|
+
const registerResumptionRound = () => {
|
|
317
|
+
resumptionRounds++;
|
|
318
|
+
if (resumptionRounds === RESUMPTION_WARN_ROUNDS) {
|
|
319
|
+
warnLog.warn(`[membrane] automatic resumption at round ${resumptionRounds} ` +
|
|
320
|
+
`(${totalUsage.inputTokens} input tokens so far this turn) — ` +
|
|
321
|
+
`a spin shows up here before it shows up on the bill`);
|
|
322
|
+
}
|
|
323
|
+
if (resumptionRounds > maxResumptionRounds) {
|
|
324
|
+
warnLog.warn(`[membrane] automatic resumption cap (${maxResumptionRounds}) reached — ` +
|
|
325
|
+
`ending turn with stopReason 'round_limit'. ` +
|
|
326
|
+
`${totalUsage.inputTokens} input tokens spent this turn.`);
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
return true;
|
|
330
|
+
};
|
|
219
331
|
try {
|
|
220
332
|
// Tool execution loop
|
|
221
333
|
while (toolDepth <= maxToolDepth) {
|
|
222
334
|
// Track if we manually detected a stop sequence (API doesn't always stop)
|
|
223
335
|
let detectedStopSequence = null;
|
|
224
336
|
let truncatedAccumulated = null;
|
|
225
|
-
// Track where to start checking for stop sequences (skip already-processed content)
|
|
337
|
+
// Track where to start checking for stop sequences (skip already-processed content).
|
|
338
|
+
// Also the round's progress baseline: XML we pushed ourselves at the
|
|
339
|
+
// end of the previous round (tool results, closing tags) sits below
|
|
340
|
+
// this index and doesn't count as model progress.
|
|
226
341
|
const checkFromIndex = parser.getAccumulated().length;
|
|
227
342
|
// Stream from provider
|
|
228
343
|
const streamResult = await this.streamOnce(providerRequest, {
|
|
@@ -332,6 +447,34 @@ export class Membrane {
|
|
|
332
447
|
}
|
|
333
448
|
// Get accumulated text from parser
|
|
334
449
|
const accumulated = parser.getAccumulated();
|
|
450
|
+
// Stall accounting (issue #39): only rounds ENTERED via automatic
|
|
451
|
+
// resumption can stall — tool rounds are caller-governed work and a
|
|
452
|
+
// real tool call is longer than the threshold anyway. A stall is a
|
|
453
|
+
// resumption that streamed almost nothing and stopped identically to
|
|
454
|
+
// the previous round; the turn ends only after several IN A ROW
|
|
455
|
+
// (one short repeated round is low progress, not proof of none —
|
|
456
|
+
// a stop sequence inside legitimate tool-argument text can cause a
|
|
457
|
+
// couple of short resumptions on the way to completing).
|
|
458
|
+
const streamedThisRound = accumulated.length - checkFromIndex;
|
|
459
|
+
if (enteredViaResumption &&
|
|
460
|
+
lastStopReason === 'stop_sequence' &&
|
|
461
|
+
streamedThisRound < MIN_ROUND_PROGRESS_CHARS &&
|
|
462
|
+
lastStopSequence === prevRoundStopSequence) {
|
|
463
|
+
consecutiveStalledResumptions++;
|
|
464
|
+
if (consecutiveStalledResumptions >= MAX_CONSECUTIVE_STALLED_RESUMPTIONS) {
|
|
465
|
+
warnLog.warn(`[membrane] ${consecutiveStalledResumptions} consecutive automatic resumptions ` +
|
|
466
|
+
`made no progress (${streamedThisRound} chars this round, stop ` +
|
|
467
|
+
`${JSON.stringify(lastStopSequence ?? null)} repeated) — ending turn with ` +
|
|
468
|
+
`stopReason 'no_progress'. ${totalUsage.inputTokens} input tokens spent this turn.`);
|
|
469
|
+
lastStopReason = 'no_progress';
|
|
470
|
+
break;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
else {
|
|
474
|
+
consecutiveStalledResumptions = 0;
|
|
475
|
+
}
|
|
476
|
+
prevRoundStopSequence = lastStopSequence;
|
|
477
|
+
enteredViaResumption = false;
|
|
335
478
|
// Check for tool calls (if handler provided)
|
|
336
479
|
if (onToolCalls && streamResult.stopSequence === '</function_calls>') {
|
|
337
480
|
// Append the closing tag (we truncated before it, or API stopped before it)
|
|
@@ -341,8 +484,11 @@ export class Membrane {
|
|
|
341
484
|
const parsed = parseToolCalls(parser.getAccumulated());
|
|
342
485
|
if (parsed && parsed.calls.length > 0) {
|
|
343
486
|
// Notify about pre-tool content
|
|
344
|
-
|
|
345
|
-
|
|
487
|
+
// Slice the seeded prefill off: beforeText starts with the whole
|
|
488
|
+
// flattened document in XML mode (see ToolContext note below).
|
|
489
|
+
const preToolNew = parsed.beforeText.slice(initialPrefillLength);
|
|
490
|
+
if (onPreToolContent && preToolNew.trim()) {
|
|
491
|
+
await onPreToolContent(preToolNew);
|
|
346
492
|
}
|
|
347
493
|
// Emit block events for each tool call
|
|
348
494
|
for (const call of parsed.calls) {
|
|
@@ -366,13 +512,24 @@ export class Membrane {
|
|
|
366
512
|
}
|
|
367
513
|
// Track the tool calls
|
|
368
514
|
executedToolCalls.push(...parsed.calls);
|
|
369
|
-
// Execute tools
|
|
515
|
+
// Execute tools.
|
|
516
|
+
// preamble/accumulated must expose the MODEL'S text only. The
|
|
517
|
+
// parser is seeded with the entire assistant prefill (the whole
|
|
518
|
+
// flattened document in XML mode), so parsed.beforeText starts
|
|
519
|
+
// with it — consumers that persist the preamble as "what the
|
|
520
|
+
// agent said this round" would otherwise write the full document
|
|
521
|
+
// back into the store as an assistant message (observed on Ash,
|
|
522
|
+
// 2026-07-26: a died-mid-rounds turn flushed a ~720k-char
|
|
523
|
+
// document echo into her message store as 62 sharded messages).
|
|
524
|
+
// The turn-END path already slices (newContent =
|
|
525
|
+
// fullAccumulated.slice(initialPrefillLength)); the tool-round
|
|
526
|
+
// path must match it.
|
|
370
527
|
const context = {
|
|
371
528
|
rawText: parsed.fullMatch,
|
|
372
|
-
preamble: parsed.beforeText,
|
|
529
|
+
preamble: parsed.beforeText.slice(initialPrefillLength),
|
|
373
530
|
depth: toolDepth,
|
|
374
531
|
previousResults: executedToolResults,
|
|
375
|
-
accumulated: parser.getAccumulated(),
|
|
532
|
+
accumulated: parser.getAccumulated().slice(initialPrefillLength),
|
|
376
533
|
};
|
|
377
534
|
const results = await onToolCalls(parsed.calls, context);
|
|
378
535
|
if (!Array.isArray(results)) {
|
|
@@ -476,7 +633,9 @@ export class Membrane {
|
|
|
476
633
|
prefillResult.assistantPrefill = parser.getAccumulated();
|
|
477
634
|
providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
|
|
478
635
|
}
|
|
479
|
-
// Reset parser state for new streaming iteration
|
|
636
|
+
// Reset parser state for new streaming iteration. Tool rounds
|
|
637
|
+
// are the caller's work — they count against maxToolDepth only,
|
|
638
|
+
// never against the resumption guards (issue #39 review).
|
|
480
639
|
parser.resetForNewIteration();
|
|
481
640
|
toolDepth++;
|
|
482
641
|
continue;
|
|
@@ -509,6 +668,11 @@ export class Membrane {
|
|
|
509
668
|
if (toolDepth > maxToolDepth) {
|
|
510
669
|
break;
|
|
511
670
|
}
|
|
671
|
+
if (!registerResumptionRound()) {
|
|
672
|
+
lastStopReason = 'round_limit';
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
enteredViaResumption = true;
|
|
512
676
|
prefillResult.assistantPrefill = parser.getAccumulated();
|
|
513
677
|
providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
|
|
514
678
|
// Reset parser state for new streaming iteration
|
|
@@ -773,6 +937,13 @@ export class Membrane {
|
|
|
773
937
|
const textBlock = { type: 'text', text };
|
|
774
938
|
if (block.cache_control) {
|
|
775
939
|
textBlock.cache_control = block.cache_control;
|
|
940
|
+
// A block-level passthrough occupies one of the 4 breakpoint slots
|
|
941
|
+
// exactly like a marked message — count it, so the tools/system
|
|
942
|
+
// fallback below doesn't stack more on top. (Imported/seeded
|
|
943
|
+
// conversations can carry stale request-time cache_control on
|
|
944
|
+
// stored blocks — first seen wedging Sill 2026-07-25: 3 cm markers
|
|
945
|
+
// + 2 stale Arc-export blocks = 5 → hard 400 on every inference.)
|
|
946
|
+
messageBreakpoints++;
|
|
776
947
|
}
|
|
777
948
|
content.push(textBlock);
|
|
778
949
|
}
|
|
@@ -1502,10 +1673,15 @@ export class Membrane {
|
|
|
1502
1673
|
const pricing = this.resolvePricing(model);
|
|
1503
1674
|
return pricing ? calculateCost(usage, pricing) : undefined;
|
|
1504
1675
|
}
|
|
1505
|
-
calculateRetryDelay(attempt) {
|
|
1506
|
-
const { retryDelayMs, backoffMultiplier, maxRetryDelayMs } =
|
|
1507
|
-
|
|
1508
|
-
|
|
1676
|
+
calculateRetryDelay(attempt, overloaded = false) {
|
|
1677
|
+
const { retryDelayMs, backoffMultiplier, maxRetryDelayMs } = overloaded
|
|
1678
|
+
? this.retryConfig.overloaded
|
|
1679
|
+
: this.retryConfig;
|
|
1680
|
+
const delay = Math.min(retryDelayMs * Math.pow(backoffMultiplier, attempt - 1), maxRetryDelayMs);
|
|
1681
|
+
// Equal jitter on the overloaded schedule only: a capacity storm is
|
|
1682
|
+
// exactly the case where a fleet retrying in sync re-creates the
|
|
1683
|
+
// stampede it's backing off from. [delay/2, delay) keeps the wait long.
|
|
1684
|
+
return overloaded ? Math.floor(delay / 2 + Math.random() * (delay / 2)) : delay;
|
|
1509
1685
|
}
|
|
1510
1686
|
attachRawRequest(error, rawRequest) {
|
|
1511
1687
|
const errorInfo = classifyError(error);
|
|
@@ -1613,6 +1789,27 @@ export class Membrane {
|
|
|
1613
1789
|
const maxToolDepth = maxToolDepthOpt === undefined || maxToolDepthOpt === -1
|
|
1614
1790
|
? Infinity
|
|
1615
1791
|
: maxToolDepthOpt;
|
|
1792
|
+
// Resumption spin guards (issue #39). This is the path the Ash spin ran
|
|
1793
|
+
// on: tool depth here is unlimited BY DESIGN (the caller budgets its own
|
|
1794
|
+
// tool work — that contract stands untouched), and the false-positive
|
|
1795
|
+
// resumption path counted against that same unlimited bound — 43 rounds
|
|
1796
|
+
// × ~172k input tokens of zero progress. Only AUTOMATIC resumptions are
|
|
1797
|
+
// guarded: a stall guard (consecutive no-progress resumptions →
|
|
1798
|
+
// 'no_progress') and a hard resumption cap ('round_limit'). Tool rounds
|
|
1799
|
+
// are never counted. See streamWithXmlTools for the rationale details.
|
|
1800
|
+
const MIN_ROUND_PROGRESS_CHARS = 16;
|
|
1801
|
+
const MAX_CONSECUTIVE_STALLED_RESUMPTIONS = 3;
|
|
1802
|
+
const RESUMPTION_WARN_ROUNDS = 5;
|
|
1803
|
+
const maxResumptionRounds = options.maxResumptionRounds === undefined
|
|
1804
|
+
? 24
|
|
1805
|
+
: options.maxResumptionRounds === -1
|
|
1806
|
+
? Infinity
|
|
1807
|
+
: options.maxResumptionRounds;
|
|
1808
|
+
let resumptionRounds = 0;
|
|
1809
|
+
let consecutiveStalledResumptions = 0;
|
|
1810
|
+
let enteredViaResumption = false;
|
|
1811
|
+
let prevRoundStopSequence;
|
|
1812
|
+
const warnLog = this.config.logger ?? console;
|
|
1616
1813
|
// Initialize parser from formatter for format-specific tracking
|
|
1617
1814
|
const formatter = this.formatter;
|
|
1618
1815
|
const parser = formatter.createStreamParser();
|
|
@@ -1652,6 +1849,23 @@ export class Membrane {
|
|
|
1652
1849
|
// blocks inherited from prefill context (e.g., unclosed <thinking> from other bots)
|
|
1653
1850
|
// from blocks the model itself opened during generation
|
|
1654
1851
|
const prefillDepths = parser.getDepths();
|
|
1852
|
+
/** Count an automatic resumption; emits the visibility warning at the
|
|
1853
|
+
* threshold and returns false when the cap says the turn should end. */
|
|
1854
|
+
const registerResumptionRound = () => {
|
|
1855
|
+
resumptionRounds++;
|
|
1856
|
+
if (resumptionRounds === RESUMPTION_WARN_ROUNDS) {
|
|
1857
|
+
warnLog.warn(`[membrane] automatic resumption at round ${resumptionRounds} ` +
|
|
1858
|
+
`(${totalUsage.inputTokens} input tokens so far this turn) — ` +
|
|
1859
|
+
`a spin shows up here before it shows up on the bill`);
|
|
1860
|
+
}
|
|
1861
|
+
if (resumptionRounds > maxResumptionRounds) {
|
|
1862
|
+
warnLog.warn(`[membrane] automatic resumption cap (${maxResumptionRounds}) reached — ` +
|
|
1863
|
+
`ending turn with stopReason 'round_limit'. ` +
|
|
1864
|
+
`${totalUsage.inputTokens} input tokens spent this turn.`);
|
|
1865
|
+
return false;
|
|
1866
|
+
}
|
|
1867
|
+
return true;
|
|
1868
|
+
};
|
|
1655
1869
|
try {
|
|
1656
1870
|
// Tool execution loop
|
|
1657
1871
|
while (toolDepth <= maxToolDepth) {
|
|
@@ -1765,6 +1979,30 @@ export class Membrane {
|
|
|
1765
1979
|
stream.emit({ type: 'block', event: emission.event });
|
|
1766
1980
|
}
|
|
1767
1981
|
}
|
|
1982
|
+
// Stall accounting (issue #39): only rounds ENTERED via automatic
|
|
1983
|
+
// resumption can stall; the turn ends only after several consecutive
|
|
1984
|
+
// stalls. Tool rounds are never counted. Mirrors streamWithXmlTools —
|
|
1985
|
+
// see the detailed rationale there.
|
|
1986
|
+
const streamedThisRound = parser.getAccumulated().length - checkFromIndex;
|
|
1987
|
+
if (enteredViaResumption &&
|
|
1988
|
+
lastStopReason === 'stop_sequence' &&
|
|
1989
|
+
streamedThisRound < MIN_ROUND_PROGRESS_CHARS &&
|
|
1990
|
+
lastStopSequence === prevRoundStopSequence) {
|
|
1991
|
+
consecutiveStalledResumptions++;
|
|
1992
|
+
if (consecutiveStalledResumptions >= MAX_CONSECUTIVE_STALLED_RESUMPTIONS) {
|
|
1993
|
+
warnLog.warn(`[membrane] ${consecutiveStalledResumptions} consecutive automatic resumptions ` +
|
|
1994
|
+
`made no progress (${streamedThisRound} chars this round, stop ` +
|
|
1995
|
+
`${JSON.stringify(lastStopSequence ?? null)} repeated) — ending turn with ` +
|
|
1996
|
+
`stopReason 'no_progress'. ${totalUsage.inputTokens} input tokens spent this turn.`);
|
|
1997
|
+
lastStopReason = 'no_progress';
|
|
1998
|
+
break;
|
|
1999
|
+
}
|
|
2000
|
+
}
|
|
2001
|
+
else {
|
|
2002
|
+
consecutiveStalledResumptions = 0;
|
|
2003
|
+
}
|
|
2004
|
+
prevRoundStopSequence = lastStopSequence;
|
|
2005
|
+
enteredViaResumption = false;
|
|
1768
2006
|
// Check for tool calls
|
|
1769
2007
|
if (streamResult.stopSequence === '</function_calls>') {
|
|
1770
2008
|
const closeTag = '</function_calls>';
|
|
@@ -1801,13 +2039,24 @@ export class Membrane {
|
|
|
1801
2039
|
}
|
|
1802
2040
|
// Track the tool calls
|
|
1803
2041
|
executedToolCalls.push(...parsed.calls);
|
|
1804
|
-
// Build tool context
|
|
2042
|
+
// Build tool context.
|
|
2043
|
+
// preamble/accumulated must expose the MODEL'S text only: the
|
|
2044
|
+
// parser was seeded with the entire assistant prefill (the whole
|
|
2045
|
+
// flattened document in XML mode), so parsed.beforeText starts
|
|
2046
|
+
// with it. Consumers persist the preamble as "what the agent said
|
|
2047
|
+
// this round" — unsliced, a turn that dies mid-rounds flushes the
|
|
2048
|
+
// full document back into the agent's store as its own message
|
|
2049
|
+
// (observed on Ash 2026-07-26: ~720k-char document echo persisted
|
|
2050
|
+
// as 62 sharded assistant messages, doubling her store and
|
|
2051
|
+
// wedging every subsequent compile). The turn-END path already
|
|
2052
|
+
// slices (newContent = fullAccumulated.slice(initialPrefillLength));
|
|
2053
|
+
// the tool-round path must match it.
|
|
1805
2054
|
const context = {
|
|
1806
2055
|
rawText: parsed.fullMatch,
|
|
1807
|
-
preamble: parsed.beforeText,
|
|
2056
|
+
preamble: parsed.beforeText.slice(initialPrefillLength),
|
|
1808
2057
|
depth: toolDepth,
|
|
1809
2058
|
previousResults: executedToolResults,
|
|
1810
|
-
accumulated: parser.getAccumulated(),
|
|
2059
|
+
accumulated: parser.getAccumulated().slice(initialPrefillLength),
|
|
1811
2060
|
};
|
|
1812
2061
|
// Yield control for tool execution
|
|
1813
2062
|
const toolCallsEvent = {
|
|
@@ -1934,6 +2183,9 @@ export class Membrane {
|
|
|
1934
2183
|
prefillResult.assistantPrefill = parser.getAccumulated();
|
|
1935
2184
|
providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
|
|
1936
2185
|
}
|
|
2186
|
+
// Tool rounds are the caller's work — they count against
|
|
2187
|
+
// maxToolDepth only, never against the resumption guards
|
|
2188
|
+
// (issue #39 review: the uncapped tool-loop contract stands).
|
|
1937
2189
|
parser.resetForNewIteration();
|
|
1938
2190
|
toolDepth++;
|
|
1939
2191
|
continue;
|
|
@@ -1961,6 +2213,11 @@ export class Membrane {
|
|
|
1961
2213
|
if (toolDepth > maxToolDepth) {
|
|
1962
2214
|
break;
|
|
1963
2215
|
}
|
|
2216
|
+
if (!registerResumptionRound()) {
|
|
2217
|
+
lastStopReason = 'round_limit';
|
|
2218
|
+
break;
|
|
2219
|
+
}
|
|
2220
|
+
enteredViaResumption = true;
|
|
1964
2221
|
prefillResult.assistantPrefill = parser.getAccumulated();
|
|
1965
2222
|
providerRequest = this.buildContinuationRequest(request, prefillResult, parser.getAccumulated());
|
|
1966
2223
|
parser.resetForNewIteration();
|