@blockrun/clawrouter 0.12.236 → 0.12.237

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/cli.js CHANGED
@@ -84792,6 +84792,13 @@ function estimateAmount(modelId, bodyLength, maxTokens) {
84792
84792
  const amountMicros = Math.max(1e3, Math.ceil(costUsd * 1.2 * 1e6));
84793
84793
  return amountMicros.toString();
84794
84794
  }
84795
+ function estimateBalancePreflightAmount(modelId, bodyLength, maxTokens) {
84796
+ const preflightMaxTokens = Math.min(
84797
+ maxTokens || BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP,
84798
+ BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP
84799
+ );
84800
+ return estimateAmount(modelId, bodyLength, preflightMaxTokens);
84801
+ }
84795
84802
  function estimatePhoneCost(urlPath) {
84796
84803
  const op = urlPath.replace(/^\/v1\//, "").split("?")[0];
84797
84804
  for (const key2 of Object.keys(PHONE_PRICING).sort((a, b) => b.length - a.length)) {
@@ -87052,9 +87059,13 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
87052
87059
  let isFreeModel = FREE_MODELS.has(modelId ?? "");
87053
87060
  if (modelId && !options.skipBalanceCheck && !isFreeModel) {
87054
87061
  const estimated = estimateAmount(modelId, body.length, maxTokens);
87062
+ const preflightEstimated = estimateBalancePreflightAmount(modelId, body.length, maxTokens);
87055
87063
  if (estimated) {
87056
87064
  estimatedCostMicros = BigInt(estimated);
87057
- const bufferedCostMicros = estimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100)) / 100n;
87065
+ }
87066
+ if (preflightEstimated) {
87067
+ const preflightEstimatedCostMicros = BigInt(preflightEstimated);
87068
+ const bufferedCostMicros = preflightEstimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100)) / 100n;
87058
87069
  let sufficiency = null;
87059
87070
  let balanceCheckTimer;
87060
87071
  try {
@@ -87084,6 +87095,7 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
87084
87095
  );
87085
87096
  modelId = freeFallback;
87086
87097
  isFreeModel = true;
87098
+ estimatedCostMicros = void 0;
87087
87099
  const parsed = JSON.parse(body.toString());
87088
87100
  parsed.model = toUpstreamModelId(freeFallback);
87089
87101
  body = Buffer.from(JSON.stringify(parsed));
@@ -88196,7 +88208,7 @@ data: [DONE]
88196
88208
  });
88197
88209
  }
88198
88210
  }
