fest-gateway 0.3.0 → 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 -3
- 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-DznOpmye.js +0 -56
- package/dist/web/dist/assets/index-DznOpmye.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../../server/pipeline/count-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"count-tokens.js","sourceRoot":"","sources":["../../../server/pipeline/count-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAEvC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,GAAoB,EACpB,GAAmB,EACnB,IAAiE;IAEjE,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,uBAAuB,EAAE,oCAAoC,CAAC,CAAC,CAAC;QACvF,OAAO;IACT,CAAC;IAED,6EAA6E;IAC7E,2EAA2E;IAC3E,8BAA8B;IAC9B,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YACnC,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE;gBACzC,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,YAAY,EAAE,MAAM,CAAC,IAAI;aAC1B,CAAC;YACF,IAAI;YACJ,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5E,0EAA0E;QAC1E,wDAAwD;QACxD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC3D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,WAAW,EAAE,kDAAkD,CAAC,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC"}
|
|
@@ -25,6 +25,7 @@ import { randomUUID } from "node:crypto";
|
|
|
25
25
|
import { detectInbound } from "../auth/posture.js";
|
|
26
26
|
import { isSubscriptionCredential } from "../secret/fingerprint.js";
|
|
27
27
|
import { readBodyBytes, isTooLarge, peekRequest } from "../http/body.js";
|
|
28
|
+
import { detectClient, sessionIdOf } from "../http/client.js";
|
|
28
29
|
import { anthropicError, statusForErrorType } from "../http/errors.js";
|
|
29
30
|
import { resolveRoute, resolveWithoutCallerCredential, defaultAnthropicUpstream, } from "../routes/resolve.js";
|
|
30
31
|
import { resolveCredential } from "../credentials/resolve.js";
|
|
@@ -98,8 +99,9 @@ export async function dispatchMessages(req, res, ctx) {
|
|
|
98
99
|
// A server-held credential is org spend, always. This is the field the
|
|
99
100
|
// posture screen keys off.
|
|
100
101
|
credentialOrigin: "fallback_server",
|
|
101
|
-
sessionId:
|
|
102
|
+
sessionId: sessionIdOf(req.headers),
|
|
102
103
|
clientVersion: headerValue(req, "user-agent"),
|
|
104
|
+
client: detectClient(req.headers),
|
|
103
105
|
};
|
|
104
106
|
if (!credential.ok) {
|
|
105
107
|
log.warn("substitute refused: no server credential", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../server/pipeline/dispatch.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../../server/pipeline/dispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,EACL,YAAY,EACZ,8BAA8B,EAC9B,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAE9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAG5D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,QAAQ,GAAsC;IAClD,SAAS,EAAE,gBAAgB;IAC3B,SAAS,EAAE,gBAAgB;CAC5B,CAAC;AAQF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,GAAoB,EACpB,GAAmB,EACnB,GAAoB;IAEpB,0EAA0E;IAC1E,0EAA0E;IAC1E,oDAAoD;IACpD,EAAE;IACF,uEAAuE;IACvE,6EAA6E;IAC7E,+CAA+C;IAC/C,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,wBAAwB,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;QACpF,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;IACtD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACrC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,cAAc,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B;;;;;;OAMG;IACH,MAAM,QAAQ,GACZ,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,8BAA8B,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACxD,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAE3C,IAAI,QAAQ,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;QACxC,2EAA2E;QAC3E,MAAM,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACtF,OAAO;IACT,CAAC;IAED,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5D,IAAI,QAAQ,KAAK,IAAI;QAAE,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,cAAc,GAClB,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAE9F,MAAM,UAAU,GAAG,iBAAiB,CAClC,QAAQ,EACR,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,kBAAkB,CAAC,WAAW,EAAE,cAAc,EAAE,EAC3E,GAAG,CAAC,OAAO,CACZ,CAAC;IAEF,MAAM,IAAI,GAAG;QACX,EAAE,EAAE,UAAU,EAAE;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;QACzC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;QACpD,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;QAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;QAClC,yEAAyE;QACzE,uEAAuE;QACvE,yEAAyE;QACzE,mBAAmB;QACnB,qBAAqB,EAAE,IAAI;QAC3B,uEAAuE;QACvE,2BAA2B;QAC3B,gBAAgB,EAAE,iBAAqC;QACvD,SAAS,EAAE,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;QACnC,aAAa,EAAE,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC;QAC7C,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;KAClC,CAAC;IAEF,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,0CAA0C,EAAE;YACnD,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE,IAAI,IAAI;YACjC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI;YACvC,KAAK,EAAE,QAAQ,CAAC,cAAc;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;QACjF,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IAC3D,IAAI,OAAO,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QACxD,iEAAiE;QACjE,MAAM,CACJ,GAAG,EACH,GAAG,CAAC,IAAI,EACR,IAAI,EACJ,QAAQ,EACR,UAAU,CAAC,UAAU,EACrB,iCAAiC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,IAAI,GAAG,CAAC,GAAG,CACjF,CAAC;QACF,OAAO;IACT,CAAC;IAED,MAAM,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE;QAC/B,IAAI;QACJ,QAAQ;QACR,OAAO;QACP,MAAM,EAAE,UAAU,CAAC,MAAM;QACzB,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,IAAI;QACJ,IAAI,EAAE,OAAO,CAAC,aAAa;QAC3B,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,gBAAgB,CAAC;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,GAAG,CAAC,IAAI;KACf,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB,EAAE,IAAY;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Codex, on the developer's own OpenAI credential.
|
|
3
|
+
*
|
|
4
|
+
* Two mounts, because Codex has two ways to pay and they reach two different
|
|
5
|
+
* backends with two different credentials:
|
|
6
|
+
*
|
|
7
|
+
* - `/openai` — an API key (`OPENAI_API_KEY`). Codex's provider `base_url` is
|
|
8
|
+
* `<fest>/openai/v1`; requests go to `FEST_OPENAI_BASE_URL`
|
|
9
|
+
* (`https://api.openai.com`) as `POST /v1/responses` and `GET /v1/models`.
|
|
10
|
+
* The key's owner is invoiced at list rates.
|
|
11
|
+
* - `/chatgpt` — a ChatGPT login. Codex's `base_url` is
|
|
12
|
+
* `<fest>/chatgpt/backend-api/codex` with `requires_openai_auth = true`, so
|
|
13
|
+
* it sends its own ChatGPT access token (`Authorization: Bearer eyJ…`) and
|
|
14
|
+
* `ChatGPT-Account-ID`; requests go to `FEST_CHATGPT_BASE_URL`
|
|
15
|
+
* (`https://chatgpt.com`). This is the Codex equivalent of a Claude
|
|
16
|
+
* subscription: the developer's plan pays, and Fest records notional value
|
|
17
|
+
* and the plan's 5h/7d windows. OpenAI documents this gateway pattern for
|
|
18
|
+
* ChatGPT workspaces ("Sign in with ChatGPT through a gateway").
|
|
19
|
+
*
|
|
20
|
+
* Both were established by pointing codex-cli 0.162.1 at the Phase 0 capture
|
|
21
|
+
* server: the paths above, `session-id` for the session, an SSE stream with no
|
|
22
|
+
* content-type from chatgpt.com, and `x-codex-turn-state` on every response.
|
|
23
|
+
*
|
|
24
|
+
* Like `/bedrock`, these are mounts rather than model sniffing, and for the
|
|
25
|
+
* same reasons (see `bedrock.ts`): free to detect, impossible to misfire. And
|
|
26
|
+
* like `/bedrock` they bypass the routing table — the mount means "relay on MY
|
|
27
|
+
* credential", and no rule may swap a server-held key in under it.
|
|
28
|
+
*
|
|
29
|
+
* The credential is forwarded and forgotten. A ChatGPT access token is a
|
|
30
|
+
* bearer for the developer's whole ChatGPT account, which is a reason to be
|
|
31
|
+
* more careful with it than with an API key, not less: it is never stored,
|
|
32
|
+
* and the log scrubber redacts JWTs.
|
|
33
|
+
*/
|
|
34
|
+
import { joinUpstreamUrl } from "../adapters/url.js";
|
|
35
|
+
import { openaiError } from "../http/errors.js";
|
|
36
|
+
import { buildDownstreamHeaders, buildUpstreamHeaders } from "../http/headers.js";
|
|
37
|
+
import { detectInbound } from "../auth/posture.js";
|
|
38
|
+
import { OPENAI_RESPONSES_WIRE } from "./wire.js";
|
|
39
|
+
import { log } from "../log.js";
|
|
40
|
+
export const OPENAI_MOUNT = "/openai";
|
|
41
|
+
export const CHATGPT_MOUNT = "/chatgpt";
|
|
42
|
+
export const OPENAI_PATHS = { responses: "/v1/responses", models: "/v1/models" };
|
|
43
|
+
export const CHATGPT_PATHS = {
|
|
44
|
+
responses: "/backend-api/codex/responses",
|
|
45
|
+
models: "/backend-api/codex/models",
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Split a mount off a path, or null when it is not that mount.
|
|
49
|
+
*
|
|
50
|
+
* Same contract as `splitBedrockMount`: `/openai` alone is `/`, and
|
|
51
|
+
* `/openaiish` is not the mount.
|
|
52
|
+
*/
|
|
53
|
+
export function splitMount(mount, path) {
|
|
54
|
+
if (!path.startsWith(mount))
|
|
55
|
+
return null;
|
|
56
|
+
const rest = path.slice(mount.length);
|
|
57
|
+
if (rest === "")
|
|
58
|
+
return "/";
|
|
59
|
+
return rest.startsWith("/") ? rest : null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* `GET …/models` — relayed, never metered, like `count_tokens`.
|
|
63
|
+
*
|
|
64
|
+
* Codex fetches its model catalogue here before the first turn and caches it
|
|
65
|
+
* against `x-models-etag`, so the etag (and `If-None-Match` on the way up) has
|
|
66
|
+
* to survive. The body is relayed whole: on chatgpt.com it is ~600KB, which is
|
|
67
|
+
* a one-off per session and not worth streaming code for.
|
|
68
|
+
*/
|
|
69
|
+
export async function handleCodexModels(req, res, opts) {
|
|
70
|
+
const inbound = detectInbound(req.url ?? "/", req.headers);
|
|
71
|
+
const target = joinUpstreamUrl(opts.upstreamBaseUrl, opts.path);
|
|
72
|
+
try {
|
|
73
|
+
const upstream = await fetch(target, {
|
|
74
|
+
method: req.method ?? "GET",
|
|
75
|
+
headers: buildUpstreamHeaders(req.headers, {
|
|
76
|
+
posture: inbound.posture,
|
|
77
|
+
upstreamHost: target.host,
|
|
78
|
+
defaultAnthropicVersion: false,
|
|
79
|
+
}),
|
|
80
|
+
redirect: "error",
|
|
81
|
+
});
|
|
82
|
+
const body = Buffer.from(await upstream.arrayBuffer());
|
|
83
|
+
const headers = buildDownstreamHeaders(upstream.headers, {
|
|
84
|
+
stream: false,
|
|
85
|
+
allow: (name) => OPENAI_RESPONSES_WIRE.downstreamAllow?.(name) === true || name === "etag",
|
|
86
|
+
});
|
|
87
|
+
res.writeHead(upstream.status, headers);
|
|
88
|
+
res.end(body);
|
|
89
|
+
}
|
|
90
|
+
catch (err) {
|
|
91
|
+
log.warn("codex models relay failed", { error: String(err).slice(0, 200) });
|
|
92
|
+
res.writeHead(502, { "content-type": "application/json" });
|
|
93
|
+
res.end(openaiError("api_error", "Fest: could not reach upstream for the model list."));
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
/** Refuse a mount whose upstream an operator switched off. */
|
|
97
|
+
export function refuseDisabled(res, envVar) {
|
|
98
|
+
res.writeHead(501, { "content-type": "application/json", "x-should-retry": "false" });
|
|
99
|
+
res.end(openaiError("invalid_request_error", `Fest: this gateway does not relay this Codex backend (${envVar} is set to "off").`));
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=openai.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../../../server/pipeline/openai.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,13 +17,15 @@
|
|
|
17
17
|
import { randomUUID } from "node:crypto";
|
|
18
18
|
import { EMPTY_USAGE } from "../../shared/types.js";
|
|
19
19
|
import { detectInbound } from "../auth/posture.js";
|
|
20
|
-
import { buildUpstreamHeaders, buildDownstreamHeaders
|
|
21
|
-
import {
|
|
20
|
+
import { buildUpstreamHeaders, buildDownstreamHeaders } from "../http/headers.js";
|
|
21
|
+
import { statusForErrorType, describeUpstreamFailure } from "../http/errors.js";
|
|
22
22
|
import { readBodyBytes, isTooLarge, peekRequest } from "../http/body.js";
|
|
23
23
|
import { createSseParser } from "../http/sse.js";
|
|
24
|
-
import {
|
|
24
|
+
import { detectClient, sessionIdOf } from "../http/client.js";
|
|
25
|
+
import { ANTHROPIC_WIRE } from "./wire.js";
|
|
25
26
|
import { priceUsage } from "../usage/pricing.js";
|
|
26
27
|
import { pipeWithTee, beginStream } from "../http/pipe.js";
|
|
28
|
+
import { joinUpstreamUrl } from "../adapters/url.js";
|
|
27
29
|
import { isSubscriptionCredential } from "../secret/fingerprint.js";
|
|
28
30
|
import { badIdentity, noIdentity, noUpstreamCredential } from "../auth/gateway-401.js";
|
|
29
31
|
import { isWarmupPreflightRefusal } from "./preflight.js";
|
|
@@ -47,18 +49,18 @@ preRead) {
|
|
|
47
49
|
const startedAt = Date.now();
|
|
48
50
|
const id = randomUUID();
|
|
49
51
|
const inbound = detectInbound(req.url ?? "/", req.headers);
|
|
50
|
-
const
|
|
52
|
+
const wire = ctx.wire ?? ANTHROPIC_WIRE;
|
|
53
|
+
const sessionId = sessionIdOf(req.headers);
|
|
51
54
|
const clientVersion = headerValue(req, "user-agent");
|
|
55
|
+
const client = detectClient(req.headers);
|
|
56
|
+
// Decided once, here, and used for posture, origin and pricing alike, so the
|
|
57
|
+
// three can never disagree about who paid.
|
|
58
|
+
const isSubscription = inbound.upstreamCredential !== null &&
|
|
59
|
+
(ctx.subscriptionMount === true || isSubscriptionCredential(inbound.upstreamCredential));
|
|
60
|
+
const posture = isSubscription ? "subscription" : inbound.posture;
|
|
52
61
|
const credentialsConsidered = inbound.upstreamCredential === null
|
|
53
62
|
? [{ source: "inbound", result: "missing", reason: "no credential on the request" }]
|
|
54
|
-
: [
|
|
55
|
-
{
|
|
56
|
-
source: isSubscriptionCredential(inbound.upstreamCredential)
|
|
57
|
-
? "inbound_subscription"
|
|
58
|
-
: "inbound_key",
|
|
59
|
-
result: "used",
|
|
60
|
-
},
|
|
61
|
-
];
|
|
63
|
+
: [{ source: isSubscription ? "inbound_subscription" : "inbound_key", result: "used" }];
|
|
62
64
|
// Resolve identity before anything else, but note the two failure modes are
|
|
63
65
|
// NOT the same:
|
|
64
66
|
// * a token was presented and did not resolve -> always an error, because
|
|
@@ -75,13 +77,13 @@ preRead) {
|
|
|
75
77
|
id,
|
|
76
78
|
startedAt,
|
|
77
79
|
endedAt: Date.now(),
|
|
78
|
-
posture
|
|
80
|
+
posture,
|
|
79
81
|
identityCarrier: inbound.identity.carrier,
|
|
80
82
|
callerFingerprint: inbound.identity.tokenFingerprint,
|
|
81
83
|
userId: resolved?.userId ?? null,
|
|
82
84
|
tokenId: resolved?.tokenId ?? null,
|
|
83
85
|
credentialFingerprint: inbound.upstreamCredential?.fingerprint ?? null,
|
|
84
|
-
credentialOrigin: credentialOrigin(
|
|
86
|
+
credentialOrigin: credentialOrigin(isSubscription, inbound.upstreamCredential !== null && !isSubscription),
|
|
85
87
|
sessionId,
|
|
86
88
|
requestedModel: null,
|
|
87
89
|
servedModel: null,
|
|
@@ -100,6 +102,7 @@ preRead) {
|
|
|
100
102
|
upstreamRequestId: null,
|
|
101
103
|
rateLimit: null,
|
|
102
104
|
clientVersion,
|
|
105
|
+
client,
|
|
103
106
|
pipeline: "passthrough",
|
|
104
107
|
routeId: ctx.routeId ?? null,
|
|
105
108
|
// Recorded even though this path never chooses: a record that says
|
|
@@ -123,7 +126,7 @@ preRead) {
|
|
|
123
126
|
});
|
|
124
127
|
// Claude Code renders error.message to the developer, so this string is
|
|
125
128
|
// the user-facing UI. Write it for a human who is mid-task.
|
|
126
|
-
res.end(
|
|
129
|
+
res.end(wire.errorBody(type, message));
|
|
127
130
|
};
|
|
128
131
|
if (presentedToken !== null && resolved === null) {
|
|
129
132
|
denyIdentity(badIdentity().message);
|
|
@@ -141,12 +144,11 @@ preRead) {
|
|
|
141
144
|
const type = "invalid_request_error";
|
|
142
145
|
finish({ status: "bad_request", httpStatus: statusForErrorType(type) });
|
|
143
146
|
res.writeHead(statusForErrorType(type), { "content-type": "application/json" });
|
|
144
|
-
res.end(
|
|
147
|
+
res.end(wire.errorBody(type, `Fest: request body exceeds ${MAX_BODY_BYTES} bytes.`));
|
|
145
148
|
return;
|
|
146
149
|
}
|
|
147
150
|
const body = bodyOrTooLarge;
|
|
148
151
|
const peek = peekRequest(body);
|
|
149
|
-
const isSubscription = inbound.upstreamCredential !== null && isSubscriptionCredential(inbound.upstreamCredential);
|
|
150
152
|
// Key posture with a Fest token and nothing to pay with: the credential
|
|
151
153
|
// position holds our OWN token, which we will not forward, and no route
|
|
152
154
|
// claimed this model. Anthropic's 401 would be accurate but useless — it
|
|
@@ -165,13 +167,17 @@ preRead) {
|
|
|
165
167
|
"content-type": "application/json",
|
|
166
168
|
"x-should-retry": String(failure.retryable),
|
|
167
169
|
});
|
|
168
|
-
res.end(
|
|
170
|
+
res.end(wire.errorBody(failure.type, failure.message));
|
|
169
171
|
return;
|
|
170
172
|
}
|
|
171
|
-
|
|
173
|
+
// `joinUpstreamUrl`, not `new URL(path, base)`: URL resolution throws away a
|
|
174
|
+
// base URL's own path, which silently drops Bedrock's `/anthropic` segment
|
|
175
|
+
// and turns every request into a 404 nobody can read off the config.
|
|
176
|
+
const target = joinUpstreamUrl(ctx.upstreamBaseUrl, ctx.pathOverride ?? inbound.effectivePath);
|
|
172
177
|
const headers = buildUpstreamHeaders(req.headers, {
|
|
173
|
-
posture
|
|
178
|
+
posture,
|
|
174
179
|
upstreamHost: target.host,
|
|
180
|
+
defaultAnthropicVersion: wire.defaultAnthropicVersion,
|
|
175
181
|
});
|
|
176
182
|
const abort = new AbortController();
|
|
177
183
|
let upstream;
|
|
@@ -198,12 +204,15 @@ preRead) {
|
|
|
198
204
|
errorMessage: String(err).slice(0, 200),
|
|
199
205
|
});
|
|
200
206
|
res.writeHead(statusForErrorType(type), { "content-type": "application/json" });
|
|
201
|
-
res.end(
|
|
207
|
+
res.end(wire.errorBody(type, "Fest: upstream request failed."));
|
|
202
208
|
return;
|
|
203
209
|
}
|
|
204
|
-
const rateLimit = parseRateLimit(upstream.headers);
|
|
205
|
-
const upstreamRequestId =
|
|
206
|
-
const downstream = buildDownstreamHeaders(upstream.headers, {
|
|
210
|
+
const rateLimit = wire.parseRateLimit(upstream.headers);
|
|
211
|
+
const upstreamRequestId = wire.upstreamRequestId(upstream.headers);
|
|
212
|
+
const downstream = buildDownstreamHeaders(upstream.headers, {
|
|
213
|
+
stream: peek.stream,
|
|
214
|
+
allow: wire.downstreamAllow,
|
|
215
|
+
});
|
|
207
216
|
const base = {
|
|
208
217
|
requestedModel: peek.model,
|
|
209
218
|
servedModel: peek.model,
|
|
@@ -234,7 +243,9 @@ preRead) {
|
|
|
234
243
|
* failure and is not warned about, or every session would open with an
|
|
235
244
|
* error in the dashboard and a warning in the log.
|
|
236
245
|
*/
|
|
237
|
-
|
|
246
|
+
// Claude Code's warmup ping is an Anthropic-wire phenomenon; nothing on
|
|
247
|
+
// another wire is that ping, whatever its shape.
|
|
248
|
+
const preflight = wire.id === "anthropic" && isWarmupPreflightRefusal({
|
|
238
249
|
httpStatus: upstream.status,
|
|
239
250
|
stream: peek.stream,
|
|
240
251
|
maxTokens: peek.maxTokens,
|
|
@@ -268,7 +279,7 @@ preRead) {
|
|
|
268
279
|
}
|
|
269
280
|
// `stream: false`: whatever the client asked for, this is a JSON error, and
|
|
270
281
|
// framing it as a stream would tell the client to expect SSE it won't get.
|
|
271
|
-
res.writeHead(upstream.status, buildDownstreamHeaders(upstream.headers, { stream: false }));
|
|
282
|
+
res.writeHead(upstream.status, buildDownstreamHeaders(upstream.headers, { stream: false, allow: wire.downstreamAllow }));
|
|
272
283
|
res.end(failure.text);
|
|
273
284
|
finish({
|
|
274
285
|
...base,
|
|
@@ -284,12 +295,12 @@ preRead) {
|
|
|
284
295
|
const text = await upstream.text();
|
|
285
296
|
let usage = EMPTY_USAGE;
|
|
286
297
|
try {
|
|
287
|
-
usage = usageFromJson(JSON.parse(text)) ?? EMPTY_USAGE;
|
|
298
|
+
usage = wire.usageFromJson(JSON.parse(text)) ?? EMPTY_USAGE;
|
|
288
299
|
}
|
|
289
300
|
catch {
|
|
290
301
|
// A body we cannot read is still relayed; we just report less.
|
|
291
302
|
}
|
|
292
|
-
const priced = priceUsage(peek.model, usage, isSubscription);
|
|
303
|
+
const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
|
|
293
304
|
res.writeHead(upstream.status, downstream);
|
|
294
305
|
res.end(text);
|
|
295
306
|
finish({
|
|
@@ -304,8 +315,11 @@ preRead) {
|
|
|
304
315
|
return;
|
|
305
316
|
}
|
|
306
317
|
// ── streaming ──────────────────────────────────────────────────────────────
|
|
307
|
-
const parser = createSseParser(
|
|
308
|
-
|
|
318
|
+
const parser = createSseParser({
|
|
319
|
+
interestingTypes: wire.usageEventTypes,
|
|
320
|
+
maxEventChars: wire.maxEventChars,
|
|
321
|
+
});
|
|
322
|
+
const acc = wire.createAccumulator();
|
|
309
323
|
beginStream(res, upstream.status, downstream);
|
|
310
324
|
try {
|
|
311
325
|
const result = await pipeWithTee(upstream.body, res, {
|
|
@@ -319,7 +333,7 @@ preRead) {
|
|
|
319
333
|
for (const event of parser.flush())
|
|
320
334
|
acc.apply(event);
|
|
321
335
|
const usage = acc.snapshot();
|
|
322
|
-
const priced = priceUsage(peek.model, usage, isSubscription);
|
|
336
|
+
const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
|
|
323
337
|
const streamErr = acc.streamError();
|
|
324
338
|
/**
|
|
325
339
|
* Only a 2xx reaches here — a non-2xx was recorded and relayed above, which
|
|
@@ -332,8 +346,14 @@ preRead) {
|
|
|
332
346
|
* a client abort wins over them: the developer walking away is the more
|
|
333
347
|
* specific fact about what happened.
|
|
334
348
|
*/
|
|
349
|
+
//
|
|
350
|
+
// A client that hangs up AFTER the terminal event is not walking away: it
|
|
351
|
+
// has the whole answer. Codex does exactly this — it stops reading at
|
|
352
|
+
// `response.completed` while chatgpt.com is still holding the stream open —
|
|
353
|
+
// and counting that as an abort marked every Codex turn a failure.
|
|
354
|
+
const finished = result.completed || acc.sawTerminal?.() === true;
|
|
335
355
|
let status = "ok";
|
|
336
|
-
if (result.clientAborted)
|
|
356
|
+
if (result.clientAborted && !finished)
|
|
337
357
|
status = "client_abort";
|
|
338
358
|
else if (streamErr)
|
|
339
359
|
status = "stream_error";
|
|
@@ -344,7 +364,7 @@ preRead) {
|
|
|
344
364
|
status,
|
|
345
365
|
// Input tokens were already consumed upstream even on an abort, so the
|
|
346
366
|
// partial usage is real and worth recording — just flagged as incomplete.
|
|
347
|
-
partial:
|
|
367
|
+
partial: !finished,
|
|
348
368
|
usage,
|
|
349
369
|
costUsd: priced.cost,
|
|
350
370
|
costBasis: priced.basis,
|
|
@@ -364,10 +384,10 @@ preRead) {
|
|
|
364
384
|
for (const event of parser.flush())
|
|
365
385
|
acc.apply(event);
|
|
366
386
|
const usage = acc.snapshot();
|
|
367
|
-
const priced = priceUsage(peek.model, usage, isSubscription);
|
|
387
|
+
const priced = priceUsage(peek.model, usage, isSubscription, ctx.priceProvider);
|
|
368
388
|
log.warn("upstream stream failed mid-flight", { id, error: String(err).slice(0, 200) });
|
|
369
389
|
if (!res.writableEnded) {
|
|
370
|
-
res.write(
|
|
390
|
+
res.write(wire.sseErrorFrame("api_error", "Fest: upstream connection closed mid-stream."));
|
|
371
391
|
res.end();
|
|
372
392
|
}
|
|
373
393
|
finish({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"passthrough.js","sourceRoot":"","sources":["../../../server/pipeline/passthrough.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAQzC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,uBAAuB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAChF,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAEhC,MAAM,cAAc,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AA0BxC,SAAS,gBAAgB,CAAC,eAAwB,EAAE,MAAe;IACjE,IAAI,eAAe;QAAE,OAAO,sBAAsB,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,aAAa,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAoB,EACpB,GAAmB,EACnB,GAAuB;AACvB;;;;;GAKG;AACH,OAAiC;IAEjC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAE3D,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAErD,MAAM,qBAAqB,GACzB,OAAO,CAAC,kBAAkB,KAAK,IAAI;QACjC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,8BAA8B,EAAE,CAAC;QACpF,CAAC,CAAC;YACE;gBACE,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC;oBAC1D,CAAC,CAAC,sBAAsB;oBACxB,CAAC,CAAC,aAAa;gBACjB,MAAM,EAAE,MAAM;aACf;SACF,CAAC;IAER,4EAA4E;IAC5E,gBAAgB;IAChB,6EAA6E;IAC7E,mEAAmE;IACnE,yEAAyE;IACzE,gEAAgE;IAChE,uEAAuE;IACvE,MAAM,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAC7C,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,IAAI;QAAE,GAAG,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,CAAC,OAAyD,EAAQ,EAAE;QACjF,MAAM,GAAG,GAAgB;YACvB,EAAE;YACF,SAAS;YACT,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;YACnB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO;YACzC,iBAAiB,EAAE,OAAO,CAAC,QAAQ,CAAC,gBAAgB;YACpD,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,IAAI;YAChC,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,IAAI;YAClC,qBAAqB,EAAE,OAAO,CAAC,kBAAkB,EAAE,WAAW,IAAI,IAAI;YACtE,gBAAgB,EAAE,gBAAgB,CAChC,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAC3F,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAC7F;YACD,SAAS;YACT,cAAc,EAAE,IAAI;YACpB,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,GAAG,CAAC,eAAe;YAC7B,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,IAAI;YAChB,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,WAAW;YAClB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,MAAM;YACjB,eAAe,EAAE,IAAI;YACrB,MAAM,EAAE,IAAI;YACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAClC,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,CAAC;YACX,iBAAiB,EAAE,IAAI;YACvB,SAAS,EAAE,IAAI;YACf,aAAa;YACb,QAAQ,EAAE,aAAa;YACvB,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,IAAI;YAC5B,mEAAmE;YACnE,sEAAsE;YACtE,mEAAmE;YACnE,WAAW;YACX,qBAAqB;YACrB,GAAG,OAAO;SACX,CAAC;QACF,gEAAgE;QAChE,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,OAAe,EAAQ,EAAE;QAC7C,MAAM,IAAI,GAAG,sBAAsB,CAAC;QACpC,MAAM,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE;YACtC,cAAc,EAAE,kBAAkB;YAClC,oEAAoE;YACpE,0EAA0E;YAC1E,gBAAgB,EAAE,OAAO;SAC1B,CAAC,CAAC;QACH,wEAAwE;QACxE,4DAA4D;QAC5D,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACzC,CAAC,CAAC;IAEF,IAAI,cAAc,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjD,YAAY,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,0EAA0E;IAC1E,iEAAiE;IACjE,IAAI,GAAG,CAAC,eAAe,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QAC7C,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,cAAc,GAAG,OAAO,IAAI,CAAC,MAAM,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7E,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACrC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACxE,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,8BAA8B,cAAc,SAAS,CAAC,CAAC,CAAC;QACrF,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,cAAc,CAAC;IAC5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,cAAc,GAAG,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,wBAAwB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAEnH,wEAAwE;IACxE,wEAAwE;IACxE,yEAAyE;IACzE,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QACtF,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC;YACL,MAAM,EAAE,aAAa;YACrB,UAAU,EAAE,OAAO,CAAC,MAAM;YAC1B,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,SAAS,EAAE,OAAO,CAAC,IAAI;SACxB,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE;YAC5B,cAAc,EAAE,kBAAkB;YAClC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;SAC5C,CAAC,CAAC;QACH,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QACvD,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,oBAAoB,CAAC,GAAG,CAAC,OAAO,EAAE;QAChD,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,YAAY,EAAE,MAAM,CAAC,IAAI;KAC1B,CAAC,CAAC;IAEH,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;IACpC,IAAI,QAAkB,CAAC;IACvB,IAAI,CAAC;QACH,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;YAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,MAAM;YAC5B,OAAO;YACP,0DAA0D;YAC1D,IAAI;YACJ,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,QAAQ,EAAE,OAAO;SAClB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,sEAAsE;QACtE,MAAM,IAAI,GAAG,WAAW,CAAC;QACzB,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9E,MAAM,CAAC;YACL,MAAM,EAAE,gBAAgB;YACxB,UAAU,EAAE,kBAAkB,CAAC,IAAI,CAAC;YACpC,cAAc,EAAE,IAAI,CAAC,KAAK;YAC1B,OAAO,EAAE,IAAI,CAAC,UAAU;YACxB,SAAS,EAAE,IAAI;YACf,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACxC,CAAC,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACnD,MAAM,iBAAiB,GACrB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,sBAAsB,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAErF,MAAM,IAAI,GAAG;QACX,cAAc,EAAE,IAAI,CAAC,KAAK;QAC1B,WAAW,EAAE,IAAI,CAAC,KAAK;QACvB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,QAAQ,CAAC,MAAM;QAC3B,OAAO,EAAE,IAAI,CAAC,UAAU;QACxB,iBAAiB;QACjB,SAAS;KACV,CAAC;IAEF,8EAA8E;IAC9E;;;;;;;;;;OAUG;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,OAAO,GAAG,uBAAuB,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAEhF;;;;;;WAMG;QACH,MAAM,SAAS,GAAG,wBAAwB,CAAC;YACzC,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS;YACT,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAC;QAEH;;;;;;;;;;WAUG;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBAC3B,EAAE;gBACF,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,OAAO,EAAE,OAAO,CAAC,OAAO;gBACxB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,IAAI,CAAC,UAAU;gBACxB,QAAQ,EAAE,aAAa;gBACvB,iBAAiB;gBACjB,SAAS;aACV,CAAC,CAAC;QACL,CAAC;QACD,4EAA4E;QAC5E,2EAA2E;QAC3E,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5F,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,CAAC;YACL,GAAG,IAAI;YACP,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,gBAAgB;YAC1D,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;YACzC,SAAS,EAAE,OAAO,CAAC,IAAI;YACvB,YAAY,EAAE,OAAO,CAAC,OAAO;SAC9B,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,IAAI,KAAK,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC;YACH,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,WAAW,CAAC;QACzD,CAAC;QAAC,MAAM,CAAC;YACP,+DAA+D;QACjE,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7D,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3C,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,CAAC;YACL,GAAG,IAAI;YACP,MAAM,EAAE,IAAI;YACZ,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,eAAe,EAAE,MAAM,CAAC,YAAY;YACpC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;SAClC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,8EAA8E;IAC9E,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;IACjC,MAAM,GAAG,GAAG,sBAAsB,EAAE,CAAC;IAErC,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAE9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE;YACnD,KAAK;YACL,SAAS;YACT,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;gBACjB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;oBAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3D,CAAC;SACF,CAAC,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE;YAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAErD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QAEpC;;;;;;;;;;WAUG;QACH,IAAI,MAAM,GAAkB,IAAI,CAAC;QACjC,IAAI,MAAM,CAAC,aAAa;YAAE,MAAM,GAAG,cAAc,CAAC;aAC7C,IAAI,SAAS;YAAE,MAAM,GAAG,cAAc,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAErC,MAAM,CAAC;YACL,GAAG,IAAI;YACP,MAAM;YACN,uEAAuE;YACvE,0EAA0E;YAC1E,OAAO,EAAE,MAAM,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,SAAS;YAClD,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,eAAe,EAAE,MAAM,CAAC,YAAY;YACpC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACrF,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,cAAc,GAAG,CAAC,EAAE,CAAC;YAC9B,GAAG,CAAC,IAAI,CAAC,sCAAsC,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC;QAC1F,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0EAA0E;QAC1E,wEAAwE;QACxE,oEAAoE;QACpE,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE;YAAE,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;QAC7D,GAAG,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;YACvB,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,8CAA8C,CAAC,CAAC,CAAC;YACtF,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;QACD,MAAM,CAAC;YACL,GAAG,IAAI;YACP,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,IAAI;YACb,KAAK;YACL,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,SAAS,EAAE,MAAM,CAAC,KAAK;YACvB,eAAe,EAAE,MAAM,CAAC,YAAY;YACpC,SAAS,EAAE,WAAW;YACtB,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAoB,EAAE,IAAY;IACrD,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|
|
1
|
+
{"version":3,"file":"passthrough.js","sourceRoot":"","sources":["../../../server/pipeline/passthrough.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,6 +40,7 @@ export function buildRecord(base, partial) {
|
|
|
40
40
|
upstreamRequestId: null,
|
|
41
41
|
rateLimit: null,
|
|
42
42
|
clientVersion: base.clientVersion,
|
|
43
|
+
client: base.client ?? null,
|
|
43
44
|
pipeline: base.pipeline,
|
|
44
45
|
routeId: base.routeId,
|
|
45
46
|
credentialsConsidered: base.credentialsConsidered,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../server/pipeline/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"record.js","sourceRoot":"","sources":["../../../server/pipeline/record.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAQH,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAqBpD,MAAM,UAAU,WAAW,CACzB,IAAgB,EAChB,OAAyD;IAEzD,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;QACzC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,cAAc,EAAE,IAAI;QACpB,WAAW,EAAE,IAAI;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,KAAK;QACb,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,WAAW;QAClB,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,MAAM;QACjB,eAAe,EAAE,IAAI;QACrB,MAAM,EAAE,IAAI;QACZ,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS;QACvC,OAAO,EAAE,CAAC;QACV,QAAQ,EAAE,CAAC;QACX,iBAAiB,EAAE,IAAI;QACvB,SAAS,EAAE,IAAI;QACf,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;QACjD,GAAG,OAAO;KACX,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire profiles: everything the pass-through relay needs to know about the
|
|
3
|
+
* API it is relaying, and nothing else.
|
|
4
|
+
*
|
|
5
|
+
* The relay itself — identity, the byte-for-byte forward, the tee, the record —
|
|
6
|
+
* is the same for every client, which is why there is one `handleMessages`
|
|
7
|
+
* rather than one per vendor. What differs is how usage is reported, what an
|
|
8
|
+
* error looks like, which headers matter, and where quota lives. That is this
|
|
9
|
+
* interface. It is not an adapter: nothing here may rewrite a request.
|
|
10
|
+
*
|
|
11
|
+
* - `anthropic` — the Messages API. Claude Code, Bedrock mantle, and Copilot
|
|
12
|
+
* CLI in BYOK mode with `COPILOT_PROVIDER_TYPE=anthropic`.
|
|
13
|
+
* - `openai-responses` — the Responses API. Codex on an API key (`/openai`)
|
|
14
|
+
* and on a ChatGPT login (`/chatgpt`).
|
|
15
|
+
*/
|
|
16
|
+
import { USAGE_EVENT_TYPES } from "../../shared/types.js";
|
|
17
|
+
import { anthropicError, openaiError, openaiSseErrorEvent, sseErrorEvent, } from "../http/errors.js";
|
|
18
|
+
import { parseCodexRateLimit, parseRateLimit } from "../http/headers.js";
|
|
19
|
+
import { createUsageAccumulator, usageFromJson, } from "../usage/accumulator.js";
|
|
20
|
+
import { createResponsesAccumulator, responsesUsageFromJson, RESPONSES_MAX_EVENT_CHARS, RESPONSES_USAGE_EVENT_TYPES, } from "../usage/responses.js";
|
|
21
|
+
export const ANTHROPIC_WIRE = {
|
|
22
|
+
id: "anthropic",
|
|
23
|
+
usageEventTypes: USAGE_EVENT_TYPES,
|
|
24
|
+
createAccumulator: createUsageAccumulator,
|
|
25
|
+
usageFromJson,
|
|
26
|
+
errorBody: anthropicError,
|
|
27
|
+
sseErrorFrame: sseErrorEvent,
|
|
28
|
+
defaultAnthropicVersion: true,
|
|
29
|
+
parseRateLimit,
|
|
30
|
+
upstreamRequestId: (h) => h.get("request-id") ?? h.get("anthropic-request-id"),
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Response headers a Codex client reads.
|
|
34
|
+
*
|
|
35
|
+
* `x-codex-turn-state` is the one that matters: Codex echoes it on its next
|
|
36
|
+
* request so the backend keeps the turn on the same node, and dropping it was
|
|
37
|
+
* not tested. The rest are quota and diagnostics Codex shows the developer.
|
|
38
|
+
*/
|
|
39
|
+
function codexAllow(name) {
|
|
40
|
+
return (name.startsWith("x-codex-") ||
|
|
41
|
+
name.startsWith("x-ratelimit-") ||
|
|
42
|
+
name.startsWith("openai-") ||
|
|
43
|
+
name === "x-request-id" ||
|
|
44
|
+
name === "x-oai-request-id" ||
|
|
45
|
+
name === "x-models-etag");
|
|
46
|
+
}
|
|
47
|
+
export const OPENAI_RESPONSES_WIRE = {
|
|
48
|
+
id: "openai-responses",
|
|
49
|
+
usageEventTypes: RESPONSES_USAGE_EVENT_TYPES,
|
|
50
|
+
maxEventChars: RESPONSES_MAX_EVENT_CHARS,
|
|
51
|
+
createAccumulator: createResponsesAccumulator,
|
|
52
|
+
usageFromJson: responsesUsageFromJson,
|
|
53
|
+
errorBody: openaiError,
|
|
54
|
+
sseErrorFrame: openaiSseErrorEvent,
|
|
55
|
+
defaultAnthropicVersion: false,
|
|
56
|
+
downstreamAllow: codexAllow,
|
|
57
|
+
// api.openai.com sends `x-ratelimit-*` request/token counters, which are per
|
|
58
|
+
// org key and have no 5h/7d shape to map. chatgpt.com sends the Codex plan
|
|
59
|
+
// windows, which do.
|
|
60
|
+
parseRateLimit: parseCodexRateLimit,
|
|
61
|
+
upstreamRequestId: (h) => h.get("x-request-id") ?? h.get("x-oai-request-id"),
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=wire.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.js","sourceRoot":"","sources":["../../../server/pipeline/wire.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EACL,cAAc,EACd,WAAW,EACX,mBAAmB,EACnB,aAAa,GAEd,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EACL,sBAAsB,EACtB,aAAa,GAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,GAC5B,MAAM,uBAAuB,CAAC;AAoB/B,MAAM,CAAC,MAAM,cAAc,GAAgB;IACzC,EAAE,EAAE,WAAW;IACf,eAAe,EAAE,iBAAiB;IAClC,iBAAiB,EAAE,sBAAsB;IACzC,aAAa;IACb,SAAS,EAAE,cAAc;IACzB,aAAa,EAAE,aAAa;IAC5B,uBAAuB,EAAE,IAAI;IAC7B,cAAc;IACd,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC;CAC/E,CAAC;AAEF;;;;;;GAMG;AACH,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CACL,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAC3B,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAC1B,IAAI,KAAK,cAAc;QACvB,IAAI,KAAK,kBAAkB;QAC3B,IAAI,KAAK,eAAe,CACzB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAgB;IAChD,EAAE,EAAE,kBAAkB;IACtB,eAAe,EAAE,2BAA2B;IAC5C,aAAa,EAAE,yBAAyB;IACxC,iBAAiB,EAAE,0BAA0B;IAC7C,aAAa,EAAE,sBAAsB;IACrC,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,mBAAmB;IAClC,uBAAuB,EAAE,KAAK;IAC9B,eAAe,EAAE,UAAU;IAC3B,6EAA6E;IAC7E,2EAA2E;IAC3E,qBAAqB;IACrB,cAAc,EAAE,mBAAmB;IACnC,iBAAiB,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC;CAC7E,CAAC"}
|
|
@@ -67,6 +67,9 @@ export function classifyCredential(header, rawValue) {
|
|
|
67
67
|
kind = "FIREPASS_KEY";
|
|
68
68
|
else if (token.startsWith("fest_"))
|
|
69
69
|
kind = "FEST_IDENTITY_TOKEN";
|
|
70
|
+
// After every `sk-ant-` case, so an Anthropic key can never land here.
|
|
71
|
+
else if (token.startsWith("sk-"))
|
|
72
|
+
kind = "OPENAI_API_KEY";
|
|
70
73
|
return {
|
|
71
74
|
header,
|
|
72
75
|
scheme: bearer ? "Bearer" : "raw",
|
|
@@ -85,8 +88,15 @@ export function isSubscriptionCredential(info) {
|
|
|
85
88
|
* fails, so every log line passes through this regardless of where it came from.
|
|
86
89
|
*/
|
|
87
90
|
const SECRET_PATTERN = /\b(?:sk-ant|sk|pk|ghp|gho|ghs|ghu|github_pat|xox[bpoars]|fw|fpk|fest)[-_][\w-]{8,}\b/gi;
|
|
91
|
+
/**
|
|
92
|
+
* A JWT: three base64url segments, the first an encoded `{"alg":…}` header, so
|
|
93
|
+
* it always starts `eyJ`. A ChatGPT login's access token is one, and it is a
|
|
94
|
+
* bearer for the developer's whole ChatGPT account — and, having no vendor
|
|
95
|
+
* prefix, it slips past `SECRET_PATTERN`.
|
|
96
|
+
*/
|
|
97
|
+
const JWT_PATTERN = /\beyJ[\w-]{8,}\.[\w-]{8,}\.[\w-]*/g;
|
|
88
98
|
export function redactSecrets(text) {
|
|
89
|
-
return text.replace(SECRET_PATTERN, "<redacted>");
|
|
99
|
+
return text.replace(SECRET_PATTERN, "<redacted>").replace(JWT_PATTERN, "<redacted>");
|
|
90
100
|
}
|
|
91
101
|
/**
|
|
92
102
|
* Split request headers into credentials (fingerprinted) and the rest (kept).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../server/secret/fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,4EAA4E;AAC5E,MAAM,CAAC,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC;IACzD,eAAe;IACf,WAAW;IACX,qBAAqB;IACrB,qBAAqB;IACrB,qBAAqB;IACrB,QAAQ;IACR,YAAY;IACZ,uDAAuD;IACvD,cAAc;CACf,CAAC,CAAC;AAEH,wDAAwD;AACxD,MAAM,CAAC,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC;IACrD,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,mBAAmB;IACnB,SAAS;IACT,kBAAkB;IAClB,IAAI;IACJ,SAAS;CACV,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../../../server/secret/fingerprint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
-- Which coding agent sent each request: 'claude-code', 'codex' or 'copilot'.
|
|
2
|
+
--
|
|
3
|
+
-- Fest fronted only Claude Code until the `/openai` and `/chatgpt` mounts
|
|
4
|
+
-- (Codex) and Copilot CLI's BYOK mode. Model ids mostly tell the clients apart,
|
|
5
|
+
-- but not reliably — Copilot BYOK sends the same `claude-*` ids Claude Code
|
|
6
|
+
-- does — and "how much of our spend is Codex" is a question per client, not
|
|
7
|
+
-- per model.
|
|
8
|
+
--
|
|
9
|
+
-- Labelled from caller-controlled headers (see server/http/client.ts), so it is
|
|
10
|
+
-- reporting, never policy. NULL is "could not tell", which is also every row
|
|
11
|
+
-- written before this migration: they were almost certainly Claude Code, but a
|
|
12
|
+
-- guess written into history is exactly what this schema refuses to do.
|
|
13
|
+
|
|
14
|
+
ALTER TABLE requests ADD COLUMN client TEXT;
|