@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 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
@@ -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;0BAa3B,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC;CAgCpE,CAAC"}
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"}
@@ -44,7 +44,10 @@ export const gemini = {
44
44
  input: data.usageMetadata?.promptTokenCount ?? 0,
45
45
  output: data.usageMetadata?.candidatesTokenCount ?? 0,
46
46
  },
47
- stopReason: 'end',
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
- const stopReason = 'end';
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;
@@ -1 +1 @@
1
- {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../src/adapters/gemini.ts"],"names":[],"mappings":"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"}
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,iEAAiE;YACjE,qEAAqE;YACrE,4DAA4D;YAC5D,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,IAAI,KAAK;SACxD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,WAAW,CAAC,QAAkB;QACnC,IAAI,CAAC,QAAQ,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC7D,IAAI,QAAQ,GAAG,EAAE,CAAC;QAClB,IAAI,KAAK,GAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;QAClD,kEAAkE;QAClE,oEAAoE;QACpE,iEAAiE;QACjE,wDAAwD;QACxD,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,IAAI,KAAK,CAAC,IAAI;gBAAE,MAAM;YACtB,IAAI,IAAwB,CAAC;YAC7B,IAAI,CAAC;gBAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAuB,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAEhF,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;gBACvB,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,gBAAgB,IAAI,CAAC,CAAC;gBACvD,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,oBAAoB,IAAI,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,IAAI,SAAS,CAAC,YAAY;gBAAE,UAAU,GAAG,SAAS,CAAC,YAAY,CAAC;YAEhE,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;YACvC,IAAI,CAAC,KAAK,EAAE,MAAM;gBAAE,SAAS;YAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;oBACtB,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC;oBACtB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;IAC5D,CAAC;CACF,CAAC"}
@@ -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
  */
@@ -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;AAqFD;;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"}
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
- return { ...built, url: opts.proxyUrl };
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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/adapters/index.ts"],"names":[],"mappings":"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"}
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;;yEAEyE;AACzE,MAAM,UAAU,uBAAuB,CAAC,KAAyB;IAC/D,uEAAuE;IACvE,sEAAsE;IACtE,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAC9B,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,WAAW,CAAC;IAC3E,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC9H,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IACrE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,IAAuB;IAC7C,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAwB,CAAC;IAClF,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,KAAK,6BAA6B,CAAC,CAAC;IACzG,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,iBAAiB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7G,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mBAAmB;AACnB,EAAE;AACF,mCAAmC;AACnC,EAAE;AACF,qEAAqE;AACrE,wEAAwE;AACxE,sEAAsE;AACtE,6DAA6D;AAC7D,EAAE;AACF,0EAA0E;AAC1E,oEAAoE;AACpE,mEAAmE;AACnE,mEAAmE;AACnE,4DAA4D;AAC5D,EAAE;AACF,wEAAwE;AACxE,sEAAsE;AACtE,yEAAyE;AACzE,EAAE;AACF,qEAAqE;AACrE,mEAAmE;AACnE,4BAA4B;AAE5B,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAExD,SAAS,kBAAkB,CAAC,GAAuB;IACjD,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,YAAY,CAAC,IAAuB,EAAE,MAAe;IAC5D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7D,MAAM,IAAI,GAA4B;QACpC,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM;KACP,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI;QAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3D,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI;QAAI,IAAI,CAAC,WAAW,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC;IACjE,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI;QAAE,IAAI,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC;IACrE,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI;QAAK,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC;IAC/D,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,QAAQ;QAClB,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI;KACL,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAuB,EAAE,MAAe;IAClE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAsB,CAAC,CAAC;IAC5E,0EAA0E;IAC1E,wEAAwE;IACxE,mEAAmE;IACnE,yEAAyE;IACzE,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,4DAA4D;IAC5D,MAAM,MAAM,GAAI,IAAI,CAAC,QAAmB,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAK,IAAI,CAAC,QAAmB,CAAC;IAC3G,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,GAAG,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9E,CAAC;AAED,6BAA6B;AAE7B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CAAC,IAAc;IACvC,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAC1C,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnG,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAErD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAa,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC1B,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAuB;KACpD,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,OAAO,CAAC,IAAI,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;IACpF,CAAC;IAED,OAAO,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,EAA6B,CAAC,CAAC;AAC5E,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,UAAU,CAAC,IAAc;IAC9C,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,QAAQ;QAC1C,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjG,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,IAAI,GAAa,CAAC;IAClB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAa,EAAE;YAC/B,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAC1B,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAuB;SACpD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAY,EAAE,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAqC,CAAC;QACnF,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,IAAI,GAAG,OAAO,CAAC,IAAI,cAAc,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;QAC5G,OAAO;IACT,CAAC;IAED,KAAK,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;AAClC,CAAC;AAED,uBAAuB;AAEvB;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,WAA8B,EAAE;IAC3D,OAAO;QACL,IAAI,EAAE,CAAC,IAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAc,CAAC;QAC7E,MAAM,EAAE,CAAC,IAAuB,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAc,CAAC;KACtF,CAAC;AACJ,CAAC;AAED,oCAAoC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
@@ -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', // bare provider, end of string
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(url);
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' | 'google' | 'stub'
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}
@@ -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;AA2F/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,CA+DhJ;AAkBD;;;;;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"}
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
- // Lazy-loaded ../llm/index.js uses Vite aliases that don't resolve in Node
15
- let _createClient = null;
16
- async function getCreateClient() {
17
- if (!_createClient) {
14
+ let _adapters = null;
15
+ async function getAdaptersModule() {
16
+ if (!_adapters) {
18
17
  try {
19
- const mod = await import('./adapters/index.js');
20
- _createClient = mod.createClient;
18
+ _adapters = await import('./adapters/index.js');
21
19
  }
22
20
  catch {
23
- _createClient = null;
21
+ _adapters = null;
24
22
  }
25
23
  }
26
- return _createClient;
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/v1/messages',
50
- openai: '/api/llm/openai/v1/chat/completions',
51
- google: '/api/llm/google',
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' | 'google' | 'stub'
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
- const apiKey = opts.apiKey || getEnv(`${provider.toUpperCase()}_API_KEY`) || getEnv('ANTHROPIC_API_KEY') || getEnv('OPENAI_API_KEY') || getEnv('GOOGLE_API_KEY');
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 fall back to stub
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: model || DEFAULT_MODELS[provider] || 'claude-sonnet-4-20250514',
206
+ model: resolvedModel,
166
207
  ...(proxyUrl ? { proxyUrl } : {}),
167
208
  });
168
- return new AdiaUILLMBridge(client, model || DEFAULT_MODELS[provider] || 'claude-sonnet-4-20250514', provider);
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
- if (getEnv('GOOGLE_API_KEY'))
176
- return 'google';
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-20250514',
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
- google: 'gemini-2.0-flash',
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":"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"}
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",
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": {