88199
- var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, FREE_MODEL, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, VIDEO_PRICING, PHONE_PRICING;
88211
+ var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, FREE_MODEL, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, VIDEO_PRICING, PHONE_PRICING;
88200
88212
  var init_proxy = __esm({
88201
88213
  "src/proxy.ts"() {
88202
88214
  "use strict";
@@ -88288,6 +88300,7 @@ var init_proxy = __esm({
88288
88300
  overloadedModels = /* @__PURE__ */ new Map();
88289
88301
  perProviderErrors = /* @__PURE__ */ new Map();
88290
88302
  BALANCE_CHECK_BUFFER = 1.5;
88303
+ BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP = 4096;
88291
88304
  PROVIDER_ERROR_PATTERNS = [
88292
88305
  /billing/i,
88293
88306
  /insufficient.*balance/i,
package/dist/index.js CHANGED
@@ -84612,6 +84612,13 @@ function estimateAmount(modelId, bodyLength, maxTokens) {
84612
84612
  const amountMicros = Math.max(1e3, Math.ceil(costUsd * 1.2 * 1e6));
84613
84613
  return amountMicros.toString();
84614
84614
  }
84615
+ function estimateBalancePreflightAmount(modelId, bodyLength, maxTokens) {
84616
+ const preflightMaxTokens = Math.min(
84617
+ maxTokens || BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP,
84618
+ BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP
84619
+ );
84620
+ return estimateAmount(modelId, bodyLength, preflightMaxTokens);
84621
+ }
84615
84622
  function estimatePhoneCost(urlPath) {
84616
84623
  const op = urlPath.replace(/^\/v1\//, "").split("?")[0];
84617
84624
  for (const key2 of Object.keys(PHONE_PRICING).sort((a, b) => b.length - a.length)) {
@@ -86872,9 +86879,13 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
86872
86879
  let isFreeModel = FREE_MODELS.has(modelId ?? "");
86873
86880
  if (modelId && !options.skipBalanceCheck && !isFreeModel) {
86874
86881
  const estimated = estimateAmount(modelId, body.length, maxTokens);
86882
+ const preflightEstimated = estimateBalancePreflightAmount(modelId, body.length, maxTokens);
86875
86883
  if (estimated) {
86876
86884
  estimatedCostMicros = BigInt(estimated);
86877
- const bufferedCostMicros = estimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100)) / 100n;
86885
+ }
86886
+ if (preflightEstimated) {
86887
+ const preflightEstimatedCostMicros = BigInt(preflightEstimated);
86888
+ const bufferedCostMicros = preflightEstimatedCostMicros * BigInt(Math.ceil(BALANCE_CHECK_BUFFER * 100)) / 100n;
86878
86889
  let sufficiency = null;
86879
86890
  let balanceCheckTimer;
86880
86891
  try {
@@ -86904,6 +86915,7 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
86904
86915
  );
86905
86916
  modelId = freeFallback;
86906
86917
  isFreeModel = true;
86918
+ estimatedCostMicros = void 0;
86907
86919
  const parsed = JSON.parse(body.toString());
86908
86920
  parsed.model = toUpstreamModelId(freeFallback);
86909
86921
  body = Buffer.from(JSON.stringify(parsed));
@@ -88016,7 +88028,7 @@ data: [DONE]
88016
88028
  });
88017
88029
  }
88018
88030
  }
88019
- var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, FREE_MODEL, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, VIDEO_PRICING, PHONE_PRICING;
88031
+ var paymentStore, BLOCKRUN_API, BLOCKRUN_SOLANA_API, IMAGE_DIR, AUDIO_DIR, VIDEO_DIR, AUTO_MODEL, ROUTING_PROFILES, FREE_MODELS, FREE_MODEL, MAX_MESSAGES, CONTEXT_LIMIT_KB, HEARTBEAT_INTERVAL_MS, BALANCE_CHECK_TIMEOUT_MS, DEFAULT_REQUEST_TIMEOUT_MS, PER_MODEL_TIMEOUT_MS, REASONING_MODEL_TIMEOUT_MS, REASONING_MODEL_IDS, MAX_FALLBACK_ATTEMPTS, HEALTH_CHECK_TIMEOUT_MS, RATE_LIMIT_COOLDOWN_MS, OVERLOAD_COOLDOWN_MS, PORT_RETRY_ATTEMPTS, PORT_RETRY_DELAY_MS, MODEL_BODY_READ_TIMEOUT_MS, ERROR_BODY_READ_TIMEOUT_MS, rateLimitedModels, overloadedModels, perProviderErrors, BALANCE_CHECK_BUFFER, BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP, PROVIDER_ERROR_PATTERNS, DEGRADED_RESPONSE_PATTERNS, DEGRADED_LOOP_PATTERNS, VALID_ROLES, ROLE_MAPPINGS, VALID_TOOL_ID_PATTERN, KIMI_BLOCK_RE, KIMI_TOKEN_RE, THINKING_TAG_RE, THINKING_BLOCK_RE, BLOCKRUN_MODEL_BY_ID, IMAGE_PRICING, VIDEO_PRICING, PHONE_PRICING;
88020
88032
  var init_proxy = __esm({
88021
88033
  "src/proxy.ts"() {
88022
88034
  "use strict";
@@ -88108,6 +88120,7 @@ var init_proxy = __esm({
88108
88120
  overloadedModels = /* @__PURE__ */ new Map();
88109
88121
  perProviderErrors = /* @__PURE__ */ new Map();
88110
88122
  BALANCE_CHECK_BUFFER = 1.5;
88123
+ BALANCE_PREFLIGHT_OUTPUT_TOKEN_CAP = 4096;
88111
88124
  PROVIDER_ERROR_PATTERNS = [
88112
88125
  /billing/i,
88113
88126
  /insufficient.*balance/i,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blockrun/clawrouter",
3
- "version": "0.12.236",
3
+ "version": "0.12.237",
4
4
  "description": "Smart LLM router — save 87% on inference costs. 66 models (8 free), one wallet, x402 micropayments.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",