fest-gateway 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +87 -0
  2. package/dist/cli/codex.js +116 -0
  3. package/dist/cli/codex.js.map +1 -0
  4. package/dist/cli/copilot.js +109 -0
  5. package/dist/cli/copilot.js.map +1 -0
  6. package/dist/server/api/live.js +1 -0
  7. package/dist/server/api/live.js.map +1 -1
  8. package/dist/server/api/routes.js +2 -1
  9. package/dist/server/api/routes.js.map +1 -1
  10. package/dist/server/bin/fest.js +41 -1
  11. package/dist/server/bin/fest.js.map +1 -1
  12. package/dist/server/config.js +47 -0
  13. package/dist/server/config.js.map +1 -1
  14. package/dist/server/http/client.js +54 -0
  15. package/dist/server/http/client.js.map +1 -0
  16. package/dist/server/http/errors.js +23 -0
  17. package/dist/server/http/errors.js.map +1 -1
  18. package/dist/server/http/headers.js +53 -4
  19. package/dist/server/http/headers.js.map +1 -1
  20. package/dist/server/http/server.js +104 -0
  21. package/dist/server/http/server.js.map +1 -1
  22. package/dist/server/http/sse.js +2 -1
  23. package/dist/server/http/sse.js.map +1 -1
  24. package/dist/server/pipeline/bedrock.js +86 -0
  25. package/dist/server/pipeline/bedrock.js.map +1 -0
  26. package/dist/server/pipeline/count-tokens.js +5 -1
  27. package/dist/server/pipeline/count-tokens.js.map +1 -1
  28. package/dist/server/pipeline/dispatch.js +3 -1
  29. package/dist/server/pipeline/dispatch.js.map +1 -1
  30. package/dist/server/pipeline/openai.js +101 -0
  31. package/dist/server/pipeline/openai.js.map +1 -0
  32. package/dist/server/pipeline/passthrough.js +55 -35
  33. package/dist/server/pipeline/passthrough.js.map +1 -1
  34. package/dist/server/pipeline/record.js +1 -0
  35. package/dist/server/pipeline/record.js.map +1 -1
  36. package/dist/server/pipeline/wire.js +63 -0
  37. package/dist/server/pipeline/wire.js.map +1 -0
  38. package/dist/server/secret/fingerprint.js +11 -1
  39. package/dist/server/secret/fingerprint.js.map +1 -1
  40. package/dist/server/store/migrations/006-client.sql +14 -0
  41. package/dist/server/store/queries.js +27 -1
  42. package/dist/server/store/queries.js.map +1 -1
  43. package/dist/server/store/write.js +3 -2
  44. package/dist/server/store/write.js.map +1 -1
  45. package/dist/server/usage/accumulator.js +3 -3
  46. package/dist/server/usage/accumulator.js.map +1 -1
  47. package/dist/server/usage/prices/catalog.js +3 -1
  48. package/dist/server/usage/prices/catalog.js.map +1 -1
  49. package/dist/server/usage/responses.js +124 -0
  50. package/dist/server/usage/responses.js.map +1 -0
  51. package/dist/shared/demotion-vars.js +35 -0
  52. package/dist/shared/demotion-vars.js.map +1 -1
  53. package/dist/web/dist/assets/bitter-latin-700-normal-1jQzrEdb.woff2 +0 -0
  54. package/dist/web/dist/assets/bitter-latin-700-normal-BHV1FLDM.woff +0 -0
  55. package/dist/web/dist/assets/index-C7n3_lX2.css +2 -0
  56. package/dist/web/dist/assets/index-TVK-7gFI.js +56 -0
  57. package/dist/web/dist/assets/index-TVK-7gFI.js.map +1 -0
  58. package/dist/web/dist/index.html +7 -3
  59. package/package.json +2 -1
  60. package/dist/web/dist/assets/index-AEUYX58m.css +0 -2
  61. package/dist/web/dist/assets/index-DQd08peN.js +0 -56
  62. package/dist/web/dist/assets/index-DQd08peN.js.map +0 -1
@@ -55,6 +55,28 @@ function stringFromEnv(name) {
55
55
  const trimmed = raw.trim();
56
56
  return trimmed === "" ? null : trimmed;
57
57
  }
