-
Notifications
You must be signed in to change notification settings - Fork 3k
Expand file tree
/
Copy pathdocker-llama-cpp-operation.ts
More file actions
131 lines (122 loc) · 4.79 KB
/
Copy pathdocker-llama-cpp-operation.ts
File metadata and controls
131 lines (122 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: Apache-2.0
import {
type ContainerEngine,
type ContainerEngineCommandCapture,
} from "../../adapters/container-engine";
import { prependInstalledUserLocalOpenshellPath } from "../openshell-pin";
import { getFutureShellPathHint } from "../remediation";
import {
createDockerLlamaCppManagedLifecycle,
type DockerLlamaCppManagedLifecycle,
} from "./docker-llama-cpp-managed-lifecycle";
import {
createDockerOperationAuthority,
dockerOperationBindingSha256,
dockerOperationCommandArguments,
} from "./docker-operation-authority";
import type {
HostLocalInferenceCommandSpawner,
HostLocalInferenceOperation,
} from "./host-local-inference";
export interface DockerLlamaCppOperationAuthority {
readonly assertAuthority: () => void;
readonly engine: ContainerEngine;
readonly spawn: HostLocalInferenceCommandSpawner;
}
function withManagedLlamaCppError<T>(run: () => T): T {
try {
return run();
} catch (error) {
if (error instanceof Error && error.message.startsWith("Docker operation ")) {
throw new Error(error.message.replace(/^Docker operation /u, "Managed llama.cpp "));
}
if (error instanceof Error && error.message.startsWith("Docker context endpoint changed ")) {
throw new Error(`Managed llama.cpp ${error.message}`);
}
throw error;
}
}
function managedLlamaCppEngine(engine: ContainerEngine): ContainerEngine {
return Object.freeze({
operation: engine.operation,
engineId: engine.engineId,
displayName: engine.displayName,
authorityId: engine.authorityId,
capture: (args: readonly string[], timeoutMs?: number, input?: Buffer) =>
withManagedLlamaCppError(() => engine.capture(args, timeoutMs, input)),
captureHost: (args: readonly string[], timeoutMs?: number) =>
withManagedLlamaCppError(() => engine.captureHost(args, timeoutMs)),
});
}
/** Bind synchronous lifecycle commands and streamed acquisition to one qualified daemon. */
export function createDockerLlamaCppOperationAuthority(
env: NodeJS.ProcessEnv = process.env,
capture?: ContainerEngineCommandCapture,
spawnCommand?: HostLocalInferenceCommandSpawner,
): DockerLlamaCppOperationAuthority {
const operationEnv = { ...env };
prependInstalledUserLocalOpenshellPath({
env: operationEnv,
getFutureShellPathHint,
});
const authority = withManagedLlamaCppError(() =>
createDockerOperationAuthority("host-local-inference", operationEnv, capture),
);
const assertAuthority = () => withManagedLlamaCppError(authority.assertAuthority);
return Object.freeze({
assertAuthority,
engine: managedLlamaCppEngine(authority.engine),
spawn: (args: readonly string[], options?: Parameters<HostLocalInferenceCommandSpawner>[1]) => {
assertAuthority();
return spawnCommand
? spawnCommand([...dockerOperationCommandArguments(authority, args)], options)
: authority.spawn(args, options);
},
});
}
export function dockerLlamaCppBindingSha256(engine: ContainerEngine): string {
return dockerOperationBindingSha256(engine);
}
export function createDockerLlamaCppHostLocalOperation(
env: NodeJS.ProcessEnv = process.env,
capture?: ContainerEngineCommandCapture,
spawnCommand?: HostLocalInferenceCommandSpawner,
createLifecycle: (
input: Parameters<typeof createDockerLlamaCppManagedLifecycle>[0],
) => DockerLlamaCppManagedLifecycle = createDockerLlamaCppManagedLifecycle,
): HostLocalInferenceOperation {
const authority = createDockerLlamaCppOperationAuthority(env, capture, spawnCommand);
return Object.freeze({
providerId: "docker",
engine: authority.engine,
bindingSha256: dockerLlamaCppBindingSha256(authority.engine),
assertAuthority: authority.assertAuthority,
spawn: authority.spawn,
createLlamaCppLifecycle: createLifecycle,
});
}
export function createManagedLlamaCppEngine(
env: NodeJS.ProcessEnv = process.env,
capture?: ContainerEngineCommandCapture,
): ContainerEngine {
return createDockerLlamaCppHostLocalOperation(env, capture).engine;
}
/** Rebind an already injected Docker engine for read-only status inspection. */
export function createDockerLlamaCppInspectionOperation(
engine: ContainerEngine,
): HostLocalInferenceOperation {
if (engine.operation !== "host-local-inference" || engine.engineId !== "docker") {
throw new Error("Managed llama.cpp inspection requires a Docker host-local-inference engine.");
}
return Object.freeze({
providerId: "docker",
engine,
bindingSha256: dockerLlamaCppBindingSha256(engine),
assertAuthority: () => undefined,
spawn: () => {
throw new Error("Managed llama.cpp inspection cannot spawn container-engine commands.");
},
createLlamaCppLifecycle: createDockerLlamaCppManagedLifecycle,
});
}