@usagetap/sdk 1.0.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 +77 -16
  2. package/dist/adapters/anthropic.cjs +1009 -0
  3. package/dist/adapters/anthropic.cjs.map +1 -0
  4. package/dist/adapters/anthropic.d.cts +90 -0
  5. package/dist/adapters/anthropic.d.ts +90 -0
  6. package/dist/adapters/anthropic.mjs +1006 -0
  7. package/dist/adapters/anthropic.mjs.map +1 -0
  8. package/dist/adapters/openai.cjs +667 -17
  9. package/dist/adapters/openai.cjs.map +1 -1
  10. package/dist/adapters/openai.d.cts +66 -2
  11. package/dist/adapters/openai.d.ts +66 -2
  12. package/dist/adapters/openai.mjs +667 -18
  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 +1009 -0
  19. package/dist/anthropic/index.cjs.map +1 -0
  20. package/dist/anthropic/index.d.cts +2 -0
  21. package/dist/anthropic/index.d.ts +2 -0
  22. package/dist/anthropic/index.mjs +1006 -0
  23. package/dist/anthropic/index.mjs.map +1 -0
  24. package/dist/{client-BHNMYvlO.d.cts → client-EMXt9_fA.d.cts} +106 -6
  25. package/dist/{client-BHNMYvlO.d.ts → client-EMXt9_fA.d.ts} +106 -6
  26. package/dist/express/index.cjs +663 -17
  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 +663 -17
  31. package/dist/express/index.mjs.map +1 -1
  32. package/dist/index.cjs +287 -24
  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 +285 -25
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/openai/index.cjs +667 -17
  39. package/dist/openai/index.cjs.map +1 -1
  40. package/dist/openai/index.d.cts +2 -2
  41. package/dist/openai/index.d.ts +2 -2
  42. package/dist/openai/index.mjs +667 -18
  43. package/dist/openai/index.mjs.map +1 -1
  44. package/package.json +21 -1
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { U as UsageTapClient, B as BeginCallRequest } from './client-BHNMYvlO.cjs';
2
- export { T as AllowedEntitlements, D as BalanceSummary, i as BeginCallOptions, b as BeginCallResponseBody, s as ChangePlanOptions, t as ChangePlanRequest, u as ChangePlanResponseBody, v as ChangePlanStrategy, p as CheckUsageOptions, q as CheckUsageRequest, r as CheckUsageResponseBody, C as CreateCustomerOptions, n as CreateCustomerRequest, o as CreateCustomerResponseBody, y as CustomMeterSlot, z as EndCallOptions, E as EndCallRequest, A as EndCallResponseBody, H as EntitlementHints, a5 as IdempotencyMetadata, I as IncrementCustomMeterOptions, w as IncrementCustomMeterRequest, x as IncrementCustomMeterResponseBody, a2 as LimitType, K as MeterSnapshot, M as MeterSummary, L as MeteredUsage, a4 as ModelHints, J as PlanSummary, P as PromptCompressionInput, k as PromptCompressionOptions, g as PromptCompressionProvider, j as PromptCompressionRequest, l as PromptCompressionResponseBody, h as PromptCompressionResult, m as PromptCompressionTelemetry, R as RateLimitsSnapshot, N as RemainingRatios, Q as RequestedEntitlements, X as RetryOptions, O as RollingCallsRateLimitState, S as SpendVelocitySnapshot, F as SpendVelocityWindow, G as SpendVelocityWindowKey, a3 as SubscriptionSnapshot, a6 as UsageMetricEvent, Y as UsageTapClientOptions, Z as UsageTapErrorResponse, a0 as UsageTapLogEntry, _ as UsageTapResultEnvelope, $ as UsageTapResultStatus, a as UsageTapSuccessResponse, V as VendorHints, a1 as WithUsageContext, W as WithUsageOptions, c as compressPrompt, d as compressPromptHeuristic, e as compressPromptToon, f as estimatePromptTokens } from './client-BHNMYvlO.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-BHNMYvlO.js';
2
- export { T as AllowedEntitlements, D as BalanceSummary, i as BeginCallOptions, b as BeginCallResponseBody, s as ChangePlanOptions, t as ChangePlanRequest, u as ChangePlanResponseBody, v as ChangePlanStrategy, p as CheckUsageOptions, q as CheckUsageRequest, r as CheckUsageResponseBody, C as CreateCustomerOptions, n as CreateCustomerRequest, o as CreateCustomerResponseBody, y as CustomMeterSlot, z as EndCallOptions, E as EndCallRequest, A as EndCallResponseBody, H as EntitlementHints, a5 as IdempotencyMetadata, I as IncrementCustomMeterOptions, w as IncrementCustomMeterRequest, x as IncrementCustomMeterResponseBody, a2 as LimitType, K as MeterSnapshot, M as MeterSummary, L as MeteredUsage, a4 as ModelHints, J as PlanSummary, P as PromptCompressionInput, k as PromptCompressionOptions, g as PromptCompressionProvider, j as PromptCompressionRequest, l as PromptCompressionResponseBody, h as PromptCompressionResult, m as PromptCompressionTelemetry, R as RateLimitsSnapshot, N as RemainingRatios, Q as RequestedEntitlements, X as RetryOptions, O as RollingCallsRateLimitState, S as SpendVelocitySnapshot, F as SpendVelocityWindow, G as SpendVelocityWindowKey, a3 as SubscriptionSnapshot, a6 as UsageMetricEvent, Y as UsageTapClientOptions, Z as UsageTapErrorResponse, a0 as UsageTapLogEntry, _ as UsageTapResultEnvelope, $ as UsageTapResultStatus, a as UsageTapSuccessResponse, V as VendorHints, a1 as WithUsageContext, W as WithUsageOptions, c as compressPrompt, d as compressPromptHeuristic, e as compressPromptToon, f as estimatePromptTokens } from './client-BHNMYvlO.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
@@ -115,21 +115,34 @@ async function runWithRetry(operation, options, shouldRetry, onSchedule, signal)
115
115
 