58
+ /**
59
+ * A Codex upstream: the default, a URL, or `off`.
60
+ *
61
+ * Same https rule as Bedrock, for a stronger reason: on `/chatgpt` the bearer
62
+ * crossing this hop is the developer's whole ChatGPT account.
63
+ */
64
+ function codexUpstreamFromEnv(name, fallback) {
65
+ const raw = stringFromEnv(name) ?? fallback;
66
+ if (raw.toLowerCase() === "off")
67
+ return null;
68
+ let parsed;
69
+ try {
70
+ parsed = new URL(raw);
71
+ }
72
+ catch {
73
+ throw new Error(`${name} is not a valid URL: ${JSON.stringify(raw)}`);
74
+ }
75
+ if (parsed.protocol !== "https:" && !["localhost", "127.0.0.1", "::1"].includes(parsed.hostname)) {
76
+ throw new Error(`${name} must be https (a developer's credential would otherwise cross the network in plaintext)`);
77
+ }
78
+ return raw.replace(/\/+$/, "");
79
+ }
58
80
  function listFromEnv(name) {
59
81
  const raw = process.env[name];
60
82
  if (raw === undefined)
@@ -76,6 +98,28 @@ export function loadConfig() {
76
98
  catch {
77
99
  throw new Error(`FEST_UPSTREAM_BASE_URL is not a valid URL: ${JSON.stringify(upstream)}`);
78
100
  }
101
+ /**
102
+ * Validated here rather than on first use: a typo in a Bedrock base URL would
103
+ * otherwise surface as a failed turn for one developer, hours later, with the
104
+ * gateway looking healthy.
105
+ */
106
+ const bedrock = stringFromEnv("FEST_BEDROCK_BASE_URL");
107
+ if (bedrock !== null) {
108
+ let parsed;
109
+ try {
110
+ parsed = new URL(bedrock);
111
+ }
112
+ catch {
113
+ throw new Error(`FEST_BEDROCK_BASE_URL is not a valid URL: ${JSON.stringify(bedrock)}`);
114
+ }
115
+ // A developer's AWS bearer crosses this hop. Loopback is exempt so a mock
116
+ // upstream stays testable, exactly as the routing table's rule works.
117
+ if (parsed.protocol !== "https:" && !["localhost", "127.0.0.1", "::1"].includes(parsed.hostname)) {
118
+ throw new Error(`FEST_BEDROCK_BASE_URL must be https (a developer's AWS bearer token would otherwise cross the network in plaintext)`);
119
+ }
120
+ }
121
+ const openai = codexUpstreamFromEnv("FEST_OPENAI_BASE_URL", "https://api.openai.com");
122
+ const chatgpt = codexUpstreamFromEnv("FEST_CHATGPT_BASE_URL", "https://chatgpt.com");
79
123
  const port = intFromEnv("FEST_PORT", 8787);
80
124
  const host = (process.env.FEST_HOST ?? "127.0.0.1").trim();
81
125
  const publicUrl = (stringFromEnv("FEST_PUBLIC_URL") ?? `http://${host}:${port}`).replace(/\/+$/, "");
@@ -88,6 +132,9 @@ export function loadConfig() {
88
132
  logLevel: level,
89
133
  requireIdentity: boolFromEnv("FEST_REQUIRE_IDENTITY", false),
90
134
  routesPath: (process.env.FEST_ROUTES ?? "").trim() || null,
135
+ bedrockBaseUrl: bedrock?.replace(/\/+$/, "") ?? null,
136
+ openaiBaseUrl: openai,
137
+ chatgptBaseUrl: chatgpt,
91
138
  secureCookies: boolFromEnv("FEST_SECURE_COOKIES", false),
92
139
  publicUrl,
93
140
  basePath: basePathFrom(stringFromEnv("FEST_BASE_PATH"), publicUrl),
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Which coding agent sent a request, and which of its sessions it belongs to.
3
+ *
4
+ * Fest fronts three clients, and each identifies itself differently. All of it
5
+ * was read off real traffic (the capture server, October 2026), because none
6
+ * of these headers is a documented contract:
7
+ *
8
+ * - Claude Code sends `x-claude-code-session-id`, and a `claude-cli/…`
9
+ * user-agent.
10
+ * - Codex sends `originator: codex_cli_rs` (interactive) or `codex_exec`
11
+ * (`codex exec`), a `codex_…/<version>` user-agent, and `session-id`.
12
+ * - Copilot CLI in BYOK mode uses the stock Anthropic or OpenAI SDK, so its
13
+ * user-agent is the SDK's (`Anthropic/JS 0.94.0`). What gives it away is
14
+ * GitHub's own pair, `x-initiator` and `x-interaction-type`, which it adds
15
+ * to every model call. It sends no session id at all.
16
+ *
17
+ * `fest codex` and `fest copilot` also send `X-Fest-Client`, which wins when
18
+ * present (`x-fest-*` is stripped before anything goes upstream). The sniffing
19
+ * below is for clients a developer pointed at Fest by hand.
20
+ *
21
+ * Detection is best-effort labelling for the dashboard, never a security
22
+ * decision: every one of these headers is caller-controlled.
23
+ */
24
+ function first(headers, name) {
25
+ const v = headers[name];
26
+ if (v === undefined)
27
+ return null;
28
+ const one = Array.isArray(v) ? v[0] : v;
29
+ return one === undefined || one === "" ? null : one;
30
+ }
31
+ export function detectClient(headers) {
32
+ const declared = first(headers, "x-fest-client");
33
+ if (declared === "claude-code" || declared === "codex" || declared === "copilot")
34
+ return declared;
35
+ const originator = first(headers, "originator");
36
+ const ua = first(headers, "user-agent") ?? "";
37
+ if (originator?.startsWith("codex") || /^codex[_-]/i.test(ua))
38
+ return "codex";
39
+ if (first(headers, "x-claude-code-session-id") !== null || ua.startsWith("claude-cli/")) {
40
+ return "claude-code";
41
+ }
42
+ if (first(headers, "x-initiator") !== null && first(headers, "x-interaction-type") !== null) {
43
+ return "copilot";
44
+ }
45
+ return null;
46
+ }
47
+ /** The client's own session id, in whichever header it puts one. */
48
+ export function sessionIdOf(headers) {
49
+ return (first(headers, "x-claude-code-session-id") ??
50
+ first(headers, "session-id") ??
51
+ first(headers, "session_id") ??
52
+ null);
53
+ }
54
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../server/http/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAMH,SAAS,KAAK,CAAC,OAAgB,EAAE,IAAY;IAC3C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACjD,IAAI,QAAQ,KAAK,aAAa,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAC;IAClG,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC;IAC9C,IAAI,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,OAAO,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,EAAE,0BAA0B,CAAC,KAAK,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QACxF,OAAO,aAAa,CAAC;IACvB,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,EAAE,oBAAoB,CAAC,KAAK,IAAI,EAAE,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,OAAO,CACL,KAAK,CAAC,OAAO,EAAE,0BAA0B,CAAC;QAC1C,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC;QAC5B,IAAI,CACL,CAAC;AACJ,CAAC"}
@@ -141,4 +141,27 @@ export function describeUpstreamFailure(status, text) {
141
141
  export function sseErrorEvent(type, message) {
142
142
  return `event: error\ndata: ${anthropicError(type, message)}\n\n`;
143
143
  }
144
+ /**
145
+ * The same refusal in OpenAI's envelope, for the `/openai` and `/chatgpt`
146
+ * mounts. Codex parses `error.message` out of this shape and shows it to the
147
+ * developer, so the message carries the same weight it does for Claude Code.
148
+ * The Anthropic type names are reused as-is: they are descriptive, and OpenAI
149
+ * itself uses `invalid_request_error` for the common case.
150
+ */
151
+ export function openaiError(type, message) {
152
+ return JSON.stringify({ error: { message, type, param: null, code: null } });
153
+ }
154
+ /**
155
+ * A terminal `response.failed` frame, for an upstream that dies mid-stream on a
156
+ * Responses wire. Codex treats it as the end of the turn and surfaces the
157
+ * message, where a bare truncation would read as a dropped connection and be
158
+ * retried.
159
+ */
160
+ export function openaiSseErrorEvent(type, message) {
161
+ const data = JSON.stringify({
162
+ type: "response.failed",
163
+ response: { status: "failed", error: { code: type, message } },
164
+ });
165
+ return `event: response.failed\ndata: ${data}\n\n`;
166
+ }
144
167
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../server/http/errors.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../server/http/errors.ts"],"names":[],"mappings":"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"}
@@ -62,8 +62,9 @@ export function buildUpstreamHeaders(inbound, opts) {
62
62
  }
63
63
  // `host` is hop-by-hop above, so it is re-set here for the real upstream.
64
64
  out.set("host", opts.upstreamHost);
65
- if (!sawAnthropicVersion)
65
+ if (!sawAnthropicVersion && opts.defaultAnthropicVersion !== false) {
66
66
  out.set("anthropic-version", DEFAULT_ANTHROPIC_VERSION);
67
+ }
67
68
  // Metering tees the SSE stream to count tokens; a gzip/zstd-framed body would
68
69
  // have to be inflated first, which means buffering a stream whose whole point
69
70
  // is not being buffered. Verified against production: asking for `identity`
@@ -105,13 +106,17 @@ export function buildDownstreamHeaders(upstream, opts) {
105
106
  out[lower] = value;
106
107
  return;
107
108
  }
108
- if (DOWNSTREAM_ALLOW.has(lower))
109
+ if (DOWNSTREAM_ALLOW.has(lower) || opts.allow?.(lower) === true)
109
110
  out[lower] = value;
110
111
  });
111
112
  // A non-streaming reply served as `text/plain` makes Claude Code report
112
113
  // "empty or malformed response" — it content-type-switches before parsing.
113
- if (out["content-type"] === undefined)
114
- out["content-type"] = "application/json";
114
+ //
115
+ // A stream with no content-type is labelled as one rather than as JSON:
116
+ // chatgpt.com's Codex backend sends its SSE with no content-type at all.
117
+ if (out["content-type"] === undefined) {
118
+ out["content-type"] = opts.stream ? "text/event-stream" : "application/json";
119
+ }
115
120
  if (opts.stream) {
116
121
  // Any intermediary that buffers turns a token-by-token stream into one
117
122
  // late blob. `no-transform` stops proxies re-compressing; `x-accel-buffering`
@@ -186,4 +191,48 @@ export function parseRateLimit(upstream) {
186
191
  return null;
187
192
  return snapshot;
188
193
  }
194
+ /**
195
+ * Read Codex's quota headers into the same snapshot.
196
+ *
197
+ * chatgpt.com reports two windows on every Codex response, captured from
198
+ * codex-cli 0.162.1 on a Plus plan:
199
+ *
200
+ * x-codex-primary-used-percent: 2 x-codex-primary-window-minutes: 300
201
+ * x-codex-primary-reset-at: 1791895315 (unix seconds)
202
+ * x-codex-secondary-used-percent: 0 x-codex-secondary-window-minutes: 10080
203
+ *
204
+ * 300 minutes and 10080 minutes are five hours and seven days — the same two
205
+ * windows Anthropic reports — so they land in the same fields and the same
206
+ * dashboard columns. Percent becomes a fraction to match Anthropic's
207
+ * `utilization`. The windows are mapped by role (primary, secondary), not by
208
+ * their reported length: if a plan ever reports different lengths, the columns
209
+ * are still "the short window" and "the long one".
210
+ */
211
+ export function parseCodexRateLimit(upstream) {
212
+ const fraction = (raw) => {
213
+ const n = num(raw);
214
+ return n === undefined ? undefined : n / 100;
215
+ };
216
+ const snapshot = {};
217
+ const fiveHourUtilization = fraction(upstream.get("x-codex-primary-used-percent"));
218
+ const fiveHourResetAt = num(upstream.get("x-codex-primary-reset-at"));
219
+ const sevenDayUtilization = fraction(upstream.get("x-codex-secondary-used-percent"));
220
+ const sevenDayResetAt = num(upstream.get("x-codex-secondary-reset-at"));
221
+ // Which limit is binding (`premium`, …) — the closest analogue Codex has to
222
+ // Anthropic's representative claim.
223
+ const claim = str(upstream.get("x-codex-active-limit"));
224
+ if (fiveHourUtilization !== undefined)
225
+ snapshot.fiveHourUtilization = fiveHourUtilization;
226
+ if (fiveHourResetAt !== undefined)
227
+ snapshot.fiveHourResetAt = fiveHourResetAt;
228
+ if (sevenDayUtilization !== undefined)
229
+ snapshot.sevenDayUtilization = sevenDayUtilization;
230
+ if (sevenDayResetAt !== undefined)
231
+ snapshot.sevenDayResetAt = sevenDayResetAt;
232
+ if (claim !== undefined)
233
+ snapshot.representativeClaim = claim;
234
+ if (Object.keys(snapshot).length === 0)
235
+ return null;
236
+ return snapshot;
237
+ }
189
238
  //# sourceMappingURL=headers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../server/http/headers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"headers.js","sourceRoot":"","sources":["../../../server/http/headers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAetE,oEAAoE;AACpE,MAAM,yBAAyB,GAAG,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAC,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAgE,EAChE,IAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,OAAO,EAAE,CAAC;IAC1B,IAAI,mBAAmB,GAAG,KAAK,CAAC;IAEhC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACpC,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,SAAS;QACxC,0EAA0E;QAC1E,IAAI,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,SAAS;QAE1C,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjD,IAAI,KAAK,KAAK,mBAAmB;YAAE,mBAAmB,GAAG,IAAI,CAAC;IAChE,CAAC;IAED,0EAA0E;IAC1E,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAEnC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,uBAAuB,KAAK,KAAK,EAAE,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,mBAAmB,EAAE,yBAAyB,CAAC,CAAC;IAC1D,CAAC;IAED,8EAA8E;IAC9E,8EAA8E;IAC9E,4EAA4E;IAC5E,iEAAiE;IACjE,IAAI,IAAI,CAAC,qBAAqB,KAAK,KAAK;QAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,UAAU,CAAC,CAAC;IAEjF,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAwB,IAAI,GAAG,CAAC;IACpD,cAAc;IACd,YAAY;IACZ,sBAAsB;IACtB,aAAa;CACd,CAAC,CAAC;AAEH,MAAM,UAAU,sBAAsB,CACpC,QAAiB,EACjB,IAQC;IAED,MAAM,GAAG,GAA2B,EAAE,CAAC;IAEvC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACjC,2EAA2E;QAC3E,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO;QACtC,2EAA2E;QAC3E,mEAAmE;QACnE,IAAI,KAAK,KAAK,kBAAkB,IAAI,KAAK,KAAK,gBAAgB;YAAE,OAAO;QACvE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;YAAE,OAAO;QAElC,2EAA2E;QAC3E,yEAAyE;QACzE,4DAA4D;QAC5D,IAAI,KAAK,CAAC,UAAU,CAAC,sBAAsB,CAAC,EAAE,CAAC;YAC7C,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;YACnB,OAAO;QACT,CAAC;QACD,IAAI,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI;YAAE,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;IACtF,CAAC,CAAC,CAAC;IAEH,wEAAwE;IACxE,2EAA2E;IAC3E,EAAE;IACF,wEAAwE;IACxE,yEAAyE;IACzE,IAAI,GAAG,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE,CAAC;QACtC,GAAG,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,kBAAkB,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,uEAAuE;QACvE,8EAA8E;QAC9E,gDAAgD;QAChD,GAAG,CAAC,eAAe,CAAC,GAAG,wBAAwB,CAAC;QAChD,GAAG,CAAC,mBAAmB,CAAC,GAAG,IAAI,CAAC;QAChC,4EAA4E;QAC5E,OAAO,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC/B,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yFAAyF;AACzF,SAAS,GAAG,CAAC,GAAkB;IAC7B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACpD,CAAC;AAED,SAAS,GAAG,CAAC,GAAkB;IAC7B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC9C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,QAAiB;IAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;IACvE,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAC5F,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAClF,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAClF,MAAM,mBAAmB,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;IAC5F,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;IAClF,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC,CAAC;IAClF,MAAM,mBAAmB,GAAG,GAAG,CAC7B,QAAQ,CAAC,GAAG,CAAC,kDAAkD,CAAC,CACjE,CAAC;IACF,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACtF,MAAM,qBAAqB,GAAG,GAAG,CAC/B,QAAQ,CAAC,GAAG,CAAC,qDAAqD,CAAC,CACpE,CAAC;IAEF,2EAA2E;IAC3E,0DAA0D;IAC1D,MAAM,QAAQ,GAAwE,EAAE,CAAC;IACzF,IAAI,MAAM,KAAK,SAAS;QAAE,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;IACnD,IAAI,mBAAmB,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC1F,IAAI,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;IAC3E,IAAI,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9E,IAAI,mBAAmB,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC1F,IAAI,cAAc,KAAK,SAAS;QAAE,QAAQ,CAAC,cAAc,GAAG,cAAc,CAAC;IAC3E,IAAI,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9E,IAAI,mBAAmB,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC1F,IAAI,aAAa,KAAK,SAAS;QAAE,QAAQ,CAAC,aAAa,GAAG,aAAa,CAAC;IACxE,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;QACxC,QAAQ,CAAC,qBAAqB,GAAG,qBAAqB,CAAC;IACzD,CAAC;IAED,yEAAyE;IACzE,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,mBAAmB,CAAC,QAAiB;IACnD,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAsB,EAAE;QAC1D,MAAM,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACnB,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IAC/C,CAAC,CAAC;IACF,MAAM,QAAQ,GAAwE,EAAE,CAAC;IACzF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;IACnF,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACtE,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC,CAAC;IACrF,MAAM,eAAe,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;IACxE,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;IACxD,IAAI,mBAAmB,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC1F,IAAI,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9E,IAAI,mBAAmB,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;IAC1F,IAAI,eAAe,KAAK,SAAS;QAAE,QAAQ,CAAC,eAAe,GAAG,eAAe,CAAC;IAC9E,IAAI,KAAK,KAAK,SAAS;QAAE,QAAQ,CAAC,mBAAmB,GAAG,KAAK,CAAC;IAC9D,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -17,6 +17,11 @@ import { handleAuth } from "../api/auth.js";
17
17
  import { authorizeApi } from "../auth/guard.js";
18
18
  import { handleModels } from "../api/models.js";
19
19
  import { handleCountTokens } from "../pipeline/count-tokens.js";
20
+ import { handleMessages } from "../pipeline/passthrough.js";
21
+ import { splitBedrockMount, refuseUnconfigured } from "../pipeline/bedrock.js";
22
+ import { CHATGPT_MOUNT, CHATGPT_PATHS, OPENAI_MOUNT, OPENAI_PATHS, handleCodexModels, refuseDisabled, splitMount, } from "../pipeline/openai.js";
23
+ import { OPENAI_RESPONSES_WIRE } from "../pipeline/wire.js";
24
+ import { openaiError } from "./errors.js";
20
25
  import { detectInbound } from "../auth/posture.js";
21
26
  import { createStaticHost } from "./static.js";
22
27
  import { fileURLToPath } from "node:url";
@@ -180,6 +185,105 @@ export function createServer(deps) {
180
185
  handleModels(res, routesOf(), Array.isArray(inm) ? inm[0] : inm);
181
186
  return;
182
187
  }
188
+ /**
189
+ * Codex, on the developer's own OpenAI key (`/openai`) or ChatGPT login
190
+ * (`/chatgpt`). Mounts, like Bedrock below, and for the same reason:
191
+ * routing gets no vote on a "relay on MY credential" path. See
192
+ * `pipeline/openai.ts`.
193
+ */
194
+ const codexMounts = [
195
+ {
196
+ mount: OPENAI_MOUNT,
197
+ paths: OPENAI_PATHS,
198
+ upstream: deps.config.openaiBaseUrl,
199
+ envVar: "FEST_OPENAI_BASE_URL",
200
+ subscription: false,
201
+ },
202
+ {
203
+ mount: CHATGPT_MOUNT,
204
+ paths: CHATGPT_PATHS,
205
+ upstream: deps.config.chatgptBaseUrl,
206
+ envVar: "FEST_CHATGPT_BASE_URL",
207
+ subscription: true,
208
+ },
209
+ ];
210
+ for (const m of codexMounts) {
211
+ const rest = splitMount(m.mount, remainder);
212
+ if (rest === null)
213
+ continue;
214
+ if (m.upstream === null) {
215
+ refuseDisabled(res, m.envVar);
216
+ return;
217
+ }
218
+ const restPath = pathnameOf(rest);
219
+ // `…/responses` and anything beneath it (`…/responses/compact`): every
220
+ // POST there is model work that bills, so all of it is metered.
221
+ const isResponses = restPath === m.paths.responses || restPath.startsWith(`${m.paths.responses}/`);
222
+ if (isResponses && method === "POST") {
223
+ await handleMessages(req, res, {
224
+ ...ctx,
225
+ upstreamBaseUrl: m.upstream,
226
+ pathOverride: rest,
227
+ wire: OPENAI_RESPONSES_WIRE,
228
+ subscriptionMount: m.subscription,
229
+ // gpt-* ids are filed bare in the catalogue; no hint needed.
230
+ });
231
+ return;
232
+ }
233
+ if (restPath === m.paths.models && (method === "GET" || method === "HEAD")) {
234
+ await handleCodexModels(req, res, { upstreamBaseUrl: m.upstream, path: rest });
235
+ return;
236
+ }
237
+ // Anything else under a Codex mount is a path nobody has verified, so
238
+ // it is refused in Codex's own envelope rather than relayed on a guess.
239
+ log.warn("unhandled codex path", { method, path });
240
+ res.writeHead(404, { "content-type": "application/json" });
241
+ res.end(openaiError("not_found_error", `Fest: ${method} ${path} is not relayed.`));
242
+ return;
243
+ }
244
+ /**
245
+ * Claude in Amazon Bedrock, on the developer's own AWS credential.
246
+ *
247
+ * Checked BEFORE the Anthropic paths and handled by `handleMessages`
248
+ * directly rather than through `dispatchMessages`: this mount means
249
+ * "relay on MY credential", so routing — which could substitute a
250
+ * server-held key — must not get a vote. See `pipeline/bedrock.ts`.
251
+ */
252
+ // Split from `remainder`, not `path`: the query string has to survive.
253
+ // Phase 0 established that Claude Code calls `/v1/messages?beta=true`
254
+ // and that the parameter is load-bearing, so an override built from the
255
+ // bare pathname would quietly relay a different request.
256
+ const bedrockRemainder = splitBedrockMount(remainder);
257
+ if (bedrockRemainder !== null && method === "POST") {
258
+ if (deps.config.bedrockBaseUrl === null) {
259
+ refuseUnconfigured(res);
260
+ return;
261
+ }
262
+ const bedrockPath = pathnameOf(bedrockRemainder);
263
+ const bedrock = {
264
+ upstreamBaseUrl: deps.config.bedrockBaseUrl,
265
+ // Bedrock files some ids only under `bedrock_mantle/…`; without the
266
+ // hint Haiku 4.5 meters fine and prices as "n/a".
267
+ priceProvider: "bedrock_mantle",
268
+ };
269
+ if (bedrockPath === "/v1/messages") {
270
+ await handleMessages(req, res, { ...ctx, ...bedrock, pathOverride: bedrockRemainder });
271
+ return;
272
+ }
273
+ if (bedrockPath === "/v1/messages/count_tokens") {
274
+ const inbound = detectInbound(url, req.headers);
275
+ await handleCountTokens(req, res, {
276
+ upstreamBaseUrl: bedrock.upstreamBaseUrl,
277
+ path: bedrockRemainder,
278
+ posture: inbound.posture,
279
+ });
280
+ return;
281
+ }
282
+ // Any other path under the mount falls through to the 404 below: the
283
+ // mount forwards the two endpoints Bedrock actually serves, and
284
+ // inventing a relay for the rest would proxy traffic nobody has
285
+ // verified.
286
+ }
183
287
  // Relayed, never metered: it consumes no tokens, and counting it would
184
288
  // drag every per-request average toward zero.
185
289
  if (path === "/v1/messages/count_tokens" && method === "POST") {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../server/http/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../server/http/server.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,7 @@ const MAX_EVENT_DATA_CHARS = 1024 * 1024;
29
29
  const DEFAULT_TYPE = "message";
30
30
  export function createSseParser(opts) {
31
31
  const interesting = opts?.interestingTypes ?? USAGE_EVENT_TYPES;
32
+ const maxEventChars = opts?.maxEventChars ?? MAX_EVENT_DATA_CHARS;
32
33
  const decoder = new StringDecoder("utf8");
33
34
  /** Tail of the last chunk that did not end on a newline. */
34
35
  let pending = "";
@@ -99,7 +100,7 @@ export function createSseParser(opts) {
99
100
  sawAnyField = true;
100
101
  if (dropData)
101
102
  return;
102
- if (dataChars + value.length > MAX_EVENT_DATA_CHARS) {
103
+ if (dataChars + value.length > maxEventChars) {
103
104
  // Past the cap we stop retaining. The event is still emitted, and the
104
105
  // usage accumulator will reject the truncated JSON on its own.
105
106
  dropData = true;
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../server/http/sse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../server/http/sse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Claude in Amazon Bedrock, on the DEVELOPER's own AWS credential.
3
+ *
4
+ * Claude Code's Bedrock "mantle" client speaks the ordinary Anthropic Messages
5
+ * API — same body, same SSE framing — at
6
+ * `https://bedrock-mantle.{region}.api.aws/anthropic/v1/messages`. Verified by
7
+ * reading the client in 2.1.278: `AnthropicBedrockMantle` builds its base URL
8
+ * as `…api.aws/anthropic`, `ANTHROPIC_BEDROCK_MANTLE_BASE_URL` REPLACES that
9
+ * whole value, and no middleware rewrites the path (unlike the legacy
10
+ * `AnthropicBedrock` client, which turns `/v1/messages` into
11
+ * `/model/{id}/invoke` and re-frames the stream as AWS eventstream). So a
12
+ * client pointed at Fest sends a plain `POST /v1/messages` that this proxy can
13
+ * relay as-is.
14
+ *
15
+ * Auth is a plain bearer: with `AWS_BEARER_TOKEN_BEDROCK` set, that client
16
+ * sends `Authorization: Bearer …` and does not sign. That is why this works at
17
+ * all — SigV4 signs the Host header, so a signed request cannot survive a proxy
18
+ * that has to rewrite Host to reach the real endpoint.
19
+ *
20
+ * ── Why a mount, and not sniffing the model id ───────────────────────────────
21
+ *
22
+ * A Bedrock-mode request is identified by the URL the developer configured
23
+ * (`…/bedrock`), not by its `anthropic.`-prefixed model id. Two reasons:
24
+ *
25
+ * - it costs nothing. The model id lives in the BODY, so sniffing it would
26
+ * mean reading and parsing a body on the hot path that Fest otherwise
27
+ * forwards without looking at;
28
+ * - it cannot misfire. A developer who forces a non-prefixed id in Bedrock
29
+ * mode would otherwise have their AWS bearer sent to api.anthropic.com,
30
+ * which is a 401 they cannot explain — and, worse, the reverse mistake would
31
+ * send an Anthropic subscription bearer to AWS.
32
+ *
33
+ * ── Why Fest never holds the credential ──────────────────────────────────────
34
+ *
35
+ * Bedrock's bearer tokens last 12 hours at most, and Fest resolves credentials
36
+ * from `{env:NAME}` only — nothing can rewrite a running process's environment,
37
+ * so a server-held Bedrock token means a restart twice a day. The developer's
38
+ * client can refresh its own (`awsAuthRefresh` / `awsCredentialExport` are
39
+ * Claude Code credential helpers, and the client maps both to
40
+ * `ANTHROPIC_BEDROCK_MANTLE_BASE_URL`), next to the SSO session that is the only
41
+ * thing able to mint one non-interactively.
42
+ *
43
+ * So this path holds the same property as the subscription path: the credential
44
+ * is forwarded and forgotten. It is never stored, and there is no server-held
45
+ * Bedrock credential to store. As a bonus, AWS sees the developer's own
46
+ * identity, so CloudTrail attributes each call to a person rather than to one
47
+ * shared token.
48
+ *
49
+ * ── Why it bypasses the routing table ────────────────────────────────────────
50
+ *
51
+ * Deliberately: this mount means "relay this on MY credential". Letting a route
52
+ * substitute it onto a server-held key would be the silent credential swap this
53
+ * codebase exists to make impossible, and an `anthropic.claude-*` rule written
54
+ * for some other purpose is all it would take.
55
+ */
56
+ import { anthropicError } from "../http/errors.js";
57
+ /** The inbound mount. Comes after any `/t/<token>` identity prefix. */
58
+ export const BEDROCK_MOUNT = "/bedrock";
59
+ /**
60
+ * Split the Bedrock mount off a path, or null when it is not one.
61
+ *
62
+ * `/bedrock` alone yields `/`, so everything downstream still matches on a
63
+ * leading slash, and `/bedrockish` is not read as the mount plus `ish`.
64
+ */
65
+ export function splitBedrockMount(path) {
66
+ if (!path.startsWith(BEDROCK_MOUNT))
67
+ return null;
68
+ const rest = path.slice(BEDROCK_MOUNT.length);
69
+ if (rest === "")
70
+ return "/";
71
+ return rest.startsWith("/") ? rest : null;
72
+ }
73
+ /**
74
+ * Refuse a Bedrock-mounted request when no Bedrock upstream is configured.
75
+ *
76
+ * An explicit refusal, not a fall-through to Anthropic: falling through would
77
+ * send a developer's AWS bearer to api.anthropic.com, and the 401 that came
78
+ * back would say nothing about the actual mistake.
79
+ */
80
+ export function refuseUnconfigured(res) {
81
+ res.writeHead(501, { "content-type": "application/json", "x-should-retry": "false" });
82
+ res.end(anthropicError("invalid_request_error", "Fest: this gateway has no Bedrock upstream configured. " +
83
+ "Set FEST_BEDROCK_BASE_URL (e.g. https://bedrock-mantle.us-east-1.api.aws/anthropic) " +
84
+ "to relay Bedrock traffic on the caller's own AWS credential."));
85
+ }
86
+ //# sourceMappingURL=bedrock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bedrock.js","sourceRoot":"","sources":["../../../server/pipeline/bedrock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnD,uEAAuE;AACvE,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,GAAG,CAAC;IAC5B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAmB;IACpD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC;IACtF,GAAG,CAAC,GAAG,CACL,cAAc,CACZ,uBAAuB,EACvB,yDAAyD;QACvD,sFAAsF;QACtF,8DAA8D,CACjE,CACF,CAAC;AACJ,CAAC"}
@@ -13,6 +13,7 @@
13
13
  import { anthropicError } from "../http/errors.js";
14
14
  import { readBodyBytes, isTooLarge } from "../http/body.js";
15
15
  import { buildUpstreamHeaders } from "../http/headers.js";
16
+ import { joinUpstreamUrl } from "../adapters/url.js";
16
17
  import { log } from "../log.js";
17
18
  const MAX_BODY_BYTES = 8 * 1024 * 1024;
18
19
  export async function handleCountTokens(req, res, opts) {
@@ -22,7 +23,10 @@ export async function handleCountTokens(req, res, opts) {
22
23
  res.end(anthropicError("invalid_request_error", "Fest: count_tokens body too large."));
23
24
  return;
24
25
  }
25
- const target = new URL(opts.path, opts.upstreamBaseUrl);
26
+ // Concatenate rather than resolve: `new URL("/v1/…", "https://h/anthropic")`
27
+ // drops the base's own path, which is exactly the shape a Bedrock upstream
28
+ // has. See `adapters/url.ts`.
29
+ const target = joinUpstreamUrl(opts.upstreamBaseUrl, opts.path);
26
30
  try {
27
31
  const upstream = await fetch(target, {
28
32
  method: "POST",