@usagetap/sdk 1.1.0 → 1.2.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.
Files changed (44) hide show
  1. package/README.md +25 -1
  2. package/dist/adapters/anthropic.cjs +67 -1
  3. package/dist/adapters/anthropic.cjs.map +1 -1
  4. package/dist/adapters/anthropic.d.cts +10 -1
  5. package/dist/adapters/anthropic.d.ts +10 -1
  6. package/dist/adapters/anthropic.mjs +67 -1
  7. package/dist/adapters/anthropic.mjs.map +1 -1
  8. package/dist/adapters/openai.cjs +67 -1
  9. package/dist/adapters/openai.cjs.map +1 -1
  10. package/dist/adapters/openai.d.cts +10 -1
  11. package/dist/adapters/openai.d.ts +10 -1
  12. package/dist/adapters/openai.mjs +67 -1
  13. package/dist/adapters/openai.mjs.map +1 -1
  14. package/dist/adapters/openrouter.cjs.map +1 -1
  15. package/dist/adapters/openrouter.d.cts +1 -1
  16. package/dist/adapters/openrouter.d.ts +1 -1
  17. package/dist/adapters/openrouter.mjs.map +1 -1
  18. package/dist/anthropic/index.cjs +67 -1
  19. package/dist/anthropic/index.cjs.map +1 -1
  20. package/dist/anthropic/index.d.cts +1 -1
  21. package/dist/anthropic/index.d.ts +1 -1
  22. package/dist/anthropic/index.mjs +67 -1
  23. package/dist/anthropic/index.mjs.map +1 -1
  24. package/dist/{client-BA-QlnRq.d.cts → client-EMXt9_fA.d.cts} +77 -8
  25. package/dist/{client-BA-QlnRq.d.ts → client-EMXt9_fA.d.ts} +77 -8
  26. package/dist/express/index.cjs +67 -1
  27. package/dist/express/index.cjs.map +1 -1
  28. package/dist/express/index.d.cts +1 -1
  29. package/dist/express/index.d.ts +1 -1
  30. package/dist/express/index.mjs +67 -1
  31. package/dist/express/index.mjs.map +1 -1
  32. package/dist/index.cjs +217 -22
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.d.cts +2 -2
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.mjs +217 -23
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/openai/index.cjs +67 -1
  39. package/dist/openai/index.cjs.map +1 -1
  40. package/dist/openai/index.d.cts +1 -1
  41. package/dist/openai/index.d.ts +1 -1
  42. package/dist/openai/index.mjs +67 -1
  43. package/dist/openai/index.mjs.map +1 -1
  44. package/package.json +1 -1
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UsageTapClient, B as BeginCallRequest } from './client-BA-QlnRq.cjs';
2
- export { _ as AllowedEntitlements, H as BalanceSummary, k as BeginCallOptions, c as BeginCallResponseBody, v as ChangePlanOptions, w as ChangePlanRequest, x as ChangePlanResponseBody, y as ChangePlanStrategy, s as CheckUsageOptions, t as CheckUsageRequest, u as CheckUsageResponseBody, C as CreateCustomerOptions, q as CreateCustomerRequest, r as CreateCustomerResponseBody, D as CustomMeterSlot, F as EndCallOptions, E as EndCallRequest, G as EndCallResponseBody, L as EntitlementHints, a9 as IdempotencyMetadata, I as IncrementCustomMeterOptions, z as IncrementCustomMeterRequest, A as IncrementCustomMeterResponseBody, a6 as LimitType, O as MeterSnapshot, N as MeterSummary, Q as MeteredUsage, a8 as ModelHints, M as PlanSummary, i as PromptCompressionInput, m as PromptCompressionOptions, P as PromptCompressionProvider, l as PromptCompressionRequest, n as PromptCompressionResponseBody, j as PromptCompressionResult, o as PromptCompressionStandaloneOptions, a as PromptCompressionTelemetry, T as RateLimitsSnapshot, R as RecordPromptCompressionRequest, X as RemainingRatios, Z as RequestedEntitlements, $ as RetryOptions, Y as RollingCallsRateLimitState, S as SpendVelocitySnapshot, J as SpendVelocityWindow, K as SpendVelocityWindowKey, a7 as SubscriptionSnapshot, aa as UsageMetricEvent, a0 as UsageTapClientOptions, a1 as UsageTapErrorResponse, a4 as UsageTapLogEntry, a2 as UsageTapResultEnvelope, a3 as UsageTapResultStatus, b as UsageTapSuccessResponse, V as VendorHints, a5 as WithUsageContext, W as WithUsageOptions, d as compressPrompt, e as compressPromptHeuristic, f as compressPromptToon, g as estimatePromptTokens, p as protect, h as protectPromptText } from './client-BA-QlnRq.cjs';
1
+ import { U as UsageTapClient, B as BeginCallRequest } from './client-EMXt9_fA.cjs';
2
+ export { a4 as AllowedEntitlements, O as BalanceSummary, q as BeginCallOptions, c as BeginCallResponseBody, D as ChangePlanOptions, F as ChangePlanRequest, G as ChangePlanResponseBody, H as ChangePlanStrategy, y as CheckUsageOptions, z as CheckUsageRequest, A as CheckUsageResponseBody, C as CreateCustomerOptions, w as CreateCustomerRequest, x as CreateCustomerResponseBody, L as CustomMeterSlot, M as EndCallOptions, E as EndCallRequest, N as EndCallResponseBody, X as EntitlementHints, af as IdempotencyMetadata, I as IncrementCustomMeterOptions, J as IncrementCustomMeterRequest, K as IncrementCustomMeterResponseBody, ac as LimitType, _ as MeterSnapshot, Z as MeterSummary, $ as MeteredUsage, ae as ModelHints, Y as PlanSummary, j as PromptCompressionInput, m as PromptCompressionMessageRole, k as PromptCompressionMessagesAggressiveness, l as PromptCompressionMessagesInput, t as PromptCompressionMessagesOptions, s as PromptCompressionOptions, P as PromptCompressionProvider, r as PromptCompressionRequest, u as PromptCompressionResponseBody, n as PromptCompressionResult, o as PromptCompressionRoleAggressiveness, v as PromptCompressionStandaloneOptions, a as PromptCompressionTelemetry, a0 as RateLimitsSnapshot, R as RecordPromptCompressionRequest, a1 as RemainingRatios, a3 as RequestedEntitlements, a5 as RetryOptions, a2 as RollingCallsRateLimitState, S as SpendVelocitySnapshot, Q as SpendVelocityWindow, T as SpendVelocityWindowKey, ad as SubscriptionSnapshot, ag as UsageMetricEvent, a6 as UsageTapClientOptions, a7 as UsageTapErrorResponse, aa as UsageTapLogEntry, a8 as UsageTapResultEnvelope, a9 as UsageTapResultStatus, b as UsageTapSuccessResponse, V as VendorHints, ab as WithUsageContext, W as WithUsageOptions, d as compressPrompt, f as compressPromptHeuristic, e as compressPromptMessages, g as compressPromptToon, h as estimatePromptTokens, p as protect, i as protectPromptText } from './client-EMXt9_fA.cjs';
3
3
 
