@atomic-chat/core 0.18.5 → 0.19.1
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/dist/app-daemon.js +5 -0
- package/dist/app-daemon.js.map +1 -1
- package/dist/cli/main.d.ts +1 -1
- package/dist/cli/main.js +5 -0
- package/dist/cli/main.js.map +1 -1
- package/dist/client/control-client.d.ts +18 -1
- package/dist/client/control-client.js +27 -0
- package/dist/client/control-client.js.map +1 -1
- package/dist/cloud/registry.js +1 -0
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +4 -0
- package/dist/config/paths.js +13 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/control-api.d.ts +9 -0
- package/dist/contracts/diffusion.d.ts +17 -7
- package/dist/contracts/diffusion.js.map +1 -1
- package/dist/contracts/engine-builds.d.ts +1 -1
- package/dist/contracts/engine-builds.js +1 -1
- package/dist/contracts/engine-builds.js.map +1 -1
- package/dist/contracts/engines.d.ts +1 -1
- package/dist/contracts/engines.js +2 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +9 -1
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +6 -1
- package/dist/contracts/index.d.ts +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/litert-lm.d.ts +97 -0
- package/dist/contracts/litert-lm.js +17 -0
- package/dist/contracts/litert-lm.js.map +1 -0
- package/dist/contracts/model-yml.d.ts +31 -0
- package/dist/contracts/model-yml.js +5 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +5 -1
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +10 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/app-lease.d.ts +56 -0
- package/dist/core/app-lease.js +50 -0
- package/dist/core/app-lease.js.map +1 -0
- package/dist/core/atomic-core.d.ts +6 -1
- package/dist/core/atomic-core.js +6 -0
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +175 -24
- package/dist/core/create.js.map +1 -1
- package/dist/diffusion/args.d.ts +8 -0
- package/dist/diffusion/args.js +10 -0
- package/dist/diffusion/args.js.map +1 -1
- package/dist/diffusion/compat.d.ts +3 -3
- package/dist/diffusion/compat.js +15 -10
- package/dist/diffusion/compat.js.map +1 -1
- package/dist/diffusion/recipe.d.ts +19 -2
- package/dist/diffusion/recipe.js +43 -20
- package/dist/diffusion/recipe.js.map +1 -1
- package/dist/diffusion/remote-job.js +6 -7
- package/dist/diffusion/remote-job.js.map +1 -1
- package/dist/diffusion/service.d.ts +1 -0
- package/dist/diffusion/service.js +4 -2
- package/dist/diffusion/service.js.map +1 -1
- package/dist/diffusion/video-history.js +3 -2
- package/dist/diffusion/video-history.js.map +1 -1
- package/dist/diffusion/video-recipe.d.ts +4 -1
- package/dist/diffusion/video-recipe.js +15 -11
- package/dist/diffusion/video-recipe.js.map +1 -1
- package/dist/diffusion/workflow.d.ts +2 -1
- package/dist/diffusion/workflow.js +3 -1
- package/dist/diffusion/workflow.js.map +1 -1
- package/dist/downloads/archive.d.ts +2 -1
- package/dist/downloads/archive.js +3 -2
- package/dist/downloads/archive.js.map +1 -1
- package/dist/engine-builds/engines.d.ts +22 -5
- package/dist/engine-builds/engines.js +44 -7
- package/dist/engine-builds/engines.js.map +1 -1
- package/dist/engine-builds/litert-lm.d.ts +29 -0
- package/dist/engine-builds/litert-lm.js +119 -0
- package/dist/engine-builds/litert-lm.js.map +1 -0
- package/dist/engine-builds/manifest.d.ts +55 -1
- package/dist/engine-builds/manifest.js +114 -1
- package/dist/engine-builds/manifest.js.map +1 -1
- package/dist/engine-builds/order.d.ts +2 -1
- package/dist/engine-builds/order.js +3 -1
- package/dist/engine-builds/order.js.map +1 -1
- package/dist/engine-builds/select.d.ts +19 -1
- package/dist/engine-builds/select.js +45 -0
- package/dist/engine-builds/select.js.map +1 -1
- package/dist/engine-builds/service.d.ts +8 -5
- package/dist/engine-builds/service.js +11 -4
- package/dist/engine-builds/service.js.map +1 -1
- package/dist/engines/service.d.ts +3 -1
- package/dist/engines/service.js +4 -1
- package/dist/engines/service.js.map +1 -1
- package/dist/router/resolve.d.ts +25 -4
- package/dist/router/resolve.js +34 -3
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/litert-lm/accelerators.d.ts +54 -0
- package/dist/runtime/litert-lm/accelerators.js +176 -0
- package/dist/runtime/litert-lm/accelerators.js.map +1 -0
- package/dist/runtime/litert-lm/check.d.ts +44 -0
- package/dist/runtime/litert-lm/check.js +113 -0
- package/dist/runtime/litert-lm/check.js.map +1 -0
- package/dist/runtime/litert-lm/host/args.d.ts +47 -0
- package/dist/runtime/litert-lm/host/args.js +108 -0
- package/dist/runtime/litert-lm/host/args.js.map +1 -0
- package/dist/runtime/litert-lm/host/ffi-bun.d.ts +16 -0
- package/dist/runtime/litert-lm/host/ffi-bun.js +535 -0
- package/dist/runtime/litert-lm/host/ffi-bun.js.map +1 -0
- package/dist/runtime/litert-lm/host/library.d.ts +113 -0
- package/dist/runtime/litert-lm/host/library.js +38 -0
- package/dist/runtime/litert-lm/host/library.js.map +1 -0
- package/dist/runtime/litert-lm/host/openai.d.ts +97 -0
- package/dist/runtime/litert-lm/host/openai.js +355 -0
- package/dist/runtime/litert-lm/host/openai.js.map +1 -0
- package/dist/runtime/litert-lm/host/pool.d.ts +51 -0
- package/dist/runtime/litert-lm/host/pool.js +114 -0
- package/dist/runtime/litert-lm/host/pool.js.map +1 -0
- package/dist/runtime/litert-lm/host/run.d.ts +48 -0
- package/dist/runtime/litert-lm/host/run.js +169 -0
- package/dist/runtime/litert-lm/host/run.js.map +1 -0
- package/dist/runtime/litert-lm/host/server.d.ts +28 -0
- package/dist/runtime/litert-lm/host/server.js +242 -0
- package/dist/runtime/litert-lm/host/server.js.map +1 -0
- package/dist/runtime/litert-lm/host-process.d.ts +44 -0
- package/dist/runtime/litert-lm/host-process.js +99 -0
- package/dist/runtime/litert-lm/host-process.js.map +1 -0
- package/dist/runtime/litert-lm/index.d.ts +10 -0
- package/dist/runtime/litert-lm/index.js +11 -0
- package/dist/runtime/litert-lm/index.js.map +1 -0
- package/dist/runtime/litert-lm/litert-host.d.ts +17 -0
- package/dist/runtime/litert-lm/litert-host.js +22 -0
- package/dist/runtime/litert-lm/litert-host.js.map +1 -0
- package/dist/runtime/litert-lm/model-yml.d.ts +8 -0
- package/dist/runtime/litert-lm/model-yml.js +67 -0
- package/dist/runtime/litert-lm/model-yml.js.map +1 -0
- package/dist/runtime/litert-lm/npu.d.ts +11 -0
- package/dist/runtime/litert-lm/npu.js +24 -0
- package/dist/runtime/litert-lm/npu.js.map +1 -0
- package/dist/runtime/litert-lm/runtime.d.ts +99 -0
- package/dist/runtime/litert-lm/runtime.js +354 -0
- package/dist/runtime/litert-lm/runtime.js.map +1 -0
- package/dist/runtime/llamacpp/runtime.d.ts +4 -1
- package/dist/runtime/llamacpp/runtime.js +4 -1
- package/dist/runtime/llamacpp/runtime.js.map +1 -1
- package/dist/runtime/shared/external-sessions.js +1 -0
- package/dist/runtime/shared/external-sessions.js.map +1 -1
- package/dist/server/clients.d.ts +6 -0
- package/dist/server/clients.js +11 -0
- package/dist/server/clients.js.map +1 -1
- package/dist/server/control/router.js +2 -0
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/litert-lm.d.ts +11 -0
- package/dist/server/control/routes/litert-lm.js +33 -0
- package/dist/server/control/routes/litert-lm.js.map +1 -0
- package/dist/server/control/routes/public-server.js +22 -0
- package/dist/server/control/routes/public-server.js.map +1 -1
- package/dist/server/control/types.d.ts +16 -1
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +3 -0
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/errors.d.ts +17 -0
- package/dist/server/public/errors.js +28 -0
- package/dist/server/public/errors.js.map +1 -1
- package/dist/server/public/forward.d.ts +20 -1
- package/dist/server/public/forward.js +72 -19
- package/dist/server/public/forward.js.map +1 -1
- package/dist/server/public/listing.d.ts +6 -0
- package/dist/server/public/listing.js +25 -3
- package/dist/server/public/listing.js.map +1 -1
- package/dist/server/public/responses.js +21 -10
- package/dist/server/public/responses.js.map +1 -1
- package/dist/server/public/subscription.js +2 -2
- package/dist/server/public/subscription.js.map +1 -1
- package/dist/server/public/telemetry.d.ts +7 -1
- package/dist/server/public/telemetry.js +11 -3
- package/dist/server/public/telemetry.js.map +1 -1
- package/dist/server/public/trace.d.ts +8 -4
- package/dist/server/public/trace.js +15 -7
- package/dist/server/public/trace.js.map +1 -1
- package/dist/server/public/types.d.ts +5 -0
- package/dist/server/public/videos-params.js +6 -1
- package/dist/server/public/videos-params.js.map +1 -1
- package/dist/settings/schema/litert-lm.json +37 -0
- package/dist/settings/schema.js +9 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +6 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One generation at a time, and conversations kept warm (design D5, task 5.5). The C API offers many
|
|
3
|
+
* conversations on one engine but promises nothing about decoding them in parallel, so requests wait
|
|
4
|
+
* in arrival order rather than fail as busy. Up to four conversations keep their KV cache: a request
|
|
5
|
+
* whose history is exactly what one of them holds sends the library only its new turn.
|
|
6
|
+
*
|
|
7
|
+
* What a conversation is created with — tools, sampling, the constraint provider — the library fixes
|
|
8
|
+
* for its life (spike S2), so it is part of the key: a request with other settings starts a new one.
|
|
9
|
+
*/
|
|
10
|
+
import type { LiteRtConversationConfig, LiteRtMessage } from './library.js';
|
|
11
|
+
/** Waits its turn, in arrival order; a failure does not block the next one. */
|
|
12
|
+
export declare class FifoLock {
|
|
13
|
+
private tail;
|
|
14
|
+
/** Work queued behind the one running, that one included. */
|
|
15
|
+
waiting: number;
|
|
16
|
+
run<T>(fn: () => Promise<T>): Promise<T>;
|
|
17
|
+
}
|
|
18
|
+
/** The key of a history: equal for two copies of one conversation. */
|
|
19
|
+
export declare function historyKey(messages: readonly LiteRtMessage[]): string;
|
|
20
|
+
export type ConversationSettings = Omit<LiteRtConversationConfig, 'messages'>;
|
|
21
|
+
export interface PoolEntry<C> {
|
|
22
|
+
conversation: C;
|
|
23
|
+
/** `historyKey` of everything the conversation holds. */
|
|
24
|
+
key: string;
|
|
25
|
+
settings: string;
|
|
26
|
+
messages: LiteRtMessage[];
|
|
27
|
+
}
|
|
28
|
+
export declare class ConversationPool<C extends {
|
|
29
|
+
close(): void;
|
|
30
|
+
}> {
|
|
31
|
+
private readonly create;
|
|
32
|
+
private readonly limit;
|
|
33
|
+
/** Least recently used first. */
|
|
34
|
+
private readonly entries;
|
|
35
|
+
constructor(create: (config: LiteRtConversationConfig) => C, limit?: number);
|
|
36
|
+
get size(): number;
|
|
37
|
+
/**
|
|
38
|
+
* The conversation to send the next turn on: one holding exactly `history` with these settings,
|
|
39
|
+
* or a new one started from `history`, evicting the least recently used beyond the limit.
|
|
40
|
+
*/
|
|
41
|
+
take(history: LiteRtMessage[], settings: ConversationSettings): {
|
|
42
|
+
conversation: C;
|
|
43
|
+
reused: boolean;
|
|
44
|
+
entry: PoolEntry<C>;
|
|
45
|
+
};
|
|
46
|
+
/** The conversation now also holds `messages` (the turn sent and the reply). */
|
|
47
|
+
advance(entry: PoolEntry<C>, messages: LiteRtMessage[]): void;
|
|
48
|
+
/** Close and forget a conversation that cannot go on (cancelled, or a failed generation). */
|
|
49
|
+
drop(entry: PoolEntry<C>): void;
|
|
50
|
+
closeAll(): void;
|
|
51
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One generation at a time, and conversations kept warm (design D5, task 5.5). The C API offers many
|
|
3
|
+
* conversations on one engine but promises nothing about decoding them in parallel, so requests wait
|
|
4
|
+
* in arrival order rather than fail as busy. Up to four conversations keep their KV cache: a request
|
|
5
|
+
* whose history is exactly what one of them holds sends the library only its new turn.
|
|
6
|
+
*
|
|
7
|
+
* What a conversation is created with — tools, sampling, the constraint provider — the library fixes
|
|
8
|
+
* for its life (spike S2), so it is part of the key: a request with other settings starts a new one.
|
|
9
|
+
*/
|
|
10
|
+
import { createHash } from 'node:crypto';
|
|
11
|
+
/** Waits its turn, in arrival order; a failure does not block the next one. */
|
|
12
|
+
export class FifoLock {
|
|
13
|
+
tail = Promise.resolve();
|
|
14
|
+
/** Work queued behind the one running, that one included. */
|
|
15
|
+
waiting = 0;
|
|
16
|
+
run(fn) {
|
|
17
|
+
this.waiting++;
|
|
18
|
+
const run = this.tail.then(fn);
|
|
19
|
+
const settled = run.then(() => {
|
|
20
|
+
this.waiting--;
|
|
21
|
+
}, () => {
|
|
22
|
+
this.waiting--;
|
|
23
|
+
});
|
|
24
|
+
this.tail = settled;
|
|
25
|
+
return run;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
29
|
+
/** JSON with sorted keys: two equal values, one string. */
|
|
30
|
+
function canonical(value) {
|
|
31
|
+
if (Array.isArray(value))
|
|
32
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
33
|
+
if (isRecord(value))
|
|
34
|
+
return `{${Object.keys(value)
|
|
35
|
+
.sort()
|
|
36
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
|
|
37
|
+
.join(',')}}`;
|
|
38
|
+
return JSON.stringify(value) ?? 'null';
|
|
39
|
+
}
|
|
40
|
+
const digest = (value) => createHash('sha256').update(value).digest('hex');
|
|
41
|
+
/** What two copies of one message share, whatever a client changed in repeating it. */
|
|
42
|
+
function normalize(message) {
|
|
43
|
+
const parts = Array.isArray(message['content']) ? message['content'] : [];
|
|
44
|
+
const text = parts
|
|
45
|
+
.map((part) => isRecord(part) && part['type'] === 'text' && typeof part['text'] === 'string' ? part['text'] : '')
|
|
46
|
+
.join('')
|
|
47
|
+
.trim();
|
|
48
|
+
const other = parts
|
|
49
|
+
.filter((part) => !(isRecord(part) && part['type'] === 'text'))
|
|
50
|
+
.map((part) => isRecord(part) && part['type'] === 'image' && typeof part['blob'] === 'string'
|
|
51
|
+
? { image: digest(part['blob']) }
|
|
52
|
+
: isRecord(part) && part['type'] === 'tool_response'
|
|
53
|
+
? { tool_response: part['name'], response: canonical(part['response']) }
|
|
54
|
+
: canonical(part));
|
|
55
|
+
const calls = (Array.isArray(message['tool_calls']) ? message['tool_calls'] : []).map((call) => {
|
|
56
|
+
const fn = isRecord(call) && isRecord(call['function']) ? call['function'] : {};
|
|
57
|
+
return { name: fn['name'], arguments: canonical(fn['arguments']) };
|
|
58
|
+
});
|
|
59
|
+
return { role: message['role'], text, other, calls };
|
|
60
|
+
}
|
|
61
|
+
/** The key of a history: equal for two copies of one conversation. */
|
|
62
|
+
export function historyKey(messages) {
|
|
63
|
+
return digest(canonical(messages.map(normalize)));
|
|
64
|
+
}
|
|
65
|
+
export class ConversationPool {
|
|
66
|
+
create;
|
|
67
|
+
limit;
|
|
68
|
+
/** Least recently used first. */
|
|
69
|
+
entries = [];
|
|
70
|
+
constructor(create, limit = 4) {
|
|
71
|
+
this.create = create;
|
|
72
|
+
this.limit = limit;
|
|
73
|
+
}
|
|
74
|
+
get size() {
|
|
75
|
+
return this.entries.length;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* The conversation to send the next turn on: one holding exactly `history` with these settings,
|
|
79
|
+
* or a new one started from `history`, evicting the least recently used beyond the limit.
|
|
80
|
+
*/
|
|
81
|
+
take(history, settings) {
|
|
82
|
+
const key = historyKey(history);
|
|
83
|
+
const settingsKey = canonical(settings);
|
|
84
|
+
const at = this.entries.findIndex((entry) => entry.key === key && entry.settings === settingsKey);
|
|
85
|
+
if (at >= 0) {
|
|
86
|
+
const [entry] = this.entries.splice(at, 1);
|
|
87
|
+
this.entries.push(entry);
|
|
88
|
+
return { conversation: entry.conversation, reused: true, entry };
|
|
89
|
+
}
|
|
90
|
+
const conversation = this.create({ messages: history, ...settings });
|
|
91
|
+
const entry = { conversation, key, settings: settingsKey, messages: [...history] };
|
|
92
|
+
this.entries.push(entry);
|
|
93
|
+
while (this.entries.length > this.limit)
|
|
94
|
+
this.entries.shift()?.conversation.close();
|
|
95
|
+
return { conversation, reused: false, entry };
|
|
96
|
+
}
|
|
97
|
+
/** The conversation now also holds `messages` (the turn sent and the reply). */
|
|
98
|
+
advance(entry, messages) {
|
|
99
|
+
entry.messages.push(...messages);
|
|
100
|
+
entry.key = historyKey(entry.messages);
|
|
101
|
+
}
|
|
102
|
+
/** Close and forget a conversation that cannot go on (cancelled, or a failed generation). */
|
|
103
|
+
drop(entry) {
|
|
104
|
+
const at = this.entries.indexOf(entry);
|
|
105
|
+
if (at >= 0)
|
|
106
|
+
this.entries.splice(at, 1);
|
|
107
|
+
entry.conversation.close();
|
|
108
|
+
}
|
|
109
|
+
closeAll() {
|
|
110
|
+
for (const entry of this.entries.splice(0))
|
|
111
|
+
entry.conversation.close();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool.js","sourceRoot":"","sources":["../../../../src/runtime/litert-lm/host/pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hidden `litert-host` mode of the core binaries (openspec change `add-litert-lm-runtime`, design
|
|
3
|
+
* D1): one process per model or command, so a crash of Google's native library never takes the core
|
|
4
|
+
* down. Core starts it with `process.execPath`; nothing else should.
|
|
5
|
+
*
|
|
6
|
+
* stdout carries JSON lines only: the probe answer, the file metadata, or `serve`'s readiness line.
|
|
7
|
+
* Errors go to stderr; the ones core maps to its own codes are one JSON line `{code, …}` there.
|
|
8
|
+
*/
|
|
9
|
+
import type { LoadLiteRtLibrary } from './library.js';
|
|
10
|
+
/** The host's exit codes; core reads 6 and 7 as its `LITERT_LM_*` codes. */
|
|
11
|
+
export declare const EXIT: {
|
|
12
|
+
readonly ok: 0;
|
|
13
|
+
/** A bug on core's side. */
|
|
14
|
+
readonly usage: 2;
|
|
15
|
+
/** The library does not load (or its stream shim does not compile). */
|
|
16
|
+
readonly load: 3;
|
|
17
|
+
/** A library call failed: a broken file, an engine the backend cannot create, a port in use. */
|
|
18
|
+
readonly libraryCall: 4;
|
|
19
|
+
readonly requiresNewerEngine: 6;
|
|
20
|
+
readonly variantUnsupported: 7;
|
|
21
|
+
};
|
|
22
|
+
export interface StopWatch {
|
|
23
|
+
stopped: Promise<void>;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
}
|
|
26
|
+
export interface LiteRtHostDeps {
|
|
27
|
+
stdout: (line: string) => void;
|
|
28
|
+
stderr: (line: string) => void;
|
|
29
|
+
loadLibrary: LoadLiteRtLibrary;
|
|
30
|
+
/** SIGTERM, SIGINT or stdin closed; made before the engine, so an early stop is never missed. */
|
|
31
|
+
watchStop?: () => StopWatch;
|
|
32
|
+
}
|
|
33
|
+
/** SIGTERM, SIGINT or the end of stdin, whichever comes first (Windows has no SIGTERM). */
|
|
34
|
+
export declare function watchStopSignals(): StopWatch;
|
|
35
|
+
/** Line-oriented output over a stream-oriented CLI io. */
|
|
36
|
+
export declare function lineIo(io: {
|
|
37
|
+
stdout: (text: string) => void;
|
|
38
|
+
stderr: (text: string) => void;
|
|
39
|
+
}): Pick<LiteRtHostDeps, 'stdout' | 'stderr'>;
|
|
40
|
+
/** Opens the library through `bun:ffi`; under Node this mode cannot run, and says so. */
|
|
41
|
+
export declare const loadLibraryWithBun: LoadLiteRtLibrary;
|
|
42
|
+
/**
|
|
43
|
+
* Where a build keeps the library: `<build>/lib` (task 4.2), absolute. Windows searches DLLs in the
|
|
44
|
+
* folder `SetDllDirectoryW` names instead of the working one, so a relative path would not load.
|
|
45
|
+
*/
|
|
46
|
+
export declare function libraryDir(build: string): string;
|
|
47
|
+
/** Runs `litert-host <argv…>` and returns its exit code. */
|
|
48
|
+
export declare function runLiteRtHost(argv: readonly string[], deps: LiteRtHostDeps): Promise<number>;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The hidden `litert-host` mode of the core binaries (openspec change `add-litert-lm-runtime`, design
|
|
3
|
+
* D1): one process per model or command, so a crash of Google's native library never takes the core
|
|
4
|
+
* down. Core starts it with `process.execPath`; nothing else should.
|
|
5
|
+
*
|
|
6
|
+
* stdout carries JSON lines only: the probe answer, the file metadata, or `serve`'s readiness line.
|
|
7
|
+
* Errors go to stderr; the ones core maps to its own codes are one JSON line `{code, …}` there.
|
|
8
|
+
*/
|
|
9
|
+
import { mkdir } from 'node:fs/promises';
|
|
10
|
+
import { resolve } from 'node:path';
|
|
11
|
+
import { LiteRtHostUsageError, parseLiteRtHostArgs } from './args.js';
|
|
12
|
+
import { LiteRtLibraryError } from './library.js';
|
|
13
|
+
import { compareVersions } from '../../../backend/index.js';
|
|
14
|
+
import { createLiteRtServer } from './server.js';
|
|
15
|
+
/** The host's exit codes; core reads 6 and 7 as its `LITERT_LM_*` codes. */
|
|
16
|
+
export const EXIT = {
|
|
17
|
+
ok: 0,
|
|
18
|
+
/** A bug on core's side. */
|
|
19
|
+
usage: 2,
|
|
20
|
+
/** The library does not load (or its stream shim does not compile). */
|
|
21
|
+
load: 3,
|
|
22
|
+
/** A library call failed: a broken file, an engine the backend cannot create, a port in use. */
|
|
23
|
+
libraryCall: 4,
|
|
24
|
+
requiresNewerEngine: 6,
|
|
25
|
+
variantUnsupported: 7,
|
|
26
|
+
};
|
|
27
|
+
/** SIGTERM, SIGINT or the end of stdin, whichever comes first (Windows has no SIGTERM). */
|
|
28
|
+
export function watchStopSignals() {
|
|
29
|
+
let resolve = () => { };
|
|
30
|
+
const stopped = new Promise((done) => (resolve = done));
|
|
31
|
+
const stop = () => resolve();
|
|
32
|
+
process.on('SIGTERM', stop);
|
|
33
|
+
process.on('SIGINT', stop);
|
|
34
|
+
process.stdin.on('end', stop);
|
|
35
|
+
process.stdin.on('close', stop);
|
|
36
|
+
process.stdin.resume();
|
|
37
|
+
return {
|
|
38
|
+
stopped,
|
|
39
|
+
dispose() {
|
|
40
|
+
process.off('SIGTERM', stop);
|
|
41
|
+
process.off('SIGINT', stop);
|
|
42
|
+
process.stdin.off('end', stop);
|
|
43
|
+
process.stdin.off('close', stop);
|
|
44
|
+
process.stdin.pause();
|
|
45
|
+
process.stdin.destroy();
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** Line-oriented output over a stream-oriented CLI io. */
|
|
50
|
+
export function lineIo(io) {
|
|
51
|
+
return { stdout: (line) => io.stdout(`${line}\n`), stderr: (line) => io.stderr(`${line}\n`) };
|
|
52
|
+
}
|
|
53
|
+
/** Opens the library through `bun:ffi`; under Node this mode cannot run, and says so. */
|
|
54
|
+
export const loadLibraryWithBun = async (libDir, options) => {
|
|
55
|
+
let module;
|
|
56
|
+
try {
|
|
57
|
+
module = await import('./ffi-bun.js');
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
throw new LiteRtLibraryError('load', `litert-host runs only inside a compiled binary (${error instanceof Error ? error.message : String(error)})`);
|
|
61
|
+
}
|
|
62
|
+
return module.loadBunLiteRtLibrary(libDir, options);
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Where a build keeps the library: `<build>/lib` (task 4.2), absolute. Windows searches DLLs in the
|
|
66
|
+
* folder `SetDllDirectoryW` names instead of the working one, so a relative path would not load.
|
|
67
|
+
*/
|
|
68
|
+
export function libraryDir(build) {
|
|
69
|
+
return resolve(build, 'lib');
|
|
70
|
+
}
|
|
71
|
+
const json = (value) => JSON.stringify(value);
|
|
72
|
+
/** Runs `litert-host <argv…>` and returns its exit code. */
|
|
73
|
+
export async function runLiteRtHost(argv, deps) {
|
|
74
|
+
let args;
|
|
75
|
+
try {
|
|
76
|
+
args = parseLiteRtHostArgs(argv);
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
deps.stderr(error instanceof LiteRtHostUsageError ? error.message : String(error));
|
|
80
|
+
return EXIT.usage;
|
|
81
|
+
}
|
|
82
|
+
let library;
|
|
83
|
+
try {
|
|
84
|
+
library = await deps.loadLibrary(libraryDir(args.lib), args.mode === 'serve' && args.ovLibs ? { ovLibsDir: resolve(args.ovLibs) } : undefined);
|
|
85
|
+
}
|
|
86
|
+
catch (error) {
|
|
87
|
+
deps.stderr(`LiteRT-LM does not load from ${args.lib}: ${error instanceof Error ? error.message : String(error)}`);
|
|
88
|
+
return EXIT.load;
|
|
89
|
+
}
|
|
90
|
+
try {
|
|
91
|
+
if (args.mode === 'probe') {
|
|
92
|
+
deps.stdout(json({ version: library.version, abi: library.abi, backends: library.backends }));
|
|
93
|
+
return EXIT.ok;
|
|
94
|
+
}
|
|
95
|
+
if (args.mode === 'inspect') {
|
|
96
|
+
deps.stdout(json(library.inspect(args.file)));
|
|
97
|
+
return EXIT.ok;
|
|
98
|
+
}
|
|
99
|
+
return await serve(library, args, deps);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
deps.stderr(error instanceof Error ? error.message : String(error));
|
|
103
|
+
return EXIT.libraryCall;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function serve(library, args, deps) {
|
|
107
|
+
const watch = (deps.watchStop ?? watchStopSignals)();
|
|
108
|
+
try {
|
|
109
|
+
const info = library.inspect(args.model);
|
|
110
|
+
if (info.min_runtime_version && compareVersions(info.min_runtime_version, args.engineVersion) > 0) {
|
|
111
|
+
deps.stderr(json({
|
|
112
|
+
code: 'LITERT_LM_MODEL_REQUIRES_NEWER_ENGINE',
|
|
113
|
+
required: info.min_runtime_version,
|
|
114
|
+
engine: args.engineVersion,
|
|
115
|
+
}));
|
|
116
|
+
return EXIT.requiresNewerEngine;
|
|
117
|
+
}
|
|
118
|
+
if (!info.backends.includes(args.backend)) {
|
|
119
|
+
deps.stderr(json({
|
|
120
|
+
code: 'LITERT_LM_VARIANT_UNSUPPORTED',
|
|
121
|
+
backend: args.backend,
|
|
122
|
+
backends: info.backends,
|
|
123
|
+
message: `This file runs on ${info.backends.join(', ') || 'no backend'}, not ${args.backend}.`,
|
|
124
|
+
}));
|
|
125
|
+
return EXIT.variantUnsupported;
|
|
126
|
+
}
|
|
127
|
+
await mkdir(args.cache, { recursive: true });
|
|
128
|
+
const maxNumTokens = Math.min(args.maxTokens, info.max_context_tokens ?? args.maxTokens);
|
|
129
|
+
const visionBackend = info.modalities.includes('vision') ? (info.vision_backends[0] ?? null) : null;
|
|
130
|
+
const speculative = args.speculative && info.speculative_decoding;
|
|
131
|
+
const engine = library.createEngine({
|
|
132
|
+
model: args.model,
|
|
133
|
+
backend: args.backend,
|
|
134
|
+
visionBackend,
|
|
135
|
+
maxNumTokens,
|
|
136
|
+
cacheDir: args.cache,
|
|
137
|
+
...(args.dispatch ? { dispatchLibDir: resolve(args.dispatch) } : {}),
|
|
138
|
+
speculative,
|
|
139
|
+
});
|
|
140
|
+
const server = createLiteRtServer({
|
|
141
|
+
engine,
|
|
142
|
+
modelId: args.id,
|
|
143
|
+
caps: { vision: visionBackend !== null, reasoning: args.reasoning },
|
|
144
|
+
log: (line) => deps.stderr(line),
|
|
145
|
+
});
|
|
146
|
+
try {
|
|
147
|
+
const url = await server.listen(args.port);
|
|
148
|
+
deps.stdout(json({
|
|
149
|
+
ready: true,
|
|
150
|
+
url,
|
|
151
|
+
model_id: args.id,
|
|
152
|
+
backend: args.backend,
|
|
153
|
+
max_num_tokens: maxNumTokens,
|
|
154
|
+
vision: visionBackend !== null,
|
|
155
|
+
speculative,
|
|
156
|
+
}));
|
|
157
|
+
await watch.stopped;
|
|
158
|
+
return EXIT.ok;
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
await server.close();
|
|
162
|
+
engine.close();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
watch.dispose();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../../src/runtime/litert-lm/host/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host's own OpenAI server (design D5, tasks 5.4–5.5): `GET /v1/models` and
|
|
3
|
+
* `POST /v1/chat/completions` on `127.0.0.1:<port>`, with no authentication — core's session gateway
|
|
4
|
+
* is the only door in, and it checks the key. Generations run one at a time in arrival order
|
|
5
|
+
* (`FifoLock`); conversations stay warm in a `ConversationPool`.
|
|
6
|
+
*
|
|
7
|
+
* A client that hangs up cancels its generation in the library; a stop string cancels it too. A
|
|
8
|
+
* cancelled conversation answers every later message with `CANCELLED` (spike S2), so it leaves the
|
|
9
|
+
* pool, as does one whose generation failed.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelCaps } from './openai.js';
|
|
12
|
+
import type { LiteRtEngine } from './library.js';
|
|
13
|
+
export interface LiteRtServerOptions {
|
|
14
|
+
engine: LiteRtEngine;
|
|
15
|
+
/** What `/v1/models` lists and replies carry as `model`: core's session id. */
|
|
16
|
+
modelId: string;
|
|
17
|
+
caps: ModelCaps;
|
|
18
|
+
now?: () => number;
|
|
19
|
+
/** One line per failed generation, for the host's stderr (core keeps its tail). */
|
|
20
|
+
log?: (line: string) => void;
|
|
21
|
+
}
|
|
22
|
+
export interface LiteRtServer {
|
|
23
|
+
/** Listen on loopback; the base URL (`http://127.0.0.1:<port>`). */
|
|
24
|
+
listen(port: number): Promise<string>;
|
|
25
|
+
/** Stop accepting, cancel what runs, close every conversation. */
|
|
26
|
+
close(): Promise<void>;
|
|
27
|
+
}
|
|
28
|
+
export declare function createLiteRtServer(options: LiteRtServerOptions): LiteRtServer;
|