@blockrun/clawrouter 0.11.10 → 0.11.12

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/README.md CHANGED
@@ -139,7 +139,7 @@ Request → Weighted Scorer (15 dimensions) → Tier → Cheapest Model → Resp
139
139
  | o3 | $2.00 | $8.00 | 200K | \* |
140
140
  | o4-mini | $1.10 | $4.40 | 128K | \* |
141
141
  | **Anthropic** | | | | |
142
- | claude-opus-4.5 | $5.00 | $25.00 | 200K | \* |
142
+ | claude-opus-4.6 | $5.00 | $25.00 | 200K | \* |
143
143
  | claude-sonnet-4.6 | $3.00 | $15.00 | 200K | \* |
144
144
  | claude-haiku-4.5 | $1.00 | $5.00 | 200K | |
145
145
  | **Google** | | | | |
package/dist/cli.js CHANGED
@@ -5185,6 +5185,7 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
5185
5185
  let maxTokens = 4096;
5186
5186
  let routingProfile = null;
5187
5187
  let accumulatedContent = "";
5188
+ let responseInputTokens;
5188
5189
  const isChatCompletion = req.url?.includes("/chat/completions");
5189
5190
  const sessionId = getSessionId(req.headers);
5190
5191
  let effectiveSessionId = sessionId;
@@ -5620,7 +5621,8 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
5620
5621
  };
5621
5622
  }
5622
5623
  const lastAssistantMsg = [...parsedMessages].reverse().find((m) => m.role === "assistant");
5623
- const toolCallNames = Array.isArray(lastAssistantMsg?.tool_calls) ? lastAssistantMsg.tool_calls.map((tc) => tc.function?.name).filter(Boolean) : void 0;
5624
+ const assistantToolCalls = lastAssistantMsg?.tool_calls;
5625
+ const toolCallNames = Array.isArray(assistantToolCalls) ? assistantToolCalls.map((tc) => tc.function?.name).filter((n) => Boolean(n)) : void 0;
5624
5626
  const contentHash = hashRequestContent(prompt, toolCallNames);
5625
5627
  const shouldEscalate = sessionStore.recordRequestHash(effectiveSessionId, contentHash);
5626
5628
  if (shouldEscalate) {
@@ -6039,6 +6041,10 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
6039
6041
  const jsonStr = jsonBody.toString();
6040
6042
  try {
6041
6043
  const rsp = JSON.parse(jsonStr);
6044
+ if (rsp.usage && typeof rsp.usage === "object") {
6045
+ const u = rsp.usage;
6046
+ if (typeof u.prompt_tokens === "number") responseInputTokens = u.prompt_tokens;
6047
+ }
6042
6048
  const baseChunk = {
6043
6049
  id: rsp.id ?? `chatcmpl-${Date.now()}`,
6044
6050
  object: "chat.completion.chunk",
@@ -6187,6 +6193,10 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
6187
6193
  if (rspJson.choices?.[0]?.message?.content) {
6188
6194
  accumulatedContent = rspJson.choices[0].message.content;
6189
6195
  }
6196
+ if (rspJson.usage && typeof rspJson.usage === "object") {
6197
+ if (typeof rspJson.usage.prompt_tokens === "number")
6198
+ responseInputTokens = rspJson.usage.prompt_tokens;
6199
+ }
6190
6200
  } catch {
6191
6201
  }
6192
6202
  }
@@ -6235,7 +6245,8 @@ async function proxyRequest(req, res, apiBase, payFetch, options, routerOpts, de
6235
6245
  cost: costWithBuffer,
6236
6246
  baselineCost: baselineWithBuffer,
6237
6247
  savings: accurateCosts.savings,
6238
- latencyMs: Date.now() - startTime
6248
+ latencyMs: Date.now() - startTime,
6249
+ ...responseInputTokens !== void 0 && { inputTokens: responseInputTokens }
6239
6250
  };
6240
6251
  logUsage(entry).catch(() => {
6241
6252
  });