@agent-relay/credential-proxy 4.0.10 → 4.0.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +71 -0
  2. package/dist/crypto-polyfill.d.ts +2 -0
  3. package/dist/crypto-polyfill.d.ts.map +1 -0
  4. package/dist/crypto-polyfill.js +8 -0
  5. package/dist/crypto-polyfill.js.map +1 -0
  6. package/dist/index.d.ts +17 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +89 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/jwt.d.ts +20 -0
  11. package/dist/jwt.d.ts.map +1 -0
  12. package/dist/jwt.js +102 -0
  13. package/dist/jwt.js.map +1 -0
  14. package/dist/metering.d.ts +27 -0
  15. package/dist/metering.d.ts.map +1 -0
  16. package/dist/metering.js +82 -0
  17. package/dist/metering.js.map +1 -0
  18. package/dist/providers/anthropic.d.ts +11 -0
  19. package/dist/providers/anthropic.d.ts.map +1 -0
  20. package/dist/providers/anthropic.js +39 -0
  21. package/dist/providers/anthropic.js.map +1 -0
  22. package/dist/providers/index.d.ts +9 -0
  23. package/dist/providers/index.d.ts.map +1 -0
  24. package/dist/providers/index.js +27 -0
  25. package/dist/providers/index.js.map +1 -0
  26. package/dist/providers/openai.d.ts +11 -0
  27. package/dist/providers/openai.d.ts.map +1 -0
  28. package/dist/providers/openai.js +56 -0
  29. package/dist/providers/openai.js.map +1 -0
  30. package/dist/providers/openrouter.d.ts +11 -0
  31. package/dist/providers/openrouter.d.ts.map +1 -0
  32. package/dist/providers/openrouter.js +60 -0
  33. package/dist/providers/openrouter.js.map +1 -0
  34. package/dist/providers/types.d.ts +36 -0
  35. package/dist/providers/types.d.ts.map +1 -0
  36. package/dist/providers/types.js +248 -0
  37. package/dist/providers/types.js.map +1 -0
  38. package/dist/router.d.ts +29 -0
  39. package/dist/router.d.ts.map +1 -0
  40. package/dist/router.js +325 -0
  41. package/dist/router.js.map +1 -0
  42. package/dist/types.d.ts +54 -0
  43. package/dist/types.d.ts.map +1 -0
  44. package/dist/types.js +2 -0
  45. package/dist/types.js.map +1 -0
  46. package/package.json +4 -2