4
4
  type UsageTapErrorCode = "USAGETAP_BROWSER_RUNTIME" | "USAGETAP_AUTH_ERROR" | "USAGETAP_BAD_REQUEST" | "USAGETAP_INVALID_RESPONSE" | "USAGETAP_NETWORK_ERROR" | "USAGETAP_RATE_LIMITED" | "USAGETAP_SERVER_ERROR" | "USAGETAP_RETRY_EXHAUSTED" | "USAGETAP_END_CALL_ERROR";
5
5
  interface UsageTapErrorInit {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UsageTapClient, B as BeginCallRequest } from './client-BA-QlnRq.js';
2
- export { _ as AllowedEntitlements, H as BalanceSummary, k as BeginCallOptions, c as BeginCallResponseBody, v as ChangePlanOptions, w as ChangePlanRequest, x as ChangePlanResponseBody, y as ChangePlanStrategy, s as CheckUsageOptions, t as CheckUsageRequest, u as CheckUsageResponseBody, C as CreateCustomerOptions, q as CreateCustomerRequest, r as CreateCustomerResponseBody, D as CustomMeterSlot, F as EndCallOptions, E as EndCallRequest, G as EndCallResponseBody, L as EntitlementHints, a9 as IdempotencyMetadata, I as IncrementCustomMeterOptions, z as IncrementCustomMeterRequest, A as IncrementCustomMeterResponseBody, a6 as LimitType, O as MeterSnapshot, N as MeterSummary, Q as MeteredUsage, a8 as ModelHints, M as PlanSummary, i as PromptCompressionInput, m as PromptCompressionOptions, P as PromptCompressionProvider, l as PromptCompressionRequest, n as PromptCompressionResponseBody, j as PromptCompressionResult, o as PromptCompressionStandaloneOptions, a as PromptCompressionTelemetry, T as RateLimitsSnapshot, R as RecordPromptCompressionRequest, X as RemainingRatios, Z as RequestedEntitlements, $ as RetryOptions, Y as RollingCallsRateLimitState, S as SpendVelocitySnapshot, J as SpendVelocityWindow, K as SpendVelocityWindowKey, a7 as SubscriptionSnapshot, aa as UsageMetricEvent, a0 as UsageTapClientOptions, a1 as UsageTapErrorResponse, a4 as UsageTapLogEntry, a2 as UsageTapResultEnvelope, a3 as UsageTapResultStatus, b as UsageTapSuccessResponse, V as VendorHints, a5 as WithUsageContext, W as WithUsageOptions, d as compressPrompt, e as compressPromptHeuristic, f as compressPromptToon, g as estimatePromptTokens, p as protect, h as protectPromptText } from './client-BA-QlnRq.js';
1
+ import { U as UsageTapClient, B as BeginCallRequest } from './client-EMXt9_fA.js';
2
+ export { a4 as AllowedEntitlements, O as BalanceSummary, q as BeginCallOptions, c as BeginCallResponseBody, D as ChangePlanOptions, F as ChangePlanRequest, G as ChangePlanResponseBody, H as ChangePlanStrategy, y as CheckUsageOptions, z as CheckUsageRequest, A as CheckUsageResponseBody, C as CreateCustomerOptions, w as CreateCustomerRequest, x as CreateCustomerResponseBody, L as CustomMeterSlot, M as EndCallOptions, E as EndCallRequest, N as EndCallResponseBody, X as EntitlementHints, af as IdempotencyMetadata, I as IncrementCustomMeterOptions, J as IncrementCustomMeterRequest, K as IncrementCustomMeterResponseBody, ac as LimitType, _ as MeterSnapshot, Z as MeterSummary, $ as MeteredUsage, ae as ModelHints, Y as PlanSummary, j as PromptCompressionInput, m as PromptCompressionMessageRole, k as PromptCompressionMessagesAggressiveness, l as PromptCompressionMessagesInput, t as PromptCompressionMessagesOptions, s as PromptCompressionOptions, P as PromptCompressionProvider, r as PromptCompressionRequest, u as PromptCompressionResponseBody, n as PromptCompressionResult, o as PromptCompressionRoleAggressiveness, v as PromptCompressionStandaloneOptions, a as PromptCompressionTelemetry, a0 as RateLimitsSnapshot, R as RecordPromptCompressionRequest, a1 as RemainingRatios, a3 as RequestedEntitlements, a5 as RetryOptions, a2 as RollingCallsRateLimitState, S as SpendVelocitySnapshot, Q as SpendVelocityWindow, T as SpendVelocityWindowKey, ad as SubscriptionSnapshot, ag as UsageMetricEvent, a6 as UsageTapClientOptions, a7 as UsageTapErrorResponse, aa as UsageTapLogEntry, a8 as UsageTapResultEnvelope, a9 as UsageTapResultStatus, b as UsageTapSuccessResponse, V as VendorHints, ab as WithUsageContext, W as WithUsageOptions, d as compressPrompt, f as compressPromptHeuristic, e as compressPromptMessages, g as compressPromptToon, h as estimatePromptTokens, p as protect, i as protectPromptText } from './client-EMXt9_fA.js';
3
3
 
