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.
- package/README.md +87 -0
- package/dist/cli/codex.js +116 -0
- package/dist/cli/codex.js.map +1 -0
- package/dist/cli/copilot.js +109 -0
- package/dist/cli/copilot.js.map +1 -0
- package/dist/server/api/live.js +1 -0
- package/dist/server/api/live.js.map +1 -1
- package/dist/server/api/routes.js +2 -1
- package/dist/server/api/routes.js.map +1 -1
- package/dist/server/bin/fest.js +41 -1
- package/dist/server/bin/fest.js.map +1 -1
- package/dist/server/config.js +47 -0
- package/dist/server/config.js.map +1 -1
- package/dist/server/http/client.js +54 -0
- package/dist/server/http/client.js.map +1 -0
- package/dist/server/http/errors.js +23 -0
- package/dist/server/http/errors.js.map +1 -1
- package/dist/server/http/headers.js +53 -4
- package/dist/server/http/headers.js.map +1 -1
- package/dist/server/http/server.js +104 -0
- package/dist/server/http/server.js.map +1 -1
- package/dist/server/http/sse.js +2 -1
- package/dist/server/http/sse.js.map +1 -1
- package/dist/server/pipeline/bedrock.js +86 -0
- package/dist/server/pipeline/bedrock.js.map +1 -0
- package/dist/server/pipeline/count-tokens.js +5 -1
- package/dist/server/pipeline/count-tokens.js.map +1 -1
- package/dist/server/pipeline/dispatch.js +3 -1
- package/dist/server/pipeline/dispatch.js.map +1 -1
- package/dist/server/pipeline/openai.js +101 -0
- package/dist/server/pipeline/openai.js.map +1 -0
- package/dist/server/pipeline/passthrough.js +55 -35
- package/dist/server/pipeline/passthrough.js.map +1 -1
- package/dist/server/pipeline/record.js +1 -0
- package/dist/server/pipeline/record.js.map +1 -1
- package/dist/server/pipeline/wire.js +63 -0
- package/dist/server/pipeline/wire.js.map +1 -0
- package/dist/server/secret/fingerprint.js +11 -1
- package/dist/server/secret/fingerprint.js.map +1 -1
- package/dist/server/store/migrations/006-client.sql +14 -0
- package/dist/server/store/queries.js +27 -1
- package/dist/server/store/queries.js.map +1 -1
- package/dist/server/store/write.js +3 -2
- package/dist/server/store/write.js.map +1 -1
- package/dist/server/usage/accumulator.js +3 -3
- package/dist/server/usage/accumulator.js.map +1 -1
- package/dist/server/usage/prices/catalog.js +3 -1
- package/dist/server/usage/prices/catalog.js.map +1 -1
- package/dist/server/usage/responses.js +124 -0
- package/dist/server/usage/responses.js.map +1 -0
- package/dist/shared/demotion-vars.js +35 -0
- package/dist/shared/demotion-vars.js.map +1 -1
- package/dist/web/dist/assets/bitter-latin-700-normal-1jQzrEdb.woff2 +0 -0
- package/dist/web/dist/assets/bitter-latin-700-normal-BHV1FLDM.woff +0 -0
- package/dist/web/dist/assets/index-C7n3_lX2.css +2 -0
- package/dist/web/dist/assets/index-TVK-7gFI.js +56 -0
- package/dist/web/dist/assets/index-TVK-7gFI.js.map +1 -0
- package/dist/web/dist/index.html +7 -3
- package/package.json +2 -1
- package/dist/web/dist/assets/index-AEUYX58m.css +0 -2
- package/dist/web/dist/assets/index-DQd08peN.js +0 -56
- package/dist/web/dist/assets/index-DQd08peN.js.map +0 -1
package/dist/server/config.js
CHANGED
|
@@ -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":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../server/config.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyGH;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAW;IAC3C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnE,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,YAAY,CAAC,QAAuB,EAAE,SAAiB;IAC9D,IAAI,QAAQ,KAAK,IAAI;QAAE,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,iBAAiB,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,6DAA6D;QAC7D,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY,EAAE,QAAgB;IAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC5D,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wCAAwC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,QAAiB;IAClD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC5D,MAAM,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,IAAY;IACjC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,OAAO,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAgB;IAC1D,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC;IAC5C,IAAI,GAAG,CAAC,WAAW,EAAE,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,wBAAwB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjG,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,0FAA0F,CAAC,CAAC;IACrH,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACjC,OAAO,GAAG;SACP,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC,CAAC,IAAI,EAA4B,CAAC;IACtF,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,qDAAqD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAChG,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,2BAA2B,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED;;;;OAIG;IACH,MAAM,OAAO,GAAG,aAAa,CAAC,uBAAuB,CAAC,CAAC;IACvD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACrB,IAAI,MAAW,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,KAAK,CAAC,6CAA6C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,0EAA0E;QAC1E,sEAAsE;QACtE,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjG,MAAM,IAAI,KAAK,CACb,qHAAqH,CACtH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC,sBAAsB,EAAE,wBAAwB,CAAC,CAAC;IACtF,MAAM,OAAO,GAAG,oBAAoB,CAAC,uBAAuB,EAAE,qBAAqB,CAAC,CAAC;IAErF,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3D,MAAM,SAAS,GAAG,CAAC,aAAa,CAAC,iBAAiB,CAAC,IAAI,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CACtF,MAAM,EACN,EAAE,CACH,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,eAAe,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;QAC7C,YAAY,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,oBAAoB,CAAC,CAAC,IAAI,EAAE;QACzE,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,gBAAgB,CAAC,CAAC,IAAI,EAAE;QACxD,QAAQ,EAAE,KAAK;QACf,eAAe,EAAE,WAAW,CAAC,uBAAuB,EAAE,KAAK,CAAC;QAC5D,UAAU,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI;QAC1D,cAAc,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;QACpD,aAAa,EAAE,MAAM;QACrB,cAAc,EAAE,OAAO;QACvB,aAAa,EAAE,WAAW,CAAC,qBAAqB,EAAE,KAAK,CAAC;QACxD,SAAS;QACT,QAAQ,EAAE,YAAY,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,SAAS,CAAC;QAClE,YAAY,EAAE,aAAa,CAAC,oBAAoB,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI;QAC9E,cAAc,EAAE,aAAa,CAAC,uBAAuB,CAAC;QACtD,kBAAkB,EAAE,aAAa,CAAC,2BAA2B,CAAC;QAC9D,cAAc,EAAE,aAAa,CAAC,uBAAuB,CAAC;QACtD,kBAAkB,EAAE,aAAa,CAAC,2BAA2B,CAAC;QAC9D,mBAAmB,EAAE,WAAW,CAAC,4BAA4B,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAAC,GAAe;IAC5C,OAAO;QACL,GAAG,GAAG;QACN,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;QACzE,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;KAC1E,CAAC;AACJ,CAAC"}
|
|
@@ -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
|
-
|
|
114
|
-
|
|
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":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;
|
|
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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"}
|
package/dist/server/http/sse.js
CHANGED
|
@@ -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 >
|
|
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":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AASzE;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../../server/http/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAiB,MAAM,uBAAuB,CAAC;AASzE;;;;;GAKG;AACH,MAAM,oBAAoB,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzC,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B,MAAM,UAAU,eAAe,CAAC,IAQ/B;IACC,MAAM,WAAW,GAAG,IAAI,EAAE,gBAAgB,IAAI,iBAAiB,CAAC;IAChE,MAAM,aAAa,GAAG,IAAI,EAAE,aAAa,IAAI,oBAAoB,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC;IAE1C,4DAA4D;IAC5D,IAAI,OAAO,GAAG,EAAE,CAAC;IAEjB,4BAA4B;IAC5B,IAAI,SAAS,GAAkB,IAAI,CAAC;IACpC,IAAI,SAAS,GAAa,EAAE,CAAC;IAC7B,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB;;;;;;;;;OASG;IACH,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,SAAS,UAAU;QACjB,SAAS,GAAG,IAAI,CAAC;QACjB,SAAS,GAAG,EAAE,CAAC;QACf,SAAS,GAAG,CAAC,CAAC;QACd,WAAW,GAAG,KAAK,CAAC;QACpB,QAAQ,GAAG,KAAK,CAAC;IACnB,CAAC;IAED,SAAS,aAAa,CAAC,IAAY;QACjC,OAAO,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC;IAED,uEAAuE;IACvE,SAAS,QAAQ,CAAC,GAAe;QAC/B,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,0EAA0E;YAC1E,UAAU,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,IAAI,YAAY,CAAC;QACvC,IAAI,aAAa,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,UAAU,EAAE,CAAC;IACf,CAAC;IAED,SAAS,UAAU,CAAC,IAAY,EAAE,GAAe;QAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,OAAO;QACT,CAAC;QACD,yEAAyE;QACzE,kDAAkD;QAClD,IAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,OAAO;YAAE,OAAO;QAE9C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACtD,4EAA4E;QAC5E,IAAI,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;YAAE,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAEvD,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACtB,WAAW,GAAG,IAAI,CAAC;YACnB,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,uDAAuD;gBACvD,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS,GAAG,EAAE,CAAC;YACjB,CAAC;YACD,OAAO;QACT,CAAC;QACD,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,WAAW,GAAG,IAAI,CAAC;YACnB,IAAI,QAAQ;gBAAE,OAAO;YACrB,IAAI,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;gBAC7C,sEAAsE;gBACtE,+DAA+D;gBAC/D,QAAQ,GAAG,IAAI,CAAC;gBAChB,SAAS,GAAG,EAAE,CAAC;gBACf,OAAO;YACT,CAAC;YACD,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,uEAAuE;QACvE,yEAAyE;QACzE,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YACxC,WAAW,GAAG,IAAI,CAAC;YACnB,OAAO;QACT,CAAC;QACD,0CAA0C;IAC5C,CAAC;IAED,SAAS,OAAO,CAAC,IAAY,EAAE,GAAe;QAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC9B,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,SAAS,CAAC;YACR,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACrC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAAE,MAAM;YACrB,IAAI,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACxF,OAAO,GAAG,EAAE,CAAC;YACb,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;YACf,qEAAqE;YACrE,sEAAsE;YACtE,qEAAqE;YACrE,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,QAAQ;gBAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC/E,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAED,OAAO;QACL,IAAI,CAAC,KAAiB;YACpB,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,uEAAuE;YACvE,gEAAgE;YAChE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3F,OAAO,GAAG,CAAC;QACb,CAAC;QAED,KAAK;YACH,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,qEAAqE;YACrE,oEAAoE;YACpE,+BAA+B;YAC/B,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,OAAO,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACxB,CAAC;YACD,2EAA2E;YAC3E,QAAQ,CAAC,GAAG,CAAC,CAAC;YACd,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -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
|
-
|
|
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",
|