headroom-ai 0.40.0 → 0.41.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 CHANGED
@@ -279,8 +279,16 @@ const hints = await client.feedback.getHints('list_servers');
279
279
  // TOIN (Tool Output Intelligence Network)
280
280
  const toinStats = await client.toin.getStats();
281
281
  const patterns = await client.toin.getPatterns(20);
282
+ const pattern = patterns[0] && await client.toin.getPattern(patterns[0].hash);
282
283
  ```
283
284
 
285
+ Each `hash` is the complete scoped aggregation key, including tenant, auth mode,
286
+ model family, and tool signature. Pass it back unchanged for an exact lookup;
287
+ the client URL-encodes it. Shorter aggregation-key prefixes are accepted only
288
+ when they identify one pattern; ambiguous prefixes return HTTP 409 rather than
289
+ an arbitrary pattern.
290
+
291
+
284
292
  ## Configuration Types
285
293
 
286
294
  Full TypeScript interfaces for every Python config dataclass.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkN7HYJMEN_cjs = require('../chunk-N7HYJMEN.cjs');
3
+ var chunkW6AXXD2B_cjs = require('../chunk-W6AXXD2B.cjs');
4
4
 
5
5
  // src/adapters/anthropic.ts
6
6
  function withHeadroom(client, options = {}) {
@@ -8,13 +8,13 @@ function withHeadroom(client, options = {}) {
8
8
  const compressedCreate = async (params) => {
9
9
  const messages = params.messages;
10
10
  const model = options.model ?? params.model ?? "claude-sonnet-4-5-20250929";
11
- const openaiMessages = chunkN7HYJMEN_cjs.anthropicToOpenAI(messages);
12
- const result = await chunkN7HYJMEN_cjs.compress(openaiMessages, {
11
+ const openaiMessages = chunkW6AXXD2B_cjs.anthropicToOpenAI(messages);
12
+ const result = await chunkW6AXXD2B_cjs.compress(openaiMessages, {
13
13
  stack: "adapter_ts_anthropic",
14
14
  ...options,
15
15
  model
16
16
  });
17
- const anthropicMessages = result.compressed ? chunkN7HYJMEN_cjs.openAIToAnthropic(result.messages) : messages;
17
+ const anthropicMessages = result.compressed ? chunkW6AXXD2B_cjs.openAIToAnthropic(result.messages) : messages;
18
18
  return originalCreate({
19
19
  ...params,
20
20
  messages: anthropicMessages
@@ -1,4 +1,4 @@
1
- import { anthropicToOpenAI, compress, openAIToAnthropic } from '../chunk-FJQ65W3R.js';
1
+ import { anthropicToOpenAI, compress, openAIToAnthropic } from '../chunk-WKB3ITLL.js';
2
2
 
3
3
  // src/adapters/anthropic.ts
4
4
  function withHeadroom(client, options = {}) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkN7HYJMEN_cjs = require('../chunk-N7HYJMEN.cjs');
3
+ var chunkW6AXXD2B_cjs = require('../chunk-W6AXXD2B.cjs');
4
4
 
5
5
  // src/adapters/gemini.ts
6
6
  function withHeadroom(model, options = {}) {
@@ -9,7 +9,7 @@ function withHeadroom(model, options = {}) {
9
9
  const compressedGenerate = async (params) => {
10
10
  const contents = params.contents ?? params;
11
11
  const modelName = options.model ?? "gemini-2.0-flash";
12
- const result = await chunkN7HYJMEN_cjs.compress(
12
+ const result = await chunkW6AXXD2B_cjs.compress(
13
13
  Array.isArray(contents) ? contents : [contents],
14
14
  { stack: "adapter_ts_gemini", ...options, model: modelName }
15
15
  );
@@ -19,7 +19,7 @@ function withHeadroom(model, options = {}) {
19
19
  const compressedStream = originalStream ? async (params) => {
20
20
  const contents = params.contents ?? params;
21
21
  const modelName = options.model ?? "gemini-2.0-flash";
22
- const result = await chunkN7HYJMEN_cjs.compress(
22
+ const result = await chunkW6AXXD2B_cjs.compress(
23
23
  Array.isArray(contents) ? contents : [contents],
24
24
  { stack: "adapter_ts_gemini", ...options, model: modelName }
25
25
  );
@@ -1,4 +1,4 @@
1
- import { compress } from '../chunk-FJQ65W3R.js';
1
+ import { compress } from '../chunk-WKB3ITLL.js';
2
2
 
3
3
  // src/adapters/gemini.ts
4
4
  function withHeadroom(model, options = {}) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkN7HYJMEN_cjs = require('../chunk-N7HYJMEN.cjs');
3
+ var chunkW6AXXD2B_cjs = require('../chunk-W6AXXD2B.cjs');
4
4
 
5
5
  // src/adapters/openai.ts
6
6
  function withHeadroom(client, options = {}) {
@@ -10,7 +10,7 @@ function withHeadroom(client, options = {}) {
10
10
  const compressedCreate = async (params) => {
11
11
  const messages = params.messages;
12
12
  const model = options.model ?? params.model ?? "gpt-4o";
13
- const result = await chunkN7HYJMEN_cjs.compress(messages, {
13
+ const result = await chunkW6AXXD2B_cjs.compress(messages, {
14
14
  stack: "adapter_ts_openai",
15
15
  ...options,
16
16
  model
@@ -1,4 +1,4 @@
1
- import { compress } from '../chunk-FJQ65W3R.js';
1
+ import { compress } from '../chunk-WKB3ITLL.js';
2
2
 
3
3
  // src/adapters/openai.ts
4
4
  function withHeadroom(client, options = {}) {
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkN7HYJMEN_cjs = require('../chunk-N7HYJMEN.cjs');
3
+ var chunkW6AXXD2B_cjs = require('../chunk-W6AXXD2B.cjs');
4
4
  var module$1 = require('module');
5
5
 
6
6
  var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
@@ -12,25 +12,25 @@ function headroomMiddleware(options = {}) {
12
12
  const prompt = params.prompt;
13
13
  if (!prompt || prompt.length === 0) return params;
14
14
  const model = options.model ?? params.modelId ?? "gpt-4o";
15
- const openaiMessages = chunkN7HYJMEN_cjs.vercelToOpenAI(prompt);
16
- const result = await chunkN7HYJMEN_cjs.compress(openaiMessages, {
15
+ const openaiMessages = chunkW6AXXD2B_cjs.vercelToOpenAI(prompt);
16
+ const result = await chunkW6AXXD2B_cjs.compress(openaiMessages, {
17
17
  stack: "adapter_ts_vercel_ai",
18
18
  ...options,
19
19
  model
20
20
  });
21
21
  if (!result.compressed) return params;
22
- const compressedPrompt = chunkN7HYJMEN_cjs.openAIToVercel(result.messages);
22
+ const compressedPrompt = chunkW6AXXD2B_cjs.openAIToVercel(result.messages);
23
23
  return { ...params, prompt: compressedPrompt };
24
24
  }
25
25
  };
26
26
  }
27
27
  async function compressVercelMessages(messages, options = {}) {
28
- const openaiMessages = chunkN7HYJMEN_cjs.vercelToOpenAI(messages);
29
- const result = await chunkN7HYJMEN_cjs.compress(openaiMessages, {
28
+ const openaiMessages = chunkW6AXXD2B_cjs.vercelToOpenAI(messages);
29
+ const result = await chunkW6AXXD2B_cjs.compress(openaiMessages, {
30
30
  stack: "adapter_ts_vercel_ai",
31
31
  ...options
32
32
  });
33
- const vercelMessages = chunkN7HYJMEN_cjs.openAIToVercel(result.messages);
33
+ const vercelMessages = chunkW6AXXD2B_cjs.openAIToVercel(result.messages);
34
34
  return {
35
35
  ...result,
36
36
  messages: vercelMessages
@@ -1,4 +1,4 @@
1
- import { vercelToOpenAI, compress, openAIToVercel } from '../chunk-FJQ65W3R.js';
1
+ import { vercelToOpenAI, compress, openAIToVercel } from '../chunk-WKB3ITLL.js';
2
2
  import { createRequire } from 'module';
3
3
 
4
4
  function headroomMiddleware(options = {}) {
@@ -181,6 +181,11 @@ function makeFallbackResult(messages) {
181
181
  compressed: false
182
182
  };
183
183
  }
184
+ function trimTrailingSlashes(value) {
185
+ let end = value.length;
186
+ while (end > 0 && value.charCodeAt(end - 1) === 47) end--;
187
+ return value.slice(0, end);
188
+ }
184
189
  var ChatCompletions = class {
185
190
  constructor(client) {
186
191
  this.client = client;
@@ -283,7 +288,9 @@ var HeadroomClient = class {
283
288
  /** Anthropic-style messages API. */
284
289
  messages;
285
290
  constructor(options = {}) {
286
- this.baseUrl = (options.baseUrl ?? getEnv("HEADROOM_BASE_URL") ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
291
+ this.baseUrl = trimTrailingSlashes(
292
+ options.baseUrl ?? getEnv("HEADROOM_BASE_URL") ?? DEFAULT_BASE_URL
293
+ );
287
294
  this.apiKey = options.apiKey ?? getEnv("HEADROOM_API_KEY");
288
295
  this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
289
296
  this.fallback = options.fallback ?? true;
@@ -1183,5 +1190,5 @@ exports.parseSSE = parseSSE;
1183
1190
  exports.snakeToCamel = snakeToCamel;
1184
1191
  exports.toOpenAI = toOpenAI;
1185
1192
  exports.vercelToOpenAI = vercelToOpenAI;
1186
- //# sourceMappingURL=chunk-N7HYJMEN.cjs.map
1187
- //# sourceMappingURL=chunk-N7HYJMEN.cjs.map
1193
+ //# sourceMappingURL=chunk-W6AXXD2B.cjs.map
1194
+ //# sourceMappingURL=chunk-W6AXXD2B.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/utils/case.ts","../src/utils/stream.ts","../src/client.ts","../src/utils/format.ts","../src/hooks.ts","../src/compress.ts"],"names":[],"mappings":"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","file":"chunk-W6AXXD2B.cjs","sourcesContent":["/**\n * Error hierarchy matching Python headroom.exceptions.\n */\n\nexport class HeadroomError extends Error {\n details?: Record<string, any>;\n\n constructor(message: string, details?: Record<string, any>) {\n super(message);\n this.name = \"HeadroomError\";\n this.details = details;\n }\n}\n\nexport class HeadroomConnectionError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomConnectionError\";\n }\n}\n\nexport class HeadroomAuthError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomAuthError\";\n }\n}\n\nexport class HeadroomCompressError extends HeadroomError {\n statusCode: number;\n errorType: string;\n\n constructor(statusCode: number, errorType: string, message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"HeadroomCompressError\";\n this.statusCode = statusCode;\n this.errorType = errorType;\n }\n}\n\nexport class ConfigurationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ConfigurationError\";\n }\n}\n\nexport class ProviderError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ProviderError\";\n }\n}\n\nexport class StorageError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"StorageError\";\n }\n}\n\nexport class TokenizationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"TokenizationError\";\n }\n}\n\nexport class CacheError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"CacheError\";\n }\n}\n\nexport class ValidationError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"ValidationError\";\n }\n}\n\nexport class TransformError extends HeadroomError {\n constructor(message: string, details?: Record<string, any>) {\n super(message, details);\n this.name = \"TransformError\";\n }\n}\n\n// --- Proxy error mapping ---\n\nconst ERROR_TYPE_MAP: Record<string, new (message: string, details?: Record<string, any>) => HeadroomError> = {\n configuration_error: ConfigurationError,\n provider_error: ProviderError,\n storage_error: StorageError,\n tokenization_error: TokenizationError,\n cache_error: CacheError,\n validation_error: ValidationError,\n transform_error: TransformError,\n};\n\n/**\n * Map a proxy error response to the correct HeadroomError subclass.\n */\nexport function mapProxyError(\n status: number,\n type: string,\n message: string,\n): HeadroomError {\n if (status === 401) return new HeadroomAuthError(message);\n const ErrorClass = ERROR_TYPE_MAP[type];\n if (ErrorClass) return new ErrorClass(message, { statusCode: status, errorType: type });\n return new HeadroomCompressError(status, type, message);\n}\n","/**\n * Case conversion utilities for proxy communication.\n * Proxy uses snake_case (Python), SDK uses camelCase (TypeScript).\n */\n\nexport function snakeToCamel(str: string): string {\n return str.replace(/_([a-z0-9])/g, (_, c) => c.toUpperCase());\n}\n\nexport function camelToSnake(str: string): string {\n return str.replace(/[A-Z]/g, (c) => `_${c.toLowerCase()}`);\n}\n\nexport function deepCamelCase<T = any>(obj: any): T {\n if (obj === null || obj === undefined) return obj as T;\n if (Array.isArray(obj)) return obj.map(deepCamelCase) as T;\n if (typeof obj === \"object\" && !(obj instanceof Date)) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [snakeToCamel(k), deepCamelCase(v)]),\n ) as T;\n }\n return obj as T;\n}\n\nexport function deepSnakeCase(obj: any): any {\n if (obj === null || obj === undefined) return obj;\n if (Array.isArray(obj)) return obj.map(deepSnakeCase);\n if (typeof obj === \"object\" && !(obj instanceof Date)) {\n return Object.fromEntries(\n Object.entries(obj).map(([k, v]) => [camelToSnake(k), deepSnakeCase(v)]),\n );\n }\n return obj;\n}\n","/**\n * SSE (Server-Sent Events) stream parser for proxy streaming responses.\n */\n\n/**\n * Parse an SSE response body into an async generator of parsed JSON events.\n */\nexport async function* parseSSE<T = any>(\n response: Response,\n): AsyncGenerator<T> {\n const reader = response.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n // On the final read, flush any buffered multi-byte remainder and process\n // every remaining line — including a last `data:` line that arrived\n // without a trailing newline, which would otherwise be held back in\n // `buffer` and dropped when the loop exits.\n buffer += done ? decoder.decode() : decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = done ? \"\" : lines.pop()!;\n\n for (const line of lines) {\n if (line.startsWith(\"data: \")) {\n const data = line.slice(6).trim();\n if (data === \"[DONE]\") return;\n try {\n yield JSON.parse(data) as T;\n } catch {\n // skip non-JSON data lines (e.g. Anthropic event metadata)\n }\n }\n }\n\n if (done) break;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n/**\n * Collect all chunks from an async iterable into an array.\n */\nexport async function collectStream<T>(stream: AsyncIterable<T>): Promise<T[]> {\n const chunks: T[] = [];\n for await (const chunk of stream) {\n chunks.push(chunk);\n }\n return chunks;\n}\n","/**\n * HeadroomClient — HTTP client for the Headroom compression proxy.\n *\n * Supports:\n * - compress() — direct compression via /v1/compress\n * - chat.completions.create() — OpenAI-style passthrough via /v1/chat/completions\n * - messages.create() — Anthropic-style passthrough via /v1/messages\n * - Metrics, health, CCR retrieve, telemetry, feedback, TOIN\n */\n\nimport type {\n OpenAIMessage,\n CompressResult,\n HeadroomClientOptions,\n HeadroomClientInterface,\n ProxyCompressResponse,\n ProxyErrorResponse,\n} from \"./types.js\";\nimport { mapProxyError, HeadroomConnectionError, HeadroomAuthError, HeadroomCompressError } from \"./errors.js\";\nimport { deepCamelCase, deepSnakeCase } from \"./utils/case.js\";\nimport { parseSSE } from \"./utils/stream.js\";\nimport type { CompressRequestConfig, HeadroomMode } from \"./types/config.js\";\nimport type {\n SimulationResult,\n RequestMetrics,\n MetricsSummary,\n SessionStats,\n ValidationResult,\n HealthStatus,\n ProxyStats,\n MemoryUsage,\n RetrieveResult,\n RetrieveSearchResult,\n CCRStats,\n TelemetryStats,\n ToolHints,\n TOINStats,\n TOINPattern,\n MetricsQuery,\n SummaryQuery,\n StatsHistoryQuery,\n} from \"./types/models.js\";\n\nconst DEFAULT_BASE_URL = \"http://localhost:8787\";\nconst DEFAULT_TIMEOUT = 30_000;\nconst DEFAULT_RETRIES = 1;\n\nfunction getEnv(key: string): string | undefined {\n if (typeof process !== \"undefined\" && process.env) {\n return process.env[key];\n }\n return undefined;\n}\n\nfunction makeFallbackResult(messages: OpenAIMessage[]): CompressResult {\n return {\n messages,\n tokensBefore: 0,\n tokensAfter: 0,\n tokensSaved: 0,\n compressionRatio: 1.0,\n transformsApplied: [],\n ccrHashes: [],\n compressed: false,\n };\n}\n\n// --- Headroom request params ---\n\nexport interface HeadroomParams {\n headroomMode?: HeadroomMode;\n headroomCachePrefixTokens?: number;\n headroomOutputBufferTokens?: number;\n headroomKeepTurns?: number;\n headroomToolProfiles?: Record<string, Record<string, any>>;\n}\n\n/**\n * Strip trailing \"/\" characters. A loop rather than a `+$` regex, which\n * backtracks quadratically on inputs with long runs of slashes.\n */\nfunction trimTrailingSlashes(value: string): string {\n let end = value.length;\n while (end > 0 && value.charCodeAt(end - 1) === 47) end--;\n return value.slice(0, end);\n}\n\n// --- Sub-clients ---\n\nclass ChatCompletions {\n constructor(private client: HeadroomClient) {}\n\n /**\n * Create a chat completion with automatic compression.\n * Routes through proxy's POST /v1/chat/completions.\n */\n async create(\n params: { model: string; messages: OpenAIMessage[]; stream?: boolean; [key: string]: any } & HeadroomParams,\n ): Promise<any> {\n const { headroomMode, headroomCachePrefixTokens, headroomOutputBufferTokens, headroomKeepTurns, headroomToolProfiles, ...apiParams } = params;\n\n const headers: Record<string, string> = {};\n if (headroomMode) headers[\"x-headroom-mode\"] = headroomMode;\n\n const providerKey = this.client.providerApiKey ?? getEnv(\"OPENAI_API_KEY\");\n if (providerKey) headers[\"Authorization\"] = `Bearer ${providerKey}`;\n\n const response = await this.client.rawFetch(\"/v1/chat/completions\", {\n method: \"POST\",\n headers,\n body: apiParams,\n stream: params.stream,\n });\n\n if (params.stream) {\n return parseSSE(response);\n }\n\n return response.json();\n }\n\n /**\n * Simulate compression without calling the LLM.\n */\n async simulate(\n params: { model: string; messages: OpenAIMessage[] } & HeadroomParams,\n ): Promise<SimulationResult> {\n const body = {\n messages: params.messages,\n model: params.model,\n config: { default_mode: \"simulate\", generate_diff_artifact: true },\n };\n const result = await this.client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n }\n}\n\nclass Messages {\n constructor(private client: HeadroomClient) {}\n\n /**\n * Create a message with automatic compression.\n * Routes through proxy's POST /v1/messages (Anthropic).\n */\n async create(\n params: { model: string; messages: any[]; max_tokens?: number; system?: string | any[]; stream?: boolean; [key: string]: any } & HeadroomParams,\n ): Promise<any> {\n const { headroomMode, headroomCachePrefixTokens, headroomOutputBufferTokens, headroomKeepTurns, headroomToolProfiles, ...apiParams } = params;\n\n const headers: Record<string, string> = {\n \"anthropic-version\": \"2023-06-01\",\n };\n if (headroomMode) headers[\"x-headroom-mode\"] = headroomMode;\n\n const providerKey = this.client.providerApiKey ?? getEnv(\"ANTHROPIC_API_KEY\");\n if (providerKey) headers[\"x-api-key\"] = providerKey;\n\n if (!apiParams.max_tokens) apiParams.max_tokens = 1024;\n\n const response = await this.client.rawFetch(\"/v1/messages\", {\n method: \"POST\",\n headers,\n body: apiParams,\n stream: params.stream,\n });\n\n if (params.stream) {\n return parseSSE(response);\n }\n\n return response.json();\n }\n\n /**\n * Stream a message with automatic compression.\n */\n stream(\n params: { model: string; messages: any[]; max_tokens?: number; system?: string | any[]; [key: string]: any } & HeadroomParams,\n ): Promise<AsyncGenerator<any>> {\n return this.create({ ...params, stream: true }) as Promise<AsyncGenerator<any>>;\n }\n\n /**\n * Simulate compression without calling the LLM.\n */\n async simulate(\n params: { model: string; messages: any[] } & HeadroomParams,\n ): Promise<SimulationResult> {\n const body = {\n messages: params.messages,\n model: params.model,\n config: { default_mode: \"simulate\", generate_diff_artifact: true },\n };\n const result = await this.client.compressRaw(body);\n return deepCamelCase<SimulationResult>(result);\n }\n}\n\n// --- Main client ---\n\nexport interface ExtendedClientOptions extends HeadroomClientOptions {\n providerApiKey?: string;\n defaultMode?: HeadroomMode;\n config?: CompressRequestConfig;\n}\n\nexport class HeadroomClient implements HeadroomClientInterface {\n private baseUrl: string;\n private apiKey: string | undefined;\n private timeout: number;\n private fallback: boolean;\n private retries: number;\n private config: CompressRequestConfig | undefined;\n private stack: string | undefined;\n\n /** @internal */ providerApiKey: string | undefined;\n\n /** OpenAI-style chat completions API. */\n readonly chat: { completions: ChatCompletions };\n /** Anthropic-style messages API. */\n readonly messages: Messages;\n\n constructor(options: ExtendedClientOptions = {}) {\n this.baseUrl = trimTrailingSlashes(\n options.baseUrl ?? getEnv(\"HEADROOM_BASE_URL\") ?? DEFAULT_BASE_URL,\n );\n this.apiKey = options.apiKey ?? getEnv(\"HEADROOM_API_KEY\");\n this.timeout = options.timeout ?? DEFAULT_TIMEOUT;\n this.fallback = options.fallback ?? true;\n this.retries = options.retries ?? DEFAULT_RETRIES;\n this.providerApiKey = options.providerApiKey;\n this.config = options.config;\n this.stack = options.stack;\n\n this.chat = { completions: new ChatCompletions(this) };\n this.messages = new Messages(this);\n }\n\n // ============================================================\n // Core: compress\n // ============================================================\n\n async compress(\n messages: OpenAIMessage[],\n options: { model?: string; tokenBudget?: number; config?: CompressRequestConfig } = {},\n ): Promise<CompressResult> {\n const model = options.model ?? \"gpt-4o\";\n\n let lastError: unknown;\n const maxAttempts = 1 + this.retries;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n try {\n return await this._doCompress(messages, model, options.tokenBudget, options.config);\n } catch (error) {\n lastError = error;\n if (error instanceof HeadroomAuthError) throw error;\n if (\n error instanceof HeadroomCompressError &&\n error.statusCode < 500\n ) {\n throw error;\n }\n }\n }\n\n if (this.fallback) {\n return makeFallbackResult(messages);\n }\n if (lastError instanceof HeadroomConnectionError) throw lastError;\n if (lastError instanceof HeadroomCompressError) throw lastError;\n throw new HeadroomConnectionError(\n `Failed after ${maxAttempts} attempts: ${lastError}`,\n );\n }\n\n /**\n * Raw compress call — sends body directly to /v1/compress.\n * Used by simulate() and other advanced features.\n * @internal\n */\n async compressRaw(body: Record<string, any>): Promise<any> {\n const response = await this._fetch(\"/v1/compress\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return response.json();\n }\n\n // ============================================================\n // Health & Stats\n // ============================================================\n\n /** Check if the proxy is running and healthy. */\n async health(): Promise<HealthStatus> {\n const resp = await this._fetch(\"/health\", { method: \"GET\" });\n return deepCamelCase<HealthStatus>(await resp.json());\n }\n\n /** Get comprehensive proxy statistics. */\n async proxyStats(): Promise<ProxyStats> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n return deepCamelCase<ProxyStats>(await resp.json());\n }\n\n /** Get Prometheus-format metrics. */\n async prometheusMetrics(): Promise<string> {\n const resp = await this._fetch(\"/metrics\", { method: \"GET\" });\n return resp.text();\n }\n\n /** Get historical stats. */\n async statsHistory(query?: StatsHistoryQuery): Promise<any> {\n const params = new URLSearchParams();\n if (query?.format) params.set(\"format\", query.format);\n if (query?.series) params.set(\"series\", query.series);\n const qs = params.toString();\n const resp = await this._fetch(`/stats-history${qs ? `?${qs}` : \"\"}`, { method: \"GET\" });\n return resp.json();\n }\n\n /** Get proxy memory usage. */\n async memoryUsage(): Promise<MemoryUsage> {\n const resp = await this._fetch(\"/debug/memory\", { method: \"GET\" });\n return deepCamelCase<MemoryUsage>(await resp.json());\n }\n\n /** Clear the response cache. */\n async clearCache(): Promise<{ status: string }> {\n const resp = await this._fetch(\"/cache/clear\", { method: \"POST\" });\n return resp.json() as Promise<{ status: string }>;\n }\n\n // ============================================================\n // Metrics & Observability\n // ============================================================\n\n /** Get request metrics from the proxy. */\n async getMetrics(query?: MetricsQuery): Promise<RequestMetrics[]> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n let metrics: any[] = stats.recent_requests ?? [];\n\n if (query?.model) {\n metrics = metrics.filter((m: any) => m.model === query.model);\n }\n if (query?.mode) {\n metrics = metrics.filter((m: any) => m.mode === query.mode);\n }\n if (query?.limit) {\n metrics = metrics.slice(0, query.limit);\n }\n\n return metrics.map((m: any) => deepCamelCase<RequestMetrics>(m));\n }\n\n /** Get aggregated metrics summary. */\n async getSummary(query?: SummaryQuery): Promise<MetricsSummary> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n return deepCamelCase<MetricsSummary>({\n total_requests: stats.requests?.total ?? 0,\n total_tokens_before: stats.tokens?.total_before_compression ?? 0,\n total_tokens_after: (stats.tokens?.total_before_compression ?? 0) - (stats.tokens?.saved ?? 0),\n total_tokens_saved: stats.tokens?.saved ?? 0,\n average_compression_ratio: stats.tokens?.savings_percent ? stats.tokens.savings_percent / 100 : 0,\n models: stats.requests?.by_model ?? {},\n modes: {},\n error_count: stats.requests?.failed ?? 0,\n });\n }\n\n /** Get in-memory session stats. */\n async getStats(): Promise<SessionStats> {\n const resp = await this._fetch(\"/stats\", { method: \"GET\" });\n const stats = (await resp.json()) as any;\n return deepCamelCase<SessionStats>({\n total_requests: stats.requests?.total ?? 0,\n total_tokens_before: stats.tokens?.total_before_compression ?? 0,\n total_tokens_after: (stats.tokens?.total_before_compression ?? 0) - (stats.tokens?.saved ?? 0),\n total_tokens_saved: stats.tokens?.saved ?? 0,\n average_compression_ratio: stats.tokens?.savings_percent ? stats.tokens.savings_percent / 100 : 0,\n cache_hits: stats.requests?.cached ?? 0,\n by_mode: {},\n });\n }\n\n /** Validate proxy configuration. */\n async validateSetup(): Promise<ValidationResult> {\n const resp = await this._fetch(\"/health\", { method: \"GET\" });\n const health = (await resp.json()) as any;\n return {\n valid: health.status === \"healthy\",\n provider: \"\",\n errors: health.status !== \"healthy\" ? [\"Proxy unhealthy\"] : [],\n warnings: [],\n config: health.config ?? {},\n };\n }\n\n // ============================================================\n // CCR Retrieve\n // ============================================================\n\n /** Retrieve original content from the CCR compression store. */\n async retrieve(\n hash: string,\n options?: { query?: string },\n ): Promise<RetrieveResult | RetrieveSearchResult> {\n const body: Record<string, any> = { hash };\n if (options?.query) body.query = options.query;\n const resp = await this._fetch(\"/v1/retrieve\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n return deepCamelCase(await resp.json());\n }\n\n /** Get CCR store statistics. */\n async getCCRStats(): Promise<CCRStats> {\n const resp = await this._fetch(\"/v1/retrieve/stats\", { method: \"GET\" });\n return deepCamelCase<CCRStats>(await resp.json());\n }\n\n /** Handle an LLM tool call for headroom_retrieve. */\n async handleToolCall(request: {\n toolCall: any;\n provider?: \"anthropic\" | \"openai\";\n }): Promise<any> {\n const resp = await this._fetch(\"/v1/retrieve/tool_call\", {\n method: \"POST\",\n body: JSON.stringify(deepSnakeCase(request)),\n });\n return deepCamelCase(await resp.json());\n }\n\n // ============================================================\n // Telemetry & Feedback\n // ============================================================\n\n readonly telemetry = {\n getStats: async (): Promise<TelemetryStats> => {\n const resp = await this._fetch(\"/v1/telemetry\", { method: \"GET\" });\n return deepCamelCase<TelemetryStats>(await resp.json());\n },\n export: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/telemetry/export\", { method: \"GET\" });\n return resp.json();\n },\n import: async (data: any): Promise<{ status: string }> => {\n const resp = await this._fetch(\"/v1/telemetry/import\", {\n method: \"POST\",\n body: JSON.stringify(data),\n });\n return resp.json() as Promise<{ status: string }>;\n },\n getTools: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/telemetry/tools\", { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n getTool: async (signatureHash: string): Promise<any> => {\n const resp = await this._fetch(`/v1/telemetry/tools/${signatureHash}`, { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n };\n\n readonly feedback = {\n getStats: async (): Promise<any> => {\n const resp = await this._fetch(\"/v1/feedback\", { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n getHints: async (toolName: string): Promise<ToolHints> => {\n const resp = await this._fetch(`/v1/feedback/${encodeURIComponent(toolName)}`, { method: \"GET\" });\n return deepCamelCase<ToolHints>(await resp.json());\n },\n };\n\n readonly toin = {\n getStats: async (): Promise<TOINStats> => {\n const resp = await this._fetch(\"/v1/toin/stats\", { method: \"GET\" });\n return deepCamelCase<TOINStats>(await resp.json());\n },\n getPatterns: async (limit?: number): Promise<TOINPattern[]> => {\n const qs = limit ? `?limit=${limit}` : \"\";\n const resp = await this._fetch(`/v1/toin/patterns${qs}`, { method: \"GET\" });\n return deepCamelCase<TOINPattern[]>(await resp.json());\n },\n getPattern: async (hashPrefix: string): Promise<any> => {\n const resp = await this._fetch(`/v1/toin/pattern/${encodeURIComponent(hashPrefix)}`, { method: \"GET\" });\n return deepCamelCase(await resp.json());\n },\n };\n\n // ============================================================\n // Lifecycle\n // ============================================================\n\n /** Close the client (no-op for HTTP client, included for API parity). */\n close(): void {\n // HTTP client is stateless — nothing to close\n }\n\n // ============================================================\n // Internal HTTP helpers\n // ============================================================\n\n /**\n * Raw fetch with proxy base URL, auth, and timeout.\n * A string body is sent as-is; anything else is JSON-serialized.\n * @internal\n */\n async rawFetch(\n path: string,\n options: { method: string; headers?: Record<string, string>; body?: any; stream?: boolean },\n ): Promise<Response> {\n const url = `${this.baseUrl}${path}`;\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n ...options.headers,\n };\n if (this.apiKey) {\n headers[\"X-Headroom-Proxy-Token\"] = this.apiKey;\n // Don't override provider auth headers\n if (!headers[\"Authorization\"] && !headers[\"x-api-key\"]) {\n headers[\"Authorization\"] = `Bearer ${this.apiKey}`;\n }\n }\n if (this.stack && !headers[\"X-Headroom-Stack\"]) {\n headers[\"X-Headroom-Stack\"] = this.stack;\n }\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: options.method,\n headers,\n body:\n typeof options.body === \"string\"\n ? options.body\n : options.body\n ? JSON.stringify(options.body)\n : undefined,\n signal: AbortSignal.timeout(this.timeout),\n });\n } catch (error) {\n throw new HeadroomConnectionError(\n `Failed to connect to Headroom at ${this.baseUrl}: ${error}`,\n );\n }\n\n if (!response.ok) {\n let errorBody: ProxyErrorResponse | undefined;\n try {\n errorBody = (await response.json()) as ProxyErrorResponse;\n } catch {\n // ignore\n }\n throw mapProxyError(\n response.status,\n errorBody?.error?.type ?? \"unknown\",\n errorBody?.error?.message ?? `HTTP ${response.status}`,\n );\n }\n\n return response;\n }\n\n /** Proxy-only endpoints, whose bodies are already serialized. @internal */\n private _fetch(\n path: string,\n init: { method: string; body?: string },\n ): Promise<Response> {\n return this.rawFetch(path, init);\n }\n\n private async _doCompress(\n messages: OpenAIMessage[],\n model: string,\n tokenBudget?: number,\n config?: CompressRequestConfig,\n ): Promise<CompressResult> {\n const body: Record<string, unknown> = { messages, model };\n if (tokenBudget) {\n body.token_budget = tokenBudget;\n }\n const mergedConfig = { ...this.config, ...config };\n if (Object.keys(mergedConfig).length > 0) {\n body.config = deepSnakeCase(mergedConfig);\n }\n\n const response = await this._fetch(\"/v1/compress\", {\n method: \"POST\",\n body: JSON.stringify(body),\n });\n\n const data = (await response.json()) as ProxyCompressResponse;\n\n return {\n messages: data.messages,\n tokensBefore: data.tokens_before,\n tokensAfter: data.tokens_after,\n tokensSaved: data.tokens_saved,\n compressionRatio: data.compression_ratio,\n transformsApplied: data.transforms_applied,\n ccrHashes: data.ccr_hashes,\n compressed: true,\n };\n }\n}\n","/**\n * Universal message format detection and conversion.\n *\n * Supports 4 formats:\n * - OpenAI: { role, content, tool_calls?, tool_call_id? }\n * - Anthropic: { role, content (string | ContentBlock[]) } with tool_use/tool_result blocks\n * - Vercel AI SDK: { role, content (string | Part[]) } with tool-call/tool-result parts\n * - Google Gemini: { role, parts[] } with functionCall/functionResponse\n *\n * Detection is structural (unique keys/values per format), not heuristic.\n * Conversion always targets OpenAI format (the proxy's lingua franca).\n */\n\nimport type {\n OpenAIMessage,\n AssistantMessage,\n ToolCall,\n} from \"../types.js\";\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type MessageFormat = \"openai\" | \"anthropic\" | \"vercel\" | \"gemini\";\n\n/**\n * Detect which format an array of messages is in.\n *\n * Uses structural markers unique to each format:\n * - Gemini: messages have `parts` field (not `content`)\n * - Vercel: content parts use hyphenated types: `tool-call`, `tool-result`\n * - Anthropic: content blocks use underscored types: `tool_use`, `tool_result`\n * - OpenAI: assistant messages have `tool_calls` field; tool messages have `tool_call_id`\n */\nexport function detectFormat(messages: any[]): MessageFormat {\n for (const msg of messages) {\n // Gemini: uses `parts` instead of `content`\n if (\"parts\" in msg && !(\"content\" in msg)) return \"gemini\";\n\n // Gemini: role \"model\" instead of \"assistant\"\n if (msg.role === \"model\") return \"gemini\";\n\n // OpenAI: tool_calls on assistant messages\n if (msg.tool_calls && msg.role === \"assistant\") return \"openai\";\n\n // OpenAI: tool role with tool_call_id\n if (msg.role === \"tool\" && \"tool_call_id\" in msg && typeof msg.content === \"string\") return \"openai\";\n\n // Check content blocks/parts for format-specific markers\n if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n // Vercel: hyphenated types\n if (part.type === \"tool-call\" || part.type === \"tool-result\") return \"vercel\";\n // Anthropic: underscored types\n if (part.type === \"tool_use\" || part.type === \"tool_result\") return \"anthropic\";\n // Anthropic: image with source.type\n if (part.type === \"image\" && part.source?.type) return \"anthropic\";\n }\n }\n }\n\n // Default: OpenAI (simple {role, content: string} is valid OpenAI)\n return \"openai\";\n}\n\n// ============================================================\n// OpenAI ↔ OpenAI (passthrough)\n// ============================================================\n\n// No conversion needed — this is the canonical format.\n\n// ============================================================\n// Anthropic → OpenAI\n// ============================================================\n\n// Anthropic image block `source` -> OpenAI image_url url string, or null if unconvertible.\nfunction anthropicImageUrl(source: any): string | null {\n if (!source || typeof source !== \"object\") return null;\n if (source.type === \"base64\" && source.media_type && source.data) {\n return `data:${source.media_type};base64,${source.data}`;\n }\n if (source.type === \"url\" && typeof source.url === \"string\") return source.url;\n return null;\n}\n\n// OpenAI image_url url -> Anthropic image block. data: URIs become a base64 source; other urls a url source.\nfunction openAIImageBlock(url: string): any {\n const m = /^data:([^;,]+);base64,(.*)$/s.exec(url);\n if (m) return { type: \"image\", source: { type: \"base64\", media_type: m[1], data: m[2] } };\n return { type: \"image\", source: { type: \"url\", url } };\n}\n\nexport function anthropicToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n if (Array.isArray(msg.content)) {\n const toolResults = msg.content.filter((b: any) => b.type === \"tool_result\");\n const hasImages = msg.content.some((b: any) => b.type === \"image\");\n\n if (hasImages) {\n const parts = msg.content\n .filter((b: any) => b.type === \"text\" || b.type === \"image\")\n .map((b: any) => {\n if (b.type === \"text\") return { type: \"text\" as const, text: b.text };\n const url = anthropicImageUrl(b.source);\n return url ? { type: \"image_url\" as const, image_url: { url } } : null;\n })\n .filter((p: any): p is NonNullable<typeof p> => p !== null);\n\n if (parts.length > 0) {\n result.push({ role: \"user\", content: parts });\n }\n } else {\n const textBlocks = msg.content.filter((b: any) => b.type === \"text\");\n if (textBlocks.length > 0) {\n result.push({\n role: \"user\",\n content: textBlocks.map((b: any) => b.text).join(\"\\n\"),\n });\n }\n }\n for (const tr of toolResults) {\n const content = typeof tr.content === \"string\"\n ? tr.content\n : Array.isArray(tr.content)\n ? tr.content.map((b: any) => b.text ?? JSON.stringify(b)).join(\"\\n\")\n : JSON.stringify(tr.content);\n result.push({\n role: \"tool\",\n content,\n tool_call_id: tr.tool_use_id,\n });\n }\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"assistant\", content: msg.content });\n continue;\n }\n if (Array.isArray(msg.content)) {\n const textBlocks = msg.content.filter((b: any) => b.type === \"text\");\n const toolUseBlocks = msg.content.filter((b: any) => b.type === \"tool_use\");\n\n const content = textBlocks.length > 0\n ? textBlocks.map((b: any) => b.text).join(\"\\n\")\n : null;\n\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n if (toolUseBlocks.length > 0) {\n openaiMsg.tool_calls = toolUseBlocks.map((b: any): ToolCall => ({\n id: b.id,\n type: \"function\",\n function: {\n name: b.name,\n arguments: typeof b.input === \"string\" ? b.input : JSON.stringify(b.input),\n },\n }));\n }\n result.push(openaiMsg);\n }\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToAnthropic(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // Anthropic system is top-level, but if it appears in messages, convert to user\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n } else if (Array.isArray(msg.content)) {\n result.push({\n role: \"user\",\n content: msg.content.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text };\n if (p.type === \"image_url\") return openAIImageBlock(p.image_url.url);\n return { type: \"text\", text: \"\" };\n }),\n });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const blocks: any[] = [];\n if (msg.content) blocks.push({ type: \"text\", text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n blocks.push({\n type: \"tool_use\",\n id: tc.id,\n name: tc.function.name,\n input: JSON.parse(tc.function.arguments),\n });\n }\n }\n result.push({\n role: \"assistant\",\n content: blocks.length === 1 && blocks[0].type === \"text\" ? blocks[0].text : blocks,\n });\n continue;\n }\n\n if (msg.role === \"tool\") {\n result.push({\n role: \"user\",\n content: [\n { type: \"tool_result\", tool_use_id: msg.tool_call_id, content: msg.content },\n ],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Vercel AI SDK → OpenAI\n// ============================================================\n\nexport function vercelToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n result.push({ role: \"system\", content: typeof msg.content === \"string\" ? msg.content : String(msg.content) });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: msg.content });\n continue;\n }\n const parts = Array.isArray(msg.content) ? msg.content : [];\n const textParts = parts.filter((p: any) => p.type === \"text\");\n const imageParts = parts.filter((p: any) => p.type === \"image\");\n\n if (imageParts.length === 0 && textParts.length > 0) {\n result.push({ role: \"user\", content: textParts.map((p: any) => p.text).join(\"\") });\n } else {\n const openaiParts = parts\n .filter((p: any) => p.type === \"text\" || p.type === \"image\")\n .map((p: any) => {\n if (p.type === \"text\") return { type: \"text\" as const, text: p.text };\n if (p.type === \"image\") {\n const url = p.image instanceof URL ? p.image.toString() : String(p.image);\n return { type: \"image_url\" as const, image_url: { url } };\n }\n return { type: \"text\" as const, text: \"\" };\n });\n result.push({ role: \"user\", content: openaiParts });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"assistant\", content: msg.content });\n continue;\n }\n const parts = Array.isArray(msg.content) ? msg.content : [];\n const textParts = parts.filter((p: any) => p.type === \"text\");\n const toolCallParts = parts.filter((p: any) => p.type === \"tool-call\");\n\n const content = textParts.length > 0 ? textParts.map((p: any) => p.text).join(\"\") : null;\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n\n if (toolCallParts.length > 0) {\n openaiMsg.tool_calls = toolCallParts.map((p: any): ToolCall => ({\n id: p.toolCallId,\n type: \"function\",\n // AI SDK v6 uses `input`, earlier versions used `args`\n function: { name: p.toolName, arguments: JSON.stringify(p.input ?? p.args) },\n }));\n }\n result.push(openaiMsg);\n continue;\n }\n\n if (msg.role === \"tool\") {\n const parts = Array.isArray(msg.content) ? msg.content : [];\n for (const part of parts) {\n if (part.type === \"tool-result\") {\n // AI SDK v6 uses `output: { type, value }`, earlier versions used `result`\n let contentStr: string;\n if (part.output !== undefined) {\n // v6 format: output is { type: 'json', value } or { type: 'text', value }\n const val = part.output?.value ?? part.output;\n contentStr = typeof val === \"string\" ? val : JSON.stringify(val);\n } else if (part.result !== undefined) {\n // Legacy format: result field directly\n contentStr = typeof part.result === \"string\" ? part.result : JSON.stringify(part.result);\n } else {\n contentStr = \"\";\n }\n result.push({\n role: \"tool\",\n content: contentStr,\n tool_call_id: part.toolCallId,\n });\n }\n }\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToVercel(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n // tool_call id -> function name, so tool-result parts carry the name the AI SDK expects.\n const toolNames = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n result.push({ role: \"system\", content: msg.content });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n result.push({ role: \"user\", content: [{ type: \"text\", text: msg.content }] });\n } else if (Array.isArray(msg.content)) {\n const parts = msg.content.map((p) => {\n if (p.type === \"text\") return { type: \"text\", text: p.text };\n if (p.type === \"image_url\") return { type: \"image\", image: new URL(p.image_url.url) };\n return { type: \"text\", text: \"\" };\n });\n result.push({ role: \"user\", content: parts });\n }\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n if (msg.content) parts.push({ type: \"text\", text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n toolNames.set(tc.id, tc.function.name);\n let input: any;\n try { input = JSON.parse(tc.function.arguments); } catch { input = tc.function.arguments ?? {}; }\n parts.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: tc.function.name,\n input, // AI SDK v6 uses `input`, not `args`\n });\n }\n }\n result.push({ role: \"assistant\", content: parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n let parsed: any;\n try { parsed = JSON.parse(msg.content); } catch { parsed = msg.content; }\n // AI SDK v6 requires output: { type: 'json' | 'text', value }\n const output = typeof parsed === \"string\"\n ? { type: \"text\" as const, value: parsed }\n : { type: \"json\" as const, value: parsed };\n result.push({\n role: \"tool\",\n content: [{\n type: \"tool-result\",\n toolCallId: msg.tool_call_id,\n toolName: toolNames.get(msg.tool_call_id) ?? \"unknown\",\n output,\n }],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Google Gemini → OpenAI\n// ============================================================\n\n// Gemini inlineData / fileData part -> OpenAI image_url object, or null if unconvertible.\n// inlineData travels as a data: URI (MIME type included). fileData keeps its MIME type on a\n// private `mime_type` key so the reverse conversion can rebuild the complete\n// { mimeType, fileUri } that @google/generative-ai requires; the proxy passes non-text\n// parts through unchanged, so the key survives /v1/compress.\nfunction geminiMediaImageUrl(part: any): { url: string; mime_type?: string } | null {\n const blob = part.inlineData;\n if (blob && typeof blob === \"object\" && blob.mimeType && blob.data) {\n return { url: `data:${blob.mimeType};base64,${blob.data}` };\n }\n const file = part.fileData;\n if (file && typeof file === \"object\" && typeof file.fileUri === \"string\") {\n return typeof file.mimeType === \"string\"\n ? { url: file.fileUri, mime_type: file.mimeType }\n : { url: file.fileUri };\n }\n return null;\n}\n\nconst MIME_BY_EXTENSION: Record<string, string> = {\n png: \"image/png\",\n jpg: \"image/jpeg\",\n jpeg: \"image/jpeg\",\n gif: \"image/gif\",\n webp: \"image/webp\",\n pdf: \"application/pdf\",\n};\n\n// OpenAI image_url -> Gemini part. data: URIs become inlineData. Other urls become fileData\n// with the carried MIME type, else one inferred from a common extension, else fileUri only.\nfunction geminiMediaPart(imageUrl: { url: string; mime_type?: string }): any {\n const m = /^data:([^;,]+);base64,(.*)$/s.exec(imageUrl.url);\n if (m) return { inlineData: { mimeType: m[1], data: m[2] } };\n const ext = /\\.([a-z0-9]+)(?:[?#]|$)/i.exec(imageUrl.url)?.[1]?.toLowerCase();\n const mimeType = imageUrl.mime_type ?? (ext ? MIME_BY_EXTENSION[ext] : undefined);\n return { fileData: mimeType ? { mimeType, fileUri: imageUrl.url } : { fileUri: imageUrl.url } };\n}\n\nexport function geminiToOpenAI(messages: any[]): OpenAIMessage[] {\n const result: OpenAIMessage[] = [];\n\n for (const msg of messages) {\n const role = msg.role === \"model\" ? \"assistant\" : \"user\";\n const parts: any[] = msg.parts ?? [];\n\n if (role === \"user\") {\n // Check for functionResponse parts\n const funcResponses = parts.filter((p: any) => p.functionResponse);\n const hasMedia = parts.some((p: any) => p.inlineData || p.fileData);\n\n if (hasMedia) {\n const content = parts\n .filter((p: any) => p.text !== undefined || p.inlineData || p.fileData)\n .map((p: any) => {\n if (p.text !== undefined) return { type: \"text\" as const, text: p.text };\n const imageUrl = geminiMediaImageUrl(p);\n return imageUrl ? { type: \"image_url\" as const, image_url: imageUrl } : null;\n })\n .filter((p: any): p is NonNullable<typeof p> => p !== null);\n\n if (content.length > 0) {\n result.push({ role: \"user\", content });\n }\n } else {\n const textParts = parts.filter((p: any) => p.text !== undefined);\n if (textParts.length > 0) {\n result.push({ role: \"user\", content: textParts.map((p: any) => p.text).join(\"\\n\") });\n }\n }\n for (const fr of funcResponses) {\n result.push({\n role: \"tool\",\n content: JSON.stringify(fr.functionResponse.response),\n tool_call_id: `gemini_${fr.functionResponse.name}`,\n });\n }\n continue;\n }\n\n if (role === \"assistant\") {\n const textParts = parts.filter((p: any) => p.text !== undefined);\n const funcCalls = parts.filter((p: any) => p.functionCall);\n\n const content = textParts.length > 0 ? textParts.map((p: any) => p.text).join(\"\\n\") : null;\n const openaiMsg: AssistantMessage = { role: \"assistant\", content };\n\n if (funcCalls.length > 0) {\n openaiMsg.tool_calls = funcCalls.map((p: any): ToolCall => ({\n id: `gemini_${p.functionCall.name}`,\n type: \"function\",\n function: {\n name: p.functionCall.name,\n arguments: JSON.stringify(p.functionCall.args),\n },\n }));\n }\n result.push(openaiMsg);\n continue;\n }\n }\n\n return result;\n}\n\nexport function openAIToGemini(messages: OpenAIMessage[]): any[] {\n const result: any[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // Gemini system is top-level; if in messages, convert to user\n result.push({ role: \"user\", parts: [{ text: msg.content }] });\n continue;\n }\n\n if (msg.role === \"user\") {\n if (Array.isArray(msg.content) && msg.content.some((p) => p.type === \"image_url\")) {\n const geminiParts = msg.content\n .map((p) => {\n if (p.type === \"text\") return { text: p.text };\n if (p.type === \"image_url\") return geminiMediaPart(p.image_url);\n return null;\n })\n .filter((p) => p !== null);\n result.push({ role: \"user\", parts: geminiParts });\n continue;\n }\n const text = typeof msg.content === \"string\"\n ? msg.content\n : (msg.content ?? []).filter((p) => p.type === \"text\").map((p) => (p as any).text).join(\"\\n\");\n result.push({ role: \"user\", parts: [{ text }] });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: any[] = [];\n if (msg.content) parts.push({ text: msg.content });\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n parts.push({\n functionCall: { name: tc.function.name, args: JSON.parse(tc.function.arguments) },\n });\n }\n }\n result.push({ role: \"model\", parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n let response: any;\n try { response = JSON.parse(msg.content); } catch { response = { result: msg.content }; }\n result.push({\n role: \"user\",\n parts: [{ functionResponse: { name: msg.tool_call_id?.replace(\"gemini_\", \"\") ?? \"unknown\", response } }],\n });\n continue;\n }\n }\n\n return result;\n}\n\n// ============================================================\n// Universal: any format → OpenAI, and OpenAI → original format\n// ============================================================\n\nexport function toOpenAI(messages: any[]): OpenAIMessage[] {\n const format = detectFormat(messages);\n switch (format) {\n case \"openai\": return messages as OpenAIMessage[];\n case \"anthropic\": return anthropicToOpenAI(messages);\n case \"vercel\": return vercelToOpenAI(messages);\n case \"gemini\": return geminiToOpenAI(messages);\n }\n}\n\nexport function fromOpenAI(messages: OpenAIMessage[], targetFormat: MessageFormat): any[] {\n switch (targetFormat) {\n case \"openai\": return messages;\n case \"anthropic\": return openAIToAnthropic(messages);\n case \"vercel\": return openAIToVercel(messages);\n case \"gemini\": return openAIToGemini(messages);\n }\n}\n","/**\n * Compression hooks matching Python headroom.hooks.\n * Allows customizing compression behavior with pre/post hooks.\n */\n\nexport interface CompressContext {\n model: string;\n userQuery: string;\n turnNumber: number;\n toolCalls: string[];\n provider: string;\n}\n\nexport interface CompressEvent {\n tokensBefore: number;\n tokensAfter: number;\n tokensSaved: number;\n compressionRatio: number;\n transformsApplied: string[];\n ccrHashes: string[];\n model: string;\n userQuery: string;\n provider: string;\n}\n\n/**\n * Base class for compression hooks. Override methods to customize behavior.\n *\n * @example\n * ```typescript\n * class LoggingHooks extends CompressionHooks {\n * postCompress(event: CompressEvent) {\n * console.log(`Saved ${event.tokensSaved} tokens (${event.compressionRatio})`);\n * }\n * }\n * ```\n */\nexport class CompressionHooks {\n /**\n * Called before compression. Modify messages before they're sent to the proxy.\n */\n preCompress(\n messages: any[],\n _ctx: CompressContext,\n ): any[] | Promise<any[]> {\n return messages;\n }\n\n /**\n * Compute per-message compression biases.\n * Return a map of message index -> bias (>1 = preserve more, <1 = compress more).\n */\n computeBiases(\n _messages: any[],\n _ctx: CompressContext,\n ): Record<number, number> | Promise<Record<number, number>> {\n return {};\n }\n\n /**\n * Called after compression. Observe-only — cannot modify the result.\n */\n postCompress(_event: CompressEvent): void | Promise<void> {\n // no-op default\n }\n}\n\n/**\n * Extract the last user message text from a messages array (any format).\n */\nexport function extractUserQuery(messages: any[]): string {\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") return msg.content;\n if (Array.isArray(msg.content)) {\n const textPart = msg.content.find(\n (p: any) => p.type === \"text\" || p.text,\n );\n if (textPart) return textPart.text ?? textPart.content ?? \"\";\n }\n }\n }\n return \"\";\n}\n\n/**\n * Count conversation turns (user+assistant pairs).\n */\nexport function countTurns(messages: any[]): number {\n return messages.filter((m) => m.role === \"user\").length;\n}\n\n/**\n * Extract tool call names from messages.\n */\nexport function extractToolCalls(messages: any[]): string[] {\n const names: string[] = [];\n for (const msg of messages) {\n if (msg.tool_calls) {\n for (const tc of msg.tool_calls) {\n names.push(tc.function?.name ?? tc.name ?? \"unknown\");\n }\n }\n if (Array.isArray(msg.content)) {\n for (const part of msg.content) {\n if (part.type === \"tool_use\") names.push(part.name ?? \"unknown\");\n if (part.type === \"tool-call\") names.push(part.toolName ?? \"unknown\");\n }\n }\n }\n return names;\n}\n","/**\n * Universal compress function with hooks support.\n * Accepts messages in any format: OpenAI, Anthropic, Vercel AI SDK, or Google Gemini.\n */\n\nimport { HeadroomClient } from \"./client.js\";\nimport type { CompressResult, CompressOptions } from \"./types.js\";\nimport { detectFormat, toOpenAI, fromOpenAI } from \"./utils/format.js\";\nimport type { CompressionHooks, CompressContext, CompressEvent } from \"./hooks.js\";\nimport { extractUserQuery, countTurns, extractToolCalls } from \"./hooks.js\";\n\n/**\n * Compress an array of messages using the Headroom proxy.\n *\n * Accepts messages in any format: OpenAI, Anthropic, Vercel AI SDK, or Google Gemini.\n * Detects the format automatically, compresses via the proxy, and returns\n * compressed messages in the same format as the input.\n */\nexport async function compress(\n messages: any[],\n options: CompressOptions = {},\n): Promise<CompressResult> {\n const {\n client: providedClient,\n model,\n tokenBudget,\n hooks,\n config,\n ...clientOptions\n } = options;\n\n // Build hook context\n const ctx: CompressContext = {\n model: model ?? \"gpt-4o\",\n userQuery: extractUserQuery(messages),\n turnNumber: countTurns(messages),\n toolCalls: extractToolCalls(messages),\n provider: \"\",\n };\n\n // 1. Pre-compress hook\n let processedMessages = messages;\n if (hooks) {\n processedMessages = await hooks.preCompress(messages, ctx);\n }\n\n // 2. Detect input format\n const inputFormat = detectFormat(processedMessages);\n\n // 3. Convert to OpenAI format (the proxy's lingua franca)\n const openaiMessages = toOpenAI(processedMessages);\n\n // 4. Compute biases\n let biases: Record<number, number> = {};\n if (hooks) {\n biases = await hooks.computeBiases(openaiMessages, ctx);\n }\n\n // 5. Compress via proxy\n const client = providedClient ?? new HeadroomClient(clientOptions);\n const result = await client.compress(openaiMessages, { model, tokenBudget, config });\n\n // 6. Convert compressed messages back to original format\n const outputMessages = fromOpenAI(result.messages, inputFormat);\n\n const finalResult: CompressResult = {\n ...result,\n messages: outputMessages,\n };\n\n // 7. Post-compress hook\n if (hooks) {\n const event: CompressEvent = {\n tokensBefore: result.tokensBefore,\n tokensAfter: result.tokensAfter,\n tokensSaved: result.tokensSaved,\n compressionRatio: result.compressionRatio,\n transformsApplied: result.transformsApplied,\n ccrHashes: result.ccrHashes,\n model: ctx.model,\n userQuery: ctx.userQuery,\n provider: ctx.provider,\n };\n await hooks.postCompress(event);\n }\n\n return finalResult;\n}\n"]}
@@ -179,6 +179,11 @@ function makeFallbackResult(messages) {
179
179
  compressed: false
180
180
  };