4
4
  type UsageTapErrorCode = "USAGETAP_BROWSER_RUNTIME" | "USAGETAP_AUTH_ERROR" | "USAGETAP_BAD_REQUEST" | "USAGETAP_INVALID_RESPONSE" | "USAGETAP_NETWORK_ERROR" | "USAGETAP_RATE_LIMITED" | "USAGETAP_SERVER_ERROR" | "USAGETAP_RETRY_EXHAUSTED" | "USAGETAP_END_CALL_ERROR";
5
5
  interface UsageTapErrorInit {
package/dist/index.mjs CHANGED
@@ -117,26 +117,32 @@ async function runWithRetry(operation, options, shouldRetry, onSchedule, signal)
117
117
  var DEFAULT_TTC_ENDPOINT = "https://api.thetokencompany.com/v1/compress";
118
118
  var DEFAULT_TTC_MODEL = "bear-2";
119
119
  var DEFAULT_TTC_AGGRESSIVENESS = 0.2;
120
+ var DEFAULT_USAGETAP_COMPRESSION_ENDPOINT = "https://compress.usagetap.com/v1/compress";
121
+ var DEFAULT_USAGETAP_MESSAGES_COMPRESSION_ENDPOINT = "https://compress.usagetap.com/v1/messages/compress";
120
122
  var PROTECTED_TEXT_PATTERN = /<ttc_safe>[\s\S]*?<\/ttc_safe>|<usagetap_safe>[\s\S]*?<\/usagetap_safe>/g;
121
123
  function protectPromptText(text) {
122
124
  return `<ttc_safe>${text}</ttc_safe>`;
123
125
  }
124
126
  var protect = protectPromptText;
125
127
  async function compressPrompt(options) {
128
+ const input = resolvePromptCompressionInput(options);
126
129
  try {
130
+ if (options.provider === "usagetap") {
131
+ return await compressWithUsageTap(options);
132
+ }
127
133
  if (options.provider === "thetokencompany" || options.tokenCompanyApiKey) {
128
134
  return await compressWithTheTokenCompany(options);
129
135
  }
130
136
  if (options.provider === "toon") {
131
- return compressPromptToon(options.input);
137
+ return compressPromptToon(input);
132
138
  }
133
- return compressPromptHeuristic(options.input);
139
+ return compressPromptHeuristic(input);
134
140
  } catch (error) {
135
141
  if (options.failOpen === false) {
136
142
  throw error;
137
143
  }
138
144
  return createPromptCompressionFallback(
139
- options.input,
145
+ input,
140
146
  options.provider ?? (options.tokenCompanyApiKey ? "thetokencompany" : "heuristic"),
141
147
  error
142
148
  );
@@ -170,6 +176,20 @@ function compressPromptToon(input) {
170
176
  "json-minify"
171
177
  ]);
172
178
  }
179
+ async function compressPromptMessages(options) {
180
+ try {
181
+ return await compressMessagesWithUsageTap(options);
182
+ } catch (error) {
183
+ if (options.failOpen === false) {
184
+ throw error;
185
+ }
186
+ return createPromptCompressionFallback(
187
+ options.input,
188
+ options.provider ?? "usagetap",
189
+ error
190
+ );
191
+ }
192
+ }
173
193
  async function compressWithTheTokenCompany(options) {
174
194
  if (!options.tokenCompanyApiKey) {
175
195
  throw new Error(
@@ -182,41 +202,131 @@ async function compressWithTheTokenCompany(options) {
182
202
  "A fetch implementation is required for The Token Company compression"
183
203
  );
184
204
  }
205
+ return compressWithCompatibleRemoteProvider({
206
+ options,
207
+ provider: "thetokencompany",
208
+ endpoint: options.tokenCompanyEndpoint ?? DEFAULT_TTC_ENDPOINT,
209
+ model: options.model ?? options.tokenCompanyModel ?? DEFAULT_TTC_MODEL,
210
+ aggressiveness: options.aggressiveness ?? options.tokenCompanyAggressiveness ?? DEFAULT_TTC_AGGRESSIVENESS,
211
+ apiKey: options.tokenCompanyApiKey,
212
+ appId: options.tokenCompanyAppId,
213
+ providerLabel: "The Token Company"
214
+ });
215
+ }
216
+ async function compressWithUsageTap(options) {
217
+ const fetchCandidate = options.fetchImpl ?? globalThis.fetch;
218
+ if (typeof fetchCandidate !== "function") {
219
+ throw new Error(
220
+ "A fetch implementation is required for UsageTap prompt compression"
221
+ );
222
+ }
223
+ return compressWithCompatibleRemoteProvider({
224
+ options,
225
+ provider: "usagetap",
226
+ endpoint: options.usageTapCompressionEndpoint ?? DEFAULT_USAGETAP_COMPRESSION_ENDPOINT,
227
+ model: options.model ?? options.usageTapCompressionModel ?? options.tokenCompanyModel ?? DEFAULT_TTC_MODEL,
228
+ aggressiveness: options.aggressiveness ?? options.usageTapCompressionAggressiveness ?? options.tokenCompanyAggressiveness ?? DEFAULT_TTC_AGGRESSIVENESS,
229
+ apiKey: options.usageTapCompressionApiKey,
230
+ appId: options.tokenCompanyAppId,
231
+ providerLabel: "UsageTap prompt compression"
232
+ });
233
+ }
234
+ async function compressMessagesWithUsageTap(options) {
235
+ const fetchCandidate = options.fetchImpl ?? globalThis.fetch;
236
+ if (typeof fetchCandidate !== "function") {
237
+ throw new Error(
238
+ "A fetch implementation is required for UsageTap prompt message compression"
239
+ );
240
+ }
241
+ const aggressiveness = options.aggressiveness ?? options.usageTapCompressionAggressiveness ?? DEFAULT_TTC_AGGRESSIVENESS;
242
+ validateAggressiveness(
243
+ aggressiveness,
244
+ "UsageTap prompt message compression"
245
+ );
185
246
  const original = stableStringifyInput(options.input);
186
- const heuristic = compressPromptHeuristic(options.input);
247
+ const headers = {
248
+ "content-type": "application/json"
249
+ };
250
+ if (options.usageTapCompressionApiKey) {
251
+ headers.authorization = `Bearer ${options.usageTapCompressionApiKey}`;
252
+ }
253
+ const response = await fetchCandidate(
254
+ options.usageTapCompressionMessagesEndpoint ?? DEFAULT_USAGETAP_MESSAGES_COMPRESSION_ENDPOINT,
255
+ {
256
+ method: "POST",
257
+ headers,
258
+ body: JSON.stringify({
259
+ ...cloneInputRecord(options.input),
260
+ compression_settings: { aggressiveness }
261
+ }),
262
+ signal: options.signal
263
+ }
264
+ );
265
+ if (!response.ok) {
266
+ throw new Error(
267
+ `UsageTap prompt message compression failed with HTTP ${response.status}`
268
+ );
269
+ }
270
+ const payload = await response.json();
271
+ const compressedInput = payload.compressed_request ?? payload.compressedInput ?? payload.compressed ?? (payload.messages !== void 0 ? { ...cloneInputRecord(options.input), messages: payload.messages } : void 0);
272
+ if (compressedInput === void 0) {
273
+ throw new Error(
274
+ "UsageTap prompt message compression response did not include compressed content"
275
+ );
276
+ }
277
+ const compressed = stableStringifyInput(compressedInput);
278
+ const tokenCounts = normalizeCompatibleTokenCounts(payload);
279
+ return buildResult(
280
+ options.input,
281
+ compressedInput,
282
+ "usagetap",
283
+ original,
284
+ compressed,
285
+ ["usagetap", "messages-endpoint"],
286
+ tokenCounts
287
+ );
288
+ }
289
+ async function compressWithCompatibleRemoteProvider(args) {
290
+ const { options, provider, endpoint, model, aggressiveness, apiKey, appId, providerLabel } = args;
291
+ const fetchCandidate = options.fetchImpl ?? globalThis.fetch;
292
+ const sourceInput = resolvePromptCompressionInput(options);
293
+ const original = stableStringifyInput(sourceInput);
294
+ const heuristic = compressPromptHeuristic(sourceInput);
187
295
  const input = typeof heuristic.compressedInput === "string" ? heuristic.compressedInput : stableStringifyInput(heuristic.compressedInput);
188
- const model = options.tokenCompanyModel ?? DEFAULT_TTC_MODEL;
189
- const aggressiveness = options.tokenCompanyAggressiveness ?? DEFAULT_TTC_AGGRESSIVENESS;
190
- if (typeof aggressiveness !== "number" || !Number.isFinite(aggressiveness) || aggressiveness < 0 || aggressiveness > 1) {
191
- throw new Error("tokenCompanyAggressiveness must be between 0.0 and 1.0");
296
+ if (!isValidAggressiveness(aggressiveness)) {
297
+ throw new Error(`${providerLabel} aggressiveness must be between 0.0 and 1.0`);
298
+ }
299
+ const headers = {
300
+ "content-type": "application/json"
301
+ };
302
+ if (apiKey) {
303
+ headers.authorization = `Bearer ${apiKey}`;
192
304
  }
193
305
  const response = await fetchCandidate(
194
- options.tokenCompanyEndpoint ?? DEFAULT_TTC_ENDPOINT,
306
+ endpoint,
195
307
  {
196
308
  method: "POST",
197
- headers: {
198
- authorization: `Bearer ${options.tokenCompanyApiKey}`,
199
- "content-type": "application/json"
200
- },
309
+ headers,
201
310
  body: JSON.stringify({
202
311
  model,
203
312
  input,
313
+ ...provider === "usagetap" ? { text: input } : {},
204
314
  compression_settings: { aggressiveness },
205
- ...options.tokenCompanyAppId ? { app_id: options.tokenCompanyAppId } : {}
315
+ ...appId ? { app_id: appId } : {}
206
316
  }),
207
317
  signal: options.signal
208
318
  }
209
319
  );
210
320
  if (!response.ok) {
211
321
  throw new Error(
212
- `The Token Company compression failed with HTTP ${response.status}`
322
+ `${providerLabel} failed with HTTP ${response.status}`
213
323
  );
214
324
  }
215
325
  const payload = await response.json();
216
326
  const tokenCompanyResult = normalizeTheTokenCompanyCompressResponse(payload);
217
327
  const compressedInput = payload.compressedInput ?? payload.compressed ?? tokenCompanyResult?.output ?? payload.output ?? payload.text;
218
328
  if (compressedInput === void 0) {
219
- throw new Error("The Token Company response did not include compressed content");
329
+ throw new Error(`${providerLabel} response did not include compressed content`);
220
330
  }
221
331
  const compressed = stableStringifyInput(compressedInput);
222
332
  const tokenCounts = tokenCompanyResult ? {
@@ -225,15 +335,55 @@ async function compressWithTheTokenCompany(options) {
225
335
  savedTokens: tokenCompanyResult.tokens_saved
226
336
  } : void 0;
227
337
  return buildResult(
228
- options.input,
338
+ sourceInput,
229
339
  compressedInput,
230
- "thetokencompany",
340
+ provider,
231
341
  original,
232
342
  compressed,
233
- [...heuristic.techniques, "thetokencompany"],
343
+ [...heuristic.techniques, provider],
234
344
  tokenCounts
235
345
  );
236
346
  }
347
+ function resolvePromptCompressionInput(options) {
348
+ if (options.input !== void 0) {
349
+ return options.input;
350
+ }
351
+ if (options.text !== void 0) {
352
+ return options.text;
353
+ }
354
+ throw new Error("Prompt compression requires input or text");
355
+ }
356
+ function validateAggressiveness(value, label) {
357
+ if (typeof value === "number") {
358
+ if (!isValidAggressiveness(value)) {
359
+ throw new Error(`${label} aggressiveness must be between 0.0 and 1.0`);
360
+ }
361
+ return;
362
+ }
363
+ for (const aggressiveness of Object.values(value)) {
364
+ if (aggressiveness !== void 0 && !isValidAggressiveness(aggressiveness)) {
365
+ throw new Error(`${label} aggressiveness must be between 0.0 and 1.0`);
366
+ }
367
+ }
368
+ }
369
+ function isValidAggressiveness(value) {
370
+ return typeof value === "number" && Number.isFinite(value) && value >= 0 && value <= 1;
371
+ }
372
+ function cloneInputRecord(input) {
373
+ return input && typeof input === "object" && !Array.isArray(input) ? { ...input } : { input };
374
+ }
375
+ function normalizeCompatibleTokenCounts(data) {
376
+ const inputTokens = typeof data.input_tokens === "number" ? data.input_tokens : data.original_input_tokens;
377
+ const outputTokens = data.output_tokens;
378
+ if (typeof inputTokens !== "number" || typeof outputTokens !== "number") {
379
+ return void 0;
380
+ }
381
+ return {
382
+ originalTokens: inputTokens,
383
+ compressedTokens: outputTokens,
384
+ savedTokens: typeof data.tokens_saved === "number" ? data.tokens_saved : inputTokens - outputTokens
385
+ };
386
+ }
237
387
  function normalizeTheTokenCompanyCompressResponse(data) {
238
388
  if (typeof data.output !== "string" || typeof data.output_tokens !== "number") {
239
389
  return void 0;
@@ -618,7 +768,7 @@ var IDEMPOTENCY_HEADER = "idempotency-key";
618
768
  var SDK_HEADER = "x-usage-sdk";
619
769
  var USER_AGENT = "UsageTapClient";
620
770
  var CANONICAL_MEDIA_TYPE = "application/vnd.usagetap.v1+json";
621
- var SDK_VERSION = "1.1.0" ;
771
+ var SDK_VERSION = "1.2.0" ;
622
772
  var HAS_WINDOW = typeof globalThis !== "undefined" && typeof globalThis.window !== "undefined";
623
773
  var UsageTapClient = class {
624
774
  apiKey;
@@ -635,9 +785,16 @@ var UsageTapClient = class {
635
785
  autoIdempotency;
636
786
  tokenCompanyApiKey;
637
787
  tokenCompanyEndpoint;
788
+ model;
638
789
  tokenCompanyModel;
790
+ aggressiveness;
639
791
  tokenCompanyAggressiveness;
640
792
  tokenCompanyAppId;
793
+ usageTapCompressionApiKey;
794
+ usageTapCompressionEndpoint;
795
+ usageTapCompressionMessagesEndpoint;
796
+ usageTapCompressionModel;
797
+ usageTapCompressionAggressiveness;
641
798
  constructor(options) {
642
799
  if (!options) {
643
800
  throw new UsageTapError(
@@ -685,9 +842,16 @@ var UsageTapClient = class {
685
842
  this.autoIdempotency = options.autoIdempotency ?? true;
686
843
  this.tokenCompanyApiKey = options.tokenCompanyApiKey;
687
844
  this.tokenCompanyEndpoint = options.tokenCompanyEndpoint;
845
+ this.model = options.model;
688
846
  this.tokenCompanyModel = options.tokenCompanyModel;
847
+ this.aggressiveness = options.aggressiveness;
689
848
  this.tokenCompanyAggressiveness = options.tokenCompanyAggressiveness;
690
849
  this.tokenCompanyAppId = options.tokenCompanyAppId;
850
+ this.usageTapCompressionApiKey = options.usageTapCompressionApiKey ?? options.apiKey;
851
+ this.usageTapCompressionEndpoint = options.usageTapCompressionEndpoint;
852
+ this.usageTapCompressionMessagesEndpoint = options.usageTapCompressionMessagesEndpoint;
853
+ this.usageTapCompressionModel = options.usageTapCompressionModel;
854
+ this.usageTapCompressionAggressiveness = options.usageTapCompressionAggressiveness;
691
855
  }
692
856
  async beginCall(request, options = {}) {
693
857
  const idempotencyKey = request.idempotencyKey ?? request.idempotency ?? (this.autoIdempotency ? this.idempotencyGenerator() : void 0);
@@ -717,11 +881,22 @@ var UsageTapClient = class {
717
881
  "promptCompress requires callId"
718
882
  );
719
883
  }
720
- const result = await this.compressPromptInput(request.input, {
884
+ const requestInput = request.input ?? request.text;
885
+ if (requestInput === void 0) {
886
+ throw new UsageTapError(
887
+ "USAGETAP_BAD_REQUEST",
888
+ "promptCompress requires input or text"
889
+ );
890
+ }
891
+ const result = await this.compressPromptInput(requestInput, {
721
892
  provider: request.provider,
893
+ model: request.model,
722
894
  tokenCompanyModel: request.tokenCompanyModel,
895
+ aggressiveness: request.aggressiveness,
723
896
  tokenCompanyAggressiveness: request.tokenCompanyAggressiveness,
724
897
  tokenCompanyAppId: request.tokenCompanyAppId,
898
+ usageTapCompressionModel: request.usageTapCompressionModel,
899
+ usageTapCompressionAggressiveness: request.usageTapCompressionAggressiveness,
725
900
  signal: options.signal
726
901
  });
727
902
  try {
@@ -736,7 +911,7 @@ var UsageTapClient = class {
736
911
  } catch (error) {
737
912
  return {
738
913
  ...createPromptCompressionFallback(
739
- request.input,
914
+ requestInput,
740
915
  request.provider ?? result.provider,
741
916
  error
742
917
  ),
@@ -750,9 +925,28 @@ var UsageTapClient = class {
750
925
  provider: options.provider,
751
926
  tokenCompanyApiKey: this.tokenCompanyApiKey,
752
927
  tokenCompanyEndpoint: this.tokenCompanyEndpoint,
928
+ model: options.model ?? this.model,
753
929
  tokenCompanyModel: options.tokenCompanyModel ?? this.tokenCompanyModel,
930
+ aggressiveness: options.aggressiveness ?? this.aggressiveness,
754
931
  tokenCompanyAggressiveness: options.tokenCompanyAggressiveness ?? this.tokenCompanyAggressiveness,
755
932
  tokenCompanyAppId: options.tokenCompanyAppId ?? this.tokenCompanyAppId,
933
+ usageTapCompressionApiKey: this.usageTapCompressionApiKey,
934
+ usageTapCompressionEndpoint: this.usageTapCompressionEndpoint,
935
+ usageTapCompressionModel: options.usageTapCompressionModel ?? this.usageTapCompressionModel,
936
+ usageTapCompressionAggressiveness: options.usageTapCompressionAggressiveness ?? this.usageTapCompressionAggressiveness,
937
+ fetchImpl: this.fetchImpl,
938
+ signal: options.signal,
939
+ failOpen: options.failOpen
940
+ });
941
+ }
942
+ async compressPromptMessages(input, options = {}) {
943
+ return compressPromptMessages({
944
+ input,
945
+ provider: options.provider ?? "usagetap",
946
+ usageTapCompressionApiKey: this.usageTapCompressionApiKey,
947
+ usageTapCompressionMessagesEndpoint: this.usageTapCompressionMessagesEndpoint,
948
+ aggressiveness: options.aggressiveness ?? this.aggressiveness,
949
+ usageTapCompressionAggressiveness: options.usageTapCompressionAggressiveness ?? this.usageTapCompressionAggressiveness,
756
950
  fetchImpl: this.fetchImpl,
757
951
  signal: options.signal,
758
952
  failOpen: options.failOpen
@@ -1599,6 +1793,6 @@ async function finalizeCall(callState, usageTap, error, usage) {
1599
1793
  }
1600
1794
  }
1601
1795
 
1602
- export { UsageTapClient, UsageTapError, compressPrompt, compressPromptHeuristic, compressPromptToon, createIdempotencyKey, estimatePromptTokens, isUsageTapError, protect, protectPromptText, wrapFetch };
1796
+ export { UsageTapClient, UsageTapError, compressPrompt, compressPromptHeuristic, compressPromptMessages, compressPromptToon, createIdempotencyKey, estimatePromptTokens, isUsageTapError, protect, protectPromptText, wrapFetch };
1603
1797
  //# sourceMappingURL=index.mjs.map
1604
1798
  //# sourceMappingURL=index.mjs.map