@mcp-abap-adt/llm-agent 22.1.0 → 23.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -5,6 +5,7 @@ export * from './external-results.js';
5
5
  export { assertClientDescriptors } from './interfaces/assert-client-descriptors.js';
6
6
  export * from './interfaces/index.js';
7
7
  export { BaseLLMProvider, type LLMProvider } from './llm/base-llm-provider.js';
8
+ export { findThrottled, gateFor, isThrottledError, preserveThrottled, pruneQuotaGates, QuotaGate, quotaGateCount, resetQuotaGates, runWithThrottleRetry, type ThrottledError, type ThrottleRetryOptions, } from './llm/throttle.js';
8
9
  export { NeedsDecompositionError } from './needs-decomposition-error.js';
9
10
  export * from './rag/index.js';
10
11
  export * from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAI3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EACL,sBAAsB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,KAAK,oBAAoB,GAC1B,MAAM,wCAAwC,CAAC;AAEhD,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,gCAAgC,CAAC;AAExC,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,cAAc,EACd,KAAK,wBAAwB,EAC7B,wBAAwB,EACxB,KAAK,0BAA0B,EAC/B,qBAAqB,EACrB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,SAAS,GACV,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -6,6 +6,7 @@ export * from './external-results.js';
6
6
  export { assertClientDescriptors } from './interfaces/assert-client-descriptors.js';
7
7
  export * from './interfaces/index.js';
8
8
  export { BaseLLMProvider } from './llm/base-llm-provider.js';
9
+ export { findThrottled, gateFor, isThrottledError, preserveThrottled, pruneQuotaGates, QuotaGate, quotaGateCount, resetQuotaGates, runWithThrottleRetry, } from './llm/throttle.js';
9
10
  export { NeedsDecompositionError } from './needs-decomposition-error.js';
10
11
  export * from './rag/index.js';
11
12
  export * from './types.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAoB,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAE3B,sEAAsE;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,eAAe;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,iBAAiB;AACjB,OAAO,EACL,sBAAsB,EAGtB,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,yBAAyB;AACzB,OAAO,EACL,sBAAsB,GAKvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GAGrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,oBAAoB;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AACjD,aAAa;AACb,OAAO,EACL,cAAc,GAGf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,cAAc,EAEd,wBAAwB,EAExB,qBAAqB,EACrB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,SAAS,GACV,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,SAAS,EACT,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AACzE,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAoB,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EACL,aAAa,EACb,OAAO,EACP,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,cAAc,EACd,eAAe,EACf,oBAAoB,GAGrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAE3B,sEAAsE;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,eAAe;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,iBAAiB;AACjB,OAAO,EACL,sBAAsB,EAGtB,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,yBAAyB;AACzB,OAAO,EACL,sBAAsB,GAKvB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAErB,MAAM,wCAAwC,CAAC;AAGhD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,gBAAgB,EAChB,oBAAoB,GAGrB,MAAM,gCAAgC,CAAC;AAGxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,oBAAoB;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,yCAAyC,CAAC;AACjD,aAAa;AACb,OAAO,EACL,cAAc,GAGf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,sBAAsB,EACtB,0BAA0B,EAC1B,kBAAkB,GACnB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EACL,cAAc,EAEd,wBAAwB,EAExB,qBAAqB,EACrB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EAEL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,SAAS,GACV,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