181
181
  }
182
+ function trimTrailingSlashes(value) {
183
+ let end = value.length;
184
+ while (end > 0 && value.charCodeAt(end - 1) === 47) end--;
185
+ return value.slice(0, end);
186
+ }
182
187
  var ChatCompletions = class {
183
188
  constructor(client) {
184
189
  this.client = client;
@@ -281,7 +286,9 @@ var HeadroomClient = class {
281
286
  /** Anthropic-style messages API. */
282
287
  messages;
283
288
  constructor(options = {}) {
284
- this.baseUrl = (options.baseUrl ?? getEnv("HEADROOM_BASE_URL") ?? DEFAULT_BASE_URL).replace(/\/+$/, "");
289
+ this.baseUrl = trimTrailingSlashes(
290
+ options.baseUrl ?? getEnv("HEADROOM_BASE_URL") ?? DEFAULT_BASE_URL
291
+ );
285
292
  this.apiKey = options.apiKey ?? getEnv("HEADROOM_API_KEY");
286
293
  this.timeout = options.timeout ?? DEFAULT_TIMEOUT;
287
294
  this.fallback = options.fallback ?? true;
@@ -1150,5 +1157,5 @@ async function compress(messages, options = {}) {
1150
1157
  }
1151
1158
 
1152
1159
  export { CacheError, CompressionHooks, ConfigurationError, HeadroomAuthError, HeadroomClient, HeadroomCompressError, HeadroomConnectionError, HeadroomError, ProviderError, StorageError, TokenizationError, TransformError, ValidationError, __require, anthropicToOpenAI, camelToSnake, collectStream, compress, countTurns, deepCamelCase, deepSnakeCase, detectFormat, extractToolCalls, extractUserQuery, fromOpenAI, mapProxyError, openAIToAnthropic, openAIToVercel, parseSSE, snakeToCamel, toOpenAI, vercelToOpenAI };
1153
- //# sourceMappingURL=chunk-FJQ65W3R.js.map
1154
- //# sourceMappingURL=chunk-FJQ65W3R.js.map
1160
+ //# sourceMappingURL=chunk-WKB3ITLL.js.map
1161
+ //# sourceMappingURL=chunk-WKB3ITLL.js.map