@inbrowser/model 0.1.1 → 0.2.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.
Files changed (82) hide show
  1. package/AGENTS.md +44 -18
  2. package/README.md +128 -20
  3. package/dist/contract.d.ts +104 -0
  4. package/dist/contract.d.ts.map +1 -0
  5. package/dist/contract.js +13 -0
  6. package/dist/contract.js.map +1 -0
  7. package/dist/engine-client.d.ts +44 -0
  8. package/dist/engine-client.d.ts.map +1 -0
  9. package/dist/engine-client.js +136 -0
  10. package/dist/engine-client.js.map +1 -0
  11. package/dist/engine.d.ts.map +1 -1
  12. package/dist/engine.js +20 -10
  13. package/dist/engine.js.map +1 -1
  14. package/dist/index.d.ts +23 -8
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +44 -8
  17. package/dist/index.js.map +1 -1
  18. package/dist/presets.d.ts +10 -0
  19. package/dist/presets.d.ts.map +1 -1
  20. package/dist/presets.js +21 -0
  21. package/dist/presets.js.map +1 -1
  22. package/dist/providers/anthropic.d.ts +45 -0
  23. package/dist/providers/anthropic.d.ts.map +1 -0
  24. package/dist/providers/anthropic.js +217 -0
  25. package/dist/providers/anthropic.js.map +1 -0
  26. package/dist/providers/claude-cli.d.ts +135 -0
  27. package/dist/providers/claude-cli.d.ts.map +1 -0
  28. package/dist/providers/claude-cli.js +270 -0
  29. package/dist/providers/claude-cli.js.map +1 -0
  30. package/dist/providers/claude-code.d.ts +188 -0
  31. package/dist/providers/claude-code.d.ts.map +1 -0
  32. package/dist/providers/claude-code.js +182 -0
  33. package/dist/providers/claude-code.js.map +1 -0
  34. package/dist/providers/gemini.d.ts +32 -0
  35. package/dist/providers/gemini.d.ts.map +1 -0
  36. package/dist/providers/gemini.js +441 -0
  37. package/dist/providers/gemini.js.map +1 -0
  38. package/dist/providers/llama-server.d.ts +15 -0
  39. package/dist/providers/llama-server.d.ts.map +1 -0
  40. package/dist/providers/llama-server.js +51 -0
  41. package/dist/providers/llama-server.js.map +1 -0
  42. package/dist/providers/oai-compat.d.ts +100 -0
  43. package/dist/providers/oai-compat.d.ts.map +1 -0
  44. package/dist/providers/oai-compat.js +206 -0
  45. package/dist/providers/oai-compat.js.map +1 -0
  46. package/dist/providers/ollama.d.ts +15 -0
  47. package/dist/providers/ollama.d.ts.map +1 -0
  48. package/dist/providers/ollama.js +51 -0
  49. package/dist/providers/ollama.js.map +1 -0
  50. package/dist/providers/openrouter-oauth.d.ts +67 -0
  51. package/dist/providers/openrouter-oauth.d.ts.map +1 -0
  52. package/dist/providers/openrouter-oauth.js +84 -0
  53. package/dist/providers/openrouter-oauth.js.map +1 -0
  54. package/dist/providers/openrouter.d.ts +13 -0
  55. package/dist/providers/openrouter.d.ts.map +1 -0
  56. package/dist/providers/openrouter.js +218 -0
  57. package/dist/providers/openrouter.js.map +1 -0
  58. package/dist/providers/types.d.ts +50 -0
  59. package/dist/providers/types.d.ts.map +1 -0
  60. package/dist/providers/types.js +2 -0
  61. package/dist/providers/types.js.map +1 -0
  62. package/dist/sse.d.ts +20 -0
  63. package/dist/sse.d.ts.map +1 -0
  64. package/dist/sse.js +47 -0
  65. package/dist/sse.js.map +1 -0
  66. package/dist/types.d.ts +2 -13
  67. package/dist/types.d.ts.map +1 -1
  68. package/dist/with-retry.d.ts +27 -0
  69. package/dist/with-retry.d.ts.map +1 -0
  70. package/dist/with-retry.js +55 -0
  71. package/dist/with-retry.js.map +1 -0
  72. package/dist/worker.d.ts +1 -1
  73. package/dist/worker.js +1 -1
  74. package/package.json +9 -29
  75. package/dist/adapters/agent.d.ts +0 -19
  76. package/dist/adapters/agent.d.ts.map +0 -1
  77. package/dist/adapters/agent.js +0 -96
  78. package/dist/adapters/agent.js.map +0 -1
  79. package/dist/adapters/relay.d.ts +0 -17
  80. package/dist/adapters/relay.d.ts.map +0 -1
  81. package/dist/adapters/relay.js +0 -90
  82. package/dist/adapters/relay.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gemini.js","sourceRoot":"","sources":["../../src/providers/gemini.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ModelClient } from '../contract.js';
