@open-everywhere/adapters 0.1.3 → 0.1.4

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.
@@ -0,0 +1,100 @@
1
+ // THE MODEL-ROUTE PROBE (OPE-2230) — the live half of the deployment-status surface's
2
+ // `model-route` requirement (`@open-everywhere/core/agent/ops/status.ts`).
3
+ //
4
+ // IT LIVES HERE because the gateway's URL is a VENDOR BINDING, and core carries none. Core defines
5
+ // the seam (`registerStatusProbe`); the app's boot wiring calls `registerGatewayRouteProbe()`.
6
+ //
7
+ // 🔴 WHAT IT MEASURES, AND WHAT IT DOES NOT. Two cheap facts:
8
+ //
9
+ // ① CREDENTIAL POSTURE, from env alone. On Vercel a deployed project authenticates to the
10
+ // gateway with OIDC and there is no key to hold, so the posture is satisfied by the platform.
11
+ // Off Vercel it needs `AI_GATEWAY_API_KEY`.
12
+ // ② REACHABILITY, from one GET of the gateway's PUBLIC model catalog — the same unauthenticated
13
+ // endpoint `scripts/seed-model-catalog-cache.ts` reads.
14
+ //
15
+ // It does NOT prove the deployment's credential is ACCEPTED: the only call that proves that is an
16
+ // inference call, which is neither cheap nor free, and a status route an unbounded caller can poke
17
+ // must not be able to spend money. The detail string says so in as many words, because a status
18
+ // field that is read as more than it measured is worse than no field.
19
+ //
20
+ // FAIL-SOFT and BOUNDED: a 2-second abort, and any throw answers "no" with no vendor error text
21
+ // forwarded (a fetch failure's message carries the host, and the status route is public).
22
+
23
+ import { registerStatusProbe, onVercel, type ProbeAnswer } from "@open-everywhere/core/agent/adapter-api.js";
24
+
25
+ /** The gateway's PUBLIC, unauthenticated model catalog — eve's own `AI_GATEWAY_MODELS_CATALOG_URL`. */
26
+ export const GATEWAY_CATALOG_URL = "https://ai-gateway.vercel.sh/v1/models/catalog";
27
+
28
+ /** How long the probe waits before it calls the gateway unreachable. */
29
+ export const GATEWAY_PROBE_TIMEOUT_MS = 2_000;
30
+
31
+ /**
32
+ * The catalog URL this deployment probes. `OE_AI_GATEWAY_URL` retargets the whole gateway (a relay,
33
+ * an on-prem proxy, a fixture), and it names the CHAT base (`…/v4/ai`), so the catalog is taken
34
+ * from its ORIGIN rather than appended to it.
35
+ */
36
+ export function gatewayCatalogUrl(env: NodeJS.ProcessEnv = process.env): string {
37
+ const override = env.OE_AI_GATEWAY_URL?.trim();
38
+ if (!override) return GATEWAY_CATALOG_URL;
39
+ try {
40
+ return `${new URL(override).origin}/v1/models/catalog`;
41
+ } catch {
42
+ // An unparseable override is the operator's problem, and the probe is not where it should
43
+ // surface: fall back to the default target rather than answer a misleading "unreachable".
44
+ return GATEWAY_CATALOG_URL;
45
+ }
46
+ }
47
+
48
+ export interface GatewayProbeDeps {
49
+ readonly env?: NodeJS.ProcessEnv;
50
+ readonly fetchImpl?: typeof globalThis.fetch;
51
+ readonly vercel?: boolean;
52
+ }
53
+
54
+ /** Run the probe once. Exported so a test drives every arm with no network. */
55
+ export async function probeGatewayRoute(deps: GatewayProbeDeps = {}): Promise<ProbeAnswer> {
56
+ const env = deps.env ?? process.env;
57
+ const vercel = deps.vercel ?? onVercel();
58
+ const keySet = (env.AI_GATEWAY_API_KEY ?? "").trim().length > 0;
59
+ // 🔴 A RETARGETED GATEWAY IS NOT MEASURABLE BY THIS PROBE, so it reads "unknown" and never "no".
60
+ // The deployment contract blesses `OE_AI_GATEWAY_URL` pointed at a compatible relay, and a relay
61
+ // owes nobody a model catalog and may need no key of ours. Both of this probe's facts are then
62
+ // about the shipped Vercel gateway, not about the route the deployment actually uses — and
63
+ // "measured, and it does not hold" would be false for a deployment whose models route fine.
64
+ const retargeted = (env.OE_AI_GATEWAY_URL ?? "").trim().length > 0;
65
+ if (!vercel && !keySet) {
66
+ if (retargeted) {
67
+ return { met: "unknown", detail: "the model route is retargeted by OE_AI_GATEWAY_URL and holds no AI_GATEWAY_API_KEY — a relay may need neither, so this was not measured" };
68
+ }
69
+ return { met: "no", detail: "no gateway credential: off Vercel the deployment needs AI_GATEWAY_API_KEY (on Vercel, OIDC authenticates it)" };
70
+ }
71
+ const credential = vercel ? "OIDC on Vercel" : "AI_GATEWAY_API_KEY";
72
+ const fetchImpl = deps.fetchImpl ?? globalThis.fetch;
73
+ const controller = new AbortController();
74
+ const fuse = setTimeout(() => controller.abort(), GATEWAY_PROBE_TIMEOUT_MS);
75
+ try {
76
+ const res = await fetchImpl(gatewayCatalogUrl(env), { method: "GET", signal: controller.signal });
77
+ if (!res.ok) {
78
+ // A 404 or 405 from a RETARGETED gateway means "this endpoint is not served here", which is a
79
+ // fact about the catalog route and not about the model route. Anything else — a 5xx, a 401 —
80
+ // is the relay failing, and stays a "no".
81
+ if (retargeted && (res.status === 404 || res.status === 405)) {
82
+ return { met: "unknown", detail: `the retargeted model gateway does not serve a model catalog (HTTP ${res.status}), so reachability was not measured; the credential posture is ${credential}` };
83
+ }
84
+ return { met: "no", detail: `the model gateway answered HTTP ${res.status} to a catalog read; the credential posture is ${credential}` };
85
+ }
86
+ return {
87
+ met: "yes",
88
+ detail: `the model gateway answered a catalog read and the credential posture is ${credential} — this does not prove an inference call is authorised`,
89
+ };
90
+ } catch {
91
+ return { met: "no", detail: `the model gateway did not answer within ${GATEWAY_PROBE_TIMEOUT_MS} ms; the credential posture is ${credential}` };
92
+ } finally {
93
+ clearTimeout(fuse);
94
+ }
95
+ }
96
+
97
+ /** Wire the probe into the deployment-status surface. Called once, from the app's boot wiring. */
98
+ export function registerGatewayRouteProbe(): void {
99
+ registerStatusProbe("model-route", () => probeGatewayRoute());
100
+ }
@@ -0,0 +1,21 @@
1
+ import { type ProbeAnswer } from "@open-everywhere/core/agent/adapter-api.js";
2
+ /** The gateway's PUBLIC, unauthenticated model catalog — eve's own `AI_GATEWAY_MODELS_CATALOG_URL`. */
3
+ export declare const GATEWAY_CATALOG_URL = "https://ai-gateway.vercel.sh/v1/models/catalog";
4
+ /** How long the probe waits before it calls the gateway unreachable. */
5
+ export declare const GATEWAY_PROBE_TIMEOUT_MS = 2000;
6
+ /**
7
+ * The catalog URL this deployment probes. `OE_AI_GATEWAY_URL` retargets the whole gateway (a relay,
8
+ * an on-prem proxy, a fixture), and it names the CHAT base (`…/v4/ai`), so the catalog is taken
9
+ * from its ORIGIN rather than appended to it.
10
+ */
11
+ export declare function gatewayCatalogUrl(env?: NodeJS.ProcessEnv): string;
12
+ export interface GatewayProbeDeps {
13
+ readonly env?: NodeJS.ProcessEnv;
14
+ readonly fetchImpl?: typeof globalThis.fetch;
15
+ readonly vercel?: boolean;
16
+ }
17
+ /** Run the probe once. Exported so a test drives every arm with no network. */
18
+ export declare function probeGatewayRoute(deps?: GatewayProbeDeps): Promise<ProbeAnswer>;
19
+ /** Wire the probe into the deployment-status surface. Called once, from the app's boot wiring. */
20
+ export declare function registerGatewayRouteProbe(): void;
21
+ //# sourceMappingURL=gateway-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-probe.d.ts","sourceRoot":"","sources":["../../../agent/model/gateway-probe.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAiC,KAAK,WAAW,EAAE,MAAM,4CAA4C,CAAC;AAE7G,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,mDAAmD,CAAC;AAEpF,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAU9E;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,+EAA+E;AAC/E,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,WAAW,CAAC,CAwCzF;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,IAAI,IAAI,CAEhD"}
@@ -0,0 +1,93 @@
1
+ // THE MODEL-ROUTE PROBE (OPE-2230) — the live half of the deployment-status surface's
2
+ // `model-route` requirement (`@open-everywhere/core/agent/ops/status.ts`).
3
+ //
4
+ // IT LIVES HERE because the gateway's URL is a VENDOR BINDING, and core carries none. Core defines
5
+ // the seam (`registerStatusProbe`); the app's boot wiring calls `registerGatewayRouteProbe()`.
6
+ //
7
+ // 🔴 WHAT IT MEASURES, AND WHAT IT DOES NOT. Two cheap facts:
8
+ //
9
+ // ① CREDENTIAL POSTURE, from env alone. On Vercel a deployed project authenticates to the
10
+ // gateway with OIDC and there is no key to hold, so the posture is satisfied by the platform.
11
+ // Off Vercel it needs `AI_GATEWAY_API_KEY`.
12
+ // ② REACHABILITY, from one GET of the gateway's PUBLIC model catalog — the same unauthenticated
13
+ // endpoint `scripts/seed-model-catalog-cache.ts` reads.
14
+ //
15
+ // It does NOT prove the deployment's credential is ACCEPTED: the only call that proves that is an
16
+ // inference call, which is neither cheap nor free, and a status route an unbounded caller can poke
17
+ // must not be able to spend money. The detail string says so in as many words, because a status
18
+ // field that is read as more than it measured is worse than no field.
19
+ //
20
+ // FAIL-SOFT and BOUNDED: a 2-second abort, and any throw answers "no" with no vendor error text
21
+ // forwarded (a fetch failure's message carries the host, and the status route is public).
22
+ import { registerStatusProbe, onVercel } from "@open-everywhere/core/agent/adapter-api.js";
23
+ /** The gateway's PUBLIC, unauthenticated model catalog — eve's own `AI_GATEWAY_MODELS_CATALOG_URL`. */
24
+ export const GATEWAY_CATALOG_URL = "https://ai-gateway.vercel.sh/v1/models/catalog";
25
+ /** How long the probe waits before it calls the gateway unreachable. */
26
+ export const GATEWAY_PROBE_TIMEOUT_MS = 2_000;
27
+ /**
28
+ * The catalog URL this deployment probes. `OE_AI_GATEWAY_URL` retargets the whole gateway (a relay,
29
+ * an on-prem proxy, a fixture), and it names the CHAT base (`…/v4/ai`), so the catalog is taken
30
+ * from its ORIGIN rather than appended to it.
31
+ */
32
+ export function gatewayCatalogUrl(env = process.env) {
33
+ const override = env.OE_AI_GATEWAY_URL?.trim();
34
+ if (!override)
35
+ return GATEWAY_CATALOG_URL;
36
+ try {
37
+ return `${new URL(override).origin}/v1/models/catalog`;
38
+ }
39
+ catch {
40
+ // An unparseable override is the operator's problem, and the probe is not where it should
41
+ // surface: fall back to the default target rather than answer a misleading "unreachable".
42
+ return GATEWAY_CATALOG_URL;
43
+ }
44
+ }
45
+ /** Run the probe once. Exported so a test drives every arm with no network. */
46
+ export async function probeGatewayRoute(deps = {}) {
47
+ const env = deps.env ?? process.env;
48
+ const vercel = deps.vercel ?? onVercel();
49
+ const keySet = (env.AI_GATEWAY_API_KEY ?? "").trim().length > 0;
50
+ // 🔴 A RETARGETED GATEWAY IS NOT MEASURABLE BY THIS PROBE, so it reads "unknown" and never "no".
51
+ // The deployment contract blesses `OE_AI_GATEWAY_URL` pointed at a compatible relay, and a relay
52
+ // owes nobody a model catalog and may need no key of ours. Both of this probe's facts are then
53
+ // about the shipped Vercel gateway, not about the route the deployment actually uses — and
54
+ // "measured, and it does not hold" would be false for a deployment whose models route fine.
55
+ const retargeted = (env.OE_AI_GATEWAY_URL ?? "").trim().length > 0;
56
+ if (!vercel && !keySet) {
57
+ if (retargeted) {
58
+ return { met: "unknown", detail: "the model route is retargeted by OE_AI_GATEWAY_URL and holds no AI_GATEWAY_API_KEY — a relay may need neither, so this was not measured" };
59
+ }
60
+ return { met: "no", detail: "no gateway credential: off Vercel the deployment needs AI_GATEWAY_API_KEY (on Vercel, OIDC authenticates it)" };
61
+ }
62
+ const credential = vercel ? "OIDC on Vercel" : "AI_GATEWAY_API_KEY";
63
+ const fetchImpl = deps.fetchImpl ?? globalThis.fetch;
64
+ const controller = new AbortController();
65
+ const fuse = setTimeout(() => controller.abort(), GATEWAY_PROBE_TIMEOUT_MS);
66
+ try {
67
+ const res = await fetchImpl(gatewayCatalogUrl(env), { method: "GET", signal: controller.signal });
68
+ if (!res.ok) {
69
+ // A 404 or 405 from a RETARGETED gateway means "this endpoint is not served here", which is a
70
+ // fact about the catalog route and not about the model route. Anything else — a 5xx, a 401 —
71
+ // is the relay failing, and stays a "no".
72
+ if (retargeted && (res.status === 404 || res.status === 405)) {
73
+ return { met: "unknown", detail: `the retargeted model gateway does not serve a model catalog (HTTP ${res.status}), so reachability was not measured; the credential posture is ${credential}` };
74
+ }
75
+ return { met: "no", detail: `the model gateway answered HTTP ${res.status} to a catalog read; the credential posture is ${credential}` };
76
+ }
77
+ return {
78
+ met: "yes",
79
+ detail: `the model gateway answered a catalog read and the credential posture is ${credential} — this does not prove an inference call is authorised`,
80
+ };
81
+ }
82
+ catch {
83
+ return { met: "no", detail: `the model gateway did not answer within ${GATEWAY_PROBE_TIMEOUT_MS} ms; the credential posture is ${credential}` };
84
+ }
85
+ finally {
86
+ clearTimeout(fuse);
87
+ }
88
+ }
89
+ /** Wire the probe into the deployment-status surface. Called once, from the app's boot wiring. */
90
+ export function registerGatewayRouteProbe() {
91
+ registerStatusProbe("model-route", () => probeGatewayRoute());
92
+ }
93
+ //# sourceMappingURL=gateway-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-probe.js","sourceRoot":"","sources":["../../../agent/model/gateway-probe.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-everywhere/adapters",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "Open Everywhere adapters — the reference Vercel-hosted backends: AI Gateway models and pricing, Sandbox, Blob, Neon, OpenTelemetry, AWS and Okta.",
5
5
  "keywords": [
6
6
  "agent",
@@ -105,6 +105,10 @@
105
105
  "types": "./dist/agent/model/dream-judge.d.ts",
106
106
  "default": "./dist/agent/model/dream-judge.js"
107
107
  },