@@ -56,6 +56,7 @@ export type { ISubAgent, ISubAgentInput, ISubAgentResult, SubAgentCapabilities,
56
56
  export type { ISubAgentContextBuilder, SubAgentContextRequest, SubAgentContextResult, } from './subagent-context.js';
57
57
  export type { ITaskFormalizer, ITaskSpec } from './task-spec.js';
58
58
  export { renderTaskSpec } from './task-spec.js';
59
+ export { DEFAULT_THROTTLE_POLICY, DefaultThrottleStrategy, type IThrottleStrategy, type ThrottleContext, type ThrottleDecision, type ThrottlePolicy, } from './throttle-strategy.js';
59
60
  export { type IToolCatalogReporter, isToolCatalogReporter, type ToolCatalogStatus, } from './tool-catalog.js';
60
61
  export type { IToolLoopContextStrategy, JsonValue, SerializableStrategyState, ToolLoopContextBase, ToolLoopContextStrategyDeps, ToolLoopContextStrategyFactory, ToolRound, } from './tool-loop-context-strategy.js';
61
62
  export { defaultToolRecordKey, type IToolRecordKey, type ToolKeyContext, toolNameFromRecord, } from './tool-record-key.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,iBAAiB,EACjB,KAAK,kBAAkB,EACvB,KAAK,UAAU,GAChB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACtE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,YAAY,EACV,WAAW,EACX,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACvD,YAAY,EACV,YAAY,EACZ,aAAa,EACb,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EACV,cAAc,EACd,eAAe,EACf,UAAU,GACX,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EACV,WAAW,EACX,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,mBAAmB,EACnB,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,eAAe,GAChB,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACrC,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,YAAY,EACV,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,qBAAqB,EACrB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AACpF,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,YAAY,EACZ,UAAU,EACV,cAAc,GACf,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,SAAS,GACV,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,yBAAyB,EACzB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,QAAQ,EACR,mBAAmB,EACnB,YAAY,EACZ,aAAa,GACd,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,aAAa,EACb,QAAQ,GACT,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EACV,eAAe,EACf,qBAAqB,EACrB,SAAS,EACT,cAAc,EACd,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,iBAAiB,EACjB,UAAU,EACV,YAAY,EACZ,oBAAoB,EACpB,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAC/D,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EACL,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACV,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,cAAc,EACd,WAAW,EACX,aAAa,EACb,aAAa,GACd,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,qBAAqB,EACrB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,YAAY,EACV,MAAM,EACN,aAAa,EACb,UAAU,EACV,cAAc,GACf,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,iBAAiB,EACjB,yBAAyB,EACzB,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,eAAe,EACf,WAAW,EACX,yBAAyB,EACzB,cAAc,GACf,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,UAAU,EACV,oBAAoB,EACpB,WAAW,EACX,qBAAqB,EACrB,iBAAiB,EACjB,QAAQ,EACR,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,GACf,MAAM,6BAA6B,CAAC;AACrC,YAAY,EACV,MAAM,EACN,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,GACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC5D,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzE,YAAY,EACV,SAAS,EACT,cAAc,EACd,eAAe,EACf,oBAAoB,EACpB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,YAAY,EACV,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,oBAAoB,EACzB,qBAAqB,EACrB,KAAK,iBAAiB,GACvB,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EACV,wBAAwB,EACxB,SAAS,EACT,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,8BAA8B,EAC9B,SAAS,GACV,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AAC3E,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3E,YAAY,EACV,WAAW,EACX,WAAW,EACX,YAAY,EACZ,eAAe,EACf,WAAW,EACX,cAAc,EACd,OAAO,EACP,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,eAAe,EACf,OAAO,EACP,aAAa,EACb,eAAe,EACf,WAAW,EACX,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,cAAc,EACd,SAAS,EACT,aAAa,EACb,WAAW,EACX,cAAc,EACd,aAAa,EACb,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -5,6 +5,7 @@ export { isReadinessReporter, } from './readiness-reporter.js';
5
5
  export { CatalogCasError, SkillsIncompatibleError } from './skills-rag.js';
6
6
  export { TokenLedger } from './stepper.js';
7
7
  export { renderTaskSpec } from './task-spec.js';
8
+ export { DEFAULT_THROTTLE_POLICY, DefaultThrottleStrategy, } from './throttle-strategy.js';
8
9
  export { isToolCatalogReporter, } from './tool-catalog.js';
9
10
  export { defaultToolRecordKey, toolNameFromRecord, } from './tool-record-key.js';
10
11
  export { AssemblerError, ClassifierError, isMcpUnavailable, LlmError, MCP_UNAVAILABLE_CODES, McpError, RagError, SkillError, SmartAgentError, } from './types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,iBAAiB,GAGlB,MAAM,sBAAsB,CAAC;AAiD9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiG9D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAEL,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAkDjC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AA0B3E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiB3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAEL,qBAAqB,GAEtB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AA+B9B,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AACA,OAAO,EAGL,iBAAiB,GAGlB,MAAM,sBAAsB,CAAC;AAiD9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAiG9D,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAE/D,OAAO,EAEL,mBAAmB,GACpB,MAAM,yBAAyB,CAAC;AAkDjC,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AA0B3E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAiB3C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EACL,uBAAuB,EACvB,uBAAuB,GAKxB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,qBAAqB,GAEtB,MAAM,mBAAmB,CAAC;AAU3B,OAAO,EACL,oBAAoB,EAGpB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AA+B9B,OAAO,EACL,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,QAAQ,EACR,qBAAqB,EACrB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEhD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * What a provider does when a server throttles it.
3
+ *
4
+ * The seam lives here, beside the other strategies, rather than next to the
5
+ * implementation that ships with it: a consumer programs against this package,
6
+ * and a contract kept in the implementation file is a contract nobody finds.
7
+ *
8
+ * The policy is the numbers; the strategy turns them into a decision. The
9
+ * shared pause per quota is NOT part of it — that is an invariant the runner
10
+ * keeps either way, because one caller declining to wait is its own business
11
+ * and one caller declining to mark the quota closed is everyone's.
12
+ */
13
+ export interface ThrottlePolicy {
14
+ /** Total attempts INCLUDING the first. 1 waits out no throttling of its own. */
15
+ maxAttempts: number;
16
+ /** Give up once the accumulated waiting would exceed this. */
17
+ maxTotalWaitMs: number;
18
+ /** First backoff step when the server names no time of its own. */
19
+ baseDelayMs: number;
20
+ /** Ceiling for one computed step, before jitter. */
21
+ maxDelayMs: number;
22
+ /**
23
+ * How the numbers above turn into a decision. Omit for the default.
24
+ *
25
+ * There is no switch to turn throttle handling off, because there is no case
26
+ * where sending another request into a quota the server has just closed is
27
+ * the better answer — that is correctness, not preference. A consumer who
28
+ * wants different mechanics supplies them here, and the shared pause, which
29
+ * is the part other callers depend on, is kept either way.
30
+ */
31
+ strategy?: IThrottleStrategy;
32
+ }
33
+ /** What the strategy is told about the 429 that just came back. */
34
+ export interface ThrottleContext {
35
+ /** 1-based: the attempt that was just refused. */
36
+ attempt: number;
37
+ /** What the server asked us to wait, in seconds, if it said. */
38
+ retryAfterSeconds?: number;
39
+ /** Waiting already spent on this call, the shared pause included. */
40
+ waitedMs: number;
41
+ /** The numbers in force, so a strategy need not close over them. */
42
+ policy: ThrottlePolicy;
43
+ }
44
+ export interface ThrottleDecision {
45
+ /**
46
+ * How long this quota is closed.
47
+ *
48
+ * Taken by the shared pause whether or not THIS caller retries: the quota is
49
+ * shut regardless of who has budget left, and a caller that gives up with the
50
+ * gate open sends everyone else straight back into the limit.
51
+ */
52
+ waitMs: number;
53
+ /** Whether this caller waits it out and tries again. */
54
+ retry: boolean;
55
+ /** When not retrying, which cap ended it. */
56
+ reason?: 'attempts' | 'budget';
57
+ }
58
+ export interface IThrottleStrategy {
59
+ readonly name: string;
60
+ decide(ctx: ThrottleContext): ThrottleDecision;
61
+ }
62
+ export declare const DEFAULT_THROTTLE_POLICY: Omit<ThrottlePolicy, 'strategy'>;
63
+ /**
64
+ * What SAP AI Core documents: the server's own `Retry-After` when it sends one,
65
+ * otherwise exponential backoff with full jitter, capped by attempts and by
66
+ * total waiting.
67
+ */
68
+ export declare class DefaultThrottleStrategy implements IThrottleStrategy {
69
+ readonly name = "default-throttle";
70
+ decide({ attempt, retryAfterSeconds, waitedMs, policy, }: ThrottleContext): ThrottleDecision;
71
+ }
72
+ //# sourceMappingURL=throttle-strategy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle-strategy.d.ts","sourceRoot":"","sources":["../../src/interfaces/throttle-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,cAAc;IAC7B,gFAAgF;IAChF,WAAW,EAAE,MAAM,CAAC;IACpB,8DAA8D;IAC9D,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CAC9B;AAED,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,qEAAqE;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,oEAAoE;IACpE,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;;OAMG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,KAAK,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,MAAM,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,GAAG,EAAE,eAAe,GAAG,gBAAgB,CAAC;CAChD;AAED,eAAO,MAAM,uBAAuB,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,CAKpE,CAAC;AAEF;;;;GAIG;AACH,qBAAa,uBAAwB,YAAW,iBAAiB;IAC/D,QAAQ,CAAC,IAAI,sBAAsB;IAEnC,MAAM,CAAC,EACL,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,MAAM,GACP,EAAE,eAAe,GAAG,gBAAgB;CAkBtC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * What a provider does when a server throttles it.
3
+ *
4
+ * The seam lives here, beside the other strategies, rather than next to the
5
+ * implementation that ships with it: a consumer programs against this package,
6
+ * and a contract kept in the implementation file is a contract nobody finds.
7
+ *
8
+ * The policy is the numbers; the strategy turns them into a decision. The
9
+ * shared pause per quota is NOT part of it — that is an invariant the runner
10
+ * keeps either way, because one caller declining to wait is its own business
11
+ * and one caller declining to mark the quota closed is everyone's.
12
+ */
13
+ export const DEFAULT_THROTTLE_POLICY = {
14
+ maxAttempts: 5,
15
+ maxTotalWaitMs: 60_000,
16
+ baseDelayMs: 1_000,
17
+ maxDelayMs: 20_000,
18
+ };
19
+ /**
20
+ * What SAP AI Core documents: the server's own `Retry-After` when it sends one,
21
+ * otherwise exponential backoff with full jitter, capped by attempts and by
22
+ * total waiting.
23
+ */
24
+ export class DefaultThrottleStrategy {
25
+ name = 'default-throttle';
26
+ decide({ attempt, retryAfterSeconds, waitedMs, policy, }) {
27
+ const served = retryAfterSeconds !== undefined && Number.isFinite(retryAfterSeconds);
28
+ // The server's own number wins. A computed guess is for when it stays
29
+ // silent — it is an estimate of something the server already knows.
30
+ const waitMs = served
31
+ ? retryAfterSeconds * 1000
32
+ : jittered(policy.baseDelayMs * 2 ** (attempt - 1), policy.maxDelayMs);
33
+ if (attempt >= policy.maxAttempts) {
34
+ return { waitMs, retry: false, reason: 'attempts' };
35
+ }
36
+ if (waitedMs + waitMs > policy.maxTotalWaitMs) {
37
+ return { waitMs, retry: false, reason: 'budget' };
38
+ }
39
+ return { waitMs, retry: true };
40
+ }
41
+ }
42
+ /**
43
+ * Full jitter: a random point in [0, computed], not computed ± a nudge.
44
+ *
45
+ * Scaling a shared delay by a factor near 1 keeps the herd together; drawing
46
+ * from the whole interval is what actually spreads it.
47
+ */
48
+ function jittered(computed, maxDelayMs) {
49
+ return Math.random() * Math.min(computed, maxDelayMs);
50
+ }
51
+ //# sourceMappingURL=throttle-strategy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"throttle-strategy.js","sourceRoot":"","sources":["../../src/interfaces/throttle-strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAuDH,MAAM,CAAC,MAAM,uBAAuB,GAAqC;IACvE,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,MAAM;IACtB,WAAW,EAAE,KAAK;IAClB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,uBAAuB;IACzB,IAAI,GAAG,kBAAkB,CAAC;IAEnC,MAAM,CAAC,EACL,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,MAAM,GACU;QAChB,MAAM,MAAM,GACV,iBAAiB,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAExE,sEAAsE;QACtE,oEAAoE;QACpE,MAAM,MAAM,GAAG,MAAM;YACnB,CAAC,CAAE,iBAA4B,GAAG,IAAI;YACtC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;QAEzE,IAAI,OAAO,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAClC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QACtD,CAAC;QACD,IAAI,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;YAC9C,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;QACpD,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;CACF;AAED;;;;;GAKG;AACH,SAAS,QAAQ,CAAC,QAAgB,EAAE,UAAkB;IACpD,OAAO,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;AACxD,CAAC"}
@@ -2,6 +2,7 @@
2
2
  * Base interface for LLM providers
3
3
  */
4
4
  import type { IModelInfo, LLMCallOptions, LLMProviderConfig, LLMResponse, Message } from '@mcp-abap-adt/llm-agent';
5
+ import { type ThrottleRetryOptions } from './throttle.js';
5
6
  export interface LLMProvider {
6
7
  /**
7
8
  * Send a chat message and get response
@@ -29,5 +30,73 @@ export declare abstract class BaseLLMProvider<C extends LLMProviderConfig = LLMP
29
30
  * Validate configuration
30
31
  */
31
32
  protected validateConfig(): void;
33
+ /**
34
+ * Which account and endpoint this call bills to.
35
+ *
36
+ * A quota belongs to an account at an endpoint, so two providers that differ
37
+ * in either one do not share a limit. In a multi-tenant process a key built
38
+ * from the class and the model alone would let one tenant's 429 pause
39
+ * another's for a minute, on a quota that tenant never touched.
40
+ *
41
+ * The credential is reduced to a short digest: the key is an in-memory map
42
+ * key and may reach a log line, so it must identify an account without being
43
+ * the account's secret. Override to add a provider's own account fields
44
+ * (organization, project, resource group) — never the raw secret.
45
+ */
46
+ protected quotaScope(): string;
47
+ /**
48
+ * Reduce spellings of one endpoint to one key.
49
+ *
50
+ * Two callers that reach the same server must land on the same gate, and a
51
+ * URL has more than one way of naming it: a trailing slash, an upper-case
52
+ * host, a port that was already the default. Written differently they would
53
+ * be metered as two quotas and stop coordinating — the same defect as reading
54
+ * the configured URL instead of the resolved one, one level down.
55
+ *
56
+ * The query string is kept verbatim: some endpoints carry a deployment or an
57
+ * API version there, and merging those would be worse than splitting them.
58
+ */
59
+ protected canonicalEndpoint(raw: string): string;
60
+ /**
61
+ * The endpoint this provider actually reaches — the RESOLVED one, not the
62
+ * configured one. A provider left to its default and a provider handed that
63
+ * same default explicitly talk to the same server and share its limit; read
64
+ * from the config alone they would look like two quotas and stop
65
+ * coordinating. Override wherever a default is filled in.
66
+ */
67
+ protected quotaEndpoint(): string;
68
+ /** Available to subclasses building their own scope out of other fields. */
69
+ protected credentialFingerprint(secret: string | undefined): string;
70
+ /**
71
+ * Which quota this call spends. Limits are per model, so the model is in the
72
+ * key — and it must be the model the CALL uses, not the configured default.
73
+ * A per-request override spends a different quota: keyed by the default, one
74
+ * model's 429 would pause another's, and two overrides would share a gate
75
+ * neither of them belongs to.
76
+ */
77
+ protected quotaKey(model?: string): string;
78
+ /** Is this "too many requests" rather than a real failure? */
79
+ protected isThrottled(error: unknown): boolean;
80
+ /**
81
+ * How long the server asked us to wait.
82
+ *
83
+ * `Retry-After` is seconds in the SAP AI Core contract and is usually seconds
84
+ * elsewhere, but the HTTP spec also allows an HTTP-date, so both are read.
85
+ */
86
+ protected retryAfterSeconds(error: unknown): number | undefined;
87
+ /**
88
+ * Keep the 429 visible through the provider's own error wrapping.
89
+ *
90
+ * Providers rethrow their transport error as a readable one. Call this on the
91
+ * way out so the consumer still reads a fact, not a substring.
92
+ */
93
+ protected preserveThrottled<E extends Error>(original: unknown, wrapped: E): E;
94
+ /** Wrap one provider call in the shared policy. */
95
+ protected withThrottleRetry<T>(fn: () => Promise<T>, extra?: {
96
+ /** The model this call actually uses, when it overrides the configured one. */
97
+ model?: string;
98
+ signal?: AbortSignal;
99
+ onRetry?: ThrottleRetryOptions['onRetry'];
100
+ }): Promise<T>;
32
101
  }
33
102
  //# sourceMappingURL=base-llm-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-llm-provider.d.ts","sourceRoot":"","sources":["../../src/llm/base-llm-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,OAAO,EACR,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,CACF,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9B;;OAEG;IACH,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,kBAAkB,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;CACzD;AAED,8BAAsB,eAAe,CACnC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAC/C,YAAW,WAAW;IAEtB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAEP,MAAM,EAAE,CAAC;IAIrB,QAAQ,CAAC,IAAI,CACX,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC;IAEvB,QAAQ,CAAC,UAAU,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,WAAW,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,IAAI;CAKjC"}
1
+ {"version":3,"file":"base-llm-provider.d.ts","sourceRoot":"","sources":["../../src/llm/base-llm-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,WAAW,EACX,OAAO,EACR,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,WAAW;IAC1B;;OAEG;IACH,IAAI,CACF,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC,CAAC;IAExB;;OAEG;IACH,UAAU,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9B;;OAEG;IACH,SAAS,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;IAE/C;;OAEG;IACH,kBAAkB,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC;CACzD;AAED,8BAAsB,eAAe,CACnC,CAAC,SAAS,iBAAiB,GAAG,iBAAiB,CAC/C,YAAW,WAAW;IAEtB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAEP,MAAM,EAAE,CAAC;IAIrB,QAAQ,CAAC,IAAI,CACX,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,WAAW,CAAC;IAEvB,QAAQ,CAAC,UAAU,CACjB,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,cAAc,GACvB,aAAa,CAAC,WAAW,CAAC;IAE7B;;OAEG;IACH,SAAS,CAAC,cAAc,IAAI,IAAI;IAchC;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,UAAU,IAAI,MAAM;IAO9B;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAahD;;;;;;OAMG;IACH,SAAS,CAAC,aAAa,IAAI,MAAM;IAIjC,4EAA4E;IAC5E,SAAS,CAAC,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM;IAInE;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM;IAM1C,8DAA8D;IAC9D,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAI9C;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAU/D;;;;;OAKG;IACH,SAAS,CAAC,iBAAiB,CAAC,CAAC,SAAS,KAAK,EACzC,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,CAAC,GACT,CAAC;IAIJ,mDAAmD;IACnD,SAAS,CAAC,iBAAiB,CAAC,CAAC,EAC3B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,KAAK,CAAC,EAAE;QACN,+EAA+E;QAC/E,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,OAAO,CAAC,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;KAC3C,GACA,OAAO,CAAC,CAAC,CAAC;CAUd"}
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * Base interface for LLM providers
3
3
  */
4
+ import { createHash } from 'node:crypto';
5
+ import { preserveThrottled, runWithThrottleRetry, } from './throttle.js';
4
6
  export class BaseLLMProvider {
5
7
  config;
6
8
  constructor(config) {
@@ -14,5 +16,163 @@ export class BaseLLMProvider {
14
16
  throw new Error('API key is required');
15
17
  }
16
18
  }
19
+ // --- Rate limiting (issue #282) -----------------------------------------
20
+ //
21
+ // The policy is shared (see `rate-limit.ts`); a provider supplies only the
22
+ // two facts the policy cannot know. The defaults below read an AxiosError,
23
+ // which covers every provider here: anthropic and openai use axios directly,
24
+ // sap-aicore gets one through @sap-ai-sdk, and deepseek and ollama build on
25
+ // the openai provider. A provider on another transport overrides them.
26
+ /**
27
+ * Which account and endpoint this call bills to.
28
+ *
29
+ * A quota belongs to an account at an endpoint, so two providers that differ
30
+ * in either one do not share a limit. In a multi-tenant process a key built
31
+ * from the class and the model alone would let one tenant's 429 pause
32
+ * another's for a minute, on a quota that tenant never touched.
33
+ *
34
+ * The credential is reduced to a short digest: the key is an in-memory map
35
+ * key and may reach a log line, so it must identify an account without being
36
+ * the account's secret. Override to add a provider's own account fields
37
+ * (organization, project, resource group) — never the raw secret.
38
+ */
39
+ quotaScope() {
40
+ return [
41
+ this.canonicalEndpoint(this.quotaEndpoint()),
42
+ this.credentialFingerprint(this.config.apiKey),
43
+ ].join('|');
44
+ }
45
+ /**
46
+ * Reduce spellings of one endpoint to one key.
47
+ *
48
+ * Two callers that reach the same server must land on the same gate, and a
49
+ * URL has more than one way of naming it: a trailing slash, an upper-case
50
+ * host, a port that was already the default. Written differently they would
51
+ * be metered as two quotas and stop coordinating — the same defect as reading
52
+ * the configured URL instead of the resolved one, one level down.
53
+ *
54
+ * The query string is kept verbatim: some endpoints carry a deployment or an
55
+ * API version there, and merging those would be worse than splitting them.
56
+ */
57
+ canonicalEndpoint(raw) {
58
+ const trimmed = raw.trim();
59
+ if (!trimmed)
60
+ return 'default';
61
+ try {
62
+ // `origin` already lower-cases the host and drops a default port.
63
+ const url = new URL(trimmed);
64
+ return `${url.origin}${url.pathname.replace(/\/+$/, '')}${url.search}`;
65
+ }
66
+ catch {
67
+ // Not absolute (a path, a host:port). Normalise what is safe to.
68
+ return trimmed.replace(/\/+$/, '');
69
+ }
70
+ }
71
+ /**
72
+ * The endpoint this provider actually reaches — the RESOLVED one, not the
73
+ * configured one. A provider left to its default and a provider handed that
74
+ * same default explicitly talk to the same server and share its limit; read
75
+ * from the config alone they would look like two quotas and stop
76
+ * coordinating. Override wherever a default is filled in.
77
+ */
78
+ quotaEndpoint() {
79
+ return this.config.baseURL ?? 'default';
80
+ }
81
+ /** Available to subclasses building their own scope out of other fields. */
82
+ credentialFingerprint(secret) {
83
+ return fingerprint(secret);
84
+ }
85
+ /**
86
+ * Which quota this call spends. Limits are per model, so the model is in the
87
+ * key — and it must be the model the CALL uses, not the configured default.
88
+ * A per-request override spends a different quota: keyed by the default, one
89
+ * model's 429 would pause another's, and two overrides would share a gate
90
+ * neither of them belongs to.
91
+ */
92
+ quotaKey(model) {
93
+ return `${this.constructor.name}:${this.quotaScope()}:${model ?? this.config.model ?? 'default'}`;
94
+ }
95
+ /** Is this "too many requests" rather than a real failure? */
96
+ isThrottled(error) {
97
+ return httpStatusOf(error) === 429;
98
+ }
99
+ /**
100
+ * How long the server asked us to wait.
101
+ *
102
+ * `Retry-After` is seconds in the SAP AI Core contract and is usually seconds
103
+ * elsewhere, but the HTTP spec also allows an HTTP-date, so both are read.
104
+ */
105
+ retryAfterSeconds(error) {
106
+ const raw = headerOf(error, 'retry-after');
107
+ if (raw === undefined)
108
+ return undefined;
109
+ const seconds = Number(raw);
110
+ if (Number.isFinite(seconds) && seconds >= 0)
111
+ return seconds;
112
+ const when = Date.parse(String(raw));
113
+ if (!Number.isNaN(when))
114
+ return Math.max(0, (when - Date.now()) / 1000);
115
+ return undefined;
116
+ }
117
+ /**
118
+ * Keep the 429 visible through the provider's own error wrapping.
119
+ *
120
+ * Providers rethrow their transport error as a readable one. Call this on the
121
+ * way out so the consumer still reads a fact, not a substring.
122
+ */
123
+ preserveThrottled(original, wrapped) {
124
+ return preserveThrottled(original, wrapped);
125
+ }
126
+ /** Wrap one provider call in the shared policy. */
127
+ withThrottleRetry(fn, extra) {
128
+ return runWithThrottleRetry(fn, {
129
+ key: this.quotaKey(extra?.model),
130
+ policy: this.config.whenThrottled,
131
+ isThrottled: (e) => this.isThrottled(e),
132
+ retryAfterSeconds: (e) => this.retryAfterSeconds(e),
133
+ signal: extra?.signal,
134
+ onRetry: extra?.onRetry,
135
+ });
136
+ }
137
+ }
138
+ /**
139
+ * A short, stable, non-reversible stand-in for a credential.
140
+ *
141
+ * Enough to tell two accounts apart in a map key; not enough to be the secret
142
+ * if that key is ever printed. An absent credential is its own scope — several
143
+ * providers configured without one are, as far as we can tell, the same one.
144
+ */
145
+ function fingerprint(secret) {
146
+ if (!secret)
147
+ return 'anonymous';
148
+ return createHash('sha256').update(secret).digest('hex').slice(0, 12);
149
+ }
150
+ /** Status of an axios-shaped error, or undefined when it is shaped otherwise. */
151
+ function httpStatusOf(error) {
152
+ const e = error;
153
+ // axios keeps it under response; several SDKs hoist it onto the error itself.
154
+ for (const candidate of [e?.response?.status, e?.status, e?.statusCode]) {
155
+ if (typeof candidate === 'number')
156
+ return candidate;
157
+ }
158
+ return undefined;
159
+ }
160
+ /** One response header, case-insensitively, from an axios-shaped error. */
161
+ function headerOf(error, name) {
162
+ const headers = error?.response
163
+ ?.headers;
164
+ if (!headers || typeof headers !== 'object')
165
+ return undefined;
166
+ // AxiosHeaders exposes a get(); a plain object does not.
167
+ const get = headers.get;
168
+ if (typeof get === 'function') {
169
+ const v = get.call(headers, name);
170
+ return v === undefined || v === null ? undefined : String(v);
171
+ }
172
+ for (const [k, v] of Object.entries(headers)) {
173
+ if (k.toLowerCase() === name)
174
+ return v === undefined || v === null ? undefined : String(v);
175
+ }
176
+ return undefined;
17
177
  }
18
178
  //# sourceMappingURL=base-llm-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-llm-provider.js","sourceRoot":"","sources":["../../src/llm/base-llm-provider.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwCH,MAAM,OAAgB,eAAe;IAI1B,MAAM,CAAI;IAEnB,YAAY,MAAS;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAcD;;OAEG;IACO,cAAc;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"base-llm-provider.js","sourceRoot":"","sources":["../../src/llm/base-llm-provider.ts"],"names":[],"mappings":"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"}