@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.
- package/README.md +77 -16
- package/dist/adapters/anthropic.cjs +1009 -0
- package/dist/adapters/anthropic.cjs.map +1 -0
- package/dist/adapters/anthropic.d.cts +90 -0
- package/dist/adapters/anthropic.d.ts +90 -0
- package/dist/adapters/anthropic.mjs +1006 -0
- package/dist/adapters/anthropic.mjs.map +1 -0
- package/dist/adapters/openai.cjs +667 -17
- package/dist/adapters/openai.cjs.map +1 -1
- package/dist/adapters/openai.d.cts +66 -2
- package/dist/adapters/openai.d.ts +66 -2
- package/dist/adapters/openai.mjs +667 -18
- package/dist/adapters/openai.mjs.map +1 -1
- package/dist/adapters/openrouter.cjs.map +1 -1
- package/dist/adapters/openrouter.d.cts +1 -1
- package/dist/adapters/openrouter.d.ts +1 -1
- package/dist/adapters/openrouter.mjs.map +1 -1
- package/dist/anthropic/index.cjs +1009 -0
- package/dist/anthropic/index.cjs.map +1 -0
- package/dist/anthropic/index.d.cts +2 -0
- package/dist/anthropic/index.d.ts +2 -0
- package/dist/anthropic/index.mjs +1006 -0
- package/dist/anthropic/index.mjs.map +1 -0
- package/dist/{client-BHNMYvlO.d.cts → client-EMXt9_fA.d.cts} +106 -6
- package/dist/{client-BHNMYvlO.d.ts → client-EMXt9_fA.d.ts} +106 -6
- package/dist/express/index.cjs +663 -17
- package/dist/express/index.cjs.map +1 -1
- package/dist/express/index.d.cts +1 -1
- package/dist/express/index.d.ts +1 -1
- package/dist/express/index.mjs +663 -17
- package/dist/express/index.mjs.map +1 -1
- package/dist/index.cjs +287 -24
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +285 -25
- package/dist/index.mjs.map +1 -1
- package/dist/openai/index.cjs +667 -17
- package/dist/openai/index.cjs.map +1 -1
- package/dist/openai/index.d.cts +2 -2
- package/dist/openai/index.d.ts +2 -2
- package/dist/openai/index.mjs +667 -18
- package/dist/openai/index.mjs.map +1 -1
- 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-
|
|
2
|
-
export {
|
|
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-
|
|
2
|
-
export {
|
|
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(
|
|
137
|
+
return compressPromptToon(input);
|
|
125
138
|
}
|
|
126
|
-
return compressPromptHeuristic(
|
|
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
|
-
|
|
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
|
|
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.
|
|
254
|
+
options.usageTapCompressionMessagesEndpoint ?? DEFAULT_USAGETAP_MESSAGES_COMPRESSION_ENDPOINT,
|
|
182
255
|
{
|
|
183
256
|
method: "POST",
|
|
184
|
-
headers
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
`
|
|
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(
|
|
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
|
-
|
|
338
|
+
sourceInput,
|
|
211
339
|
compressedInput,
|
|
212
|
-
|
|
340
|
+
provider,
|
|
213
341
|
original,
|
|
214
342
|
compressed,
|
|
215
|
-
[...heuristic.techniques,
|
|
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.
|
|
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
|
|
683
|
-
|
|
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
|
-
|
|
686
|
-
|
|
687
|
-
|
|
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.
|
|
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
|
-
|
|
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
|