@usagetap/sdk 0.10.0 → 1.1.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/LICENSE +21 -0
- package/README.md +83 -22
- package/dist/adapters/anthropic.cjs +943 -0
- package/dist/adapters/anthropic.cjs.map +1 -0
- package/dist/adapters/anthropic.d.cts +81 -0
- package/dist/adapters/anthropic.d.ts +81 -0
- package/dist/adapters/anthropic.mjs +940 -0
- package/dist/adapters/anthropic.mjs.map +1 -0
- package/dist/adapters/openai.cjs +601 -17
- package/dist/adapters/openai.cjs.map +1 -1
- package/dist/adapters/openai.d.cts +57 -2
- package/dist/adapters/openai.d.ts +57 -2
- package/dist/adapters/openai.mjs +601 -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 +943 -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 +940 -0
- package/dist/anthropic/index.mjs.map +1 -0
- package/dist/{client-DEbk0Q2l.d.cts → client-BA-QlnRq.d.cts} +95 -1
- package/dist/{client-DEbk0Q2l.d.ts → client-BA-QlnRq.d.ts} +95 -1
- package/dist/express/index.cjs +597 -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 +597 -17
- package/dist/express/index.mjs.map +1 -1
- package/dist/index.cjs +586 -1
- 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 +581 -2
- package/dist/index.mjs.map +1 -1
- package/dist/openai/index.cjs +601 -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 +601 -18
- package/dist/openai/index.mjs.map +1 -1
- package/package.json +22 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/prompt-compression.ts","../../src/adapters/anthropic.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export type UsageTapErrorCode =\r\n | \"USAGETAP_BROWSER_RUNTIME\"\r\n | \"USAGETAP_AUTH_ERROR\"\r\n | \"USAGETAP_BAD_REQUEST\"\r\n | \"USAGETAP_INVALID_RESPONSE\"\r\n | \"USAGETAP_NETWORK_ERROR\"\r\n | \"USAGETAP_RATE_LIMITED\"\r\n | \"USAGETAP_SERVER_ERROR\"\r\n | \"USAGETAP_RETRY_EXHAUSTED\"\r\n | \"USAGETAP_END_CALL_ERROR\";\r\n\r\nexport interface UsageTapErrorInit {\r\n status?: number;\r\n retryable?: boolean;\r\n correlationId?: string;\r\n details?: Record<string, unknown>;\r\n cause?: unknown;\r\n}\r\n\r\nexport class UsageTapError extends Error {\r\n public readonly code: UsageTapErrorCode;\r\n public readonly status?: number;\r\n public readonly retryable: boolean;\r\n public readonly correlationId?: string;\r\n public readonly details?: Record<string, unknown>;\r\n\r\n constructor(code: UsageTapErrorCode, message: string, init: UsageTapErrorInit = {}) {\r\n super(message, init.cause ? { cause: init.cause as Error } : undefined);\r\n this.name = \"UsageTapError\";\r\n this.code = code;\r\n this.status = init.status;\r\n this.retryable = init.retryable ?? false;\r\n this.correlationId = init.correlationId;\r\n this.details = init.details;\r\n }\r\n\r\n toJSON(): Record<string, unknown> {\r\n return {\r\n name: this.name,\r\n message: this.message,\r\n code: this.code,\r\n status: this.status,\r\n retryable: this.retryable,\r\n correlationId: this.correlationId,\r\n details: this.details,\r\n };\r\n }\r\n}\r\n\r\nexport function isUsageTapError(error: unknown): error is UsageTapError {\r\n return error instanceof UsageTapError;\r\n}\r\n","export type PromptCompressionProvider = \"heuristic\" | \"toon\" | \"thetokencompany\";\n\nexport interface PromptCompressionInput {\n input: unknown;\n provider?: PromptCompressionProvider;\n tokenCompanyApiKey?: string;\n tokenCompanyEndpoint?: string;\n tokenCompanyModel?: string;\n tokenCompanyAggressiveness?: number;\n tokenCompanyAppId?: string;\n fetchImpl?: typeof fetch;\n signal?: AbortSignal;\n failOpen?: boolean;\n}\n\r\nexport interface PromptCompressionResult<TInput = unknown> {\n input: TInput;\n compressedInput: unknown;\n provider: PromptCompressionProvider;\n originalCharacters: number;\n compressedCharacters: number;\n savedCharacters: number;\n originalTokens: number;\n compressedTokens: number;\n savedTokens: number;\n tokenSavingsRatio: number;\n savingsRatio: number;\n techniques: string[];\n}\n\r\nconst DEFAULT_TTC_ENDPOINT = \"https://api.thetokencompany.com/v1/compress\";\nconst DEFAULT_TTC_MODEL = \"bear-2\";\nconst DEFAULT_TTC_AGGRESSIVENESS = 0.2;\nconst PROTECTED_TEXT_PATTERN = /<ttc_safe>[\\s\\S]*?<\\/ttc_safe>|<usagetap_safe>[\\s\\S]*?<\\/usagetap_safe>/g;\n\ntype PromptCompressionTokenCounts = {\n originalTokens: number;\n compressedTokens: number;\n savedTokens: number;\n};\n\ntype TheTokenCompanyCompressResponse = {\n output: string;\n output_tokens: number;\n input_tokens: number;\n tokens_saved: number;\n compression_ratio: number;\n};\n\nexport function protectPromptText(text: string): string {\n return `<ttc_safe>${text}</ttc_safe>`;\n}\n\nexport const protect = protectPromptText;\n\nexport async function compressPrompt<TInput = unknown>(\n options: PromptCompressionInput\n): Promise<PromptCompressionResult<TInput>> {\n try {\n if (options.provider === \"thetokencompany\" || options.tokenCompanyApiKey) {\n return await compressWithTheTokenCompany(options) as PromptCompressionResult<TInput>;\n }\n\n if (options.provider === \"toon\") {\n return compressPromptToon(options.input) as PromptCompressionResult<TInput>;\n }\n\n return compressPromptHeuristic(options.input) as PromptCompressionResult<TInput>;\n } catch (error) {\n if (options.failOpen === false) {\n throw error;\n }\n return createPromptCompressionFallback(\n options.input,\n options.provider ?? (options.tokenCompanyApiKey ? \"thetokencompany\" : \"heuristic\"),\n error\n ) as PromptCompressionResult<TInput>;\n }\n}\n\nexport function compressPromptHeuristic<TInput = unknown>(\n input: TInput\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const techniques = new Set<string>();\n const compressedInput = compressValue(input, techniques, { allowToonString: false });\n const compressed = stableStringifyInput(compressedInput);\n const chosenInput = compressed.length <= original.length ? compressedInput : input;\n const chosen = compressed.length <= original.length ? compressed : original;\n\n if (!techniques.size) {\n techniques.add(\"no-op\");\n }\n\n return buildResult(\n input,\n chosenInput,\n \"heuristic\",\n original,\n chosen,\n Array.from(techniques)\n ) as PromptCompressionResult<TInput>;\n}\n\nexport function compressPromptToon<TInput = unknown>(\n input: TInput\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const compressedInput =\n typeof input === \"string\"\n ? compressText(input, new Set<string>(), { allowToonString: true })\n : encodeToon(input);\n const compressed = stableStringifyInput(compressedInput);\n\n return buildResult(input, compressedInput, \"toon\", original, compressed, [\n \"toon\",\n \"json-minify\",\n ]) as PromptCompressionResult<TInput>;\n}\n\r\nasync function compressWithTheTokenCompany(\r\n options: PromptCompressionInput\r\n): Promise<PromptCompressionResult> {\r\n if (!options.tokenCompanyApiKey) {\r\n throw new Error(\r\n \"tokenCompanyApiKey is required when provider is thetokencompany\"\r\n );\r\n }\r\n\r\n const fetchCandidate = options.fetchImpl ?? globalThis.fetch;\r\n if (typeof fetchCandidate !== \"function\") {\r\n throw new Error(\r\n \"A fetch implementation is required for The Token Company compression\"\r\n );\r\n }\r\n\r\n const original = stableStringifyInput(options.input);\n const heuristic = compressPromptHeuristic(options.input);\n const input = typeof heuristic.compressedInput === \"string\"\n ? heuristic.compressedInput\n : stableStringifyInput(heuristic.compressedInput);\n const model = options.tokenCompanyModel ?? DEFAULT_TTC_MODEL;\n const aggressiveness =\n options.tokenCompanyAggressiveness ?? DEFAULT_TTC_AGGRESSIVENESS;\n\n if (\n typeof aggressiveness !== \"number\" ||\n !Number.isFinite(aggressiveness) ||\n aggressiveness < 0 ||\n aggressiveness > 1\n ) {\n throw new Error(\"tokenCompanyAggressiveness must be between 0.0 and 1.0\");\n }\n\n const response = await fetchCandidate(\n options.tokenCompanyEndpoint ?? DEFAULT_TTC_ENDPOINT,\n {\n method: \"POST\",\n headers: {\n authorization: `Bearer ${options.tokenCompanyApiKey}`,\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n model,\n input,\n compression_settings: { aggressiveness },\n ...(options.tokenCompanyAppId ? { app_id: options.tokenCompanyAppId } : {}),\n }),\n signal: options.signal,\n }\n );\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `The Token Company compression failed with HTTP ${response.status}`\r\n );\r\n }\r\n\r\n const payload = (await response.json()) as Record<string, unknown>;\n const tokenCompanyResult = normalizeTheTokenCompanyCompressResponse(payload);\n const compressedInput =\n payload.compressedInput ??\n payload.compressed ??\n tokenCompanyResult?.output ??\n payload.output ??\n payload.text;\n if (compressedInput === undefined) {\n throw new Error(\"The Token Company response did not include compressed content\");\n }\n\n const compressed = stableStringifyInput(compressedInput);\n const tokenCounts = tokenCompanyResult\n ? {\n originalTokens: tokenCompanyResult.input_tokens,\n compressedTokens: tokenCompanyResult.output_tokens,\n savedTokens: tokenCompanyResult.tokens_saved,\n }\n : undefined;\n\n return buildResult(\n options.input,\n compressedInput,\n \"thetokencompany\",\n original,\n compressed,\n [...heuristic.techniques, \"thetokencompany\"],\n tokenCounts\n );\n}\n\nfunction normalizeTheTokenCompanyCompressResponse(\n data: Record<string, unknown>\n): TheTokenCompanyCompressResponse | undefined {\n if (\n typeof data.output !== \"string\" ||\n typeof data.output_tokens !== \"number\"\n ) {\n return undefined;\n }\n\n const inputTokens =\n typeof data.input_tokens === \"number\"\n ? data.input_tokens\n : data.original_input_tokens;\n\n if (typeof inputTokens !== \"number\") {\n return undefined;\n }\n\n const tokensSaved =\n typeof data.tokens_saved === \"number\"\n ? data.tokens_saved\n : inputTokens - data.output_tokens;\n const compressionRatio =\n typeof data.compression_ratio === \"number\"\n ? data.compression_ratio\n : data.output_tokens === 0\n ? 0\n : inputTokens / data.output_tokens;\n\n return {\n output: data.output,\n output_tokens: data.output_tokens,\n input_tokens: inputTokens,\n tokens_saved: tokensSaved,\n compression_ratio: compressionRatio,\n };\n}\n\nexport function createPromptCompressionFallback<TInput = unknown>(\n input: TInput,\n provider: PromptCompressionProvider = \"heuristic\",\n error?: unknown\n): PromptCompressionResult<TInput> {\n const original = stableStringifyInput(input);\n const techniques = [\"fallback-original\"];\n if (error) {\n techniques.push(\"compression-error\");\n }\n\n return buildResult(input, input, provider, original, original, techniques) as\n PromptCompressionResult<TInput>;\n}\n\r\nfunction buildResult(\n input: unknown,\n compressedInput: unknown,\n provider: PromptCompressionProvider,\n original: string,\n compressed: string,\n techniques: string[],\n tokenCounts?: PromptCompressionTokenCounts\n): PromptCompressionResult {\n const originalCharacters = original.length;\n const compressedCharacters = compressed.length;\n const savedCharacters = Math.max(\n 0,\n originalCharacters - compressedCharacters\n );\n const originalTokens = tokenCounts?.originalTokens ?? estimatePromptTokens(original);\n const compressedTokens = tokenCounts?.compressedTokens ?? estimatePromptTokens(compressed);\n const savedTokens = Math.max(\n 0,\n tokenCounts?.savedTokens ?? originalTokens - compressedTokens\n );\n\n return {\n input,\n compressedInput,\n provider,\n originalCharacters,\n compressedCharacters,\n savedCharacters,\n originalTokens,\n compressedTokens,\n savedTokens,\n tokenSavingsRatio: originalTokens > 0 ? savedTokens / originalTokens : 0,\n savingsRatio: originalCharacters > 0 ? savedCharacters / originalCharacters : 0,\n techniques,\n };\n}\n\nexport function estimatePromptTokens(input: unknown): number {\n const text = typeof input === \"string\" ? input : stableStringifyInput(input);\n return text.match(/[\\p{L}\\p{N}]+|[^\\s]/gu)?.length ?? 0;\n}\n\r\nfunction compressValue(\n value: unknown,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): unknown {\n if (typeof value === \"string\") return compressText(value, techniques, options);\n if (Array.isArray(value)) {\n techniques.add(\"json-minify\");\n return value.map((item) => compressValue(item, techniques, options));\n }\n if (value && typeof value === \"object\") {\n techniques.add(\"json-minify\");\n return Object.keys(value as Record<string, unknown>)\n .reduce<Record<string, unknown>>((acc, key) => {\n const child = (value as Record<string, unknown>)[key];\n if (child !== undefined) {\n acc[key] = compressValue(child, techniques, options);\n }\n return acc;\n }, {});\n }\n return value;\n}\n\nfunction compressText(\n value: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n const protectedSpans: string[] = [];\n const text = value.replace(PROTECTED_TEXT_PATTERN, (match) => {\n const placeholder = `__USAGETAP_PROTECTED_${protectedSpans.length}__`;\n protectedSpans.push(match);\n techniques.add(\"protected-text\");\n return placeholder;\n });\n\n const compressed = compressTextWithoutProtection(text, techniques, options);\n\n return protectedSpans.reduce(\n (output, span, index) =>\n output.replace(`__USAGETAP_PROTECTED_${index}__`, span),\n compressed\n );\n}\n\nfunction compressTextWithoutProtection(\n value: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n const fencePattern = /```([\\w-]+)?\\n([\\s\\S]*?)```/g;\n const parts: string[] = [];\n let cursor = 0;\n let match: RegExpExecArray | null;\n\n while ((match = fencePattern.exec(value)) !== null) {\n const before = value.slice(cursor, match.index);\n const compressedBefore = compressPlainTextAndEmbeddedJson(\n before,\n techniques,\n options\n );\n if (compressedBefore) parts.push(compressedBefore);\n\n const lang = match[1]?.toLowerCase();\n const code = cleanCodeBlock(match[2] ?? \"\");\n const compressedCode =\n lang === \"json\" ? compressJsonText(code, techniques, options) : undefined;\n\n if (compressedCode?.format === \"toon\") {\n parts.push(`\\`\\`\\`toon\\n${compressedCode.text}\\n\\`\\`\\``);\n } else if (compressedCode?.format === \"json\") {\n parts.push(`\\`\\`\\`json\\n${compressedCode.text}\\n\\`\\`\\``);\n } else {\n if (code !== match[2]) {\n techniques.add(\"code-whitespace\");\n }\n parts.push(lang ? `\\`\\`\\`${lang}\\n${code}\\n\\`\\`\\`` : `\\`\\`\\`\\n${code}\\n\\`\\`\\``);\n }\n cursor = match.index + match[0].length;\n }\n\n const after = compressPlainTextAndEmbeddedJson(value.slice(cursor), techniques, options);\n if (after) parts.push(after);\n\n return parts.join(\"\\n\").trim();\n}\n\nfunction compressPlainText(value: string, techniques: Set<string>): string {\n const compressed = value\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line)\n .join(\"\\n\")\n .replace(/[ \\t]{2,}/g, \" \")\n .trim();\n\n if (compressed !== value.trim()) {\n techniques.add(\"text-whitespace\");\n }\n\n return compressed;\n}\n\nfunction compressPlainTextAndEmbeddedJson(\n value: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n const normalized = compressPlainText(value, techniques);\n return compressEmbeddedJson(normalized, techniques, options);\n}\n\nfunction cleanCodeBlock(code: string): string {\n const lines = code.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n while (lines.length && lines[0].trim() === \"\") lines.shift();\n while (lines.length && lines[lines.length - 1].trim() === \"\") lines.pop();\n\n const commonIndent = lines\n .filter((line) => line.trim())\n .reduce<number | undefined>((min, line) => {\n const indent = /^[ \\t]*/.exec(line)?.[0].length ?? 0;\n return min === undefined ? indent : Math.min(min, indent);\n }, undefined);\n\n return lines\n .map((line) => (commonIndent ? line.slice(commonIndent) : line))\n .join(\"\\n\")\n .replace(/[ \\t]+$/gm, \"\");\n}\n\r\nfunction stableStringifyInput(input: unknown): string {\n if (typeof input === \"string\") return input;\n return JSON.stringify(input) ?? String(input);\n}\n\ntype JsonCompressionCandidate = {\n format: \"json\" | \"toon\";\n text: string;\n};\n\nfunction compressJsonText(\n text: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): JsonCompressionCandidate | undefined {\n const parsed = safeParseJson(text);\n if (parsed === undefined) {\n return undefined;\n }\n\n const compactJson = JSON.stringify(parsed);\n const candidates: JsonCompressionCandidate[] = [\n { format: \"json\", text: compactJson },\n ];\n\n if (options.allowToonString || shouldUseToonForJson(parsed)) {\n candidates.push({ format: \"toon\", text: encodeToon(parsed) });\n }\n\n const originalLength = text.trim().length;\n const best = candidates.reduce((winner, candidate) =>\n candidate.text.length < winner.text.length ? candidate : winner\n );\n\n if (best.text.length >= originalLength) {\n return undefined;\n }\n\n techniques.add(best.format === \"toon\" ? \"embedded-json-toon\" : \"embedded-json-minify\");\n return best;\n}\n\nfunction compressEmbeddedJson(\n text: string,\n techniques: Set<string>,\n options: { allowToonString: boolean }\n): string {\n let result = \"\";\n let cursor = 0;\n\n while (cursor < text.length) {\n const start = findNextJsonStart(text, cursor);\n if (start < 0) {\n result += text.slice(cursor);\n break;\n }\n\n result += text.slice(cursor, start);\n const span = findBalancedJsonSpan(text, start);\n if (!span) {\n result += text[start];\n cursor = start + 1;\n continue;\n }\n\n const candidate = compressJsonText(span.text, techniques, options);\n if (candidate) {\n result += candidate.text;\n } else {\n result += span.text;\n }\n cursor = span.end;\n }\n\n return result;\n}\n\nfunction findNextJsonStart(text: string, from: number): number {\n const objectStart = text.indexOf(\"{\", from);\n const arrayStart = text.indexOf(\"[\", from);\n if (objectStart < 0) return arrayStart;\n if (arrayStart < 0) return objectStart;\n return Math.min(objectStart, arrayStart);\n}\n\nfunction findBalancedJsonSpan(\n text: string,\n start: number\n): { text: string; end: number } | undefined {\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : opener === \"[\" ? \"]\" : undefined;\n if (!closer) return undefined;\n\n const stack = [closer];\n let inString = false;\n let escaped = false;\n\n for (let index = start + 1; index < text.length; index += 1) {\n const char = text[index];\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === \"\\\"\") {\n inString = false;\n }\n continue;\n }\n\n if (char === \"\\\"\") {\n inString = true;\n continue;\n }\n\n if (char === \"{\" || char === \"[\") {\n stack.push(char === \"{\" ? \"}\" : \"]\");\n continue;\n }\n\n if (char === stack[stack.length - 1]) {\n stack.pop();\n if (!stack.length) {\n const end = index + 1;\n return { text: text.slice(start, end), end };\n }\n }\n }\n\n return undefined;\n}\n\nfunction safeParseJson(text: string): unknown {\n try {\n return JSON.parse(text);\n } catch {\n return undefined;\n }\n}\n\nfunction shouldUseToonForJson(value: unknown): boolean {\n if (Array.isArray(value)) {\n return isUniformObjectArray(value) || value.some(shouldUseToonForJson);\n }\n if (isPlainObject(value)) {\n return Object.values(value).some(shouldUseToonForJson);\n }\n return false;\n}\n\nfunction encodeToon(value: unknown, indent = 0): string {\n if (isPrimitive(value)) {\n return scalarToToon(value);\n }\n\n if (Array.isArray(value)) {\n return encodeArrayToon(value, indent);\n }\n\n if (isPlainObject(value)) {\n const lines: string[] = [];\n for (const [key, child] of Object.entries(value)) {\n lines.push(...encodePropertyToon(key, child, indent));\n }\n return lines.join(\"\\n\");\n }\n\n return scalarToToon(String(value));\n}\n\nfunction encodePropertyToon(key: string, value: unknown, indent: number): string[] {\n const prefix = \" \".repeat(indent);\n const toonKey = keyToToon(key);\n\n if (isPrimitive(value)) {\n return [`${prefix}${toonKey}: ${scalarToToon(value)}`];\n }\n\n if (Array.isArray(value)) {\n if (value.every(isPrimitive)) {\n return [`${prefix}${toonKey}[${value.length}]: ${value.map(scalarToToon).join(\",\")}`];\n }\n\n if (isUniformObjectArray(value)) {\n const fields = Object.keys(value[0] as Record<string, unknown>);\n const header = `${prefix}${toonKey}[${value.length}]{${fields.map(keyToToon).join(\",\")}}:`;\n const rows = value.map((item) =>\n `${\" \".repeat(indent + 2)}${fields.map((field) =>\n scalarToToon((item as Record<string, unknown>)[field])\n ).join(\",\")}`\n );\n return [header, ...rows];\n }\n\n return [\n `${prefix}${toonKey}[${value.length}]:`,\n ...value.flatMap((item, index) => {\n if (isPrimitive(item)) {\n return [`${\" \".repeat(indent + 2)}- ${scalarToToon(item)}`];\n }\n return [\n `${\" \".repeat(indent + 2)}- item${index}:`,\n ...encodeToon(item, indent + 4).split(\"\\n\"),\n ];\n }),\n ];\n }\n\n return [`${prefix}${toonKey}:`, ...encodeToon(value, indent + 2).split(\"\\n\")];\n}\n\nfunction encodeArrayToon(value: unknown[], indent: number): string {\n if (value.every(isPrimitive)) {\n return `[${value.length}]: ${value.map(scalarToToon).join(\",\")}`;\n }\n\n if (isUniformObjectArray(value)) {\n const fields = Object.keys(value[0] as Record<string, unknown>);\n return [\n `[${value.length}]{${fields.map(keyToToon).join(\",\")}}:`,\n ...value.map((item) =>\n `${\" \".repeat(indent + 2)}${fields.map((field) =>\n scalarToToon((item as Record<string, unknown>)[field])\n ).join(\",\")}`\n ),\n ].join(\"\\n\");\n }\n\n return value\n .flatMap((item, index) => [\n `${\" \".repeat(indent)}- item${index}:`,\n ...encodeToon(item, indent + 2).split(\"\\n\"),\n ])\n .join(\"\\n\");\n}\n\nfunction isUniformObjectArray(value: unknown[]): boolean {\n if (!value.length || !value.every(isPlainObject)) {\n return false;\n }\n\n const fields = Object.keys(value[0] as Record<string, unknown>);\n if (!fields.length) {\n return false;\n }\n\n return value.every((item) => {\n const record = item as Record<string, unknown>;\n const itemFields = Object.keys(record);\n return (\n itemFields.length === fields.length &&\n fields.every((field) => itemFields.includes(field) && isPrimitive(record[field]))\n );\n });\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isPrimitive(value: unknown): boolean {\n return (\n value === null ||\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n );\n}\n\nfunction keyToToon(key: string): string {\n return /^[A-Za-z_][A-Za-z0-9_-]*$/.test(key) ? key : JSON.stringify(key);\n}\n\nfunction scalarToToon(value: unknown): string {\n if (value === null) return \"null\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n const text = String(value);\n if (\n text &&\n !/^(true|false|null|-?\\d+(?:\\.\\d+)?)$/i.test(text) &&\n /^[A-Za-z0-9_./@-]+(?: [A-Za-z0-9_./@-]+)*$/.test(text)\n ) {\n return text;\n }\n\n return JSON.stringify(text);\n}\n","import { UsageTapClient } from \"../client\";\nimport { UsageTapError } from \"../errors\";\nimport { estimatePromptTokens } from \"../prompt-compression\";\nimport type {\n PromptCompressionProvider,\n PromptCompressionResult,\n} from \"../prompt-compression\";\nimport type {\n BeginCallOptions,\n BeginCallRequest,\n BeginCallResponseBody,\n EndCallOptions,\n EndCallRequest,\n PromptCompressionOptions,\n PromptCompressionTelemetry,\n UsageTapSuccessResponse,\n VendorHints,\n WithUsageContext,\n WithUsageOptions,\n} from \"../types\";\n\nexport type WrapAnthropicContext = BeginCallRequest;\n\nexport type AnthropicPromptCompressionRole = \"system\" | \"user\" | \"tool\" | \"assistant\";\n\nexport interface AnthropicPromptCompressionRoleOptions {\n enabled?: boolean;\n provider?: PromptCompressionProvider;\n minTokens?: number;\n tokenCompanyAggressiveness?: number;\n}\n\nexport type AnthropicPromptCompressionRoleSetting =\n | boolean\n | AnthropicPromptCompressionRoleOptions;\n\nexport interface AnthropicPromptCompressionOptions {\n enabled?: boolean;\n provider?: PromptCompressionProvider;\n roles?: Partial<Record<AnthropicPromptCompressionRole, AnthropicPromptCompressionRoleSetting>>;\n minTokens?: number;\n failOpen?: boolean;\n tokenCompanyModel?: string;\n tokenCompanyAggressiveness?: number | Partial<Record<AnthropicPromptCompressionRole, number>>;\n tokenCompanyAppId?: string;\n}\n\nexport interface AnthropicPromptCompressionFailure {\n callId: string;\n operation: \"messages.create\";\n stage: \"telemetry\";\n message: string;\n timestamp: number;\n}\n\nexport interface AnthropicPromptCompressionTurnStats extends PromptCompressionTelemetry {\n callId: string;\n operation: \"messages.create\";\n messagesCompressed: number;\n timestamp: number;\n}\n\nexport class AnthropicPromptCompressionStats {\n history: AnthropicPromptCompressionTurnStats[] = [];\n failures: AnthropicPromptCompressionFailure[] = [];\n\n _record(turn: AnthropicPromptCompressionTurnStats): void {\n this.history.push(turn);\n }\n\n _recordFailure(failure: AnthropicPromptCompressionFailure): void {\n this.failures.push(failure);\n }\n\n get totalOriginalTokens(): number {\n return this.history.reduce((sum, turn) => sum + (turn.originalTokens ?? 0), 0);\n }\n\n get totalCompressedTokens(): number {\n return this.history.reduce((sum, turn) => sum + (turn.compressedTokens ?? 0), 0);\n }\n\n get totalTokensSaved(): number {\n return this.history.reduce((sum, turn) => sum + (turn.savedTokens ?? 0), 0);\n }\n\n get totalOriginalCharacters(): number {\n return this.history.reduce((sum, turn) => sum + turn.originalCharacters, 0);\n }\n\n get totalCompressedCharacters(): number {\n return this.history.reduce((sum, turn) => sum + turn.compressedCharacters, 0);\n }\n\n get totalCharactersSaved(): number {\n return this.history.reduce((sum, turn) => sum + turn.savedCharacters, 0);\n }\n\n get calls(): number {\n return this.history.length;\n }\n\n get telemetryFailures(): number {\n return this.failures.length;\n }\n\n get failOpenEvents(): number {\n return this.history.filter((turn) =>\n turn.techniques.includes(\"compression-error\") ||\n turn.techniques.includes(\"fallback-original\"),\n ).length;\n }\n\n get tokenSavingsRatio(): number {\n return this.totalOriginalTokens > 0\n ? this.totalTokensSaved / this.totalOriginalTokens\n : 0;\n }\n\n get savingsRatio(): number {\n return this.totalOriginalCharacters > 0\n ? this.totalCharactersSaved / this.totalOriginalCharacters\n : 0;\n }\n}\n\nexport interface WrapAnthropicOptions {\n defaultContext?: Partial<WrapAnthropicContext>;\n applyVendorHints?: boolean;\n promptCompression?: boolean | AnthropicPromptCompressionOptions;\n}\n\nexport interface WrapAnthropicCallOptions {\n usageTap?: Partial<WrapAnthropicContext>;\n withUsage?: WithUsageOptions;\n promptCompression?: boolean | AnthropicPromptCompressionOptions;\n}\n\nexport interface AnthropicClientLike {\n messages: {\n create: unknown;\n };\n}\n\ntype WrappedAnthropicCreate<TCreate> =\n TCreate extends (params: infer TParams, options?: infer TOptions) => infer TReturn\n ? (params: TParams, options?: TOptions & WrapAnthropicCallOptions) => TReturn\n : (params: AnthropicMessagesCreateParams, options?: WrapAnthropicCallOptions) => Promise<unknown>;\n\ntype WrappedAnthropicMessages<TMessages> =\n Omit<TMessages, \"create\"> & {\n create: TMessages extends { create: infer TCreate }\n ? WrappedAnthropicCreate<TCreate>\n : WrappedAnthropicCreate<never>;\n };\n\nexport type WrappedAnthropic<TClient extends AnthropicClientLike = AnthropicClientLike> =\n Omit<TClient, \"messages\"> & {\n messages: WrappedAnthropicMessages<TClient[\"messages\"]>;\n promptCompression: AnthropicPromptCompressionStats;\n unwrap: () => TClient;\n };\n\ntype AnthropicMessagesCreateParams = Record<string, unknown>;\ntype AnthropicMessagesCreateOptions = Record<string, unknown>;\ntype AnthropicCreateFunction = (\n params: AnthropicMessagesCreateParams,\n options?: AnthropicMessagesCreateOptions,\n) => unknown;\n\ntype PromptCompressionOperation = AnthropicPromptCompressionTurnStats[\"operation\"];\n\ninterface ResolvedRoleCompressionOptions {\n provider?: PromptCompressionProvider;\n minTokens?: number;\n failOpen?: boolean;\n tokenCompanyModel?: string;\n tokenCompanyAggressiveness?: number;\n tokenCompanyAppId?: string;\n}\n\ninterface SegmentCompression {\n role: AnthropicPromptCompressionRole;\n result: PromptCompressionResult<string>;\n}\n\ninterface CompressionOutcome<TParams> {\n params: TParams;\n segments: SegmentCompression[];\n}\n\ninterface SplitUsageOptionsResult {\n requestOptions?: Record<string, unknown>;\n usageContext?: Partial<WrapAnthropicContext>;\n withUsage?: WithUsageOptions;\n promptCompression?: boolean | AnthropicPromptCompressionOptions;\n}\n\ninterface AnthropicCallState {\n beginRequest: BeginCallRequest;\n begin: UsageTapSuccessResponse<BeginCallResponseBody>;\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>;\n error?: EndCallRequest[\"error\"];\n finalized: boolean;\n}\n\ntype UsageTapStream<T> = AsyncIterable<T> & { __usageTapFinalize?: () => Promise<void> };\ntype UsageTapIterableIterator<T> = AsyncIterator<T> & UsageTapStream<T> & {\n __usageTapFinalize: () => Promise<void>;\n};\n\nconst USAGETAP_CORRELATION_HEADER = \"x-usage-correlation-id\";\n\nexport function wrapAnthropic<TClient extends AnthropicClientLike>(\n client: TClient,\n usageTap: UsageTapClient,\n options: WrapAnthropicOptions = {},\n): WrappedAnthropic<TClient> {\n if (!client) {\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"wrapAnthropic requires an Anthropic client instance\");\n }\n\n if (!client.messages || !isObjectRecord(client.messages)) {\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"wrapAnthropic requires client.messages\");\n }\n\n const defaultContext = options.defaultContext;\n const applyVendorHints = options.applyVendorHints !== false;\n const defaultPromptCompression = normalizePromptCompressionOptions(options.promptCompression);\n const promptCompressionStats = new AnthropicPromptCompressionStats();\n const proxiedMessages = createMessagesProxy(\n client.messages,\n usageTap,\n defaultContext,\n applyVendorHints,\n defaultPromptCompression,\n promptCompressionStats,\n );\n\n const handler: ProxyHandler<TClient> = {\n get(target, prop, receiver) {\n if (prop === \"messages\") {\n return proxiedMessages;\n }\n\n if (prop === \"promptCompression\") {\n return promptCompressionStats;\n }\n\n if (prop === \"unwrap\") {\n return () => target;\n }\n\n return Reflect.get(target as object, prop, receiver) as unknown;\n },\n };\n\n return new Proxy(client, handler) as unknown as WrappedAnthropic<TClient>;\n}\n\nfunction createMessagesProxy<TMessages extends { create: unknown }>(\n resource: TMessages,\n usageTap: UsageTapClient,\n defaultContext: Partial<WrapAnthropicContext> | undefined,\n applyVendorHints: boolean,\n defaultPromptCompression: AnthropicPromptCompressionOptions | undefined,\n promptCompressionStats: AnthropicPromptCompressionStats,\n): WrappedAnthropicMessages<TMessages> {\n if (typeof resource.create !== \"function\") {\n throw new UsageTapError(\"USAGETAP_BAD_REQUEST\", \"wrapAnthropic requires client.messages.create\");\n }\n\n const originalCreate = (resource.create as AnthropicCreateFunction).bind(resource);\n\n const wrappedCreate = ((\n params: AnthropicMessagesCreateParams,\n options?: AnthropicMessagesCreateOptions & WrapAnthropicCallOptions,\n ): Promise<unknown> => {\n const {\n requestOptions,\n usageContext,\n withUsage,\n promptCompression,\n } = splitUsageOptions(options);\n\n return invokeMessagesCreate({\n params,\n requestOptions,\n usageContext,\n withUsage,\n promptCompression,\n originalCreate,\n usageTap,\n defaultContext,\n applyVendorHints,\n defaultPromptCompression,\n promptCompressionStats,\n });\n }) as WrappedAnthropicMessages<TMessages>[\"create\"];\n\n const handler: ProxyHandler<TMessages> = {\n get(target, prop, receiver) {\n if (prop === \"create\") {\n return wrappedCreate;\n }\n return Reflect.get(target as object, prop, receiver) as unknown;\n },\n };\n\n return new Proxy(resource, handler) as WrappedAnthropicMessages<TMessages>;\n}\n\nasync function invokeMessagesCreate(args: {\n params: AnthropicMessagesCreateParams;\n requestOptions?: Record<string, unknown>;\n usageContext?: Partial<WrapAnthropicContext>;\n withUsage?: WithUsageOptions;\n promptCompression?: boolean | AnthropicPromptCompressionOptions;\n originalCreate: AnthropicCreateFunction;\n usageTap: UsageTapClient;\n defaultContext?: Partial<WrapAnthropicContext>;\n applyVendorHints: boolean;\n defaultPromptCompression?: AnthropicPromptCompressionOptions;\n promptCompressionStats: AnthropicPromptCompressionStats;\n}): Promise<unknown> {\n const beginRequest = resolveBeginRequest(args.defaultContext, args.usageContext);\n const begin = await args.usageTap.beginCall(\n beginRequest,\n beginCallOptions(args.withUsage),\n );\n const state = createCallState(beginRequest, begin);\n const ctx = createUsageContext(state);\n\n try {\n const hintedParams = args.applyVendorHints\n ? applyAnthropicVendorHints(args.params, ctx.begin.data.vendorHints)\n : args.params;\n const finalParams = await compressAnthropicParamsForCall({\n params: hintedParams,\n usageTap: args.usageTap,\n ctx,\n defaultPromptCompression: args.defaultPromptCompression,\n callPromptCompression: args.promptCompression,\n stats: args.promptCompressionStats,\n withUsage: args.withUsage,\n operation: \"messages.create\",\n });\n const request = attachCorrelationHeader(args.requestOptions, ctx.begin.correlationId);\n const response = await args.originalCreate(finalParams, request);\n\n if (isStreamingRequest(finalParams)) {\n ensureAsyncIterable(response, \"messages.create\");\n return wrapAnthropicStreamForUsageTap(\n response,\n state,\n args.usageTap,\n args.withUsage,\n readString(finalParams.model),\n );\n }\n\n inferAnthropicUsage(response, readString(finalParams.model), ctx);\n await finalizeCall(state, args.usageTap, args.withUsage);\n return response;\n } catch (error) {\n if (!state.error) {\n state.error = {\n code: args.withUsage?.defaultErrorCode ?? \"VENDOR_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n };\n }\n await finalizeCall(state, args.usageTap, args.withUsage);\n throw error;\n }\n}\n\nasync function compressAnthropicParamsForCall(args: {\n params: AnthropicMessagesCreateParams;\n usageTap: UsageTapClient;\n ctx: WithUsageContext;\n defaultPromptCompression: AnthropicPromptCompressionOptions | undefined;\n callPromptCompression: boolean | AnthropicPromptCompressionOptions | undefined;\n stats: AnthropicPromptCompressionStats;\n withUsage?: WithUsageOptions;\n operation: PromptCompressionOperation;\n}): Promise<AnthropicMessagesCreateParams> {\n const compression = resolveEffectivePromptCompressionOptions(\n args.defaultPromptCompression,\n args.callPromptCompression,\n );\n if (!compression) {\n return args.params;\n }\n\n const outcome = await compressAnthropicParams(\n args.params,\n args.usageTap,\n compression,\n args.withUsage?.signal,\n );\n await recordCompressionOutcome({\n outcome,\n compression,\n usageTap: args.usageTap,\n ctx: args.ctx,\n stats: args.stats,\n withUsage: args.withUsage,\n operation: args.operation,\n });\n return outcome.params;\n}\n\nasync function recordCompressionOutcome<TParams>(args: {\n outcome: CompressionOutcome<TParams>;\n compression: AnthropicPromptCompressionOptions;\n usageTap: UsageTapClient;\n ctx: WithUsageContext;\n stats: AnthropicPromptCompressionStats;\n withUsage?: WithUsageOptions;\n operation: PromptCompressionOperation;\n}): Promise<void> {\n const telemetry = buildPromptCompressionTelemetry(args.outcome.segments);\n if (!telemetry) {\n return;\n }\n\n const turn: AnthropicPromptCompressionTurnStats = {\n ...telemetry,\n callId: args.ctx.begin.data.callId,\n operation: args.operation,\n messagesCompressed: args.outcome.segments.length,\n timestamp: Date.now(),\n };\n args.stats._record(turn);\n\n try {\n await args.usageTap.recordPromptCompression(\n {\n callId: args.ctx.begin.data.callId,\n promptCompression: telemetry,\n },\n promptCompressionRequestOptions(args.withUsage, args.ctx.begin.correlationId),\n );\n } catch (error) {\n args.stats._recordFailure({\n callId: args.ctx.begin.data.callId,\n operation: args.operation,\n stage: \"telemetry\",\n message: error instanceof Error ? error.message : String(error),\n timestamp: Date.now(),\n });\n if (args.compression.failOpen === false) {\n throw error;\n }\n }\n}\n\nasync function compressAnthropicParams(\n params: AnthropicMessagesCreateParams,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<CompressionOutcome<AnthropicMessagesCreateParams>> {\n if (!params || typeof params !== \"object\") {\n return { params, segments: [] };\n }\n\n const source = cloneRecord(params);\n const segments: SegmentCompression[] = [];\n\n if (typeof source.system === \"string\") {\n const compressed = await compressTextForRole(\n source.system,\n \"system\",\n usageTap,\n compression,\n signal,\n );\n if (compressed) {\n source.system = compressed.text;\n segments.push(compressed.segment);\n }\n } else if (Array.isArray(source.system)) {\n const systemResults = await Promise.all(\n source.system.map((block) =>\n compressAnthropicTextBlock(block, \"system\", usageTap, compression, signal),\n ),\n );\n const systemSegments = systemResults.flatMap((result) =>\n result.segment ? [result.segment] : [],\n );\n if (systemSegments.length) {\n source.system = systemResults.map((result) => result.value);\n segments.push(...systemSegments);\n }\n }\n\n if (Array.isArray(source.messages)) {\n const messageResults = await Promise.all(\n source.messages.map((message) =>\n compressAnthropicMessage(message, usageTap, compression, signal),\n ),\n );\n source.messages = messageResults.map((result) => result.value);\n segments.push(...messageResults.flatMap((result) => result.segments));\n }\n\n return {\n params: source,\n segments,\n };\n}\n\nasync function compressAnthropicMessage(\n message: unknown,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<{ value: unknown; segments: SegmentCompression[] }> {\n if (!isObjectRecord(message)) {\n return { value: message, segments: [] };\n }\n\n const role = mapAnthropicMessageRole(message.role);\n if (!role) {\n return { value: message, segments: [] };\n }\n\n const content = message.content;\n if (typeof content === \"string\") {\n const compressed = await compressTextForRole(\n content,\n role,\n usageTap,\n compression,\n signal,\n );\n if (!compressed) {\n return { value: message, segments: [] };\n }\n return {\n value: { ...message, content: compressed.text },\n segments: [compressed.segment],\n };\n }\n\n if (Array.isArray(content)) {\n const blockResults = await Promise.all(\n content.map((block) =>\n compressAnthropicContentBlock(block, role, usageTap, compression, signal),\n ),\n );\n const segments = blockResults.flatMap((result) => result.segments);\n return {\n value: segments.length\n ? { ...message, content: blockResults.map((result) => result.value) }\n : message,\n segments,\n };\n }\n\n return { value: message, segments: [] };\n}\n\nasync function compressAnthropicContentBlock(\n block: unknown,\n messageRole: AnthropicPromptCompressionRole,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<{ value: unknown; segments: SegmentCompression[] }> {\n if (!isObjectRecord(block)) {\n return { value: block, segments: [] };\n }\n\n if (block.type === \"tool_result\") {\n return compressAnthropicToolResultBlock(block, usageTap, compression, signal);\n }\n\n const textResult = await compressAnthropicTextBlock(\n block,\n messageRole,\n usageTap,\n compression,\n signal,\n );\n return {\n value: textResult.value,\n segments: textResult.segment ? [textResult.segment] : [],\n };\n}\n\nasync function compressAnthropicToolResultBlock(\n block: Record<PropertyKey, unknown>,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<{ value: unknown; segments: SegmentCompression[] }> {\n const content = block.content;\n\n if (typeof content === \"string\") {\n const compressed = await compressTextForRole(\n content,\n \"tool\",\n usageTap,\n compression,\n signal,\n );\n if (!compressed) {\n return { value: block, segments: [] };\n }\n return {\n value: { ...block, content: compressed.text },\n segments: [compressed.segment],\n };\n }\n\n if (Array.isArray(content)) {\n const contentResults = await Promise.all(\n content.map((child) =>\n compressAnthropicTextBlock(child, \"tool\", usageTap, compression, signal),\n ),\n );\n const segments = contentResults.flatMap((result) =>\n result.segment ? [result.segment] : [],\n );\n if (!segments.length) {\n return { value: block, segments: [] };\n }\n return {\n value: {\n ...block,\n content: contentResults.map((result) => result.value),\n },\n segments,\n };\n }\n\n return { value: block, segments: [] };\n}\n\nasync function compressAnthropicTextBlock(\n block: unknown,\n role: AnthropicPromptCompressionRole,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<{ value: unknown; segment?: SegmentCompression }> {\n if (\n !isObjectRecord(block) ||\n block.type !== \"text\" ||\n typeof block.text !== \"string\"\n ) {\n return { value: block };\n }\n\n const compressed = await compressTextForRole(\n block.text,\n role,\n usageTap,\n compression,\n signal,\n );\n if (!compressed) {\n return { value: block };\n }\n\n return {\n value: { ...block, text: compressed.text },\n segment: compressed.segment,\n };\n}\n\nasync function compressTextForRole(\n text: string,\n role: AnthropicPromptCompressionRole,\n usageTap: UsageTapClient,\n compression: AnthropicPromptCompressionOptions,\n signal?: AbortSignal,\n): Promise<{ text: string; segment: SegmentCompression } | undefined> {\n if (!text.trim()) {\n return undefined;\n }\n\n const roleOptions = resolveRoleCompressionOptions(compression, role);\n if (!roleOptions) {\n return undefined;\n }\n\n const estimatedTokens = estimatePromptTokens(text);\n if (typeof roleOptions.minTokens === \"number\" && estimatedTokens < roleOptions.minTokens) {\n return undefined;\n }\n\n const result = await usageTap.compressPromptInput<string>(text, {\n provider: roleOptions.provider,\n failOpen: roleOptions.failOpen,\n tokenCompanyModel: roleOptions.tokenCompanyModel,\n tokenCompanyAggressiveness: roleOptions.tokenCompanyAggressiveness,\n tokenCompanyAppId: roleOptions.tokenCompanyAppId,\n signal,\n });\n const compressedText =\n typeof result.compressedInput === \"string\"\n ? result.compressedInput\n : String(result.compressedInput);\n\n return {\n text: compressedText,\n segment: { role, result: { ...result, compressedInput: compressedText } },\n };\n}\n\nfunction normalizePromptCompressionOptions(\n options: boolean | AnthropicPromptCompressionOptions | undefined,\n): AnthropicPromptCompressionOptions | undefined {\n if (!options) {\n return undefined;\n }\n if (options === true) {\n return {};\n }\n if (options.enabled === false) {\n return undefined;\n }\n return options;\n}\n\nfunction resolveEffectivePromptCompressionOptions(\n defaults: AnthropicPromptCompressionOptions | undefined,\n override: boolean | AnthropicPromptCompressionOptions | undefined,\n): AnthropicPromptCompressionOptions | undefined {\n if (override === false) {\n return undefined;\n }\n if (override === undefined) {\n return defaults;\n }\n if (override === true) {\n return defaults ?? {};\n }\n\n const merged: AnthropicPromptCompressionOptions = {\n ...(defaults ?? {}),\n ...override,\n roles: override.roles ?? defaults?.roles,\n };\n return normalizePromptCompressionOptions(merged);\n}\n\nfunction resolveRoleCompressionOptions(\n compression: AnthropicPromptCompressionOptions,\n role: AnthropicPromptCompressionRole,\n): ResolvedRoleCompressionOptions | undefined {\n const hasExplicitRoles = compression.roles !== undefined;\n const setting = compression.roles?.[role];\n\n if (hasExplicitRoles && setting === undefined) {\n return undefined;\n }\n\n if (!hasExplicitRoles && role === \"assistant\") {\n return undefined;\n }\n\n if (setting === false) {\n return undefined;\n }\n\n const roleOptions = typeof setting === \"object\" ? setting : undefined;\n if (roleOptions?.enabled === false) {\n return undefined;\n }\n\n return {\n provider: roleOptions?.provider ?? compression.provider,\n minTokens: roleOptions?.minTokens ?? compression.minTokens,\n failOpen: compression.failOpen,\n tokenCompanyModel: compression.tokenCompanyModel,\n tokenCompanyAggressiveness:\n roleOptions?.tokenCompanyAggressiveness ??\n resolveTokenCompanyAggressiveness(compression, role),\n tokenCompanyAppId: compression.tokenCompanyAppId,\n };\n}\n\nfunction resolveTokenCompanyAggressiveness(\n compression: AnthropicPromptCompressionOptions,\n role: AnthropicPromptCompressionRole,\n): number | undefined {\n if (typeof compression.tokenCompanyAggressiveness === \"number\") {\n return compression.tokenCompanyAggressiveness;\n }\n return compression.tokenCompanyAggressiveness?.[role];\n}\n\nfunction buildPromptCompressionTelemetry(\n segments: SegmentCompression[],\n): PromptCompressionTelemetry | undefined {\n if (!segments.length) {\n return undefined;\n }\n\n const originalCharacters = segments.reduce(\n (sum, segment) => sum + segment.result.originalCharacters,\n 0,\n );\n const compressedCharacters = segments.reduce(\n (sum, segment) => sum + segment.result.compressedCharacters,\n 0,\n );\n const originalTokens = segments.reduce(\n (sum, segment) => sum + segment.result.originalTokens,\n 0,\n );\n const compressedTokens = segments.reduce(\n (sum, segment) => sum + segment.result.compressedTokens,\n 0,\n );\n const savedCharacters = Math.max(0, originalCharacters - compressedCharacters);\n const savedTokens = Math.max(0, originalTokens - compressedTokens);\n const providers = dedupeStrings(segments.map((segment) => segment.result.provider));\n const roles = dedupeStrings(segments.map((segment) => `role:${segment.role}`));\n const techniques = dedupeStrings([\n \"anthropic-wrapper\",\n ...roles,\n ...segments.flatMap((segment) => segment.result.techniques),\n ...(providers.length > 1 ? [\"mixed-providers\"] : []),\n ]);\n\n return {\n provider: segments[0]?.result.provider ?? \"heuristic\",\n originalCharacters,\n compressedCharacters,\n savedCharacters,\n originalTokens,\n compressedTokens,\n savedTokens,\n tokenSavingsRatio: originalTokens > 0 ? savedTokens / originalTokens : 0,\n savingsRatio: originalCharacters > 0 ? savedCharacters / originalCharacters : 0,\n techniques,\n };\n}\n\nfunction promptCompressionRequestOptions(\n withUsage: WithUsageOptions | undefined,\n correlationId: string,\n): PromptCompressionOptions {\n return {\n signal: withUsage?.signal,\n headers: withUsage?.headers,\n retries: withUsage?.retries,\n correlationId,\n };\n}\n\nfunction splitUsageOptions(options: unknown): SplitUsageOptionsResult {\n if (!options || typeof options !== \"object\") {\n return {};\n }\n\n const { usageTap, withUsage, promptCompression, ...rest } = options as {\n usageTap?: Partial<WrapAnthropicContext>;\n withUsage?: WithUsageOptions;\n promptCompression?: boolean | AnthropicPromptCompressionOptions;\n } & Record<string, unknown>;\n\n const requestOptions = Object.keys(rest).length ? cloneRequestOptions(rest) : undefined;\n\n return {\n requestOptions,\n usageContext: usageTap,\n withUsage,\n promptCompression,\n } satisfies SplitUsageOptionsResult;\n}\n\nfunction resolveBeginRequest(\n defaults: Partial<WrapAnthropicContext> | undefined,\n override: Partial<WrapAnthropicContext> | undefined,\n): BeginCallRequest {\n const base = defaults ?? {};\n const current = override ?? {};\n const customerId = current.customerId ?? base.customerId;\n\n if (!customerId) {\n throw new UsageTapError(\n \"USAGETAP_BAD_REQUEST\",\n \"wrapAnthropic requires usageTap.customerId (provide defaultContext or options.usageTap)\",\n );\n }\n\n const tags = mergeTags(base.tags, current.tags);\n const begin: BeginCallRequest = { customerId } satisfies BeginCallRequest;\n\n const requested = current.requested ?? base.requested;\n if (requested) begin.requested = requested;\n\n const feature = current.feature ?? base.feature;\n if (feature) begin.feature = feature;\n\n const idempotency = current.idempotency ?? base.idempotency;\n if (idempotency) begin.idempotency = idempotency;\n\n const idempotencyKey = current.idempotencyKey ?? base.idempotencyKey;\n if (idempotencyKey) begin.idempotencyKey = idempotencyKey;\n\n const customerName = current.customerName ?? base.customerName;\n if (customerName) begin.customerName = customerName;\n\n const customerEmail = current.customerEmail ?? base.customerEmail;\n if (customerEmail) begin.customerEmail = customerEmail;\n\n const stripeCustomerId = current.stripeCustomerId ?? base.stripeCustomerId;\n if (stripeCustomerId) begin.stripeCustomerId = stripeCustomerId;\n\n const holdUsd = current.holdUsd ?? base.holdUsd;\n if (typeof holdUsd === \"number\") begin.holdUsd = holdUsd;\n\n const batch = current.batch ?? base.batch;\n if (typeof batch === \"boolean\") begin.batch = batch;\n\n const pricingMode = current.pricingMode ?? base.pricingMode;\n if (pricingMode) begin.pricingMode = pricingMode;\n\n if (tags?.length) {\n begin.tags = tags;\n }\n\n return begin;\n}\n\nfunction createCallState(\n beginRequest: BeginCallRequest,\n begin: UsageTapSuccessResponse<BeginCallResponseBody>,\n): AnthropicCallState {\n const usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\n const stripeCustomerId =\n typeof begin.data.stripeCustomerId === \"string\"\n ? begin.data.stripeCustomerId\n : typeof beginRequest.stripeCustomerId === \"string\"\n ? beginRequest.stripeCustomerId\n : undefined;\n\n if (stripeCustomerId) {\n usage.stripeCustomerId = stripeCustomerId;\n }\n\n return {\n beginRequest,\n begin,\n usage,\n finalized: false,\n };\n}\n\nfunction createUsageContext(state: AnthropicCallState): WithUsageContext {\n return {\n begin: state.begin,\n setUsage: (usage) => {\n state.usage = { ...state.usage, ...usage };\n },\n setError: (error) => {\n state.error = error;\n },\n };\n}\n\nasync function finalizeCall(\n state: AnthropicCallState,\n usageTap: UsageTapClient,\n options: WithUsageOptions | undefined,\n): Promise<void> {\n if (state.finalized) {\n return;\n }\n state.finalized = true;\n\n await usageTap.endCall(\n {\n callId: state.begin.data.callId,\n customerId: state.beginRequest.customerId,\n feature: state.beginRequest.feature,\n tags: state.beginRequest.tags,\n ...state.usage,\n error: state.error,\n },\n endCallOptions(options, state.begin.correlationId),\n );\n}\n\nfunction beginCallOptions(options: WithUsageOptions | undefined): BeginCallOptions {\n return {\n signal: options?.signal,\n headers: options?.headers,\n retries: options?.retries,\n correlationId: options?.correlationId,\n };\n}\n\nfunction endCallOptions(\n options: WithUsageOptions | undefined,\n correlationId: string,\n): EndCallOptions {\n return {\n signal: options?.signal,\n headers: options?.headers,\n retries: options?.retries,\n correlationId,\n };\n}\n\nfunction inferAnthropicUsage(\n response: unknown,\n fallbackModel: string | undefined,\n ctx: WithUsageContext,\n): void {\n const usage = extractAnthropicUsage(response, fallbackModel);\n if (usage) {\n ctx.setUsage(usage);\n }\n}\n\nfunction extractAnthropicUsage(\n payload: unknown,\n fallbackModel: string | undefined,\n): Partial<Omit<EndCallRequest, \"callId\" | \"error\">> | undefined {\n if (!isObjectRecord(payload)) {\n return fallbackModel ? { modelUsed: fallbackModel } : undefined;\n }\n\n const usage = findAnthropicUsageRecord(payload);\n const result: Partial<Omit<EndCallRequest, \"callId\" | \"error\">> = {};\n const model = readString(payload.model) ?? readString((payload.message as Record<string, unknown> | undefined)?.model) ?? fallbackModel;\n if (model) {\n result.modelUsed = model;\n }\n\n if (usage) {\n applyAnthropicUsageRecord(result, usage);\n }\n\n return Object.keys(result).length ? result : undefined;\n}\n\nfunction findAnthropicUsageRecord(payload: Record<PropertyKey, unknown>): Record<PropertyKey, unknown> | undefined {\n if (isObjectRecord(payload.usage)) {\n return payload.usage;\n }\n\n if (isObjectRecord(payload.message) && isObjectRecord(payload.message.usage)) {\n return payload.message.usage;\n }\n\n return undefined;\n}\n\nfunction applyAnthropicUsageRecord(\n usage: Partial<Omit<EndCallRequest, \"callId\" | \"error\">>,\n usageRecord: Record<PropertyKey, unknown>,\n): void {\n const inputTokens = readNumber(usageRecord.input_tokens ?? usageRecord.prompt_tokens);\n if (inputTokens !== undefined) {\n usage.inputTokens = inputTokens;\n }\n\n const outputTokens = readNumber(usageRecord.output_tokens ?? usageRecord.completion_tokens);\n if (outputTokens !== undefined) {\n usage.responseTokens = outputTokens;\n }\n\n const cachedInputTokens = readNumber(\n usageRecord.cache_read_input_tokens ??\n usageRecord.prompt_cache_hit_tokens ??\n usageRecord.cached_tokens,\n );\n if (cachedInputTokens !== undefined) {\n usage.cachedInputTokens = cachedInputTokens;\n }\n}\n\nfunction accumulateAnthropicStreamUsage(\n chunk: unknown,\n fallbackModel: string | undefined,\n state: AnthropicCallState,\n): void {\n const usage = extractAnthropicUsage(chunk, fallbackModel);\n if (usage) {\n state.usage = { ...state.usage, ...usage };\n }\n}\n\nfunction wrapAnthropicStreamForUsageTap<TStream>(\n source: UsageTapStream<TStream> | AsyncIterable<TStream>,\n state: AnthropicCallState,\n usageTap: UsageTapClient,\n options: WithUsageOptions | undefined,\n fallbackModel: string | undefined,\n): AsyncIterable<TStream> & { __usageTapFinalize: () => Promise<void> } {\n const getIterator = source[Symbol.asyncIterator];\n if (typeof getIterator !== \"function\") {\n throw new TypeError(\"Stream is not async iterable\");\n }\n\n const iterator = getIterator.call(source) as AsyncIterator<TStream>;\n\n const invokeFinalize = async (error?: unknown): Promise<void> => {\n if (error && !state.error) {\n state.error = {\n code: options?.defaultErrorCode ?? \"VENDOR_ERROR\",\n message: error instanceof Error ? error.message : String(error),\n };\n }\n await finalizeCall(state, usageTap, options);\n };\n\n const prototype = (Object.getPrototypeOf(source as object) as object | null) ?? Object.prototype;\n const wrapped = Object.create(prototype) as unknown as UsageTapIterableIterator<TStream>;\n\n for (const key of Reflect.ownKeys(source as object)) {\n try {\n const descriptor = Object.getOwnPropertyDescriptor(source as object, key);\n if (descriptor) {\n Object.defineProperty(wrapped, key, descriptor);\n }\n } catch {\n /* ignore non-configurable properties */\n }\n }\n\n Object.defineProperty(wrapped, Symbol.asyncIterator, {\n value(): UsageTapIterableIterator<TStream> {\n return this as UsageTapIterableIterator<TStream>;\n },\n configurable: true,\n });\n\n Object.defineProperty(wrapped, \"next\", {\n value: async (...args: Parameters<AsyncIterator<TStream>[\"next\"]>): Promise<IteratorResult<TStream>> => {\n try {\n const result = await iterator.next(...args);\n if (result.value !== undefined) {\n accumulateAnthropicStreamUsage(result.value, fallbackModel, state);\n }\n if (result.done) {\n await invokeFinalize();\n }\n return result;\n } catch (error) {\n await invokeFinalize(error).catch(() => undefined);\n throw error;\n }\n },\n configurable: true,\n writable: true,\n });\n\n Object.defineProperty(wrapped, \"return\", {\n value: async (value?: TStream): Promise<IteratorResult<TStream>> => {\n if (typeof iterator.return === \"function\") {\n const rawResult: unknown = await iterator.return(value);\n if (!isIteratorResult<TStream>(rawResult)) {\n throw new TypeError(\"Iterator.return() returned an invalid result\");\n }\n await invokeFinalize();\n return rawResult;\n }\n await invokeFinalize();\n return { done: true, value } as IteratorResult<TStream>;\n },\n configurable: true,\n writable: true,\n });\n\n Object.defineProperty(wrapped, \"throw\", {\n value: async (error?: unknown): Promise<IteratorResult<TStream>> => {\n if (typeof iterator.throw === \"function\") {\n const rawResult: unknown = await iterator.throw(error);\n if (!isIteratorResult<TStream>(rawResult)) {\n throw new TypeError(\"Iterator.throw() returned an invalid result\");\n }\n await invokeFinalize(error);\n return rawResult;\n }\n await invokeFinalize(error);\n throw error;\n },\n configurable: true,\n writable: true,\n });\n\n Object.defineProperty(wrapped, \"__usageTapFinalize\", {\n value: async (): Promise<void> => {\n await invokeFinalize();\n },\n configurable: true,\n });\n\n return wrapped;\n}\n\nfunction applyAnthropicVendorHints(\n params: AnthropicMessagesCreateParams,\n hints: VendorHints | undefined,\n): AnthropicMessagesCreateParams {\n if (!hints) {\n return params;\n }\n\n const next = cloneRecord(params);\n\n if (hints.preferredModel && (next.model === undefined || next.model === null)) {\n next.model = hints.preferredModel;\n }\n\n if (typeof hints.maxResponseTokens === \"number\" && next.max_tokens == null) {\n next.max_tokens = hints.maxResponseTokens;\n }\n\n return next;\n}\n\nfunction attachCorrelationHeader(\n options: Record<string, unknown> | undefined,\n correlationId: string,\n): Record<string, unknown> | undefined {\n const normalized = normalizeHeaders(options?.headers);\n\n if (correlationId && !normalized[USAGETAP_CORRELATION_HEADER]) {\n normalized[USAGETAP_CORRELATION_HEADER] = correlationId;\n }\n\n if (!options) {\n return Object.keys(normalized).length\n ? ({ headers: normalized } satisfies Record<string, unknown>)\n : undefined;\n }\n\n const next = { ...options } satisfies Record<string, unknown>;\n if (Object.keys(normalized).length) {\n next.headers = normalized;\n }\n return next;\n}\n\nfunction cloneRequestOptions(source: Record<string, unknown>): Record<string, unknown> {\n const clone: Record<string, unknown> = { ...source };\n\n if (\"headers\" in clone) {\n clone.headers = normalizeHeaders((clone as { headers?: unknown }).headers);\n }\n\n return clone;\n}\n\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\n if (!headers) {\n return {};\n }\n\n if (headers instanceof Headers) {\n const result: Record<string, string> = {};\n headers.forEach((value, key) => {\n result[key.toLowerCase()] = value;\n });\n return result;\n }\n\n if (Array.isArray(headers)) {\n const result: Record<string, string> = {};\n for (const entry of headers) {\n if (!isStringTuple(entry)) {\n continue;\n }\n const [key, value] = entry;\n result[key.toLowerCase()] = value;\n }\n return result;\n }\n\n if (isObjectRecord(headers)) {\n const result: Record<string, string> = {};\n const record = headers as Record<string, unknown>;\n for (const key of Object.keys(record)) {\n const value = record[key];\n if (value !== undefined && value !== null) {\n result[key.toLowerCase()] = String(value);\n }\n }\n return result;\n }\n\n return {};\n}\n\nfunction mapAnthropicMessageRole(role: unknown): AnthropicPromptCompressionRole | undefined {\n if (role === \"user\") {\n return \"user\";\n }\n if (role === \"assistant\") {\n return \"assistant\";\n }\n return undefined;\n}\n\nfunction isObjectRecord(value: unknown): value is Record<PropertyKey, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction cloneRecord(value: unknown): Record<string, unknown> {\n return isObjectRecord(value) ? { ...(value as Record<string, unknown>) } : {};\n}\n\nfunction isStringTuple(value: unknown): value is [string, string] {\n return Array.isArray(value) && value.length >= 2 && typeof value[0] === \"string\" && typeof value[1] === \"string\";\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\n\nfunction mergeTags(a?: string[], b?: string[]): string[] | undefined {\n const values = [...(a ?? []), ...(b ?? [])]\n .map((value) => (typeof value === \"string\" ? value.trim() : \"\"))\n .filter(Boolean);\n\n if (!values.length) {\n return undefined;\n }\n\n return dedupeStrings(values);\n}\n\nfunction dedupeStrings(values: string[]): string[] {\n return Array.from(new Set(values));\n}\n\nfunction isStreamingRequest(params: unknown): boolean {\n if (!params || typeof params !== \"object\") {\n return false;\n }\n\n const stream = (params as { stream?: unknown }).stream;\n if (typeof stream === \"boolean\") {\n return stream;\n }\n\n return stream != null;\n}\n\nfunction ensureAsyncIterable(value: unknown, label: string): asserts value is AsyncIterable<unknown> {\n if (!value || typeof value !== \"object\" || typeof (value as AsyncIterable<unknown>)[Symbol.asyncIterator] !== \"function\") {\n throw new UsageTapError(\n \"USAGETAP_BAD_REQUEST\",\n `${label} expected an async iterable stream but received ${typeof value}`,\n );\n }\n}\n\nfunction isIteratorResult<T>(value: unknown): value is IteratorResult<T> {\n return isObjectRecord(value) && \"done\" in value;\n}\n"]}
|
|
@@ -81,6 +81,26 @@ interface VendorHints {
|
|
|
81
81
|
maxInputTokens?: number;
|
|
82
82
|
maxResponseTokens?: number;
|
|
83
83
|
}
|
|
84
|
+
interface PromptCompressionRequest {
|
|
85
|
+
callId: string;
|
|
86
|
+
input: unknown;
|
|
87
|
+
provider?: "heuristic" | "toon" | "thetokencompany";
|
|
88
|
+
tokenCompanyModel?: string;
|
|
89
|
+
tokenCompanyAggressiveness?: number;
|
|
90
|
+
tokenCompanyAppId?: string;
|
|
91
|
+
}
|
|
92
|
+
interface PromptCompressionTelemetry {
|
|
93
|
+
provider: "heuristic" | "toon" | "thetokencompany";
|
|
94
|
+
originalCharacters: number;
|
|
95
|
+
compressedCharacters: number;
|
|
96
|
+
savedCharacters: number;
|
|
97
|
+
originalTokens?: number;
|
|
98
|
+
compressedTokens?: number;
|
|
99
|
+
savedTokens?: number;
|
|
100
|
+
tokenSavingsRatio?: number;
|
|
101
|
+
savingsRatio: number;
|
|
102
|
+
techniques: string[];
|
|
103
|
+
}
|
|
84
104
|
interface BeginCallRequest {
|
|
85
105
|
customerId: string;
|
|
86
106
|
requested?: RequestedEntitlements;
|
|
@@ -309,18 +329,47 @@ interface UsageTapClientOptions {
|
|
|
309
329
|
* Allow constructing the client in browser-like environments for testing.
|
|
310
330
|
*/
|
|
311
331
|
allowBrowser?: boolean;
|
|
332
|
+
/** API key for The Token Company Bear compression API. */
|
|
333
|
+
tokenCompanyApiKey?: string;
|
|
334
|
+
/** Override endpoint for The Token Company compatible compression APIs. */
|
|
335
|
+
tokenCompanyEndpoint?: string;
|
|
336
|
+
/** Default model for The Token Company compression. */
|
|
337
|
+
tokenCompanyModel?: string;
|
|
338
|
+
/** Default aggressiveness for The Token Company compression, from 0.0 to 1.0. */
|
|
339
|
+
tokenCompanyAggressiveness?: number;
|
|
340
|
+
/** Optional application identifier sent to The Token Company. */
|
|
341
|
+
tokenCompanyAppId?: string;
|
|
312
342
|
}
|
|
313
343
|
interface RequestOptions {
|
|
314
344
|
signal?: AbortSignal;
|
|
315
345
|
headers?: Record<string, string>;
|
|
316
346
|
retries?: RetryOptions;
|
|
317
347
|
}
|
|
348
|
+
interface PromptCompressionStandaloneOptions {
|
|
349
|
+
signal?: AbortSignal;
|
|
350
|
+
provider?: "heuristic" | "toon" | "thetokencompany";
|
|
351
|
+
failOpen?: boolean;
|
|
352
|
+
tokenCompanyModel?: string;
|
|
353
|
+
tokenCompanyAggressiveness?: number;
|
|
354
|
+
tokenCompanyAppId?: string;
|
|
355
|
+
}
|
|
356
|
+
interface RecordPromptCompressionRequest {
|
|
357
|
+
callId: string;
|
|
358
|
+
promptCompression: PromptCompressionTelemetry;
|
|
359
|
+
}
|
|
318
360
|
interface BeginCallOptions extends RequestOptions {
|
|
319
361
|
correlationId?: string;
|
|
320
362
|
}
|
|
321
363
|
interface EndCallOptions extends RequestOptions {
|
|
322
364
|
correlationId?: string;
|
|
323
365
|
}
|
|
366
|
+
interface PromptCompressionOptions extends RequestOptions {
|
|
367
|
+
correlationId?: string;
|
|
368
|
+
}
|
|
369
|
+
interface PromptCompressionResponseBody extends PromptCompressionTelemetry {
|
|
370
|
+
callId: string;
|
|
371
|
+
updated: boolean;
|
|
372
|
+
}
|
|
324
373
|
interface WithUsageContext {
|
|
325
374
|
begin: UsageTapSuccessResponse<BeginCallResponseBody>;
|
|
326
375
|
setUsage: (usage: Partial<Omit<EndCallRequest, "callId" | "error">>) => void;
|
|
@@ -443,6 +492,40 @@ interface UsageMetricEvent {
|
|
|
443
492
|
correlationId?: string;
|
|
444
493
|
}
|
|
445
494
|
|
|
495
|
+
type PromptCompressionProvider = "heuristic" | "toon" | "thetokencompany";
|
|
496
|
+
interface PromptCompressionInput {
|
|
497
|
+
input: unknown;
|
|
498
|
+
provider?: PromptCompressionProvider;
|
|
499
|
+
tokenCompanyApiKey?: string;
|
|
500
|
+
tokenCompanyEndpoint?: string;
|
|
501
|
+
tokenCompanyModel?: string;
|
|
502
|
+
tokenCompanyAggressiveness?: number;
|
|
503
|
+
tokenCompanyAppId?: string;
|
|
504
|
+
fetchImpl?: typeof fetch;
|
|
505
|
+
signal?: AbortSignal;
|
|
506
|
+
failOpen?: boolean;
|
|
507
|
+
}
|
|
508
|
+
interface PromptCompressionResult<TInput = unknown> {
|
|
509
|
+
input: TInput;
|
|
510
|
+
compressedInput: unknown;
|
|
511
|
+
provider: PromptCompressionProvider;
|
|
512
|
+
originalCharacters: number;
|
|
513
|
+
compressedCharacters: number;
|
|
514
|
+
savedCharacters: number;
|
|
515
|
+
originalTokens: number;
|
|
516
|
+
compressedTokens: number;
|
|
517
|
+
savedTokens: number;
|
|
518
|
+
tokenSavingsRatio: number;
|
|
519
|
+
savingsRatio: number;
|
|
520
|
+
techniques: string[];
|
|
521
|
+
}
|
|
522
|
+
declare function protectPromptText(text: string): string;
|
|
523
|
+
declare const protect: typeof protectPromptText;
|
|
524
|
+
declare function compressPrompt<TInput = unknown>(options: PromptCompressionInput): Promise<PromptCompressionResult<TInput>>;
|
|
525
|
+
declare function compressPromptHeuristic<TInput = unknown>(input: TInput): PromptCompressionResult<TInput>;
|
|
526
|
+
declare function compressPromptToon<TInput = unknown>(input: TInput): PromptCompressionResult<TInput>;
|
|
527
|
+
declare function estimatePromptTokens(input: unknown): number;
|
|
528
|
+
|
|
446
529
|
declare class UsageTapClient {
|
|
447
530
|
private readonly apiKey;
|
|
448
531
|
private readonly baseUrl;
|
|
@@ -456,14 +539,25 @@ declare class UsageTapClient {
|
|
|
456
539
|
private readonly metricFn?;
|
|
457
540
|
private readonly authHeader;
|
|
458
541
|
private readonly autoIdempotency;
|
|
542
|
+
private readonly tokenCompanyApiKey?;
|
|
543
|
+
private readonly tokenCompanyEndpoint?;
|
|
544
|
+
private readonly tokenCompanyModel?;
|
|
545
|
+
private readonly tokenCompanyAggressiveness?;
|
|
546
|
+
private readonly tokenCompanyAppId?;
|
|
459
547
|
constructor(options: UsageTapClientOptions);
|
|
460
548
|
beginCall(request: BeginCallRequest, options?: BeginCallOptions): Promise<UsageTapSuccessResponse<BeginCallResponseBody>>;
|
|
549
|
+
promptCompress(request: PromptCompressionRequest, options?: PromptCompressionOptions): Promise<PromptCompressionResult & {
|
|
550
|
+
callId: string;
|
|
551
|
+
}>;
|
|
552
|
+
compressPromptInput<TInput = unknown>(input: TInput, options?: PromptCompressionStandaloneOptions): Promise<PromptCompressionResult<TInput>>;
|
|
553
|
+
recordPromptCompression(request: RecordPromptCompressionRequest, options?: PromptCompressionOptions): Promise<UsageTapSuccessResponse<PromptCompressionResponseBody>>;
|
|
461
554
|
endCall(request: EndCallRequest, options?: EndCallOptions): Promise<UsageTapSuccessResponse<EndCallResponseBody>>;
|
|
462
555
|
checkUsage(request: CheckUsageRequest, options?: CheckUsageOptions): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>>;
|
|
463
556
|
createCustomer(request: CreateCustomerRequest, options?: CreateCustomerOptions): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>>;
|
|
464
557
|
changePlan(request: ChangePlanRequest, options?: ChangePlanOptions): Promise<UsageTapSuccessResponse<ChangePlanResponseBody>>;
|
|
465
558
|
incrementCustomMeter(request: IncrementCustomMeterRequest, options?: IncrementCustomMeterOptions): Promise<UsageTapSuccessResponse<IncrementCustomMeterResponseBody>>;
|
|
466
559
|
withUsage<T>(beginRequest: BeginCallRequest, handler: (context: WithUsageContext) => Promise<T>, options?: WithUsageOptions): Promise<T>;
|
|
560
|
+
private toPromptCompressionTelemetry;
|
|
467
561
|
private request;
|
|
468
562
|
private requestGet;
|
|
469
563
|
private performFetch;
|
|
@@ -476,4 +570,4 @@ declare class UsageTapClient {
|
|
|
476
570
|
private toApiError;
|
|
477
571
|
}
|
|
478
572
|
|
|
479
|
-
export { type
|
|
573
|
+
export { type RetryOptions as $, type IncrementCustomMeterResponseBody as A, type BeginCallRequest as B, type CreateCustomerOptions as C, type CustomMeterSlot as D, type EndCallRequest as E, type EndCallOptions as F, type EndCallResponseBody as G, type BalanceSummary as H, type IncrementCustomMeterOptions as I, type SpendVelocityWindow as J, type SpendVelocityWindowKey as K, type EntitlementHints as L, type PlanSummary as M, type MeterSummary as N, type MeterSnapshot as O, type PromptCompressionProvider as P, type MeteredUsage as Q, type RecordPromptCompressionRequest as R, type SpendVelocitySnapshot as S, type RateLimitsSnapshot as T, UsageTapClient as U, type VendorHints as V, type WithUsageOptions as W, type RemainingRatios as X, type RollingCallsRateLimitState as Y, type RequestedEntitlements as Z, type AllowedEntitlements as _, type PromptCompressionTelemetry as a, type UsageTapClientOptions as a0, type UsageTapErrorResponse as a1, type UsageTapResultEnvelope as a2, type UsageTapResultStatus as a3, type UsageTapLogEntry as a4, type WithUsageContext as a5, type LimitType as a6, type SubscriptionSnapshot as a7, type ModelHints as a8, type IdempotencyMetadata as a9, type UsageMetricEvent as aa, type UsageTapSuccessResponse as b, type BeginCallResponseBody as c, compressPrompt as d, compressPromptHeuristic as e, compressPromptToon as f, estimatePromptTokens as g, protectPromptText as h, type PromptCompressionInput as i, type PromptCompressionResult as j, type BeginCallOptions as k, type PromptCompressionRequest as l, type PromptCompressionOptions as m, type PromptCompressionResponseBody as n, type PromptCompressionStandaloneOptions as o, protect as p, type CreateCustomerRequest as q, type CreateCustomerResponseBody as r, type CheckUsageOptions as s, type CheckUsageRequest as t, type CheckUsageResponseBody as u, type ChangePlanOptions as v, type ChangePlanRequest as w, type ChangePlanResponseBody as x, type ChangePlanStrategy as y, type IncrementCustomMeterRequest as z };
|
|
@@ -81,6 +81,26 @@ interface VendorHints {
|
|
|
81
81
|
maxInputTokens?: number;
|
|
82
82
|
maxResponseTokens?: number;
|
|
83
83
|
}
|
|
84
|
+
interface PromptCompressionRequest {
|
|
85
|
+
callId: string;
|
|
86
|
+
input: unknown;
|
|
87
|
+
provider?: "heuristic" | "toon" | "thetokencompany";
|
|
88
|
+
tokenCompanyModel?: string;
|
|
89
|
+
tokenCompanyAggressiveness?: number;
|
|
90
|
+
tokenCompanyAppId?: string;
|
|
91
|
+
}
|
|
92
|
+
interface PromptCompressionTelemetry {
|
|
93
|
+
provider: "heuristic" | "toon" | "thetokencompany";
|
|
94
|
+
originalCharacters: number;
|
|
95
|
+
compressedCharacters: number;
|
|
96
|
+
savedCharacters: number;
|
|
97
|
+
originalTokens?: number;
|
|
98
|
+
compressedTokens?: number;
|
|
99
|
+
savedTokens?: number;
|
|
100
|
+
tokenSavingsRatio?: number;
|
|
101
|
+
savingsRatio: number;
|
|
102
|
+
techniques: string[];
|
|
103
|
+
}
|
|
84
104
|
interface BeginCallRequest {
|
|
85
105
|
customerId: string;
|
|
86
106
|
requested?: RequestedEntitlements;
|
|
@@ -309,18 +329,47 @@ interface UsageTapClientOptions {
|
|
|
309
329
|
* Allow constructing the client in browser-like environments for testing.
|
|
310
330
|
*/
|
|
311
331
|
allowBrowser?: boolean;
|
|
332
|
+
/** API key for The Token Company Bear compression API. */
|
|
333
|
+
tokenCompanyApiKey?: string;
|
|
334
|
+
/** Override endpoint for The Token Company compatible compression APIs. */
|
|
335
|
+
tokenCompanyEndpoint?: string;
|
|
336
|
+
/** Default model for The Token Company compression. */
|
|
337
|
+
tokenCompanyModel?: string;
|
|
338
|
+
/** Default aggressiveness for The Token Company compression, from 0.0 to 1.0. */
|
|
339
|
+
tokenCompanyAggressiveness?: number;
|
|
340
|
+
/** Optional application identifier sent to The Token Company. */
|
|
341
|
+
tokenCompanyAppId?: string;
|
|
312
342
|
}
|
|
313
343
|
interface RequestOptions {
|
|
314
344
|
signal?: AbortSignal;
|
|
315
345
|
headers?: Record<string, string>;
|
|
316
346
|
retries?: RetryOptions;
|
|
317
347
|
}
|
|
348
|
+
interface PromptCompressionStandaloneOptions {
|
|
349
|
+
signal?: AbortSignal;
|
|
350
|
+
provider?: "heuristic" | "toon" | "thetokencompany";
|
|
351
|
+
failOpen?: boolean;
|
|
352
|
+
tokenCompanyModel?: string;
|
|
353
|
+
tokenCompanyAggressiveness?: number;
|
|
354
|
+
tokenCompanyAppId?: string;
|
|
355
|
+
}
|
|
356
|
+
interface RecordPromptCompressionRequest {
|
|
357
|
+
callId: string;
|
|
358
|
+
promptCompression: PromptCompressionTelemetry;
|
|
359
|
+
}
|
|
318
360
|
interface BeginCallOptions extends RequestOptions {
|
|
319
361
|
correlationId?: string;
|
|
320
362
|
}
|
|
321
363
|
interface EndCallOptions extends RequestOptions {
|
|
322
364
|
correlationId?: string;
|
|
323
365
|
}
|
|
366
|
+
interface PromptCompressionOptions extends RequestOptions {
|
|
367
|
+
correlationId?: string;
|
|
368
|
+
}
|
|
369
|
+
interface PromptCompressionResponseBody extends PromptCompressionTelemetry {
|
|
370
|
+
callId: string;
|
|
371
|
+
updated: boolean;
|
|
372
|
+
}
|
|
324
373
|
interface WithUsageContext {
|
|
325
374
|
begin: UsageTapSuccessResponse<BeginCallResponseBody>;
|
|
326
375
|
setUsage: (usage: Partial<Omit<EndCallRequest, "callId" | "error">>) => void;
|
|
@@ -443,6 +492,40 @@ interface UsageMetricEvent {
|
|
|
443
492
|
correlationId?: string;
|
|
444
493
|
}
|
|
445
494
|
|
|
495
|
+
type PromptCompressionProvider = "heuristic" | "toon" | "thetokencompany";
|
|
496
|
+
interface PromptCompressionInput {
|
|
497
|
+
input: unknown;
|
|
498
|
+
provider?: PromptCompressionProvider;
|
|
499
|
+
tokenCompanyApiKey?: string;
|
|
500
|
+
tokenCompanyEndpoint?: string;
|
|
501
|
+
tokenCompanyModel?: string;
|
|
502
|
+
tokenCompanyAggressiveness?: number;
|
|
503
|
+
tokenCompanyAppId?: string;
|
|
504
|
+
fetchImpl?: typeof fetch;
|
|
505
|
+
signal?: AbortSignal;
|
|
506
|
+
failOpen?: boolean;
|
|
507
|
+
}
|
|
508
|
+
interface PromptCompressionResult<TInput = unknown> {
|
|
509
|
+
input: TInput;
|
|
510
|
+
compressedInput: unknown;
|
|
511
|
+
provider: PromptCompressionProvider;
|
|
512
|
+
originalCharacters: number;
|
|
513
|
+
compressedCharacters: number;
|
|
514
|
+
savedCharacters: number;
|
|
515
|
+
originalTokens: number;
|
|
516
|
+
compressedTokens: number;
|
|
517
|
+
savedTokens: number;
|
|
518
|
+
tokenSavingsRatio: number;
|
|
519
|
+
savingsRatio: number;
|
|
520
|
+
techniques: string[];
|
|
521
|
+
}
|
|
522
|
+
declare function protectPromptText(text: string): string;
|
|
523
|
+
declare const protect: typeof protectPromptText;
|
|
524
|
+
declare function compressPrompt<TInput = unknown>(options: PromptCompressionInput): Promise<PromptCompressionResult<TInput>>;
|
|
525
|
+
declare function compressPromptHeuristic<TInput = unknown>(input: TInput): PromptCompressionResult<TInput>;
|
|
526
|
+
declare function compressPromptToon<TInput = unknown>(input: TInput): PromptCompressionResult<TInput>;
|
|
527
|
+
declare function estimatePromptTokens(input: unknown): number;
|
|
528
|
+
|
|
446
529
|
declare class UsageTapClient {
|
|
447
530
|
private readonly apiKey;
|
|
448
531
|
private readonly baseUrl;
|
|
@@ -456,14 +539,25 @@ declare class UsageTapClient {
|
|
|
456
539
|
private readonly metricFn?;
|
|
457
540
|
private readonly authHeader;
|
|
458
541
|
private readonly autoIdempotency;
|
|
542
|
+
private readonly tokenCompanyApiKey?;
|
|
543
|
+
private readonly tokenCompanyEndpoint?;
|
|
544
|
+
private readonly tokenCompanyModel?;
|
|
545
|
+
private readonly tokenCompanyAggressiveness?;
|
|
546
|
+
private readonly tokenCompanyAppId?;
|
|
459
547
|
constructor(options: UsageTapClientOptions);
|
|
460
548
|
beginCall(request: BeginCallRequest, options?: BeginCallOptions): Promise<UsageTapSuccessResponse<BeginCallResponseBody>>;
|
|
549
|
+
promptCompress(request: PromptCompressionRequest, options?: PromptCompressionOptions): Promise<PromptCompressionResult & {
|
|
550
|
+
callId: string;
|
|
551
|
+
}>;
|
|
552
|
+
compressPromptInput<TInput = unknown>(input: TInput, options?: PromptCompressionStandaloneOptions): Promise<PromptCompressionResult<TInput>>;
|
|
553
|
+
recordPromptCompression(request: RecordPromptCompressionRequest, options?: PromptCompressionOptions): Promise<UsageTapSuccessResponse<PromptCompressionResponseBody>>;
|
|
461
554
|
endCall(request: EndCallRequest, options?: EndCallOptions): Promise<UsageTapSuccessResponse<EndCallResponseBody>>;
|
|
462
555
|
checkUsage(request: CheckUsageRequest, options?: CheckUsageOptions): Promise<UsageTapSuccessResponse<CheckUsageResponseBody>>;
|
|
463
556
|
createCustomer(request: CreateCustomerRequest, options?: CreateCustomerOptions): Promise<UsageTapSuccessResponse<CreateCustomerResponseBody>>;
|
|
464
557
|
changePlan(request: ChangePlanRequest, options?: ChangePlanOptions): Promise<UsageTapSuccessResponse<ChangePlanResponseBody>>;
|
|
465
558
|
incrementCustomMeter(request: IncrementCustomMeterRequest, options?: IncrementCustomMeterOptions): Promise<UsageTapSuccessResponse<IncrementCustomMeterResponseBody>>;
|
|
466
559
|
withUsage<T>(beginRequest: BeginCallRequest, handler: (context: WithUsageContext) => Promise<T>, options?: WithUsageOptions): Promise<T>;
|
|
560
|
+
private toPromptCompressionTelemetry;
|
|
467
561
|
private request;
|
|
468
562
|
private requestGet;
|
|
469
563
|
private performFetch;
|
|
@@ -476,4 +570,4 @@ declare class UsageTapClient {
|
|
|
476
570
|
private toApiError;
|
|
477
571
|
}
|
|
478
572
|
|
|
479
|
-
export { type
|
|
573
|
+
export { type RetryOptions as $, type IncrementCustomMeterResponseBody as A, type BeginCallRequest as B, type CreateCustomerOptions as C, type CustomMeterSlot as D, type EndCallRequest as E, type EndCallOptions as F, type EndCallResponseBody as G, type BalanceSummary as H, type IncrementCustomMeterOptions as I, type SpendVelocityWindow as J, type SpendVelocityWindowKey as K, type EntitlementHints as L, type PlanSummary as M, type MeterSummary as N, type MeterSnapshot as O, type PromptCompressionProvider as P, type MeteredUsage as Q, type RecordPromptCompressionRequest as R, type SpendVelocitySnapshot as S, type RateLimitsSnapshot as T, UsageTapClient as U, type VendorHints as V, type WithUsageOptions as W, type RemainingRatios as X, type RollingCallsRateLimitState as Y, type RequestedEntitlements as Z, type AllowedEntitlements as _, type PromptCompressionTelemetry as a, type UsageTapClientOptions as a0, type UsageTapErrorResponse as a1, type UsageTapResultEnvelope as a2, type UsageTapResultStatus as a3, type UsageTapLogEntry as a4, type WithUsageContext as a5, type LimitType as a6, type SubscriptionSnapshot as a7, type ModelHints as a8, type IdempotencyMetadata as a9, type UsageMetricEvent as aa, type UsageTapSuccessResponse as b, type BeginCallResponseBody as c, compressPrompt as d, compressPromptHeuristic as e, compressPromptToon as f, estimatePromptTokens as g, protectPromptText as h, type PromptCompressionInput as i, type PromptCompressionResult as j, type BeginCallOptions as k, type PromptCompressionRequest as l, type PromptCompressionOptions as m, type PromptCompressionResponseBody as n, type PromptCompressionStandaloneOptions as o, protect as p, type CreateCustomerRequest as q, type CreateCustomerResponseBody as r, type CheckUsageOptions as s, type CheckUsageRequest as t, type CheckUsageResponseBody as u, type ChangePlanOptions as v, type ChangePlanRequest as w, type ChangePlanResponseBody as x, type ChangePlanStrategy as y, type IncrementCustomMeterRequest as z };
|