@adia-ai/llm 0.8.3 → 0.8.5
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/CHANGELOG.md +22 -0
- package/adapters/gemini.d.ts.map +1 -1
- package/adapters/gemini.js +11 -2
- package/adapters/gemini.js.map +1 -1
- package/adapters/index.d.ts +4 -0
- package/adapters/index.d.ts.map +1 -1
- package/adapters/index.js +19 -2
- package/adapters/index.js.map +1 -1
- package/adapters/router.test.js +22 -6
- package/llm-bridge.d.ts +1 -1
- package/llm-bridge.d.ts.map +1 -1
- package/llm-bridge.js +67 -22
- package/llm-bridge.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
|
+
|
|
3
|
+
## [0.8.5] — 2026-07-17
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
- **Gemini production passthrough** (`server.js`, operator ruling 2026-07-17): exe.dev's LLM gateway carries anthropic/openai/fireworks only, so an explicitly selected gemini model on `ui-kit.exe.xyz` had no server path. `server.js` gains a narrow gemini-only passthrough at `/api/llm/gemini/*` — forwards verbatim to `generativelanguage.googleapis.com` with the server-side `GEMINI_API_KEY` injected (the browser's sentinel header is discarded; path allowlisted, not an open proxy; SSE relayed with the same reader pattern as `handleChat`). `deploy/Caddyfile` + `infra/caddy/llm-gateway.snippet` route `/api/llm/gemini/*` to `server.js` ordered before the gateway handle.
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- **Gemini passthrough hardening per review**: per-IP sliding-window rate limit (30 req / 5 min, unbounded-map guarded) bounds worst-case quota burn under the same no-auth public-demo trust model as the existing `/api/chat` smart proxy; 1 MB body cap returns 413 while accumulating, not after; path allowlist tightened to real Gemini API prefixes (`/v1`, `/v1beta` — `/^\/v\d/` previously accepted arbitrary versions); client disconnect now aborts the upstream call via `AbortController` hooked to `req` close before the body read, combined with the existing 120s timeout via `AbortSignal.any` (previously attached post-fetch, SSE branch only, so a vanished client kept work alive until timeout).
|
|
10
|
+
|
|
11
|
+
## [0.8.4] — 2026-07-16
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **The model id decides the provider** (`src/llm-bridge.ts`, `src/adapters/index.ts` + built `llm-bridge.js`/`adapters/`): provider resolution was env-key detection only (or hardcoded `anthropic` on production browser hosts), so every non-default model was POSTed to the wrong provider's API and 404'd — only Claude models could generate in a browser. Precedence is now `opts.provider` → the model id (new export `detectProviderFromModel` in `adapters/index`) → `LLM_PROVIDER` env → env-key detection.
|
|
15
|
+
- **Passthrough proxying preserves the upstream URL path + query**: `passthroughRequest` overwrote the whole URL with the static `proxyUrl`, dropping gemini's `models/<model>:<action>?alt=sse` routing — every gemini passthrough call hit the proxy root. The proxy prefix now joins `buildRequest()`'s own path/query; legacy full-path proxyUrls (`/api/llm/anthropic/v1/messages`) reduce to the identical final URL. `resolveBaseUrl` entries are provider prefixes (`gemini: /api/llm/gemini`; Vite gains the route, `google` kept as a legacy alias).
|
|
16
|
+
- **`google` → `gemini` provider aliasing** (gh#268 L-1): `provider: 'google'` and `GOOGLE_API_KEY` auto-detection produced an always-throwing bridge (`Unknown provider "google"`); both canonicalize to the registry key `gemini` now. `GEMINI_API_KEY` is canonical.
|
|
17
|
+
- **Gemini `stopReason` raw pass-through** (gh#268 L-2, invariant 1): `parseResponse`/`parseStream` forwarded a hardcoded `'end'`, hiding truncation from the downstream detector; `finishReason` (`MAX_TOKENS` / `SAFETY` / …) passes through raw, `'end'` only when absent.
|
|
18
|
+
- **Per-provider API-key isolation**: the env-key fallback chain (`ANTHROPIC || OPENAI || GEMINI || GOOGLE`) could send one provider's credential to another's API when the selected provider had no key. Keys resolve from the selected provider's own env var(s) only.
|
|
19
|
+
- **Production-browser proxy fallback honors the selected provider**: a keyless explicit provider on a production host routed to the stub (and the hardcoded-anthropic path); it now routes through the same-origin proxy for that provider.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
- **`DEFAULT_MODELS` de-staled**: `anthropic: claude-sonnet-4-6` (was the retired `-20250514` id), `gemini: gemini-2.5-flash` (was 2.0), keyed by registry name.
|
|
23
|
+
|
|
2
24
|
## [0.8.3] — 2026-07-16
|
|
3
25
|
|
|
4
26
|
### Maintenance
|
package/adapters/gemini.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOnH,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,UAAU;IAAG,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACtC,UAAU,aAAa;IAAG,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE;AAChD,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAID,eAAO,MAAM,MAAM;;uBAGE,gBAAgB,GAAG,cAAc;wBA+BhC,kBAAkB,GAAG,eAAe;
|
|
1
|
+
{"version":3,"file":"gemini.d.ts","sourceRoot":"","sources":["../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAgB,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAOnH,UAAU,mBAAmB;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,UAAU,UAAU;IAAG,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AACtC,UAAU,aAAa;IAAG,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;CAAE;AAChD,UAAU,eAAe;IACvB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,UAAU,kBAAkB;IAC1B,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAID,eAAO,MAAM,MAAM;;uBAGE,gBAAgB,GAAG,cAAc;wBA+BhC,kBAAkB,GAAG,eAAe;0BAgB3B,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC;CAsCpE,CAAC"}
|
package/adapters/gemini.js
CHANGED
|
@@ -44,7 +44,10 @@ export const gemini = {
|
|
|
44
44
|
input: data.usageMetadata?.promptTokenCount ?? 0,
|
|
45
45
|
output: data.usageMetadata?.candidatesTokenCount ?? 0,
|
|
46
46
|
},
|
|
47
|
-
|
|
47
|
+
// Raw pass-through (invariant 1 — never normalize): Gemini emits
|
|
48
|
+
// STOP / MAX_TOKENS / SAFETY / …; the downstream truncation detector
|
|
49
|
+
// reads the raw value. 'end' only when the field is absent.
|
|
50
|
+
stopReason: data.candidates?.[0]?.finishReason ?? 'end',
|
|
48
51
|
};
|
|
49
52
|
},
|
|
50
53
|
async *parseStream(response) {
|
|
@@ -52,7 +55,11 @@ export const gemini = {
|
|
|
52
55
|
throw new Error('Response body is null');
|
|
53
56
|
let snapshot = '';
|
|
54
57
|
let usage = { input: 0, output: 0 };
|
|
55
|
-
|
|
58
|
+
// Raw pass-through (invariant 1): the final SSE candidate carries
|
|
59
|
+
// finishReason (STOP / MAX_TOKENS / SAFETY / …) — often on an event
|
|
60
|
+
// with no content parts, so it MUST be captured before the parts
|
|
61
|
+
// guard below. 'end' only if no event ever carried one.
|
|
62
|
+
let stopReason = 'end';
|
|
56
63
|
for await (const event of readSSE(response.body)) {
|
|
57
64
|
if (event.done)
|
|
58
65
|
break;
|
|
@@ -70,6 +77,8 @@ export const gemini = {
|
|
|
70
77
|
const candidate = data.candidates?.[0];
|
|
71
78
|
if (!candidate)
|
|
72
79
|
continue;
|
|
80
|
+
if (candidate.finishReason)
|
|
81
|
+
stopReason = candidate.finishReason;
|
|
73
82
|
const parts = candidate.content?.parts;
|
|
74
83
|
if (!parts?.length)
|
|
75
84
|
continue;
|
package/adapters/gemini.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../src/adapters/gemini.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGnC,MAAM,OAAO,GAAG,yDAAyD,CAAC;AAC1E,MAAM,kBAAkB,GAAG,KAAK,CAAC;AAqBjC,8EAA8E;AAE9E,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,IAAI,EAAE,QAAiB;IAEvB,YAAY,CAAC,IAAsB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,EAAE,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;YACjD,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;SAC/B,CAAC,CAAC,CAAC;QAEJ,MAAM,IAAI,GAA4B,EAAE,QAAQ,EAAE,CAAC;QAEnD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QACjE,CAAC;QAED,MAAM,gBAAgB,GAA4B;YAChD,eAAe,EAAE,IAAI,CAAC,SAAS,IAAI,kBAAkB;SACtD,CAAC;QACF,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;YAAE,gBAAgB,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;QACjF,IAAI,CAAC,kBAAkB,CAAC,GAAG,gBAAgB,CAAC;QAE5C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,+BAA+B,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAEjF,OAAO;YACL,GAAG,EAAE,GAAG,OAAO,IAAI,KAAK,IAAI,MAAM,EAAE;YACpC,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,gBAAgB,EAAE,IAAI,CAAC,MAAM;aAC9B;YACD,IAAI;SACL,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,IAAwB;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO;YACL,IAAI;YACJ,KAAK,EAAE;gBACL,KAAK,EAAE,IAAI,CAAC,aAAa,EAAE,gBAAgB,IAAI,CAAC;gBAChD,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,oBAAoB,IAAI,CAAC;aACtD;YACD,UAAU,EAAE,KAAK;
|
|
1
|
+
{"version":3,"file":"gemini.js","sourceRoot":"","sources":["../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
|
package/adapters/index.d.ts
CHANGED
|
@@ -71,6 +71,10 @@ export interface LLMClient {
|
|
|
71
71
|
chat(opts: Partial<ChatOpts>): Promise<ChatResult>;
|
|
72
72
|
stream(opts: Partial<ChatOpts>): AsyncGenerator<StreamChunk>;
|
|
73
73
|
}
|
|
74
|
+
/** Detect provider from model name. Exported so createAdapter() (llm-bridge)
|
|
75
|
+
* can honor a model-picker selection without duplicating this mapping —
|
|
76
|
+
* an env-detected provider must never override an explicit model id. */
|
|
77
|
+
export declare function detectProviderFromModel(model: string | undefined): 'anthropic' | 'openai' | 'gemini' | null;
|
|
74
78
|
/**
|
|
75
79
|
* Non-streaming chat completion.
|
|
76
80
|
*/
|
package/adapters/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEnG,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAI7E,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;CAC9D;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEnG,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,CAAC;AAI7E,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAC;IAC1F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;CAC9D;AAOD;;yEAEyE;AACzE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAI3G;AAyFD;;GAEG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,CAAC,CAmB9D;AAED;;GAEG;AACH,wBAAuB,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA0B7E;AAID;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,QAAQ,GAAE,OAAO,CAAC,QAAQ,CAAM,GAAG,SAAS,CAKxE;AAGD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
package/adapters/index.js
CHANGED
|
@@ -38,7 +38,14 @@ import { openai } from './openai.js';
|
|
|
38
38
|
import { gemini } from './gemini.js';
|
|
39
39
|
// ── Provider registry ──
|
|
40
40
|
const providers = { anthropic, openai, gemini };
|
|
41
|
-
/** Detect provider from model name.
|
|
41
|
+
/** Detect provider from model name. Exported so createAdapter() (llm-bridge)
|
|
42
|
+
* can honor a model-picker selection without duplicating this mapping —
|
|
43
|
+
* an env-detected provider must never override an explicit model id. */
|
|
44
|
+
export function detectProviderFromModel(model) {
|
|
45
|
+
// Literal union (not ProviderName) so the declaration doesn't pull the
|
|
46
|
+
// non-exported adapter response types into the public .d.ts (TS4023).
|
|
47
|
+
return detectProvider(model);
|
|
48
|
+
}
|
|
42
49
|
function detectProvider(model) {
|
|
43
50
|
if (!model)
|
|
44
51
|
return null;
|
|
@@ -115,7 +122,17 @@ function proxyRequest(opts, stream) {
|
|
|
115
122
|
function passthroughRequest(opts, stream) {
|
|
116
123
|
const adapter = resolveAdapter(opts);
|
|
117
124
|
const built = adapter.buildRequest({ ...opts, stream });
|
|
118
|
-
|
|
125
|
+
// Swap ONLY the upstream origin: keep the proxy prefix up to the provider
|
|
126
|
+
// segment and append buildRequest()'s own path + query. Overwriting the
|
|
127
|
+
// whole URL with proxyUrl (the previous behavior) silently dropped
|
|
128
|
+
// URL-encoded routing — gemini carries `models/<model>:<action>?alt=sse`
|
|
129
|
+
// in the path, so every gemini passthrough call POSTed to the proxy root.
|
|
130
|
+
// Anthropic/OpenAI are unchanged: a proxyUrl that already includes the
|
|
131
|
+
// API path (e.g. `/api/llm/anthropic/v1/messages`) reduces to the same
|
|
132
|
+
// final URL, since the appended upstream path is identical.
|
|
133
|
+
const prefix = opts.proxyUrl.match(/^.*?\/api\/llm\/[a-z]+/)?.[0] ?? opts.proxyUrl;
|
|
134
|
+
const upstream = new URL(built.url);
|
|
135
|
+
return { ...built, url: `${prefix}${upstream.pathname}${upstream.search}` };
|
|
119
136
|
}
|
|
120
137
|
// ── Standalone functions ──
|
|
121
138
|
/**
|
package/adapters/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAkCrC,0BAA0B;AAE1B,MAAM,SAAS,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAW,CAAC;AAGzD,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/adapters/index.ts"],"names":[],"mappings":"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"}
|
package/adapters/router.test.js
CHANGED
|
@@ -141,13 +141,18 @@ describe('isPassthroughProxy URL routing', () => {
|
|
|
141
141
|
expect(lastFetch.body).toHaveProperty('provider');
|
|
142
142
|
});
|
|
143
143
|
|
|
144
|
+
// Passthrough swaps ONLY the upstream origin (v0.8.4): the proxy prefix
|
|
145
|
+
// (up to the provider segment) joins buildRequest()'s own path + query —
|
|
146
|
+
// a static full-URL swap dropped gemini's `models/<model>:<action>` path.
|
|
147
|
+
// These anthropic-bodied requests therefore always land on the prefix +
|
|
148
|
+
// anthropic's /v1/messages, whatever trailing path the proxyUrl carried.
|
|
144
149
|
const passthroughShapes = [
|
|
145
|
-
'/api/llm/anthropic/v1/messages',
|
|
146
|
-
'/api/llm/openai/v1/chat/completions',
|
|
147
|
-
'/api/llm/gemini/foo',
|
|
148
|
-
'/api/llm/anthropic',
|
|
150
|
+
['/api/llm/anthropic/v1/messages', '/api/llm/anthropic/v1/messages'],
|
|
151
|
+
['/api/llm/openai/v1/chat/completions', '/api/llm/openai/v1/messages'],
|
|
152
|
+
['/api/llm/gemini/foo', '/api/llm/gemini/v1/messages'],
|
|
153
|
+
['/api/llm/anthropic', '/api/llm/anthropic/v1/messages'], // bare provider prefix works now
|
|
149
154
|
];
|
|
150
|
-
for (const url of passthroughShapes) {
|
|
155
|
+
for (const [url, expected] of passthroughShapes) {
|
|
151
156
|
it(`recognizes ${url} as passthrough`, async () => {
|
|
152
157
|
await chat({
|
|
153
158
|
apiKey: 'k',
|
|
@@ -155,11 +160,22 @@ describe('isPassthroughProxy URL routing', () => {
|
|
|
155
160
|
messages: [{ role: 'user', content: 'hi' }],
|
|
156
161
|
proxyUrl: url,
|
|
157
162
|
});
|
|
158
|
-
expect(lastFetch.url).toBe(
|
|
163
|
+
expect(lastFetch.url).toBe(expected);
|
|
159
164
|
// Passthrough body: anthropic-shaped (no `provider` key)
|
|
160
165
|
expect(lastFetch.body).not.toHaveProperty('provider');
|
|
161
166
|
});
|
|
162
167
|
}
|
|
168
|
+
|
|
169
|
+
it('passthrough keeps the upstream path + query (the gemini model:action fix)', async () => {
|
|
170
|
+
await chat({
|
|
171
|
+
apiKey: 'k',
|
|
172
|
+
model: 'gemini-2.5-flash',
|
|
173
|
+
messages: [{ role: 'user', content: 'hi' }],
|
|
174
|
+
proxyUrl: '/api/llm/gemini',
|
|
175
|
+
});
|
|
176
|
+
expect(lastFetch.url).toBe('/api/llm/gemini/v1beta/models/gemini-2.5-flash:generateContent');
|
|
177
|
+
expect(lastFetch.body).not.toHaveProperty('provider');
|
|
178
|
+
});
|
|
163
179
|
});
|
|
164
180
|
|
|
165
181
|
describe('proxyRequest body shape', () => {
|
package/llm-bridge.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ import type { LLMClient } from './adapters/index.js';
|
|
|
19
19
|
* and .stream() that match the AdiaUI interface (simple messages + systemPrompt).
|
|
20
20
|
*
|
|
21
21
|
* @param opts
|
|
22
|
-
* @param opts.provider — 'anthropic' | 'openai' | '
|
|
22
|
+
* @param opts.provider — 'anthropic' | 'openai' | 'gemini' | 'stub' ('google' accepted as a legacy alias for 'gemini')
|
|
23
23
|
* @param opts.apiKey — explicit API key (overrides env)
|
|
24
24
|
* @param opts.model — model override
|
|
25
25
|
* @returns {StubLLMAdapter | AdiaUILLMBridge}
|
package/llm-bridge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-bridge.d.ts","sourceRoot":"","sources":["src/llm-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"llm-bridge.d.ts","sourceRoot":"","sources":["src/llm-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAY,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAiG/D;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,GAAG,eAAe,CAAC,CAmGhJ;AAsBD;;;;;GAKG;AACH,cAAM,eAAe;;gBAKP,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAM9D;;;;;;;;;;;OAWG;IACG,QAAQ,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;IAsBvR;;;;;;;OAOG;IACI,MAAM,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE;QAAE,QAAQ,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,cAAc,CACpI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GACjC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,mBAAmB,EAAE,MAAM,CAAC;YAAC,eAAe,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CACnJ;IA8BD,qDAAqD;IACrD,IAAI,OAAO,cAA2B;IAEtC,0CAA0C;IAC1C,IAAI,QAAQ,WAA6B;CAC1C"}
|
package/llm-bridge.js
CHANGED
|
@@ -11,19 +11,20 @@
|
|
|
11
11
|
* matching the AdiaUI pipeline interface.
|
|
12
12
|
*/
|
|
13
13
|
import { StubLLMAdapter } from './llm-stub.js';
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
if (!_createClient) {
|
|
14
|
+
let _adapters = null;
|
|
15
|
+
async function getAdaptersModule() {
|
|
16
|
+
if (!_adapters) {
|
|
18
17
|
try {
|
|
19
|
-
|
|
20
|
-
_createClient = mod.createClient;
|
|
18
|
+
_adapters = await import('./adapters/index.js');
|
|
21
19
|
}
|
|
22
20
|
catch {
|
|
23
|
-
|
|
21
|
+
_adapters = null;
|
|
24
22
|
}
|
|
25
23
|
}
|
|
26
|
-
return
|
|
24
|
+
return _adapters;
|
|
25
|
+
}
|
|
26
|
+
async function getCreateClient() {
|
|
27
|
+
return (await getAdaptersModule())?.createClient ?? null;
|
|
27
28
|
}
|
|
28
29
|
// ── Environment ──────────────────────────────────────────────────────────
|
|
29
30
|
function getEnv(key) {
|
|
@@ -45,10 +46,13 @@ const IS_BROWSER = typeof window !== 'undefined';
|
|
|
45
46
|
function resolveBaseUrl(provider) {
|
|
46
47
|
if (!IS_BROWSER)
|
|
47
48
|
return undefined; // Let the module use its defaults
|
|
49
|
+
// Provider PREFIXES — passthroughRequest (adapters/index.ts) appends the
|
|
50
|
+
// upstream path + query from buildRequest(), so the API path never lives
|
|
51
|
+
// here (it used to, which is why gemini's model:action path got dropped).
|
|
48
52
|
const proxyMap = {
|
|
49
|
-
anthropic: '/api/llm/anthropic
|
|
50
|
-
openai: '/api/llm/openai
|
|
51
|
-
|
|
53
|
+
anthropic: '/api/llm/anthropic',
|
|
54
|
+
openai: '/api/llm/openai',
|
|
55
|
+
gemini: '/api/llm/gemini',
|
|
52
56
|
};
|
|
53
57
|
return proxyMap[provider];
|
|
54
58
|
}
|
|
@@ -110,14 +114,30 @@ async function createBrowserProxyBridge(provider, modelOpt) {
|
|
|
110
114
|
* and .stream() that match the AdiaUI interface (simple messages + systemPrompt).
|
|
111
115
|
*
|
|
112
116
|
* @param opts
|
|
113
|
-
* @param opts.provider — 'anthropic' | 'openai' | '
|
|
117
|
+
* @param opts.provider — 'anthropic' | 'openai' | 'gemini' | 'stub' ('google' accepted as a legacy alias for 'gemini')
|
|
114
118
|
* @param opts.apiKey — explicit API key (overrides env)
|
|
115
119
|
* @param opts.model — model override
|
|
116
120
|
* @returns {StubLLMAdapter | AdiaUILLMBridge}
|
|
117
121
|
*/
|
|
118
122
|
export async function createAdapter(opts = {}) {
|
|
119
|
-
const provider = opts.provider || getEnv('LLM_PROVIDER') || detectProvider();
|
|
120
123
|
const model = opts.model || getEnv('LLM_MODEL') || undefined;
|
|
124
|
+
// Provider precedence: explicit option → the MODEL id → env override →
|
|
125
|
+
// env-key detection. A model-picker selection ("gemini-2.5-flash",
|
|
126
|
+
// "gpt-4o-mini") must decide the provider — resolving from env alone
|
|
127
|
+
// routed every non-default model to the env-detected provider's API,
|
|
128
|
+
// which 404s on a foreign model id (live bug 2026-07-16: only Claude
|
|
129
|
+
// models could ever generate in a browser).
|
|
130
|
+
const adapters = await getAdaptersModule();
|
|
131
|
+
let provider = opts.provider
|
|
132
|
+
|| (model ? adapters?.detectProviderFromModel(model) ?? '' : '')
|
|
133
|
+
|| getEnv('LLM_PROVIDER')
|
|
134
|
+
|| detectProvider();
|
|
135
|
+
// The adapters registry's key is 'gemini' (adapters/index.ts) — 'google'
|
|
136
|
+
// is accepted as a legacy alias but must never reach chat()/streamChat(),
|
|
137
|
+
// where it throws `Unknown provider "google"` (live bug fixed 2026-07-16,
|
|
138
|
+
// gh#268 L-1). Canonicalize before ANY keyed lookup below.
|
|
139
|
+
if (provider === 'google')
|
|
140
|
+
provider = 'gemini';
|
|
121
141
|
if (provider === 'stub') {
|
|
122
142
|
// §181 (v0.5.5) — browser on a production host: even though
|
|
123
143
|
// detectProvider() returned 'stub' (no env vars in the browser),
|
|
@@ -132,8 +152,18 @@ export async function createAdapter(opts = {}) {
|
|
|
132
152
|
}
|
|
133
153
|
return new StubLLMAdapter();
|
|
134
154
|
}
|
|
135
|
-
// Resolve API key for the detected provider
|
|
136
|
-
|
|
155
|
+
// Resolve API key for the detected provider — ONLY that provider's own
|
|
156
|
+
// env var(s). Cross-provider fallback (the old ANTHROPIC||OPENAI||GOOGLE
|
|
157
|
+
// chain) sent one provider's credential to another's API when the
|
|
158
|
+
// selected provider had no key — a leak, not a convenience (PR #274
|
|
159
|
+
// review). Gemini accepts GOOGLE_API_KEY as its legacy alias.
|
|
160
|
+
const KEY_ENVS = {
|
|
161
|
+
anthropic: ['ANTHROPIC_API_KEY'],
|
|
162
|
+
openai: ['OPENAI_API_KEY'],
|
|
163
|
+
gemini: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'],
|
|
164
|
+
};
|
|
165
|
+
const apiKey = opts.apiKey
|
|
166
|
+
|| (KEY_ENVS[provider] ?? [`${provider.toUpperCase()}_API_KEY`]).map(getEnv).find(Boolean);
|
|
137
167
|
// Browser-only safety reminder: when running through the dev-server's
|
|
138
168
|
// passthrough proxy, the API key is sent verbatim in `x-api-key` /
|
|
139
169
|
// `Authorization` headers from the browser. Anyone with DevTools open
|
|
@@ -148,8 +178,16 @@ export async function createAdapter(opts = {}) {
|
|
|
148
178
|
`Anyone with DevTools access on this dev server can read it. Local-dev only — never deploy this shape. ` +
|
|
149
179
|
`Rotate at the provider console if this transcript leaves your machine.`, 'color: #a78bfa; font-weight: bold;', 'color: #f59e0b; font-weight: bold;', 'color: inherit;');
|
|
150
180
|
}
|
|
151
|
-
// No key found
|
|
181
|
+
// No key found: on a production browser host the same-origin smart proxy
|
|
182
|
+
// holds the key server-side — route through it for the SELECTED provider
|
|
183
|
+
// (previously only the stub-detection branch got this path, hardcoded to
|
|
184
|
+
// anthropic, so an explicit provider:'gemini' in a deployed browser fell
|
|
185
|
+
// to the stub and the /api/llm/gemini route was unreachable — PR #274
|
|
186
|
+
// review). Anywhere else (Node, local dev) keyless still means stub.
|
|
152
187
|
if (!apiKey) {
|
|
188
|
+
if (IS_BROWSER && isProductionHost() && provider in KEY_ENVS) {
|
|
189
|
+
return createBrowserProxyBridge(provider, model);
|
|
190
|
+
}
|
|
153
191
|
console.warn('LLM Bridge: No API keys found. Using stub adapter.');
|
|
154
192
|
return new StubLLMAdapter();
|
|
155
193
|
}
|
|
@@ -159,29 +197,36 @@ export async function createAdapter(opts = {}) {
|
|
|
159
197
|
return new StubLLMAdapter();
|
|
160
198
|
}
|
|
161
199
|
const proxyUrl = resolveBaseUrl(provider);
|
|
200
|
+
// Literal terminal keeps the type `string` under noUncheckedIndexedAccess;
|
|
201
|
+
// the value mirrors DEFAULT_MODELS['anthropic'].
|
|
202
|
+
const resolvedModel = model || DEFAULT_MODELS[provider] || 'claude-sonnet-4-6';
|
|
162
203
|
const client = createClient({
|
|
163
204
|
provider,
|
|
164
205
|
apiKey,
|
|
165
|
-
model:
|
|
206
|
+
model: resolvedModel,
|
|
166
207
|
...(proxyUrl ? { proxyUrl } : {}),
|
|
167
208
|
});
|
|
168
|
-
return new AdiaUILLMBridge(client,
|
|
209
|
+
return new AdiaUILLMBridge(client, resolvedModel, provider);
|
|
169
210
|
}
|
|
170
211
|
function detectProvider() {
|
|
171
212
|
if (getEnv('ANTHROPIC_API_KEY'))
|
|
172
213
|
return 'anthropic';
|
|
173
214
|
if (getEnv('OPENAI_API_KEY'))
|
|
174
215
|
return 'openai';
|
|
175
|
-
|
|
176
|
-
|
|
216
|
+
// GEMINI_API_KEY is canonical (the reference server reads it, server.js);
|
|
217
|
+
// GOOGLE_API_KEY kept as a legacy alias. Both resolve to the registry
|
|
218
|
+
// key 'gemini' — returning 'google' here made auto-detection yield an
|
|
219
|
+
// always-throwing bridge (gh#268 L-1).
|
|
220
|
+
if (getEnv('GEMINI_API_KEY') || getEnv('GOOGLE_API_KEY'))
|
|
221
|
+
return 'gemini';
|
|
177
222
|
return 'stub';
|
|
178
223
|
}
|
|
179
224
|
// ── Bridge class ─────────────────────────────────────────────────────────
|
|
180
225
|
/** Default models per provider */
|
|
181
226
|
const DEFAULT_MODELS = {
|
|
182
|
-
anthropic: 'claude-sonnet-4-
|
|
227
|
+
anthropic: 'claude-sonnet-4-6', // current sonnet per models.ts — the retired -20250514 id was a stale literal
|
|
183
228
|
openai: 'gpt-4o',
|
|
184
|
-
|
|
229
|
+
gemini: 'gemini-2.5-flash', // matches the reference server's default (server.js)
|
|
185
230
|
};
|
|
186
231
|
/**
|
|
187
232
|
* Wraps the AdiaUI llm client to match the AdiaUI pipeline's simpler interface.
|
package/llm-bridge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"llm-bridge.js","sourceRoot":"","sources":["src/llm-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"llm-bridge.js","sourceRoot":"","sources":["src/llm-bridge.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adia-ai/llm",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.5",
|
|
4
4
|
"description": "Provider-agnostic LLM client \u2014 anthropic / openai / gemini adapters with a unified chat() + streamChat() facade. Used by AdiaUI's chat-shell and the A2UI generation pipeline; works in browser (with proxyUrl) and Node.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|