2
+ import type { CloudProviderConfig } from './types.js';
3
+ /** Construction config for the llama-server provider. `baseUrl` sets the
4
+ * server URL; `apiKey` is the optional `--api-key` Bearer token (or, on
5
+ * the relay path, carries the base URL when it's an http(s) URL). */
6
+ export interface LlamaServerConfig extends CloudProviderConfig {
7
+ }
8
+ export { toOaiTools } from './oai-compat.js';
9
+ /**
10
+ * Build a `llama-server` `ModelClient`. Construction values (baseUrl,
11
+ * apiKey, model) come in the config; per-call values (messages, tools,
12
+ * sampling) come in the `ModelRequest`.
13
+ */
14
+ export declare function llamaServerModelClient(config: LlamaServerConfig): ModelClient;
15
+ //# sourceMappingURL=llama-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llama-server.d.ts","sourceRoot":"","sources":["../../src/providers/llama-server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA2BtD;;sEAEsE;AACtE,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;CAAG;AAIjE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,iBAAiB,GAAG,WAAW,CAiB7E"}
@@ -0,0 +1,51 @@
1
+ import { makeOaiClient, resolveBaseUrl } from './oai-compat.js';
2
+ /**
3
+ * llama.cpp `llama-server` provider — a preset over the shared
4
+ * OpenAI-compatible core (`./oai-compat`). Talks to a locally-running
5
+ * `llama-server`'s OAI endpoint (`${baseUrl}/v1/chat/completions`).
6
+ * Default baseUrl is `http://localhost:8080` (llama-server's default
7
+ * port).
8
+ *
9
+ * llama-server differs from Ollama in two operator-facing ways:
10
+ * - **Auth is optional.** Started with `--api-key KEY`, the server
11
+ * expects `Authorization: Bearer KEY`; without it, no auth header is
12
+ * needed.
13
+ * - **Tool calling requires `--jinja`.** The server only honors the
14
+ * OpenAI `tools` array when launched with `--jinja` (so it applies a
15
+ * tool-aware chat template). Without it, tool_calls never stream back.
16
+ *
17
+ * Auth/URL resolution mirrors Ollama because the relay only hands a
18
+ * provider an `apiKey` slot (no separate baseUrl):
19
+ * - If `apiKey` looks like an http(s) URL, it's treated as the base URL
20
+ * (the relay BYOK `kind: 'baseUrl'` path) and no auth header is sent.
21
+ * - Otherwise `apiKey` is sent as a Bearer token.
22
+ * - Direct library callers can pass `baseUrl` and `apiKey` (the key)
23
+ * separately for an authenticated server.
24
+ */
25
+ const DEFAULT_BASE_URL = 'http://localhost:8080';
26
+ // Re-exported for parity with the other OAI providers (and so tool-wire
27
+ // tests can assert against it).
28
+ export { toOaiTools } from './oai-compat.js';
29
+ /**
30
+ * Build a `llama-server` `ModelClient`. Construction values (baseUrl,
31
+ * apiKey, model) come in the config; per-call values (messages, tools,
32
+ * sampling) come in the `ModelRequest`.
33
+ */
34
+ export function llamaServerModelClient(config) {
35
+ const apiKeyIsUrl = config.apiKey ? /^https?:\/\//.test(config.apiKey) : false;
36
+ const base = resolveBaseUrl(config.baseUrl ?? config.apiKey, DEFAULT_BASE_URL);
37
+ // A non-URL apiKey is the `--api-key` Bearer token; a URL apiKey was
38
+ // just the relay routing the base URL through its only config slot.
39
+ const key = apiKeyIsUrl ? undefined : config.apiKey;
40
+ return makeOaiClient({
41
+ id: `llama:${config.model}`,
42
+ endpoint: `${base}/v1/chat/completions`,
43
+ model: config.model,
44
+ headers: key ? { Authorization: `Bearer ${key}` } : {},
45
+ errorLabel: 'llama-server',
46
+ idPrefix: 'llama',
47
+ temperatureDefault: config.temperature,
48
+ connectHint: (b) => `Confirm llama-server is running at ${b} (start it with --jinja to enable tool calling).`,
49
+ });
50
+ }
51
+ //# sourceMappingURL=llama-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llama-server.js","sourceRoot":"","sources":["../../src/providers/llama-server.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAOjD,wEAAwE;AACxE,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAyB;IAC9D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/E,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/E,qEAAqE;IACrE,oEAAoE;IACpE,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACpD,OAAO,aAAa,CAAC;QACnB,EAAE,EAAE,SAAS,MAAM,CAAC,KAAK,EAAE;QAC3B,QAAQ,EAAE,GAAG,IAAI,sBAAsB;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE;QACtD,UAAU,EAAE,cAAc;QAC1B,QAAQ,EAAE,OAAO;QACjB,kBAAkB,EAAE,MAAM,CAAC,WAAW;QACtC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,sCAAsC,CAAC,kDAAkD;KAC5F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,100 @@
1
+ import type { ModelClient, ModelMessage, ToolSpec } from '../contract.js';
2
+ import type { CloudProviderConfig } from './types.js';
3
+ /**
4
+ * Shared OpenAI-compatible chat-completions core.
5
+ *
6
+ * Every server that speaks the OpenAI `POST /v1/chat/completions` wire
7
+ * shape — Ollama, llama.cpp's `llama-server`, vLLM, LM Studio, LocalAI,
8
+ * TGI, … — streams the same SSE deltas and reports the same `usage`
9
+ * fields. This module holds that one implementation:
10
+ *
11
+ * - `toOaiMessages` / `toOaiTools` — translate the unified contract's
12
+ * messages + nested `ToolSpec` into the OAI wire shape.
13
+ * - `makeOaiClient` — the streaming engine: builds the request body,
14
+ * fetches, parses SSE, accumulates tool-calls by index, and emits
15
+ * `text` / `tool_call` / `usage` / `error` events. It takes
16
+ * fully-resolved params so each server is just a set of defaults.
17
+ * - `openaiCompatModelClient` — the public, generic factory. Point it
18
+ * at any OAI-compatible server via `baseUrl` (or a full `endpoint`).
19
+ *
20
+ * The named presets (`ollamaModelClient`, `llamaServerModelClient`) are
21
+ * thin wrappers that resolve their own port / auth / labels and delegate
22
+ * to `makeOaiClient`. They call the engine directly rather than routing
23
+ * through `openaiCompatModelClient` because their auth rules differ
24
+ * (Ollama carries a base URL in the `apiKey` slot and sends no auth
25
+ * header; the generic factory treats `apiKey` as a Bearer token).
26
+ *
27
+ * Environment-agnostic: the only globals touched are `fetch`,
28
+ * `TextDecoder` (via ../sse), and `JSON`.
29
+ */
30
+ interface OaiToolCall {
31
+ id: string;
32
+ type: 'function';
33
+ function: {
34
+ name: string;
35
+ arguments: string;
36
+ };
37
+ }
38
+ interface OaiMessage {
39
+ role: 'system' | 'user' | 'assistant' | 'tool';
40
+ content?: string | null;
41
+ tool_calls?: OaiToolCall[];
42
+ tool_call_id?: string;
43
+ name?: string;
44
+ }
45
+ export declare function toOaiMessages(messages: ModelMessage[]): OaiMessage[];
46
+ export declare function toOaiTools(tools: ToolSpec[]): unknown[];
47
+ /**
48
+ * Trim trailing slashes off a base URL, falling back to `fallback` when
49
+ * the value is empty or not an http(s) URL. Shared by the presets, whose
50
+ * relay-routing path can pass the base URL through the `apiKey` slot.
51
+ */
52
+ export declare function resolveBaseUrl(raw: string | undefined, fallback: string): string;
53
+ /** Fully-resolved settings the streaming engine needs. */
54
+ export interface OaiClientParams {
55
+ /** Stable id for metrics + provenance, e.g. `ollama:llama3.1`. */
56
+ id: string;
57
+ /** Full chat-completions endpoint, e.g. `http://localhost:8080/v1/chat/completions`. */
58
+ endpoint: string;
59
+ /** Upstream model id sent in the request body. */
60
+ model: string;
61
+ /** Extra request headers (e.g. `Authorization`). `Content-Type` is always set. */
62
+ headers: Record<string, string>;
63
+ /** Human label used in error messages, e.g. `llama-server`. */
64
+ errorLabel: string;
65
+ /** Prefix for synthesized tool-call ids when the server omits one. */
66
+ idPrefix: string;
67
+ /** Extra hint appended to a connection-failure error; receives the base URL. */
68
+ connectHint?: (base: string) => string;
69
+ /** Construction-time temperature default; a per-request value always wins. */
70
+ temperatureDefault?: number;
71
+ }
72
+ /** Build a `ModelClient` from fully-resolved OAI params. */
73
+ export declare function makeOaiClient(p: OaiClientParams): ModelClient;
74
+ /**
75
+ * Construction config for the generic OpenAI-compatible provider. Extends
76
+ * the shared cloud config with optional wire overrides:
77
+ * - `baseUrl` — server URL; `/v1/chat/completions` is appended. Defaults
78
+ * to `http://localhost:8080` (the common local-server port).
79
+ * - `endpoint` — full chat-completions URL; overrides `baseUrl` entirely.
80
+ * - `apiKey` — sent as `Authorization: Bearer <key>` unless an explicit
81
+ * `Authorization` header is supplied in `headers`.
82
+ * - `headers` — extra request headers (override the derived ones).
83
+ * - `id` — metrics id; defaults to `openai:<model>`.
84
+ * - `label` — error-message label; defaults to `OpenAI-compatible server`.
85
+ */
86
+ export interface OpenAiCompatConfig extends CloudProviderConfig {
87
+ endpoint?: string;
88
+ headers?: Record<string, string>;
89
+ id?: string;
90
+ label?: string;
91
+ }
92
+ /**
93
+ * Build a `ModelClient` for any OpenAI-compatible chat-completions server.
94
+ * Construction values (baseUrl/endpoint, apiKey, model, headers) come in
95
+ * the config; per-call values (messages, tools, sampling) come in the
96
+ * `ModelRequest`.
97
+ */
98
+ export declare function openaiCompatModelClient(config: OpenAiCompatConfig): ModelClient;
99
+ export {};
100
+ //# sourceMappingURL=oai-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oai-compat.d.ts","sourceRoot":"","sources":["../../src/providers/oai-compat.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAc,YAAY,EAAgB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEpG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CAC/C;AAED,UAAU,UAAU;IAClB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC/C,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,CAAC,EAAE,WAAW,EAAE,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,UAAU,EAAE,CAmCpE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CASvD;AASD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,EAAE,EAAE,MAAM,CAAC;IACX,wFAAwF;IACxF,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,kFAAkF;IAClF,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,QAAQ,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;IACvC,8EAA8E;IAC9E,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,CAAC,EAAE,eAAe,GAAG,WAAW,CAmI7D;AAID;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,kBAAkB,GAAG,WAAW,CAkB/E"}
@@ -0,0 +1,206 @@
1
+ import { readSseDataLines } from '../sse.js';
2
+ export function toOaiMessages(messages) {
3
+ const out = [];
4
+ for (const m of messages) {
5
+ if (m.role === 'system' || m.role === 'user') {
6
+ out.push({ role: m.role, content: m.text ?? '' });
7
+ continue;
8
+ }
9
+ if (m.role === 'assistant') {
10
+ const msg = { role: 'assistant', content: m.text ?? '' };
11
+ if (m.toolCalls && m.toolCalls.length > 0) {
12
+ msg.tool_calls = m.toolCalls.map((c) => ({
13
+ id: c.id,
14
+ type: 'function',
15
+ function: {
16
+ name: c.name,
17
+ arguments: typeof c.args === 'string' ? c.args : JSON.stringify(c.args ?? {}),
18
+ },
19
+ }));
20
+ // OAI servers reject assistant messages that carry tool_calls
21
+ // alongside empty-string content — null content is the documented form.
22
+ if (!msg.content)
23
+ msg.content = null;
24
+ }
25
+ out.push(msg);
26
+ continue;
27
+ }
28
+ if (m.role === 'tool') {
29
+ out.push({
30
+ role: 'tool',
31
+ tool_call_id: m.toolCallId ?? '',
32
+ name: m.name ?? '',
33
+ content: m.resultJson ?? '',
34
+ });
35
+ }
36
+ }
37
+ return out;
38
+ }
39
+ export function toOaiTools(tools) {
40
+ return tools.map((t) => ({
41
+ type: 'function',
42
+ function: {
43
+ name: t.function.name,
44
+ description: t.function.description,
45
+ parameters: t.function.parameters,
46
+ },
47
+ }));
48
+ }
49
+ /**
50
+ * Trim trailing slashes off a base URL, falling back to `fallback` when
51
+ * the value is empty or not an http(s) URL. Shared by the presets, whose
52
+ * relay-routing path can pass the base URL through the `apiKey` slot.
53
+ */
54
+ export function resolveBaseUrl(raw, fallback) {
55
+ return raw && /^https?:\/\//.test(raw) ? raw.replace(/\/+$/, '') : fallback;
56
+ }
57
+ /** Build a `ModelClient` from fully-resolved OAI params. */
58
+ export function makeOaiClient(p) {
59
+ return {
60
+ id: p.id,
61
+ supportsTools: true,
62
+ async *chat(req, signal) {
63
+ // Per-request temperature wins; otherwise fall back to the
64
+ // construction-time default. The relay sets neither.
65
+ const temperature = req.temperature ?? p.temperatureDefault;
66
+ const body = {
67
+ model: p.model,
68
+ messages: toOaiMessages(req.messages),
69
+ stream: true,
70
+ ...(typeof temperature === 'number' ? { temperature } : {}),
71
+ ...(typeof req.topP === 'number' ? { top_p: req.topP } : {}),
72
+ ...(typeof req.topK === 'number' ? { top_k: req.topK } : {}),
73
+ ...(req.tools.length > 0
74
+ ? { tools: toOaiTools(req.tools), tool_choice: 'auto' }
75
+ : {}),
76
+ };
77
+ let response;
78
+ try {
79
+ response = await fetch(p.endpoint, {
80
+ method: 'POST',
81
+ headers: { 'Content-Type': 'application/json', ...p.headers },
82
+ body: JSON.stringify(body),
83
+ ...(signal ? { signal } : {}),
84
+ });
85
+ }
86
+ catch (e) {
87
+ if (signal?.aborted)
88
+ return;
89
+ const msg = e instanceof Error ? e.message : String(e);
90
+ const base = p.endpoint.replace(/\/v1\/chat\/completions$/, '');
91
+ const hint = p.connectHint ? ` ${p.connectHint(base)}` : '';
92
+ yield { kind: 'error', message: `${p.errorLabel} fetch failed (${msg}).${hint}` };
93
+ return;
94
+ }
95
+ if (!response.ok) {
96
+ const text = await response.text().catch(() => response.statusText);
97
+ yield {
98
+ kind: 'error',
99
+ message: `${p.errorLabel} ${response.status}: ${text.slice(0, 240)}`,
100
+ };
101
+ return;
102
+ }
103
+ let promptTokens = 0;
104
+ let completionTokens = 0;
105
+ const pending = new Map();
106
+ try {
107
+ for await (const payload of readSseDataLines(response.body)) {
108
+ if (payload === '[DONE]')
109
+ break;
110
+ if (signal?.aborted)
111
+ return;
112
+ let evt;
113
+ try {
114
+ evt = JSON.parse(payload);
115
+ }
116
+ catch {
117
+ continue;
118
+ }
119
+ const e = evt;
120
+ const delta = e.choices?.[0]?.delta;
121
+ if (delta?.content) {
122
+ yield { kind: 'text', text: delta.content };
123
+ }
124
+ if (delta?.tool_calls) {
125
+ for (const d of delta.tool_calls) {
126
+ let pc = pending.get(d.index);
127
+ if (!pc) {
128
+ pc = { id: d.id ?? '', name: '', args: '', emitted: false };
129
+ pending.set(d.index, pc);
130
+ }
131
+ if (d.id)
132
+ pc.id = d.id;
133
+ if (d.function?.name)
134
+ pc.name = d.function.name;
135
+ if (d.function?.arguments)
136
+ pc.args += d.function.arguments;
137
+ }
138
+ }
139
+ if (e.usage) {
140
+ promptTokens = e.usage.prompt_tokens ?? promptTokens;
141
+ completionTokens = e.usage.completion_tokens ?? completionTokens;
142
+ }
143
+ }
144
+ }
145
+ catch (e) {
146
+ if (signal?.aborted)
147
+ return;
148
+ yield { kind: 'error', message: e instanceof Error ? e.message : String(e) };
149
+ return;
150
+ }
151
+ // Tool calls stream argument-by-argument; emit once after the
152
+ // stream closes so we don't fire on half-parsed JSON.
153
+ for (const pc of pending.values()) {
154
+ if (pc.emitted)
155
+ continue;
156
+ let parsedArgs = {};
157
+ try {
158
+ parsedArgs = pc.args ? JSON.parse(pc.args) : {};
159
+ }
160
+ catch {
161
+ parsedArgs = { _raw: pc.args };
162
+ }
163
+ yield {
164
+ kind: 'tool_call',
165
+ id: pc.id || `${p.idPrefix}_${Math.random().toString(36).slice(2, 10)}`,
166
+ name: pc.name,
167
+ args: parsedArgs,
168
+ };
169
+ pc.emitted = true;
170
+ }
171
+ yield {
172
+ kind: 'usage',
173
+ usage: {
174
+ promptTokens,
175
+ outputTokens: completionTokens,
176
+ },
177
+ };
178
+ },
179
+ };
180
+ }
181
+ const DEFAULT_BASE_URL = 'http://localhost:8080';
182
+ /**
183
+ * Build a `ModelClient` for any OpenAI-compatible chat-completions server.
184
+ * Construction values (baseUrl/endpoint, apiKey, model, headers) come in
185
+ * the config; per-call values (messages, tools, sampling) come in the
186
+ * `ModelRequest`.
187
+ */
188
+ export function openaiCompatModelClient(config) {
189
+ const endpoint = config.endpoint ?? `${resolveBaseUrl(config.baseUrl, DEFAULT_BASE_URL)}/v1/chat/completions`;
190
+ const headers = {
191
+ // OAI servers expect a Bearer token; explicit headers win so callers
192
+ // can override the scheme (or clear it) when a server differs.
193
+ ...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),
194
+ ...config.headers,
195
+ };
196
+ return makeOaiClient({
197
+ id: config.id ?? `openai:${config.model}`,
198
+ endpoint,
199
+ model: config.model,
200
+ headers,
201
+ errorLabel: config.label ?? 'OpenAI-compatible server',
202
+ idPrefix: 'oai',
203
+ temperatureDefault: config.temperature,
204
+ });
205
+ }
206
+ //# sourceMappingURL=oai-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oai-compat.js","sourceRoot":"","sources":["../../src/providers/oai-compat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ModelClient } from '../contract.js';
2
+ import type { CloudProviderConfig } from './types.js';
3
+ /** Construction config for the Ollama provider. `baseUrl` overrides the
4
+ * Ollama server URL; the relay passes the URL via `apiKey` instead. */
5
+ export interface OllamaConfig extends CloudProviderConfig {
6
+ }
7
+ export { toOaiTools } from './oai-compat.js';
8
+ /**
9
+ * Build an Ollama `ModelClient`. The server base URL comes from
10
+ * `config.baseUrl ?? config.apiKey` (relay routes it via apiKey; direct
11
+ * callers pass baseUrl); per-call values (messages, tools, sampling) come
12
+ * in the `ModelRequest`.
13
+ */
14
+ export declare function ollamaModelClient(config: OllamaConfig): ModelClient;
15
+ //# sourceMappingURL=ollama.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.d.ts","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA2BtD;wEACwE;AACxE,MAAM,WAAW,YAAa,SAAQ,mBAAmB;CAAG;AAK5D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,YAAY,GAAG,WAAW,CAenE"}
@@ -0,0 +1,51 @@
1
+ import { makeOaiClient, resolveBaseUrl } from './oai-compat.js';
2
+ /**
3
+ * Ollama provider — a preset over the shared OpenAI-compatible core
4
+ * (`./oai-compat`). Talks to a locally-running Ollama server's
5
+ * OAI-compatible endpoint (`${baseUrl}/v1/chat/completions`). Default
6
+ * baseUrl is `http://localhost:11434`. The caller passes their own via
7
+ * `config.baseUrl`; the relay passes it through `config.apiKey` (the
8
+ * playground's BYOK slot for Ollama is `kind: 'baseUrl'`; its `getKey()`
9
+ * returns the user-configured URL or the default), so the provider reads
10
+ * `config.baseUrl ?? config.apiKey`.
11
+ *
12
+ * Two Ollama-specific traits the core is configured for:
13
+ * - No `Authorization` header (Ollama doesn't authenticate). The base
14
+ * URL — not a key — rides in the `apiKey` slot, so we must NOT route
15
+ * it to a Bearer header; that's why this delegates to `makeOaiClient`
16
+ * directly instead of the generic `openaiCompatModelClient`.
17
+ * - Token counts arrive in the final usage chunk's `prompt_tokens` /
18
+ * `completion_tokens`, which Ollama's OAI endpoint reports.
19
+ *
20
+ * CORS: Ollama doesn't set CORS headers by default. Browser-side users
21
+ * must run Ollama with `OLLAMA_ORIGINS` set to allow the playground
22
+ * origin (typically `*` for local development). The playground surfaces
23
+ * this warning inline in its BYOK form.
24
+ */
25
+ const DEFAULT_BASE_URL = 'http://localhost:11434';
26
+ // Re-exported so existing imports (`import { toOaiTools } from
27
+ // './providers/ollama'`) and the package root's `toOllamaTools` alias
28
+ // keep resolving after the core extraction.
29
+ export { toOaiTools } from './oai-compat.js';
30
+ /**
31
+ * Build an Ollama `ModelClient`. The server base URL comes from
32
+ * `config.baseUrl ?? config.apiKey` (relay routes it via apiKey; direct
33
+ * callers pass baseUrl); per-call values (messages, tools, sampling) come
34
+ * in the `ModelRequest`.
35
+ */
36
+ export function ollamaModelClient(config) {
37
+ const base = resolveBaseUrl(config.baseUrl ?? config.apiKey, DEFAULT_BASE_URL);
38
+ return makeOaiClient({
39
+ id: `ollama:${config.model}`,
40
+ endpoint: `${base}/v1/chat/completions`,
41
+ model: config.model,
42
+ headers: {},
43
+ errorLabel: 'Ollama',
44
+ idPrefix: 'oll',
45
+ temperatureDefault: config.temperature,
46
+ // Browser fetch can't cleanly distinguish "not running" from "CORS
47
+ // blocked"; surface a hint that covers both.
48
+ connectHint: (b) => `Confirm \`ollama serve\` is running at ${b} and that OLLAMA_ORIGINS permits this origin.`,
49
+ });
50
+ }
51
+ //# sourceMappingURL=ollama.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ollama.js","sourceRoot":"","sources":["../../src/providers/ollama.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAMlD,+DAA+D;AAC/D,sEAAsE;AACtE,4CAA4C;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC/E,OAAO,aAAa,CAAC;QACnB,EAAE,EAAE,UAAU,MAAM,CAAC,KAAK,EAAE;QAC5B,QAAQ,EAAE,GAAG,IAAI,sBAAsB;QACvC,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO,EAAE,EAAE;QACX,UAAU,EAAE,QAAQ;QACpB,QAAQ,EAAE,KAAK;QACf,kBAAkB,EAAE,MAAM,CAAC,WAAW;QACtC,mEAAmE;QACnE,6CAA6C;QAC7C,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,CACjB,0CAA0C,CAAC,+CAA+C;KAC7F,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * OpenRouter OAuth (PKCE) — a browser-first "Connect OpenRouter" flow. Lets a
3
+ * backend-less app obtain a user-controlled, revocable OpenRouter API key
4
+ * without the user pasting a raw key.
5
+ *
6
+ * Two primitives; the app owns the redirect/popup, storage, and routing:
7
+ *
8
+ * 1. `beginOpenRouterOAuth({ callbackUrl })` -> `{ authUrl, codeVerifier }`
9
+ * Persist `codeVerifier` (e.g. sessionStorage), then send the user to
10
+ * `authUrl` (full-page redirect or popup).
11
+ * 2. On return, OpenRouter appends `?code=<code>` to the callback URL. Call
12
+ * `completeOpenRouterOAuth({ code, codeVerifier })` -> `{ key, userId }`.
13
+ * Feed `key` to `openrouterModelClient({ apiKey: key })`.
14
+ *
15
+ * Fully client-side: PKCE means no client secret, and the implementation uses
16
+ * only WebCrypto + `fetch`, so it runs in the browser with no backend (and is
17
+ * import-safe in Node). The key still lives wherever the app stores it — this
18
+ * provisions and exchanges it; it does not persist anything itself.
19
+ *
20
+ * OpenRouter constrains the callback URL to https on port 443 or 3000, or
21
+ * localhost on any port.
22
+ */
23
+ export interface BeginOpenRouterOAuthOpts {
24
+ /**
25
+ * Where OpenRouter returns the user with `?code=`. Must be https on port 443
26
+ * or 3000, or localhost on any port. A path is allowed (e.g. to return the
27
+ * user to the exact page they started from).
28
+ */
29
+ callbackUrl: string;
30
+ /** Override the OpenRouter origin (for testing). Default `https://openrouter.ai`. */
31
+ baseUrl?: string;
32
+ }
33
+ export interface OpenRouterOAuthStart {
34
+ /** Send the user here (full-page redirect or popup) to authorize. */
35
+ authUrl: string;
36
+ /** The PKCE verifier. Persist it across the redirect and pass it to `complete`. */
37
+ codeVerifier: string;
38
+ }
39
+ export interface CompleteOpenRouterOAuthOpts {
40
+ /** The `code` query param OpenRouter appended to the callback URL. */
41
+ code: string;
42
+ /** The verifier returned by `beginOpenRouterOAuth`. */
43
+ codeVerifier: string;
44
+ /** Override the OpenRouter origin (for testing). Default `https://openrouter.ai`. */
45
+ baseUrl?: string;
46
+ /** Optional abort signal for the exchange request. */
47
+ signal?: AbortSignal;
48
+ }
49
+ export interface OpenRouterOAuthResult {
50
+ /** The user-controlled API key (`sk-or-v1-...`). Feed to `openrouterModelClient`. */
51
+ key: string;
52
+ /** The OpenRouter user id associated with the key, or null. */
53
+ userId: string | null;
54
+ }
55
+ /**
56
+ * Step 1 of the PKCE flow: mint a verifier + S256 challenge and build the
57
+ * OpenRouter authorization URL. Persist the returned `codeVerifier` (it must
58
+ * survive the redirect), then navigate the user to `authUrl`.
59
+ */
60
+ export declare function beginOpenRouterOAuth(opts: BeginOpenRouterOAuthOpts): Promise<OpenRouterOAuthStart>;
61
+ /**
62
+ * Step 2 of the PKCE flow: exchange the `code` (from the callback) plus the
63
+ * stored `codeVerifier` for a user-controlled API key. Throws on a non-OK
64
+ * response or a missing key so callers can surface a clear error.
65
+ */
66
+ export declare function completeOpenRouterOAuth(opts: CompleteOpenRouterOAuthOpts): Promise<OpenRouterOAuthResult>;
67
+ //# sourceMappingURL=openrouter-oauth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openrouter-oauth.d.ts","sourceRoot":"","sources":["../../src/providers/openrouter-oauth.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAIH,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,qEAAqE;IACrE,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,2BAA2B;IAC1C,sEAAsE;IACtE,IAAI,EAAE,MAAM,CAAC;IACb,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAuBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,oBAAoB,CAAC,CAU/B;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,2BAA2B,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAqBhC"}