116
116
  // src/prompt-compression.ts
117
117
  var DEFAULT_TTC_ENDPOINT = "https://api.thetokencompany.com/v1/compress";
118
+ var DEFAULT_TTC_MODEL = "bear-2";
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";
122
+ var PROTECTED_TEXT_PATTERN = /<ttc_safe>[\s\S]*?<\/ttc_safe>|<usagetap_safe>[\s\S]*?<\/usagetap_safe>/g;
123
+ function protectPromptText(text) {
124
+ return `<ttc_safe>${text}</ttc_safe>`;
125
+ }
126
+ var protect = protectPromptText;
118
127
  async function compressPrompt(options) {
128
+ const input = resolvePromptCompressionInput(options);
119
129
  try {
130
+ if (options.provider === "usagetap") {
131
+ return await compressWithUsageTap(options);
132
+ }
120
133
  if (options.provider === "thetokencompany" || options.tokenCompanyApiKey) {
121
134
  return await compressWithTheTokenCompany(options);
122
135
  }
123
136
  if (options.provider === "toon") {
124
- return compressPromptToon(options.input);
137
+ return compressPromptToon(input);
125
138
  }
126
- return compressPromptHeuristic(options.input);
139
+ return compressPromptHeuristic(input);
127
140
  } catch (error) {
128
141
  if (options.failOpen === false) {
129
142
  throw error;
130
143
  }
131
144
  return createPromptCompressionFallback(
132
- options.input,
145
+ input,
133
146
  options.provider ?? (options.tokenCompanyApiKey ? "thetokencompany" : "heuristic"),
134
147
  error
135
148
  );
@@ -163,6 +176,20 @@ function compressPromptToon(input) {
163
176
  "json-minify"
164
177
  ]);
165
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
+ }
166
193
  async function compressWithTheTokenCompany(options) {
167
194
  if (!options.tokenCompanyApiKey) {
168
195
  throw new Error(
@@ -175,30 +202,131 @@ async function compressWithTheTokenCompany(options) {
175
202
  "A fetch implementation is required for The Token Company compression"
176
203
  );
177
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
+ );
178
246
  const original = stableStringifyInput(options.input);
179
- 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
+ }
180
253
  const response = await fetchCandidate(
181
- options.tokenCompanyEndpoint ?? DEFAULT_TTC_ENDPOINT,
254
+ options.usageTapCompressionMessagesEndpoint ?? DEFAULT_USAGETAP_MESSAGES_COMPRESSION_ENDPOINT,
182
255
  {
183
256
  method: "POST",
184
- headers: {
185
- authorization: `Bearer ${options.tokenCompanyApiKey}`,
186
- "content-type": "application/json"
187
- },
188
- body: JSON.stringify({ input: heuristic.compressedInput }),
257
+ headers,
258
+ body: JSON.stringify({
259
+ ...cloneInputRecord(options.input),
260
+ compression_settings: { aggressiveness }
261
+ }),
189
262
  signal: options.signal
190
263
  }
191
264
  );
192
265
  if (!response.ok) {
193
266
  throw new Error(
194
- `The Token Company compression failed with HTTP ${response.status}`
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);
295
+ const input = typeof heuristic.compressedInput === "string" ? heuristic.compressedInput : stableStringifyInput(heuristic.compressedInput);
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}`;
304
+ }
305
+ const response = await fetchCandidate(
306
+ endpoint,
307
+ {
308
+ method: "POST",
309
+ headers,
310
+ body: JSON.stringify({
311
+ model,
312
+ input,
313
+ ...provider === "usagetap" ? { text: input } : {},
314
+ compression_settings: { aggressiveness },
315
+ ...appId ? { app_id: appId } : {}
316
+ }),
317
+ signal: options.signal
318
+ }
319
+ );
320
+ if (!response.ok) {
321
+ throw new Error(
322
+ `${providerLabel} failed with HTTP ${response.status}`
195
323
  );
196
324
  }
197
325
  const payload = await response.json();
198
326
  const tokenCompanyResult = normalizeTheTokenCompanyCompressResponse(payload);
199
327
  const compressedInput = payload.compressedInput ?? payload.compressed ?? tokenCompanyResult?.output ?? payload.output ?? payload.text;
200
328
  if (compressedInput === void 0) {
201
- throw new Error("The Token Company response did not include compressed content");
329
+ throw new Error(`${providerLabel} response did not include compressed content`);
202
330
  }
203
331
  const compressed = stableStringifyInput(compressedInput);
204
332
  const tokenCounts = tokenCompanyResult ? {
@@ -207,15 +335,55 @@ async function compressWithTheTokenCompany(options) {
207
335
  savedTokens: tokenCompanyResult.tokens_saved
208
336
  } : void 0;
209
337
  return buildResult(
210
- options.input,
338
+ sourceInput,
211
339
  compressedInput,
212
- "thetokencompany",
340
+ provider,
213
341
  original,
214
342
  compressed,
215
- [...heuristic.techniques, "thetokencompany"],
343
+ [...heuristic.techniques, provider],
216
344
  tokenCounts
217
345
  );
218
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
+ }
219
387
  function normalizeTheTokenCompanyCompressResponse(data) {
220
388
  if (typeof data.output !== "string" || typeof data.output_tokens !== "number") {
221
389
  return void 0;
@@ -293,6 +461,20 @@ function compressValue(value, techniques, options) {
293
461
  return value;
294
462
  }
295
463
  function compressText(value, techniques, options) {
464
+ const protectedSpans = [];
465
+ const text = value.replace(PROTECTED_TEXT_PATTERN, (match) => {
466
+ const placeholder = `__USAGETAP_PROTECTED_${protectedSpans.length}__`;
467
+ protectedSpans.push(match);
468
+ techniques.add("protected-text");
469
+ return placeholder;
470
+ });
471
+ const compressed = compressTextWithoutProtection(text, techniques, options);
472
+ return protectedSpans.reduce(
473
+ (output, span, index) => output.replace(`__USAGETAP_PROTECTED_${index}__`, span),
474
+ compressed
475
+ );
476
+ }
477
+ function compressTextWithoutProtection(value, techniques, options) {
296
478
  const fencePattern = /```([\w-]+)?\n([\s\S]*?)```/g;
297
479
  const parts = [];
298
480
  let cursor = 0;
@@ -586,7 +768,7 @@ var IDEMPOTENCY_HEADER = "idempotency-key";
586
768
  var SDK_HEADER = "x-usage-sdk";
587
769
  var USER_AGENT = "UsageTapClient";
588
770
  var CANONICAL_MEDIA_TYPE = "application/vnd.usagetap.v1+json";
589
- var SDK_VERSION = "1.0.0" ;
771
+ var SDK_VERSION = "1.2.0" ;
590
772
  var HAS_WINDOW = typeof globalThis !== "undefined" && typeof globalThis.window !== "undefined";
591
773
  var UsageTapClient = class {
592
774
  apiKey;
@@ -603,6 +785,16 @@ var UsageTapClient = class {
603
785
  autoIdempotency;
604
786
  tokenCompanyApiKey;
605
787
  tokenCompanyEndpoint;
788
+ model;
789
+ tokenCompanyModel;
790
+ aggressiveness;
791
+ tokenCompanyAggressiveness;
792
+ tokenCompanyAppId;
793
+ usageTapCompressionApiKey;
794
+ usageTapCompressionEndpoint;
795
+ usageTapCompressionMessagesEndpoint;
796
+ usageTapCompressionModel;
797
+ usageTapCompressionAggressiveness;
606
798
  constructor(options) {
607
799
  if (!options) {
608
800
  throw new UsageTapError(
@@ -650,6 +842,16 @@ var UsageTapClient = class {
650
842
  this.autoIdempotency = options.autoIdempotency ?? true;
651
843
  this.tokenCompanyApiKey = options.tokenCompanyApiKey;
652
844
  this.tokenCompanyEndpoint = options.tokenCompanyEndpoint;
845
+ this.model = options.model;
846
+ this.tokenCompanyModel = options.tokenCompanyModel;
847
+ this.aggressiveness = options.aggressiveness;
848
+ this.tokenCompanyAggressiveness = options.tokenCompanyAggressiveness;
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;
653
855
  }
654
856
  async beginCall(request, options = {}) {
655
857
  const idempotencyKey = request.idempotencyKey ?? request.idempotency ?? (this.autoIdempotency ? this.idempotencyGenerator() : void 0);
@@ -679,17 +881,26 @@ var UsageTapClient = class {
679
881
  "promptCompress requires callId"
680
882
  );
681
883
  }
682
- const result = await compressPrompt({
683
- input: 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, {
684
892
  provider: request.provider,
685
- tokenCompanyApiKey: this.tokenCompanyApiKey,
686
- tokenCompanyEndpoint: this.tokenCompanyEndpoint,
687
- fetchImpl: this.fetchImpl,
893
+ model: request.model,
894
+ tokenCompanyModel: request.tokenCompanyModel,
895
+ aggressiveness: request.aggressiveness,
896
+ tokenCompanyAggressiveness: request.tokenCompanyAggressiveness,
897
+ tokenCompanyAppId: request.tokenCompanyAppId,
898
+ usageTapCompressionModel: request.usageTapCompressionModel,
899
+ usageTapCompressionAggressiveness: request.usageTapCompressionAggressiveness,
688
900
  signal: options.signal
689
901
  });
690
902
  try {
691
- await this.request(
692
- COMPRESS_PROMPT_PATH,
903
+ await this.recordPromptCompression(
693
904
  {
694
905
  callId: request.callId,
695
906
  promptCompression: this.toPromptCompressionTelemetry(result)
@@ -700,7 +911,7 @@ var UsageTapClient = class {
700
911
  } catch (error) {
701
912
  return {
702
913
  ...createPromptCompressionFallback(
703
- request.input,
914
+ requestInput,
704
915
  request.provider ?? result.provider,
705
916
  error
706
917
  ),
@@ -708,6 +919,55 @@ var UsageTapClient = class {
708
919
  };
709
920
  }
710
921
  }
922
+ async compressPromptInput(input, options = {}) {
923
+ return compressPrompt({
924
+ input,
925
+ provider: options.provider,
926
+ tokenCompanyApiKey: this.tokenCompanyApiKey,
927
+ tokenCompanyEndpoint: this.tokenCompanyEndpoint,
928
+ model: options.model ?? this.model,
929
+ tokenCompanyModel: options.tokenCompanyModel ?? this.tokenCompanyModel,
930
+ aggressiveness: options.aggressiveness ?? this.aggressiveness,
931
+ tokenCompanyAggressiveness: options.tokenCompanyAggressiveness ?? this.tokenCompanyAggressiveness,
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,
950
+ fetchImpl: this.fetchImpl,
951
+ signal: options.signal,
952
+ failOpen: options.failOpen
953
+ });
954
+ }
955
+ async recordPromptCompression(request, options = {}) {
956
+ if (!request?.callId) {
957
+ throw new UsageTapError(
958
+ "USAGETAP_BAD_REQUEST",
959
+ "recordPromptCompression requires callId"
960
+ );
961
+ }
962
+ return this.request(
963
+ COMPRESS_PROMPT_PATH,
964
+ {
965
+ callId: request.callId,
966
+ promptCompression: request.promptCompression
967
+ },
968
+ options
969
+ );
970
+ }
711
971
  async endCall(request, options = {}) {
712
972
  if (!request?.callId) {
713
973
  throw new UsageTapError(
@@ -1533,6 +1793,6 @@ async function finalizeCall(callState, usageTap, error, usage) {
1533
1793
  }
1534
1794
  }
1535
1795
 
1536
- export { UsageTapClient, UsageTapError, compressPrompt, compressPromptHeuristic, compressPromptToon, createIdempotencyKey, estimatePromptTokens, isUsageTapError, wrapFetch };
1796
+ export { UsageTapClient, UsageTapError, compressPrompt, compressPromptHeuristic, compressPromptMessages, compressPromptToon, createIdempotencyKey, estimatePromptTokens, isUsageTapError, protect, protectPromptText, wrapFetch };
1537
1797
  //# sourceMappingURL=index.mjs.map
1538
1798
  //# sourceMappingURL=index.mjs.map