@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.
- package/AGENTS.md +44 -18
- package/README.md +128 -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 +23 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -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 +100 -0
- package/dist/providers/oai-compat.d.ts.map +1 -0
- package/dist/providers/oai-compat.js +206 -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 +13 -0
- package/dist/providers/openrouter.d.ts.map +1 -0
- package/dist/providers/openrouter.js +218 -0
- package/dist/providers/openrouter.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/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 +9 -29
- 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
package/package.json
CHANGED
|
@@ -1,30 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inbrowser/model",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "The model layer for the inbrowser stack: it OWNS the shared ModelClient contract that @inbrowser/relay (transport) and @inbrowser/agent (runtime) both consume, the cloud provider factories (Gemini, OpenRouter, Anthropic, Ollama, Claude-CLI, Claude-Code) that each return a ModelClient, a withRetry decorator, and the on-device LLM engine (lazy-loads @huggingface/transformers + ONNX Runtime Web behind a narrow EngineEvent-streaming Engine surface; Gemma 4 + Qwen + SmolLM2 presets; in-worker host/connect helpers). The engine is also a ModelClient via createEngineModelClient. Everything is exported from the package root.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
8
|
+
"sideEffects": false,
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
11
|
"types": "./dist/index.d.ts",
|
|
11
12
|
"import": "./dist/index.js"
|
|
12
|
-
},
|
|
13
|
-
"./presets": {
|
|
14
|
-
"types": "./dist/presets.d.ts",
|
|
15
|
-
"import": "./dist/presets.js"
|
|
16
|
-
},
|
|
17
|
-
"./relay": {
|
|
18
|
-
"types": "./dist/adapters/relay.d.ts",
|
|
19
|
-
"import": "./dist/adapters/relay.js"
|
|
20
|
-
},
|
|
21
|
-
"./agent": {
|
|
22
|
-
"types": "./dist/adapters/agent.d.ts",
|
|
23
|
-
"import": "./dist/adapters/agent.js"
|
|
24
|
-
},
|
|
25
|
-
"./worker": {
|
|
26
|
-
"types": "./dist/worker.d.ts",
|
|
27
|
-
"import": "./dist/worker.js"
|
|
28
13
|
}
|
|
29
14
|
},
|
|
30
15
|
"files": ["dist", "README.md", "AGENTS.md"],
|
|
@@ -34,25 +19,20 @@
|
|
|
34
19
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
35
20
|
},
|
|
36
21
|
"peerDependencies": {
|
|
37
|
-
"@
|
|
38
|
-
"@
|
|
39
|
-
"@inbrowser/relay": "0.2.1"
|
|
22
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.0",
|
|
23
|
+
"@huggingface/transformers": "^3.0.0 || ^4.0.0"
|
|
40
24
|
},
|
|
41
25
|
"peerDependenciesMeta": {
|
|
42
|
-
"@
|
|
43
|
-
"optional": false
|
|
44
|
-
},
|
|
45
|
-
"@inbrowser/agent": {
|
|
26
|
+
"@anthropic-ai/claude-agent-sdk": {
|
|
46
27
|
"optional": true
|
|
47
28
|
},
|
|
48
|
-
"@
|
|
49
|
-
"optional":
|
|
29
|
+
"@huggingface/transformers": {
|
|
30
|
+
"optional": false
|
|
50
31
|
}
|
|
51
32
|
},
|
|
52
33
|
"devDependencies": {
|
|
34
|
+
"@anthropic-ai/claude-agent-sdk": "^0.3.0",
|
|
53
35
|
"@huggingface/transformers": "^4.2.0",
|
|
54
|
-
"@inbrowser/agent": "0.2.0",
|
|
55
|
-
"@inbrowser/relay": "0.2.1",
|
|
56
36
|
"@types/bun": "latest",
|
|
57
37
|
"typescript": "^5.7.0"
|
|
58
38
|
},
|
package/dist/adapters/agent.d.ts
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapt an on-device `Engine` to `@inbrowser/agent`'s `LlmClient`.
|
|
3
|
-
* The agent runtime then drives a local model identically to a
|
|
4
|
-
* cloud provider — same `chat(req, signal) → AsyncIterable<ChatEvent>`
|
|
5
|
-
* surface.
|
|
6
|
-
*
|
|
7
|
-
* Tool calling: when `req.toolUseEnabled` is true and the engine
|
|
8
|
-
* doesn't natively support tools, the adapter declines (yields a
|
|
9
|
-
* single `error` event). The runtime can layer a tool-use polyfill
|
|
10
|
-
* (`withToolUsePolyfill`) over this client to lift it into a
|
|
11
|
-
* tool-capable one via prompt-engineered tool calling.
|
|
12
|
-
*
|
|
13
|
-
* `@inbrowser/agent` is a peer dep; this subpath is the only point
|
|
14
|
-
* in `@inbrowser/model` that imports from it.
|
|
15
|
-
*/
|
|
16
|
-
import type { LlmClient } from '@inbrowser/agent';
|
|
17
|
-
import type { Engine } from '../types.js';
|
|
18
|
-
export declare function createLocalLlmClient(engine: Engine, id: string): LlmClient;
|
|
19
|
-
//# sourceMappingURL=agent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/adapters/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAA0B,SAAS,EAAqB,MAAM,kBAAkB,CAAC;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEzD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAQ1E"}
|
package/dist/adapters/agent.js
DELETED
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapt an on-device `Engine` to `@inbrowser/agent`'s `LlmClient`.
|
|
3
|
-
* The agent runtime then drives a local model identically to a
|
|
4
|
-
* cloud provider — same `chat(req, signal) → AsyncIterable<ChatEvent>`
|
|
5
|
-
* surface.
|
|
6
|
-
*
|
|
7
|
-
* Tool calling: when `req.toolUseEnabled` is true and the engine
|
|
8
|
-
* doesn't natively support tools, the adapter declines (yields a
|
|
9
|
-
* single `error` event). The runtime can layer a tool-use polyfill
|
|
10
|
-
* (`withToolUsePolyfill`) over this client to lift it into a
|
|
11
|
-
* tool-capable one via prompt-engineered tool calling.
|
|
12
|
-
*
|
|
13
|
-
* `@inbrowser/agent` is a peer dep; this subpath is the only point
|
|
14
|
-
* in `@inbrowser/model` that imports from it.
|
|
15
|
-
*/
|
|
16
|
-
export function createLocalLlmClient(engine, id) {
|
|
17
|
-
return {
|
|
18
|
-
id,
|
|
19
|
-
supportsTools: engine.capabilities.supportsTools,
|
|
20
|
-
chat(req, signal) {
|
|
21
|
-
return drive(engine, req, signal);
|
|
22
|
-
},
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
async function* drive(engine, req, signal) {
|
|
26
|
-
if (req.toolUseEnabled && !engine.capabilities.supportsTools) {
|
|
27
|
-
yield {
|
|
28
|
-
kind: 'error',
|
|
29
|
-
message: 'engine does not natively support tools — pick a tools-capable preset (see capabilities.supportsTools)',
|
|
30
|
-
};
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
const messages = toEngineMessages(req.messages);
|
|
34
|
-
let promptTokens = 0;
|
|
35
|
-
let completionTokens = 0;
|
|
36
|
-
// Forward `req.tools` only when the request opts into tool use.
|
|
37
|
-
// The engine itself gates on `capabilities.supportsTools`; passing
|
|
38
|
-
// tools to a non-tools-capable engine is a no-op.
|
|
39
|
-
const tools = req.toolUseEnabled && req.tools.length > 0
|
|
40
|
-
? req.tools.map((t) => ({
|
|
41
|
-
type: 'function',
|
|
42
|
-
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
43
|
-
}))
|
|
44
|
-
: undefined;
|
|
45
|
-
for await (const evt of engine.generate(messages, { signal, ...(tools ? { tools } : {}) })) {
|
|
46
|
-
if (evt.kind === 'token') {
|
|
47
|
-
yield { kind: 'text', chunk: evt.text };
|
|
48
|
-
continue;
|
|
49
|
-
}
|
|
50
|
-
if (evt.kind === 'thinking') {
|
|
51
|
-
// ChatEvent has its own 'thinking' kind — pass through. The
|
|
52
|
-
// engine only emits this when the caller wrapped with
|
|
53
|
-
// splitThinking() upstream.
|
|
54
|
-
yield { kind: 'thinking', chunk: evt.text };
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
if (evt.kind === 'tool_call') {
|
|
58
|
-
yield {
|
|
59
|
-
kind: 'tool_call',
|
|
60
|
-
id: evt.id,
|
|
61
|
-
name: evt.name,
|
|
62
|
-
args: evt.args,
|
|
63
|
-
};
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
if (evt.kind === 'usage') {
|
|
67
|
-
promptTokens = evt.promptTokens;
|
|
68
|
-
completionTokens = evt.outputTokens;
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
yield { kind: 'error', message: evt.message };
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
yield {
|
|
75
|
-
kind: 'turn_complete',
|
|
76
|
-
usage: { promptTokens, completionTokens },
|
|
77
|
-
details: { requestedModel: engine.model.modelId },
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
function toEngineMessages(messages) {
|
|
81
|
-
const out = [];
|
|
82
|
-
for (const m of messages) {
|
|
83
|
-
if (m.role === 'tool') {
|
|
84
|
-
out.push({
|
|
85
|
-
role: 'user',
|
|
86
|
-
text: `[tool ${m.name ?? ''} result]\n${m.resultJson ?? ''}`,
|
|
87
|
-
});
|
|
88
|
-
continue;
|
|
89
|
-
}
|
|
90
|
-
if (m.role === 'system' || m.role === 'user' || m.role === 'assistant') {
|
|
91
|
-
out.push({ role: m.role, text: m.text });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
return out;
|
|
95
|
-
}
|
|
96
|
-
//# sourceMappingURL=agent.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/adapters/agent.ts"],"names":[],"mappings":"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"}
|
package/dist/adapters/relay.d.ts
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapt an on-device `Engine` to `@inbrowser/relay`'s
|
|
3
|
-
* `InferenceProvider`. Lets the relay's existing handlers, durable
|
|
4
|
-
* storage, and SSE wire format treat a local Gemma model
|
|
5
|
-
* indistinguishably from Gemini-over-HTTP.
|
|
6
|
-
*
|
|
7
|
-
* `NormalizedRequest` fields with no on-device analogue (`apiKey`,
|
|
8
|
-
* `provider`, `model` routing) are ignored — the engine is already
|
|
9
|
-
* bound to a single model at construction time.
|
|
10
|
-
*
|
|
11
|
-
* `@inbrowser/relay` is a peer dep; this subpath is the only point
|
|
12
|
-
* in `@inbrowser/model` that imports from it.
|
|
13
|
-
*/
|
|
14
|
-
import type { InferenceProvider } from '@inbrowser/relay';
|
|
15
|
-
import type { Engine } from '../types.js';
|
|
16
|
-
export declare function createLocalInferenceProvider(engine: Engine): InferenceProvider;
|
|
17
|
-
//# sourceMappingURL=relay.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay.d.ts","sourceRoot":"","sources":["../../src/adapters/relay.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAEV,iBAAiB,EAGlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAC;AAEzD,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CA2D9E"}
|
package/dist/adapters/relay.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Adapt an on-device `Engine` to `@inbrowser/relay`'s
|
|
3
|
-
* `InferenceProvider`. Lets the relay's existing handlers, durable
|
|
4
|
-
* storage, and SSE wire format treat a local Gemma model
|
|
5
|
-
* indistinguishably from Gemini-over-HTTP.
|
|
6
|
-
*
|
|
7
|
-
* `NormalizedRequest` fields with no on-device analogue (`apiKey`,
|
|
8
|
-
* `provider`, `model` routing) are ignored — the engine is already
|
|
9
|
-
* bound to a single model at construction time.
|
|
10
|
-
*
|
|
11
|
-
* `@inbrowser/relay` is a peer dep; this subpath is the only point
|
|
12
|
-
* in `@inbrowser/model` that imports from it.
|
|
13
|
-
*/
|
|
14
|
-
export function createLocalInferenceProvider(engine) {
|
|
15
|
-
return async function* (req) {
|
|
16
|
-
const messages = toEngineMessages(req.messages);
|
|
17
|
-
const startedAt = performance.now();
|
|
18
|
-
// Forward declared tools to the engine when the request brings
|
|
19
|
-
// any. The engine itself gates emission on the preset's
|
|
20
|
-
// capabilities.supportsTools — passing tools to a non-tools
|
|
21
|
-
// preset is a no-op rather than an error so callers can be
|
|
22
|
-
// backend-agnostic about which preset they bound to.
|
|
23
|
-
const tools = req.tools.length > 0
|
|
24
|
-
? req.tools.map((t) => ({
|
|
25
|
-
type: 'function',
|
|
26
|
-
function: { name: t.name, description: t.description, parameters: t.parameters },
|
|
27
|
-
}))
|
|
28
|
-
: undefined;
|
|
29
|
-
for await (const evt of engine.generate(messages, {
|
|
30
|
-
temperature: req.temperature,
|
|
31
|
-
topP: req.topP,
|
|
32
|
-
topK: req.topK,
|
|
33
|
-
...(tools ? { tools } : {}),
|
|
34
|
-
...(req.signal ? { signal: req.signal } : {}),
|
|
35
|
-
})) {
|
|
36
|
-
if (evt.kind === 'token') {
|
|
37
|
-
yield { kind: 'text', chunk: evt.text };
|
|
38
|
-
continue;
|
|
39
|
-
}
|
|
40
|
-
if (evt.kind === 'thinking') {
|
|
41
|
-
// InferenceEvent has its own 'thinking' kind — pass through.
|
|
42
|
-
// The engine only emits this when the caller wrapped with
|
|
43
|
-
// splitThinking() upstream.
|
|
44
|
-
yield { kind: 'thinking', chunk: evt.text };
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
if (evt.kind === 'tool_call') {
|
|
48
|
-
yield {
|
|
49
|
-
kind: 'tool_call',
|
|
50
|
-
callId: evt.id,
|
|
51
|
-
name: evt.name,
|
|
52
|
-
args: evt.args,
|
|
53
|
-
};
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (evt.kind === 'usage') {
|
|
57
|
-
yield {
|
|
58
|
-
kind: 'usage',
|
|
59
|
-
promptTokens: evt.promptTokens,
|
|
60
|
-
outputTokens: evt.outputTokens,
|
|
61
|
-
};
|
|
62
|
-
continue;
|
|
63
|
-
}
|
|
64
|
-
yield { kind: 'error', message: evt.message };
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
void startedAt;
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
function toEngineMessages(messages) {
|
|
71
|
-
const out = [];
|
|
72
|
-
for (const m of messages) {
|
|
73
|
-
// The engine vocabulary has no `tool` role — Gemma 4 is toolless.
|
|
74
|
-
// Tool turns are flattened into the prior assistant message so the
|
|
75
|
-
// model has the context, but the tool-call/result structure is
|
|
76
|
-
// dropped. Tool support arrives via the polyfill in @inbrowser/agent.
|
|
77
|
-
if (m.role === 'tool') {
|
|
78
|
-
out.push({
|
|
79
|
-
role: 'user',
|
|
80
|
-
text: `[tool ${m.name ?? ''} result]\n${m.resultJson ?? ''}`,
|
|
81
|
-
});
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (m.role === 'system' || m.role === 'user' || m.role === 'assistant') {
|
|
85
|
-
out.push({ role: m.role, text: m.text ?? '' });
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
return out;
|
|
89
|
-
}
|
|
90
|
-
//# sourceMappingURL=relay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"relay.js","sourceRoot":"","sources":["../../src/adapters/relay.ts"],"names":[],"mappings":"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"}
|