@@ -0,0 +1,56 @@
1
+ import { extractOpenAIUsage, forwardProviderRequest, getCapturedUsage, isRecord, normalizePath, } from './types.js';
2
+ function injectStreamingUsage(body) {
3
+ if (!isRecord(body) || body.stream !== true) {
4
+ return body;
5
+ }
6
+ const streamOptions = isRecord(body.stream_options) ? body.stream_options : {};
7
+ return {
8
+ ...body,
9
+ stream_options: {
10
+ ...streamOptions,
11
+ include_usage: true,
12
+ },
13
+ };
14
+ }
15
+ function extractStreamingUsage(eventData) {
16
+ if (eventData === '[DONE]') {
17
+ return null;
18
+ }
19
+ try {
20
+ return extractOpenAIUsage(JSON.parse(eventData));
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ export class OpenAIProviderAdapter {
27
+ name = 'openai';
28
+ baseUrl = 'https://api.openai.com';
29
+ authHeader(apiKey) {
30
+ return {
31
+ Authorization: `Bearer ${apiKey}`,
32
+ };
33
+ }
34
+ matchesPath(path) {
35
+ const normalizedPath = normalizePath(path);
36
+ return normalizedPath === '/v1/chat/completions' || normalizedPath === '/v1/embeddings';
37
+ }
38
+ forwardRequest(req, apiKey) {
39
+ return forwardProviderRequest({
40
+ request: req,
41
+ baseUrl: this.baseUrl,
42
+ authHeaders: this.authHeader(apiKey),
43
+ usageExtractor: extractOpenAIUsage,
44
+ streamingUsageExtractor: extractStreamingUsage,
45
+ transformJsonBody: injectStreamingUsage,
46
+ });
47
+ }
48
+ extractUsage(response) {
49
+ if (response instanceof Response) {
50
+ return getCapturedUsage(response);
51
+ }
52
+ return extractOpenAIUsage(response);
53
+ }
54
+ }
55
+ export const openAIProviderAdapter = new OpenAIProviderAdapter();
56
+ //# sourceMappingURL=openai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.js","sourceRoot":"","sources":["../../src/providers/openai.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,aAAa,GAGd,MAAM,YAAY,CAAC;AAEpB,SAAS,oBAAoB,CAAC,IAAa;IACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO;QACL,GAAG,IAAI;QACP,cAAc,EAAE;YACd,GAAG,aAAa;YAChB,aAAa,EAAE,IAAI;SACpB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,qBAAqB;IACvB,IAAI,GAAG,QAAiB,CAAC;IACzB,OAAO,GAAG,wBAAwB,CAAC;IAE5C,UAAU,CAAC,MAAc;QACvB,OAAO;YACL,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,cAAc,KAAK,sBAAsB,IAAI,cAAc,KAAK,gBAAgB,CAAC;IAC1F,CAAC;IAED,cAAc,CAAC,GAAY,EAAE,MAAc;QACzC,OAAO,sBAAsB,CAAC;YAC5B,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC,cAAc,EAAE,kBAAkB;YAClC,uBAAuB,EAAE,qBAAqB;YAC9C,iBAAiB,EAAE,oBAAoB;SACxC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,QAA2B;QACtC,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;YACjC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,EAAE,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type ProviderAdapter, type TokenUsage } from './types.js';
2
+ export declare class OpenRouterProviderAdapter implements ProviderAdapter {
3
+ readonly name: "openrouter";
4
+ readonly baseUrl = "https://openrouter.ai/api";
5
+ authHeader(apiKey: string): Record<string, string>;
6
+ matchesPath(path: string): boolean;
7
+ forwardRequest(req: Request, apiKey: string): Promise<Response>;
8
+ extractUsage(response: Response | object): TokenUsage | null;
9
+ }
10
+ export declare const openRouterProviderAdapter: OpenRouterProviderAdapter;
11
+ //# sourceMappingURL=openrouter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AA+BpB,qBAAa,yBAA0B,YAAW,eAAe;IAC/D,QAAQ,CAAC,IAAI,EAAG,YAAY,CAAU;IACtC,QAAQ,CAAC,OAAO,+BAA+B;IAE/C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAMlD,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAKlC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAc/D,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI;CAO7D;AAED,eAAO,MAAM,yBAAyB,2BAAkC,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { extractOpenAIUsage, forwardProviderRequest, getCapturedUsage, isRecord, normalizePath, } from './types.js';
2
+ const OPENROUTER_TITLE = 'Relay Credential Proxy';
3
+ function injectStreamingUsage(body) {
4
+ if (!isRecord(body) || body.stream !== true) {
5
+ return body;
6
+ }
7
+ const streamOptions = isRecord(body.stream_options) ? body.stream_options : {};
8
+ return {
9
+ ...body,
10
+ stream_options: {
11
+ ...streamOptions,
12
+ include_usage: true,
13
+ },
14
+ };
15
+ }
16
+ function extractStreamingUsage(eventData) {
17
+ if (eventData === '[DONE]') {
18
+ return null;
19
+ }
20
+ try {
21
+ return extractOpenAIUsage(JSON.parse(eventData));
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ export class OpenRouterProviderAdapter {
28
+ name = 'openrouter';
29
+ baseUrl = 'https://openrouter.ai/api';
30
+ authHeader(apiKey) {
31
+ return {
32
+ Authorization: `Bearer ${apiKey}`,
33
+ };
34
+ }
35
+ matchesPath(path) {
36
+ const normalizedPath = normalizePath(path);
37
+ return normalizedPath === '/v1/chat/completions' || normalizedPath === '/v1/embeddings';
38
+ }
39
+ forwardRequest(req, apiKey) {
40
+ return forwardProviderRequest({
41
+ request: req,
42
+ baseUrl: this.baseUrl,
43
+ authHeaders: this.authHeader(apiKey),
44
+ extraHeaders: {
45
+ 'X-Title': OPENROUTER_TITLE,
46
+ },
47
+ usageExtractor: extractOpenAIUsage,
48
+ streamingUsageExtractor: extractStreamingUsage,
49
+ transformJsonBody: injectStreamingUsage,
50
+ });
51
+ }
52
+ extractUsage(response) {
53
+ if (response instanceof Response) {
54
+ return getCapturedUsage(response);
55
+ }
56
+ return extractOpenAIUsage(response);
57
+ }
58
+ }
59
+ export const openRouterProviderAdapter = new OpenRouterProviderAdapter();
60
+ //# sourceMappingURL=openrouter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter.js","sourceRoot":"","sources":["../../src/providers/openrouter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,QAAQ,EACR,aAAa,GAGd,MAAM,YAAY,CAAC;AAEpB,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD,SAAS,oBAAoB,CAAC,IAAa;IACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO;QACL,GAAG,IAAI;QACP,cAAc,EAAE;YACd,GAAG,aAAa;YAChB,aAAa,EAAE,IAAI;SACpB;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,SAAiB;IAC9C,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAY,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,OAAO,yBAAyB;IAC3B,IAAI,GAAG,YAAqB,CAAC;IAC7B,OAAO,GAAG,2BAA2B,CAAC;IAE/C,UAAU,CAAC,MAAc;QACvB,OAAO;YACL,aAAa,EAAE,UAAU,MAAM,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,WAAW,CAAC,IAAY;QACtB,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,cAAc,KAAK,sBAAsB,IAAI,cAAc,KAAK,gBAAgB,CAAC;IAC1F,CAAC;IAED,cAAc,CAAC,GAAY,EAAE,MAAc;QACzC,OAAO,sBAAsB,CAAC;YAC5B,OAAO,EAAE,GAAG;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;YACpC,YAAY,EAAE;gBACZ,SAAS,EAAE,gBAAgB;aAC5B;YACD,cAAc,EAAE,kBAAkB;YAClC,uBAAuB,EAAE,qBAAqB;YAC9C,iBAAiB,EAAE,oBAAoB;SACxC,CAAC,CAAC;IACL,CAAC;IAED,YAAY,CAAC,QAA2B;QACtC,IAAI,QAAQ,YAAY,QAAQ,EAAE,CAAC;YACjC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;CACF;AAED,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,yBAAyB,EAAE,CAAC"}
@@ -0,0 +1,36 @@
1
+ export type ProviderType = 'openai' | 'anthropic' | 'openrouter';
2
+ export interface TokenUsage {
3
+ inputTokens: number;
4
+ outputTokens: number;
5
+ totalTokens: number;
6
+ model?: string;
7
+ }
8
+ export interface ProviderAdapter {
9
+ readonly name: ProviderType;
10
+ authHeader(apiKey: string): Record<string, string>;
11
+ readonly baseUrl: string;
12
+ matchesPath(path: string): boolean;
13
+ forwardRequest(req: Request, apiKey: string): Promise<Response>;
14
+ extractUsage(response: Response | object): TokenUsage | null;
15
+ }
16
+ type JsonTransform = (body: unknown) => unknown;
17
+ type StreamingUsageExtractor = (eventData: string) => TokenUsage | null;
18
+ export declare function getCapturedUsage(response: Response): TokenUsage | null;
19
+ export declare function waitForCapturedUsage(response: Response): Promise<TokenUsage | null>;
20
+ export declare function normalizePath(path: string): string;
21
+ export declare function isRecord(value: unknown): value is Record<string, unknown>;
22
+ export declare function getNumber(value: unknown): number | null;
23
+ export declare function createTokenUsage(inputTokens: number, outputTokens: number, model?: string): TokenUsage;
24
+ export declare function extractOpenAIUsage(payload: unknown): TokenUsage | null;
25
+ export declare function extractAnthropicUsage(payload: unknown): TokenUsage | null;
26
+ export declare function forwardProviderRequest(options: {
27
+ request: Request;
28
+ baseUrl: string;
29
+ authHeaders: Record<string, string>;
30
+ usageExtractor: (payload: unknown) => TokenUsage | null;
31
+ streamingUsageExtractor?: StreamingUsageExtractor;
32
+ transformJsonBody?: JsonTransform;
33
+ extraHeaders?: Record<string, string>;
34
+ }): Promise<Response>;
35
+ export {};
36
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,WAAW,GAAG,YAAY,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IACnC,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAChE,YAAY,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;CAC9D;AAyBD,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC;AAChD,KAAK,uBAAuB,GAAG,CAAC,SAAS,EAAE,MAAM,KAAK,UAAU,GAAG,IAAI,CAAC;AAKxE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,IAAI,CAEtE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAEnF;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAEzE;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAEvD;AAED,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,UAAU,CAOtG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CActE;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,GAAG,IAAI,CAuBzE;AAED,wBAAsB,sBAAsB,CAAC,OAAO,EAAE;IACpD,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,cAAc,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,UAAU,GAAG,IAAI,CAAC;IACxD,uBAAuB,CAAC,EAAE,uBAAuB,CAAC;IAClD,iBAAiB,CAAC,EAAE,aAAa,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAsBpB"}
@@ -0,0 +1,248 @@
1
+ /** Maximum SSE buffer size (1 MB) before discarding incomplete data to prevent OOM. */
2
+ const MAX_SSE_BUFFER_BYTES = 1024 * 1024;
3
+ /** Headers stripped from incoming agent requests before forwarding upstream. */
4
+ const STRIPPED_REQUEST_HEADERS = new Set([
5
+ 'authorization',
6
+ 'host',
7
+ 'content-length',
8
+ 'connection',
9
+ 'cookie',
10
+ 'proxy-authorization',
11
+ 'x-api-key',
12
+ 'x-forwarded-for',
13
+ 'x-forwarded-host',
14
+ 'x-forwarded-proto',
15
+ 'x-real-ip',
16
+ 'transfer-encoding',
17
+ ]);
18
+ const usageStateByResponse = new WeakMap();
19
+ const usagePromiseByResponse = new WeakMap();
20
+ export function getCapturedUsage(response) {
21
+ return usageStateByResponse.get(response)?.usage ?? null;
22
+ }
23
+ export function waitForCapturedUsage(response) {
24
+ return usagePromiseByResponse.get(response) ?? Promise.resolve(getCapturedUsage(response));
25
+ }
26
+ export function normalizePath(path) {
27
+ const pathname = new URL(path, 'http://localhost').pathname;
28
+ return pathname.length > 1 ? pathname.replace(/\/+$/, '') : pathname;
29
+ }
30
+ export function isRecord(value) {
31
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
32
+ }
33
+ export function getNumber(value) {
34
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
35
+ }
36
+ export function createTokenUsage(inputTokens, outputTokens, model) {
37
+ return {
38
+ inputTokens,
39
+ outputTokens,
40
+ totalTokens: inputTokens + outputTokens,
41
+ ...(model ? { model } : {}),
42
+ };
43
+ }
44
+ export function extractOpenAIUsage(payload) {
45
+ if (!isRecord(payload) || !isRecord(payload.usage)) {
46
+ return null;
47
+ }
48
+ const inputTokens = getNumber(payload.usage.prompt_tokens) ?? 0;
49
+ const outputTokens = getNumber(payload.usage.completion_tokens) ?? 0;
50
+ if (inputTokens === 0 && outputTokens === 0) {
51
+ return null;
52
+ }
53
+ const model = typeof payload.model === 'string' ? payload.model : undefined;
54
+ return createTokenUsage(inputTokens, outputTokens, model);
55
+ }
56
+ export function extractAnthropicUsage(payload) {
57
+ if (!isRecord(payload)) {
58
+ return null;
59
+ }
60
+ const usage = (isRecord(payload.usage) && payload.usage)
61
+ || (isRecord(payload.message) && isRecord(payload.message.usage) && payload.message.usage)
62
+ || (isRecord(payload.delta) && isRecord(payload.delta.usage) && payload.delta.usage);
63
+ if (!usage) {
64
+ return null;
65
+ }
66
+ const inputTokens = getNumber(usage.input_tokens) ?? 0;
67
+ const outputTokens = getNumber(usage.output_tokens) ?? 0;
68
+ if (inputTokens === 0 && outputTokens === 0) {
69
+ return null;
70
+ }
71
+ const model = typeof payload.model === 'string' ? payload.model : undefined;
72
+ return createTokenUsage(inputTokens, outputTokens, model);
73
+ }
74
+ export async function forwardProviderRequest(options) {
75
+ const requestUrl = new URL(options.request.url);
76
+ const upstreamUrl = new URL(`${requestUrl.pathname}${requestUrl.search}`, options.baseUrl);
77
+ const headers = createUpstreamRequestHeaders(options.request.headers, options.authHeaders, options.extraHeaders);
78
+ const body = await createUpstreamRequestBody(options.request, options.transformJsonBody);
79
+ const upstreamResponse = await fetch(upstreamUrl, {
80
+ method: options.request.method,
81
+ headers,
82
+ body,
83
+ redirect: 'manual',
84
+ });
85
+ return captureProviderResponse(upstreamResponse, options.usageExtractor, options.streamingUsageExtractor);
86
+ }
87
+ function createUpstreamRequestHeaders(incomingHeaders, authHeaders, extraHeaders) {
88
+ const headers = new Headers();
89
+ incomingHeaders.forEach((value, key) => {
90
+ const lowerKey = key.toLowerCase();
91
+ if (STRIPPED_REQUEST_HEADERS.has(lowerKey)) {
92
+ return;
93
+ }
94
+ headers.set(key, value);
95
+ });
96
+ for (const [key, value] of Object.entries(authHeaders)) {
97
+ headers.set(key, value);
98
+ }
99
+ if (extraHeaders) {
100
+ for (const [key, value] of Object.entries(extraHeaders)) {
101
+ headers.set(key, value);
102
+ }
103
+ }
104
+ return headers;
105
+ }
106
+ async function createUpstreamRequestBody(request, transformJsonBody) {
107
+ if (request.method === 'GET' || request.method === 'HEAD') {
108
+ return undefined;
109
+ }
110
+ const rawBody = await request.clone().text();
111
+ if (rawBody.length === 0) {
112
+ return undefined;
113
+ }
114
+ if (!transformJsonBody || !isJsonContentType(request.headers.get('content-type'))) {
115
+ return rawBody;
116
+ }
117
+ try {
118
+ const parsed = JSON.parse(rawBody);
119
+ return JSON.stringify(transformJsonBody(parsed));
120
+ }
121
+ catch {
122
+ return rawBody;
123
+ }
124
+ }
125
+ function isJsonContentType(contentType) {
126
+ return contentType?.toLowerCase().includes('application/json') ?? false;
127
+ }
128
+ function captureProviderResponse(upstreamResponse, usageExtractor, streamingUsageExtractor) {
129
+ const contentType = upstreamResponse.headers.get('content-type')?.toLowerCase() ?? '';
130
+ if (upstreamResponse.body &&
131
+ contentType.includes('text/event-stream') &&
132
+ streamingUsageExtractor) {
133
+ return captureStreamingResponse(upstreamResponse, streamingUsageExtractor);
134
+ }
135
+ return captureNonStreamingResponse(upstreamResponse, usageExtractor);
136
+ }
137
+ async function captureNonStreamingResponse(upstreamResponse, usageExtractor) {
138
+ if (!upstreamResponse.body) {
139
+ const response = new Response(null, {
140
+ status: upstreamResponse.status,
141
+ statusText: upstreamResponse.statusText,
142
+ headers: cloneResponseHeaders(upstreamResponse.headers),
143
+ });
144
+ const state = { usage: null };
145
+ usageStateByResponse.set(response, state);
146
+ usagePromiseByResponse.set(response, Promise.resolve(null));
147
+ return response;
148
+ }
149
+ const rawBody = await upstreamResponse.text();
150
+ let usage = null;
151
+ try {
152
+ usage = usageExtractor(JSON.parse(rawBody));
153
+ }
154
+ catch {
155
+ usage = null;
156
+ }
157
+ const response = new Response(rawBody, {
158
+ status: upstreamResponse.status,
159
+ statusText: upstreamResponse.statusText,
160
+ headers: cloneResponseHeaders(upstreamResponse.headers),
161
+ });
162
+ const state = { usage };
163
+ usageStateByResponse.set(response, state);
164
+ usagePromiseByResponse.set(response, Promise.resolve(usage));
165
+ return response;
166
+ }
167
+ function captureStreamingResponse(upstreamResponse, streamingUsageExtractor) {
168
+ const state = { usage: null };
169
+ let resolveUsage;
170
+ const usagePromise = new Promise((resolve) => {
171
+ resolveUsage = resolve;
172
+ });
173
+ const decoder = new TextDecoder();
174
+ let buffer = '';
175
+ const transformedBody = upstreamResponse.body.pipeThrough(new TransformStream({
176
+ transform(chunk, controller) {
177
+ controller.enqueue(chunk);
178
+ buffer += decoder.decode(chunk, { stream: true });
179
+ // Prevent unbounded buffer growth from malformed SSE streams.
180
+ if (buffer.length > MAX_SSE_BUFFER_BYTES) {
181
+ buffer = '';
182
+ return;
183
+ }
184
+ const consumed = consumeCompleteSseEvents(buffer);
185
+ buffer = consumed.remainder;
186
+ for (const eventText of consumed.events) {
187
+ const usage = extractUsageFromSseEvent(eventText, streamingUsageExtractor);
188
+ if (usage) {
189
+ state.usage = usage;
190
+ }
191
+ }
192
+ },
193
+ flush() {
194
+ buffer += decoder.decode();
195
+ const consumed = consumeCompleteSseEvents(`${buffer}\n\n`);
196
+ for (const eventText of consumed.events) {
197
+ const usage = extractUsageFromSseEvent(eventText, streamingUsageExtractor);
198
+ if (usage) {
199
+ state.usage = usage;
200
+ }
201
+ }
202
+ resolveUsage?.(state.usage);
203
+ },
204
+ }));
205
+ const response = new Response(transformedBody, {
206
+ status: upstreamResponse.status,
207
+ statusText: upstreamResponse.statusText,
208
+ headers: cloneResponseHeaders(upstreamResponse.headers),
209
+ });
210
+ usageStateByResponse.set(response, state);
211
+ usagePromiseByResponse.set(response, usagePromise);
212
+ return response;
213
+ }
214
+ function consumeCompleteSseEvents(buffer) {
215
+ const events = [];
216
+ const separator = /\r?\n\r?\n/g;
217
+ let lastIndex = 0;
218
+ let match;
219
+ while ((match = separator.exec(buffer)) !== null) {
220
+ events.push(buffer.slice(lastIndex, match.index));
221
+ lastIndex = separator.lastIndex;
222
+ }
223
+ return {
224
+ events,
225
+ remainder: buffer.slice(lastIndex),
226
+ };
227
+ }
228
+ function extractUsageFromSseEvent(eventText, streamingUsageExtractor) {
229
+ if (eventText.trim().length === 0) {
230
+ return null;
231
+ }
232
+ const dataLines = [];
233
+ for (const line of eventText.split(/\r?\n/)) {
234
+ if (line.startsWith('data:')) {
235
+ dataLines.push(line.slice(5).trimStart());
236
+ }
237
+ }
238
+ if (dataLines.length === 0) {
239
+ return null;
240
+ }
241
+ return streamingUsageExtractor(dataLines.join('\n'));
242
+ }
243
+ function cloneResponseHeaders(headers) {
244
+ const cloned = new Headers(headers);
245
+ cloned.delete('content-length');
246
+ return cloned;
247
+ }
248
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/providers/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import './crypto-polyfill.js';
2
+ import { Hono } from 'hono';
3
+ import { MeteringCollector } from './metering.js';
4
+ import type { AdminTokenClaims, ProxyTokenClaims } from './types.js';
5
+ type AppEnv = {
6
+ Variables: CredentialProxyVariables;
7
+ };
8
+ export interface CredentialProxyVariables {
9
+ requestId: string;
10
+ claims: ProxyTokenClaims;
11
+ adminClaims: AdminTokenClaims;
12
+ }
13
+ export interface CredentialStore {
14
+ resolve(claims: ProxyTokenClaims): Promise<string>;
15
+ }
16
+ export interface CredentialProxyOptions {
17
+ jwtSecret?: string;
18
+ adminJwtSecret?: string;
19
+ adminAudience?: string;
20
+ metering?: MeteringCollector;
21
+ credentialStore?: CredentialStore;
22
+ requestIdFactory?: () => string;
23
+ }
24
+ export type CredentialProxyApp = Hono<AppEnv>;
25
+ export declare function createCredentialStore(): CredentialStore;
26
+ export declare function createCredentialProxyApp(options?: CredentialProxyOptions): CredentialProxyApp;
27
+ export declare const app: CredentialProxyApp;
28
+ export default app;
29
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA,OAAO,sBAAsB,CAAC;AAI9B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,iBAAiB,EAA2C,MAAM,eAAe,CAAC;AAI3F,OAAO,KAAK,EACV,gBAAgB,EAGhB,gBAAgB,EAEjB,MAAM,YAAY,CAAC;AAWpB,KAAK,MAAM,GAAG;IACZ,SAAS,EAAE,wBAAwB,CAAC;CACrC,CAAC;AAEF,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,gBAAgB,CAAC;IACzB,WAAW,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,gBAAgB,CAAC,EAAE,MAAM,MAAM,CAAC;CACjC;AAED,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;AAiC9C,wBAAgB,qBAAqB,IAAI,eAAe,CAEvD;AAED,wBAAgB,wBAAwB,CAAC,OAAO,GAAE,sBAA2B,GAAG,kBAAkB,CA+GjG;AAED,eAAO,MAAM,GAAG,oBAA6B,CAAC;AA8Q9C,eAAe,GAAG,CAAC"}