108
+ "./agent/model/gateway-probe.js": {
109
+ "types": "./dist/agent/model/gateway-probe.d.ts",
110
+ "default": "./dist/agent/model/gateway-probe.js"
111
+ },
108
112
  "./agent/model/gateway-vision.js": {
109
113
  "types": "./dist/agent/model/gateway-vision.d.ts",
110
114
  "default": "./dist/agent/model/gateway-vision.js"
@@ -167,7 +171,7 @@
167
171
  "prepack": "npm run build",
168
172
  "typecheck": "tsc --noEmit -p tsconfig.json",
169
173
  "test": "npm run test:chain",
170
- "test:chain": "npm run test:instrumentation && npm run test:sandbox-lifecycle && npm run test:sandbox-guard && npm run test:sandbox-extend && npm run test:model-gateway && npm run test:dream-judge-gateway && npm run test:approval-judge-gateway && npm run test:gateway-vision && npm run test:oe-oauth && npm run test:oe-oauth-static && npm run test:agent-browser && npm run test:neon-pool-error && npm run test:aws-adapter && npm run test:aws-sso && npm run test:okta-directory",
174
+ "test:chain": "npm run test:instrumentation && npm run test:sandbox-lifecycle && npm run test:sandbox-guard && npm run test:sandbox-extend && npm run test:model-gateway && npm run test:gateway-probe && npm run test:dream-judge-gateway && npm run test:approval-judge-gateway && npm run test:gateway-vision && npm run test:oe-oauth && npm run test:oe-oauth-static && npm run test:agent-browser && npm run test:neon-pool-error && npm run test:aws-adapter && npm run test:aws-sso && npm run test:okta-directory",
171
175
  "test:aws-adapter": "tsx scripts/aws-adapter-test.ts",
172
176
  "test:okta-directory": "tsx scripts/okta-directory-test.ts",
173
177
  "test:aws-sso": "tsx scripts/aws-sso-test.ts",
@@ -180,6 +184,7 @@
180
184
  "test:sandbox-guard": "tsx scripts/sandbox-live-guard-test.ts",
181
185
  "test:sandbox-live": "tsx scripts/sandbox-live-test.ts",
182
186
  "test:sandbox-extend": "tsx scripts/sandbox-extend-test.ts",
187
+ "test:gateway-probe": "NODE_NO_WARNINGS=1 tsx scripts/gateway-probe-test.ts",
183
188
  "test:model-gateway": "tsx scripts/model-gateway-test.ts",
184
189
  "test:dream-judge-gateway": "tsx scripts/dream-judge-gateway-test.ts",
185
190
  "test:approval-judge-gateway": "tsx scripts/approval-judge-gateway-test.ts",
@@ -187,7 +192,7 @@
187
192
  },
188
193
  "dependencies": {
189
194
  "@neondatabase/serverless": "^1.1.0",
190
- "@open-everywhere/core": "0.1.3",
195
+ "@open-everywhere/core": "0.1.4",
191
196
  "@vercel/blob": "^2.6.1",
192
197
  "@vercel/otel": "^2.1.3",
193
198
  "@vercel/sandbox": "^3.2.1",