@inbrowser/model 0.1.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +44 -18
- package/README.md +129 -20
- package/dist/contract.d.ts +104 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +13 -0
- package/dist/contract.js.map +1 -0
- package/dist/engine-client.d.ts +44 -0
- package/dist/engine-client.d.ts.map +1 -0
- package/dist/engine-client.js +136 -0
- package/dist/engine-client.js.map +1 -0
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +20 -10
- package/dist/engine.js.map +1 -1
- package/dist/index.d.ts +25 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +46 -8
- package/dist/index.js.map +1 -1
- package/dist/presets.d.ts +10 -0
- package/dist/presets.d.ts.map +1 -1
- package/dist/presets.js +21 -0
- package/dist/presets.js.map +1 -1
- package/dist/providers/anthropic.d.ts +45 -0
- package/dist/providers/anthropic.d.ts.map +1 -0
- package/dist/providers/anthropic.js +217 -0
- package/dist/providers/anthropic.js.map +1 -0
- package/dist/providers/claude-cli.d.ts +135 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +270 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/claude-code.d.ts +188 -0
- package/dist/providers/claude-code.d.ts.map +1 -0
- package/dist/providers/claude-code.js +182 -0
- package/dist/providers/claude-code.js.map +1 -0
- package/dist/providers/gemini.d.ts +32 -0
- package/dist/providers/gemini.d.ts.map +1 -0
- package/dist/providers/gemini.js +441 -0
- package/dist/providers/gemini.js.map +1 -0
- package/dist/providers/llama-server.d.ts +15 -0
- package/dist/providers/llama-server.d.ts.map +1 -0
- package/dist/providers/llama-server.js +51 -0
- package/dist/providers/llama-server.js.map +1 -0
- package/dist/providers/oai-compat.d.ts +113 -0
- package/dist/providers/oai-compat.d.ts.map +1 -0
- package/dist/providers/oai-compat.js +257 -0
- package/dist/providers/oai-compat.js.map +1 -0
- package/dist/providers/ollama.d.ts +15 -0
- package/dist/providers/ollama.d.ts.map +1 -0
- package/dist/providers/ollama.js +51 -0
- package/dist/providers/ollama.js.map +1 -0
- package/dist/providers/openrouter-oauth.d.ts +67 -0
- package/dist/providers/openrouter-oauth.d.ts.map +1 -0
- package/dist/providers/openrouter-oauth.js +84 -0
- package/dist/providers/openrouter-oauth.js.map +1 -0
- package/dist/providers/openrouter.d.ts +16 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +27 -0
- package/dist/providers/openrouter.js.map +1 -0
- package/dist/providers/requesty.d.ts +16 -0
- package/dist/providers/requesty.d.ts.map +1 -0
- package/dist/providers/requesty.js +27 -0
- package/dist/providers/requesty.js.map +1 -0
- package/dist/providers/types.d.ts +50 -0
- package/dist/providers/types.d.ts.map +1 -0
- package/dist/providers/types.js +2 -0
- package/dist/providers/types.js.map +1 -0
- package/dist/sse.d.ts +20 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +47 -0
- package/dist/sse.js.map +1 -0
- package/dist/types.d.ts +2 -13
- package/dist/types.d.ts.map +1 -1
- package/dist/usage.d.ts +6 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +55 -0
- package/dist/usage.js.map +1 -0
- package/dist/with-retry.d.ts +27 -0
- package/dist/with-retry.d.ts.map +1 -0
- package/dist/with-retry.js +55 -0
- package/dist/with-retry.js.map +1 -0
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +1 -1
- package/package.json +14 -30
- package/dist/adapters/agent.d.ts +0 -19
- package/dist/adapters/agent.d.ts.map +0 -1
- package/dist/adapters/agent.js +0 -96
- package/dist/adapters/agent.js.map +0 -1
- package/dist/adapters/relay.d.ts +0 -17
- package/dist/adapters/relay.d.ts.map +0 -1
- package/dist/adapters/relay.js +0 -90
- 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,113 @@
|
|
|
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, API gateways, … — streams the same SSE deltas and reports the
|
|
9
|
+
* same core `usage` 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` / `thinking` / `tool_call` / `usage` / `error` events. It
|
|
16
|
+
* takes fully-resolved params so each server or gateway is just a set
|
|
17
|
+
* of defaults.
|
|
18
|
+
* - `openaiCompatModelClient` — the public, generic factory. Point it
|
|
19
|
+
* at any OAI-compatible server via `baseUrl` (or a full `endpoint`).
|
|
20
|
+
*
|
|
21
|
+
* The named presets (`ollamaModelClient`, `llamaServerModelClient`) are
|
|
22
|
+
* thin wrappers that resolve their own port / auth / labels and delegate
|
|
23
|
+
* to `makeOaiClient`. They call the engine directly rather than routing
|
|
24
|
+
* through `openaiCompatModelClient` because their auth rules differ
|
|
25
|
+
* (Ollama carries a base URL in the `apiKey` slot and sends no auth
|
|
26
|
+
* header; the generic factory treats `apiKey` as a Bearer token).
|
|
27
|
+
*
|
|
28
|
+
* Environment-agnostic: the only globals touched are `fetch`,
|
|
29
|
+
* `TextDecoder` (via ../sse), and `JSON`.
|
|
30
|
+
*/
|
|
31
|
+
interface OaiToolCall {
|
|
32
|
+
id: string;
|
|
33
|
+
type: 'function';
|
|
34
|
+
function: {
|
|
35
|
+
name: string;
|
|
36
|
+
arguments: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
interface OaiMessage {
|
|
40
|
+
role: 'system' | 'user' | 'assistant' | 'tool';
|
|
41
|
+
content?: string | null;
|
|
42
|
+
tool_calls?: OaiToolCall[];
|
|
43
|
+
tool_call_id?: string;
|
|
44
|
+
name?: string;
|
|
45
|
+
}
|
|
46
|
+
export declare function toOaiMessages(messages: ModelMessage[]): OaiMessage[];
|
|
47
|
+
export declare function toOaiTools(tools: ToolSpec[]): unknown[];
|
|
48
|
+
export interface OaiGatewayAttribution {
|
|
49
|
+
referer?: string;
|
|
50
|
+
title?: string;
|
|
51
|
+
}
|
|
52
|
+
export type OaiReasoningMode = 'openrouter-compatible';
|
|
53
|
+
export declare function oaiGatewayAttributionHeaders(attribution?: OaiGatewayAttribution): Record<string, string>;
|
|
54
|
+
/**
|
|
55
|
+
* Trim trailing slashes off a base URL, falling back to `fallback` when
|
|
56
|
+
* the value is empty or not an http(s) URL. Shared by the presets, whose
|
|
57
|
+
* relay-routing path can pass the base URL through the `apiKey` slot.
|
|
58
|
+
*/
|
|
59
|
+
export declare function resolveBaseUrl(raw: string | undefined, fallback: string): string;
|
|
60
|
+
/** Fully-resolved settings the streaming engine needs. */
|
|
61
|
+
export interface OaiClientParams {
|
|
62
|
+
/** Stable id for metrics + provenance, e.g. `ollama:llama3.1`. */
|
|
63
|
+
id: string;
|
|
64
|
+
/** Full chat-completions endpoint, e.g. `http://localhost:8080/v1/chat/completions`. */
|
|
65
|
+
endpoint: string;
|
|
66
|
+
/** Upstream model id sent in the request body. */
|
|
67
|
+
model: string;
|
|
68
|
+
/** Extra request headers (e.g. `Authorization`). `Content-Type` is always set. */
|
|
69
|
+
headers: Record<string, string>;
|
|
70
|
+
/** Human label used in error messages, e.g. `llama-server`. */
|
|
71
|
+
errorLabel: string;
|
|
72
|
+
/** Prefix for synthesized tool-call ids when the server omits one. */
|
|
73
|
+
idPrefix: string;
|
|
74
|
+
/** Extra hint appended to a connection-failure error; receives the base URL. */
|
|
75
|
+
connectHint?: (base: string) => string;
|
|
76
|
+
/** Construction-time temperature default; a per-request value always wins. */
|
|
77
|
+
temperatureDefault?: number;
|
|
78
|
+
/** Request final gateway usage/cost telemetry with `usage: { include: true }`. */
|
|
79
|
+
includeUsage?: boolean;
|
|
80
|
+
/** Gateway-specific reasoning request shape. */
|
|
81
|
+
reasoningMode?: OaiReasoningMode;
|
|
82
|
+
/** Delta fields that carry streamed reasoning/thought text. */
|
|
83
|
+
thinkingDeltaFields?: readonly string[];
|
|
84
|
+
}
|
|
85
|
+
/** Build a `ModelClient` from fully-resolved OAI params. */
|
|
86
|
+
export declare function makeOaiClient(p: OaiClientParams): ModelClient;
|
|
87
|
+
/**
|
|
88
|
+
* Construction config for the generic OpenAI-compatible provider. Extends
|
|
89
|
+
* the shared cloud config with optional wire overrides:
|
|
90
|
+
* - `baseUrl` — server URL; `/v1/chat/completions` is appended. Defaults
|
|
91
|
+
* to `http://localhost:8080` (the common local-server port).
|
|
92
|
+
* - `endpoint` — full chat-completions URL; overrides `baseUrl` entirely.
|
|
93
|
+
* - `apiKey` — sent as `Authorization: Bearer <key>` unless an explicit
|
|
94
|
+
* `Authorization` header is supplied in `headers`.
|
|
95
|
+
* - `headers` — extra request headers (override the derived ones).
|
|
96
|
+
* - `id` — metrics id; defaults to `openai:<model>`.
|
|
97
|
+
* - `label` — error-message label; defaults to `OpenAI-compatible server`.
|
|
98
|
+
*/
|
|
99
|
+
export interface OpenAiCompatConfig extends CloudProviderConfig {
|
|
100
|
+
endpoint?: string;
|
|
101
|
+
headers?: Record<string, string>;
|
|
102
|
+
id?: string;
|
|
103
|
+
label?: string;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Build a `ModelClient` for any OpenAI-compatible chat-completions server.
|
|
107
|
+
* Construction values (baseUrl/endpoint, apiKey, model, headers) come in
|
|
108
|
+
* the config; per-call values (messages, tools, sampling) come in the
|
|
109
|
+
* `ModelRequest`.
|
|
110
|
+
*/
|
|
111
|
+
export declare function openaiCompatModelClient(config: OpenAiCompatConfig): ModelClient;
|
|
112
|
+
export {};
|
|
113
|
+
//# 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;AAGpG,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;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,MAAM,WAAW,qBAAqB;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEvD,wBAAgB,4BAA4B,CAC1C,WAAW,CAAC,EAAE,qBAAqB,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAKxB;AAED;;;;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;IAC5B,kFAAkF;IAClF,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,aAAa,CAAC,EAAE,gBAAgB,CAAC;IACjC,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACzC;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,CAAC,EAAE,eAAe,GAAG,WAAW,CAiK7D;AA8BD;;;;;;;;;;;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,257 @@
|
|
|
1
|
+
import { readSseDataLines } from '../sse.js';
|
|
2
|
+
import { normalizeModelUsage } from '../usage.js';
|
|
3
|
+
export function toOaiMessages(messages) {
|
|
4
|
+
const out = [];
|
|
5
|
+
for (const m of messages) {
|
|
6
|
+
if (m.role === 'system' || m.role === 'user') {
|
|
7
|
+
out.push({ role: m.role, content: m.text ?? '' });
|
|
8
|
+
continue;
|
|
9
|
+
}
|
|
10
|
+
if (m.role === 'assistant') {
|
|
11
|
+
const msg = { role: 'assistant', content: m.text ?? '' };
|
|
12
|
+
if (m.toolCalls && m.toolCalls.length > 0) {
|
|
13
|
+
msg.tool_calls = m.toolCalls.map((c) => ({
|
|
14
|
+
id: c.id,
|
|
15
|
+
type: 'function',
|
|
16
|
+
function: {
|
|
17
|
+
name: c.name,
|
|
18
|
+
arguments: typeof c.args === 'string' ? c.args : JSON.stringify(c.args ?? {}),
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
// OAI servers reject assistant messages that carry tool_calls
|
|
22
|
+
// alongside empty-string content — null content is the documented form.
|
|
23
|
+
if (!msg.content)
|
|
24
|
+
msg.content = null;
|
|
25
|
+
}
|
|
26
|
+
out.push(msg);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (m.role === 'tool') {
|
|
30
|
+
out.push({
|
|
31
|
+
role: 'tool',
|
|
32
|
+
tool_call_id: m.toolCallId ?? '',
|
|
33
|
+
name: m.name ?? '',
|
|
34
|
+
content: m.resultJson ?? '',
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
export function toOaiTools(tools) {
|
|
41
|
+
return tools.map((t) => ({
|
|
42
|
+
type: 'function',
|
|
43
|
+
function: {
|
|
44
|
+
name: t.function.name,
|
|
45
|
+
description: t.function.description,
|
|
46
|
+
parameters: t.function.parameters,
|
|
47
|
+
},
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
export function oaiGatewayAttributionHeaders(attribution) {
|
|
51
|
+
return {
|
|
52
|
+
...(attribution?.referer ? { 'HTTP-Referer': attribution.referer } : {}),
|
|
53
|
+
...(attribution?.title ? { 'X-Title': attribution.title } : {}),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Trim trailing slashes off a base URL, falling back to `fallback` when
|
|
58
|
+
* the value is empty or not an http(s) URL. Shared by the presets, whose
|
|
59
|
+
* relay-routing path can pass the base URL through the `apiKey` slot.
|
|
60
|
+
*/
|
|
61
|
+
export function resolveBaseUrl(raw, fallback) {
|
|
62
|
+
return raw && /^https?:\/\//.test(raw) ? raw.replace(/\/+$/, '') : fallback;
|
|
63
|
+
}
|
|
64
|
+
/** Build a `ModelClient` from fully-resolved OAI params. */
|
|
65
|
+
export function makeOaiClient(p) {
|
|
66
|
+
return {
|
|
67
|
+
id: p.id,
|
|
68
|
+
supportsTools: true,
|
|
69
|
+
async *chat(req, signal) {
|
|
70
|
+
// Per-request temperature wins; otherwise fall back to the
|
|
71
|
+
// construction-time default. The relay sets neither.
|
|
72
|
+
const temperature = req.temperature ?? p.temperatureDefault;
|
|
73
|
+
const body = {
|
|
74
|
+
model: p.model,
|
|
75
|
+
messages: toOaiMessages(req.messages),
|
|
76
|
+
stream: true,
|
|
77
|
+
...(p.includeUsage ? { usage: { include: true } } : {}),
|
|
78
|
+
...(typeof temperature === 'number' ? { temperature } : {}),
|
|
79
|
+
...(typeof req.topP === 'number' ? { top_p: req.topP } : {}),
|
|
80
|
+
...(typeof req.topK === 'number' ? { top_k: req.topK } : {}),
|
|
81
|
+
...buildReasoningRequest(p.reasoningMode, req),
|
|
82
|
+
...(req.tools.length > 0
|
|
83
|
+
? { tools: toOaiTools(req.tools), tool_choice: 'auto' }
|
|
84
|
+
: {}),
|
|
85
|
+
};
|
|
86
|
+
let response;
|
|
87
|
+
try {
|
|
88
|
+
response = await fetch(p.endpoint, {
|
|
89
|
+
method: 'POST',
|
|
90
|
+
headers: { 'Content-Type': 'application/json', ...p.headers },
|
|
91
|
+
body: JSON.stringify(body),
|
|
92
|
+
...(signal ? { signal } : {}),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
catch (e) {
|
|
96
|
+
if (signal?.aborted)
|
|
97
|
+
return;
|
|
98
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
99
|
+
const base = p.endpoint.replace(/\/v1\/chat\/completions$/, '');
|
|
100
|
+
const hint = p.connectHint ? ` ${p.connectHint(base)}` : '';
|
|
101
|
+
yield { kind: 'error', message: `${p.errorLabel} fetch failed (${msg}).${hint}` };
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!response.ok) {
|
|
105
|
+
const text = await response.text().catch(() => response.statusText);
|
|
106
|
+
yield {
|
|
107
|
+
kind: 'error',
|
|
108
|
+
message: `${p.errorLabel} ${response.status}: ${text.slice(0, 240)}`,
|
|
109
|
+
};
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
let promptTokens = 0;
|
|
113
|
+
let completionTokens = 0;
|
|
114
|
+
let cachedTokens;
|
|
115
|
+
let reasoningTokens;
|
|
116
|
+
let costUsd;
|
|
117
|
+
const pending = new Map();
|
|
118
|
+
try {
|
|
119
|
+
for await (const payload of readSseDataLines(response.body)) {
|
|
120
|
+
if (payload === '[DONE]')
|
|
121
|
+
break;
|
|
122
|
+
if (signal?.aborted)
|
|
123
|
+
return;
|
|
124
|
+
let evt;
|
|
125
|
+
try {
|
|
126
|
+
evt = JSON.parse(payload);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
const e = evt;
|
|
132
|
+
const delta = e.choices?.[0]?.delta;
|
|
133
|
+
if (delta?.content) {
|
|
134
|
+
yield { kind: 'text', text: delta.content };
|
|
135
|
+
}
|
|
136
|
+
const thinking = findThinkingDelta(delta, p.thinkingDeltaFields);
|
|
137
|
+
if (thinking) {
|
|
138
|
+
yield { kind: 'thinking', text: thinking };
|
|
139
|
+
}
|
|
140
|
+
if (delta?.tool_calls) {
|
|
141
|
+
for (const d of delta.tool_calls) {
|
|
142
|
+
let pc = pending.get(d.index);
|
|
143
|
+
if (!pc) {
|
|
144
|
+
pc = { id: d.id ?? '', name: '', args: '', emitted: false };
|
|
145
|
+
pending.set(d.index, pc);
|
|
146
|
+
}
|
|
147
|
+
if (d.id)
|
|
148
|
+
pc.id = d.id;
|
|
149
|
+
if (d.function?.name)
|
|
150
|
+
pc.name = d.function.name;
|
|
151
|
+
if (d.function?.arguments)
|
|
152
|
+
pc.args += d.function.arguments;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (e.usage) {
|
|
156
|
+
promptTokens = e.usage.prompt_tokens ?? promptTokens;
|
|
157
|
+
completionTokens = e.usage.completion_tokens ?? completionTokens;
|
|
158
|
+
if (typeof e.usage.prompt_tokens_details?.cached_tokens === 'number') {
|
|
159
|
+
cachedTokens = e.usage.prompt_tokens_details.cached_tokens;
|
|
160
|
+
}
|
|
161
|
+
if (typeof e.usage.completion_tokens_details?.reasoning_tokens === 'number') {
|
|
162
|
+
reasoningTokens = e.usage.completion_tokens_details.reasoning_tokens;
|
|
163
|
+
}
|
|
164
|
+
else if (typeof e.usage.reasoning_tokens === 'number') {
|
|
165
|
+
reasoningTokens = e.usage.reasoning_tokens;
|
|
166
|
+
}
|
|
167
|
+
if (typeof e.usage.cost === 'number')
|
|
168
|
+
costUsd = e.usage.cost;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
catch (e) {
|
|
173
|
+
if (signal?.aborted)
|
|
174
|
+
return;
|
|
175
|
+
yield { kind: 'error', message: e instanceof Error ? e.message : String(e) };
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// Tool calls stream argument-by-argument; emit once after the
|
|
179
|
+
// stream closes so we don't fire on half-parsed JSON.
|
|
180
|
+
for (const pc of pending.values()) {
|
|
181
|
+
if (pc.emitted)
|
|
182
|
+
continue;
|
|
183
|
+
let parsedArgs = {};
|
|
184
|
+
try {
|
|
185
|
+
parsedArgs = pc.args ? JSON.parse(pc.args) : {};
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
parsedArgs = { _raw: pc.args };
|
|
189
|
+
}
|
|
190
|
+
yield {
|
|
191
|
+
kind: 'tool_call',
|
|
192
|
+
id: pc.id || `${p.idPrefix}_${Math.random().toString(36).slice(2, 10)}`,
|
|
193
|
+
name: pc.name,
|
|
194
|
+
args: parsedArgs,
|
|
195
|
+
};
|
|
196
|
+
pc.emitted = true;
|
|
197
|
+
}
|
|
198
|
+
yield {
|
|
199
|
+
kind: 'usage',
|
|
200
|
+
usage: normalizeModelUsage({
|
|
201
|
+
promptTokens,
|
|
202
|
+
outputTokens: completionTokens,
|
|
203
|
+
...(typeof cachedTokens === 'number' ? { cachedTokens } : {}),
|
|
204
|
+
...(typeof reasoningTokens === 'number' ? { reasoningTokens } : {}),
|
|
205
|
+
...(typeof costUsd === 'number' ? { costUsd } : {}),
|
|
206
|
+
}),
|
|
207
|
+
};
|
|
208
|
+
},
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function buildReasoningRequest(mode, req) {
|
|
212
|
+
if (mode !== 'openrouter-compatible')
|
|
213
|
+
return {};
|
|
214
|
+
const effort = req.reasoningEffort ?? 'off';
|
|
215
|
+
return effort === 'off'
|
|
216
|
+
? { reasoning: { enabled: false } }
|
|
217
|
+
: {
|
|
218
|
+
reasoning: { effort, summary: 'auto' },
|
|
219
|
+
include_reasoning: true,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function findThinkingDelta(delta, fields) {
|
|
223
|
+
if (!delta || !fields)
|
|
224
|
+
return undefined;
|
|
225
|
+
for (const field of fields) {
|
|
226
|
+
const value = delta[field];
|
|
227
|
+
if (typeof value === 'string' && value.length > 0)
|
|
228
|
+
return value;
|
|
229
|
+
}
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
const DEFAULT_BASE_URL = 'http://localhost:8080';
|
|
233
|
+
/**
|
|
234
|
+
* Build a `ModelClient` for any OpenAI-compatible chat-completions server.
|
|
235
|
+
* Construction values (baseUrl/endpoint, apiKey, model, headers) come in
|
|
236
|
+
* the config; per-call values (messages, tools, sampling) come in the
|
|
237
|
+
* `ModelRequest`.
|
|
238
|
+
*/
|
|
239
|
+
export function openaiCompatModelClient(config) {
|
|
240
|
+
const endpoint = config.endpoint ?? `${resolveBaseUrl(config.baseUrl, DEFAULT_BASE_URL)}/v1/chat/completions`;
|
|
241
|
+
const headers = {
|
|
242
|
+
// OAI servers expect a Bearer token; explicit headers win so callers
|
|
243
|
+
// can override the scheme (or clear it) when a server differs.
|
|
244
|
+
...(config.apiKey ? { Authorization: `Bearer ${config.apiKey}` } : {}),
|
|
245
|
+
...config.headers,
|
|
246
|
+
};
|
|
247
|
+
return makeOaiClient({
|
|
248
|
+
id: config.id ?? `openai:${config.model}`,
|
|
249
|
+
endpoint,
|
|
250
|
+
model: config.model,
|
|
251
|
+
headers,
|
|
252
|
+
errorLabel: config.label ?? 'OpenAI-compatible server',
|
|
253
|
+
idPrefix: 'oai',
|
|
254
|
+
temperatureDefault: config.temperature,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=oai-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oai-compat.js","sourceRoot":"","sources":["../../src/providers/oai-compat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AA6ClD,MAAM,UAAU,aAAa,CAAC,QAAwB;IACpD,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC7C,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;YAClD,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAe,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;YACrE,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACvC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,QAAQ,EAAE;wBACR,IAAI,EAAE,CAAC,CAAC,IAAI;wBACZ,SAAS,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;qBAC9E;iBACF,CAAC,CAAC,CAAC;gBACJ,8DAA8D;gBAC9D,wEAAwE;gBACxE,IAAI,CAAC,GAAG,CAAC,OAAO;oBAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;YACvC,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACd,SAAS;QACX,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACtB,GAAG,CAAC,IAAI,CAAC;gBACP,IAAI,EAAE,MAAM;gBACZ,YAAY,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;gBAChC,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;gBAClB,OAAO,EAAE,CAAC,CAAC,UAAU,IAAI,EAAE;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAiB;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACvB,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI;YACrB,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW;YACnC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU;SAClC;KACF,CAAC,CAAC,CAAC;AACN,CAAC;AAgBD,MAAM,UAAU,4BAA4B,CAC1C,WAAmC;IAEnC,OAAO;QACL,GAAG,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAuB,EAAE,QAAgB;IACtE,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC9E,CAAC;AA4BD,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,CAAkB;IAC9C,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,aAAa,EAAE,IAAI;QACnB,KAAK,CAAC,CAAC,IAAI,CAAC,GAAiB,EAAE,MAAmB;YAChD,2DAA2D;YAC3D,qDAAqD;YACrD,MAAM,WAAW,GAAG,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,kBAAkB,CAAC;YAC5D,MAAM,IAAI,GAAG;gBACX,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,QAAQ,EAAE,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;gBACrC,MAAM,EAAE,IAAI;gBACZ,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,CAAC,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,GAAG,qBAAqB,CAAC,CAAC,CAAC,aAAa,EAAE,GAAG,CAAC;gBAC9C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;oBACtB,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,MAAe,EAAE;oBAChE,CAAC,CAAC,EAAE,CAAC;aACR,CAAC;YAEF,IAAI,QAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,QAAQ,EAAE;oBACjC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE;oBAC7D,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC9B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO;gBAC5B,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACvD,MAAM,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC;gBAChE,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC5D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,UAAU,kBAAkB,GAAG,KAAK,IAAI,EAAE,EAAE,CAAC;gBAClF,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;gBACpE,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,GAAG,CAAC,CAAC,UAAU,IAAI,QAAQ,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;iBACrE,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,gBAAgB,GAAG,CAAC,CAAC;YACzB,IAAI,YAAgC,CAAC;YACrC,IAAI,eAAmC,CAAC;YACxC,IAAI,OAA2B,CAAC;YAChC,MAAM,OAAO,GAAG,IAAI,GAAG,EAA2B,CAAC;YAEnD,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC5D,IAAI,OAAO,KAAK,QAAQ;wBAAE,MAAM;oBAChC,IAAI,MAAM,EAAE,OAAO;wBAAE,OAAO;oBAC5B,IAAI,GAAY,CAAC;oBACjB,IAAI,CAAC;wBACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAC5B,CAAC;oBAAC,MAAM,CAAC;wBACP,SAAS;oBACX,CAAC;oBACD,MAAM,CAAC,GAAG,GAwBT,CAAC;oBACF,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;oBACpC,IAAI,KAAK,EAAE,OAAO,EAAE,CAAC;wBACnB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;oBAC9C,CAAC;oBACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,KAAK,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;oBACjE,IAAI,QAAQ,EAAE,CAAC;wBACb,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBAC7C,CAAC;oBACD,IAAI,KAAK,EAAE,UAAU,EAAE,CAAC;wBACtB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;4BACjC,IAAI,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;4BAC9B,IAAI,CAAC,EAAE,EAAE,CAAC;gCACR,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gCAC5D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;4BAC3B,CAAC;4BACD,IAAI,CAAC,CAAC,EAAE;gCAAE,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;4BACvB,IAAI,CAAC,CAAC,QAAQ,EAAE,IAAI;gCAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;4BAChD,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS;gCAAE,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;wBAC7D,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;wBACZ,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,YAAY,CAAC;wBACrD,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,iBAAiB,IAAI,gBAAgB,CAAC;wBACjE,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,qBAAqB,EAAE,aAAa,KAAK,QAAQ,EAAE,CAAC;4BACrE,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,aAAa,CAAC;wBAC7D,CAAC;wBACD,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,yBAAyB,EAAE,gBAAgB,KAAK,QAAQ,EAAE,CAAC;4BAC5E,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,yBAAyB,CAAC,gBAAgB,CAAC;wBACvE,CAAC;6BAAM,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;4BACxD,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC;wBAC7C,CAAC;wBACD,IAAI,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;4BAAE,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;oBAC/D,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,MAAM,EAAE,OAAO;oBAAE,OAAO;gBAC5B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7E,OAAO;YACT,CAAC;YAED,8DAA8D;YAC9D,sDAAsD;YACtD,KAAK,MAAM,EAAE,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClC,IAAI,EAAE,CAAC,OAAO;oBAAE,SAAS;gBACzB,IAAI,UAAU,GAAY,EAAE,CAAC;gBAC7B,IAAI,CAAC;oBACH,UAAU,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,CAAC;gBAAC,MAAM,CAAC;oBACP,UAAU,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;gBACjC,CAAC;gBACD,MAAM;oBACJ,IAAI,EAAE,WAAW;oBACjB,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE;oBACvE,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,IAAI,EAAE,UAAU;iBACjB,CAAC;gBACF,EAAE,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,CAAC;YAED,MAAM;gBACJ,IAAI,EAAE,OAAO;gBACb,KAAK,EAAE,mBAAmB,CAAC;oBACzB,YAAY;oBACZ,YAAY,EAAE,gBAAgB;oBAC9B,GAAG,CAAC,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7D,GAAG,CAAC,OAAO,eAAe,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACnE,GAAG,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpD,CAAC;aACH,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAC5B,IAAkC,EAClC,GAAiB;IAEjB,IAAI,IAAI,KAAK,uBAAuB;QAAE,OAAO,EAAE,CAAC;IAChD,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,IAAI,KAAK,CAAC;IAC5C,OAAO,MAAM,KAAK,KAAK;QACrB,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACnC,CAAC,CAAC;YACE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;YACtC,iBAAiB,EAAE,IAAI;SACxB,CAAC;AACR,CAAC;AAED,SAAS,iBAAiB,CACxB,KAA6C,EAC7C,MAAqC;IAErC,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAqBjD;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAA0B;IAChE,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,IAAI,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,gBAAgB,CAAC,sBAAsB,CAAC;IAC/F,MAAM,OAAO,GAA2B;QACtC,qEAAqE;QACrE,+DAA+D;QAC/D,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,MAAM,CAAC,OAAO;KAClB,CAAC;IACF,OAAO,aAAa,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC,EAAE,IAAI,UAAU,MAAM,CAAC,KAAK,EAAE;QACzC,QAAQ;QACR,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,OAAO;QACP,UAAU,EAAE,MAAM,CAAC,KAAK,IAAI,0BAA0B;QACtD,QAAQ,EAAE,KAAK;QACf,kBAAkB,EAAE,MAAM,CAAC,WAAW;KACvC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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"}
|