llama-cpp-pro 0.2.2
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/CHANGELOG.md +295 -0
- package/LICENSE +21 -0
- package/LlamaCpp.podspec +33 -0
- package/LlamaCppCapacitor.podspec +33 -0
- package/Package.swift +29 -0
- package/README.md +93 -0
- package/android/build.gradle +88 -0
- package/android/src/main/AndroidManifest.xml +4 -0
- package/android/src/main/CMakeLists-arm64.txt +138 -0
- package/android/src/main/CMakeLists-x86_64.txt +141 -0
- package/android/src/main/CMakeLists.txt +138 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCpp.java +1340 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/LlamaCppPlugin.java +814 -0
- package/android/src/main/java/ai/annadata/plugin/capacitor/ModelAdmissionController.java +214 -0
- package/android/src/main/jni-chat-session.cpp +261 -0
- package/android/src/main/jni-lora.cpp +197 -0
- package/android/src/main/jni-multimodal.cpp +167 -0
- package/android/src/main/jni-tts.cpp +290 -0
- package/android/src/main/jni-utils.h +148 -0
- package/android/src/main/jni.cpp +1808 -0
- package/android/src/main/jniLibs/arm64-v8a/libllama-cpp-arm64.so +0 -0
- package/android/src/main/res/.gitkeep +0 -0
- package/build-native.sh +280 -0
- package/cmake/desktop-metal-embed.cmake +30 -0
- package/cmake/desktop-sources.cmake +100 -0
- package/cmake/ggml-backends.cmake +44 -0
- package/cpp/LICENSE +21 -0
- package/cpp/README.md +15 -0
- package/cpp/anyascii.c +22223 -0
- package/cpp/anyascii.h +42 -0
- package/cpp/cap-completion.cpp +942 -0
- package/cpp/cap-completion.h +127 -0
- package/cpp/cap-embedding.cpp +193 -0
- package/cpp/cap-embedding.h +35 -0
- package/cpp/cap-ios-bridge.cpp +1810 -0
- package/cpp/cap-ios-bridge.h +61 -0
- package/cpp/cap-llama.cpp +412 -0
- package/cpp/cap-llama.h +161 -0
- package/cpp/cap-mtmd.hpp +602 -0
- package/cpp/cap-native-server.cpp +1095 -0
- package/cpp/cap-native-server.h +40 -0
- package/cpp/cap-tts.cpp +591 -0
- package/cpp/cap-tts.h +59 -0
- package/cpp/cap-wasm-fs.cpp +156 -0
- package/cpp/cap-wasm-jspi.cpp +19 -0
- package/cpp/cap-wasm-jspi.h +30 -0
- package/cpp/cap-wasm-vfs.cpp +22 -0
- package/cpp/chat-parser.cpp +393 -0
- package/cpp/chat-parser.h +120 -0
- package/cpp/chat.cpp +2315 -0
- package/cpp/chat.h +221 -0
- package/cpp/common.cpp +1664 -0
- package/cpp/common.h +744 -0
- package/cpp/ggml-alloc.c +1028 -0
- package/cpp/ggml-alloc.h +76 -0
- package/cpp/ggml-backend-impl.h +255 -0
- package/cpp/ggml-backend-reg.cpp +600 -0
- package/cpp/ggml-backend.cpp +2121 -0
- package/cpp/ggml-backend.h +354 -0
- package/cpp/ggml-common.h +1878 -0
- package/cpp/ggml-cpp.h +39 -0
- package/cpp/ggml-cpu/amx/amx.cpp +221 -0
- package/cpp/ggml-cpu/amx/amx.h +8 -0
- package/cpp/ggml-cpu/amx/common.h +91 -0
- package/cpp/ggml-cpu/amx/mmq.cpp +2512 -0
- package/cpp/ggml-cpu/amx/mmq.h +10 -0
- package/cpp/ggml-cpu/arch/arm/cpu-feats.cpp +94 -0
- package/cpp/ggml-cpu/arch/arm/quants.c +3650 -0
- package/cpp/ggml-cpu/arch/arm/repack.cpp +1891 -0
- package/cpp/ggml-cpu/arch/x86/cpu-feats.cpp +327 -0
- package/cpp/ggml-cpu/arch/x86/quants.c +3820 -0
- package/cpp/ggml-cpu/arch/x86/repack.cpp +6307 -0
- package/cpp/ggml-cpu/arch-fallback.h +215 -0
- package/cpp/ggml-cpu/binary-ops.cpp +158 -0
- package/cpp/ggml-cpu/binary-ops.h +16 -0
- package/cpp/ggml-cpu/common.h +73 -0
- package/cpp/ggml-cpu/ggml-cpu-impl.h +559 -0
- package/cpp/ggml-cpu/ggml-cpu.c +3578 -0
- package/cpp/ggml-cpu/ggml-cpu.cpp +672 -0
- package/cpp/ggml-cpu/ops.cpp +10587 -0
- package/cpp/ggml-cpu/ops.h +114 -0
- package/cpp/ggml-cpu/quants.c +1193 -0
- package/cpp/ggml-cpu/quants.h +97 -0
- package/cpp/ggml-cpu/repack.cpp +1982 -0
- package/cpp/ggml-cpu/repack.h +120 -0
- package/cpp/ggml-cpu/simd-mappings.h +1184 -0
- package/cpp/ggml-cpu/traits.cpp +36 -0
- package/cpp/ggml-cpu/traits.h +38 -0
- package/cpp/ggml-cpu/unary-ops.cpp +186 -0
- package/cpp/ggml-cpu/unary-ops.h +28 -0
- package/cpp/ggml-cpu/vec.cpp +348 -0
- package/cpp/ggml-cpu/vec.h +1121 -0
- package/cpp/ggml-cpu.h +145 -0
- package/cpp/ggml-impl.h +622 -0
- package/cpp/ggml-metal-impl.h +688 -0
- package/cpp/ggml-metal.h +66 -0
- package/cpp/ggml-metal.m +6833 -0
- package/cpp/ggml-metal.metal +10754 -0
- package/cpp/ggml-opt.cpp +1093 -0
- package/cpp/ggml-opt.h +256 -0
- package/cpp/ggml-quants.c +5324 -0
- package/cpp/ggml-quants.h +106 -0
- package/cpp/ggml-threading.cpp +12 -0
- package/cpp/ggml-threading.h +14 -0
- package/cpp/ggml.c +7108 -0
- package/cpp/ggml.h +2492 -0
- package/cpp/gguf.cpp +1358 -0
- package/cpp/gguf.h +202 -0
- package/cpp/json-partial.cpp +256 -0
- package/cpp/json-partial.h +38 -0
- package/cpp/json-schema-to-grammar.cpp +985 -0
- package/cpp/json-schema-to-grammar.h +21 -0
- package/cpp/llama-adapter.cpp +388 -0
- package/cpp/llama-adapter.h +76 -0
- package/cpp/llama-arch.cpp +2355 -0
- package/cpp/llama-arch.h +499 -0
- package/cpp/llama-batch.cpp +875 -0
- package/cpp/llama-batch.h +160 -0
- package/cpp/llama-chat.cpp +783 -0
- package/cpp/llama-chat.h +65 -0
- package/cpp/llama-context.cpp +2788 -0
- package/cpp/llama-context.h +306 -0
- package/cpp/llama-cparams.cpp +5 -0
- package/cpp/llama-cparams.h +41 -0
- package/cpp/llama-cpp.h +30 -0
- package/cpp/llama-grammar.cpp +1229 -0
- package/cpp/llama-grammar.h +173 -0
- package/cpp/llama-graph.cpp +1891 -0
- package/cpp/llama-graph.h +810 -0
- package/cpp/llama-hparams.cpp +180 -0
- package/cpp/llama-hparams.h +233 -0
- package/cpp/llama-impl.cpp +167 -0
- package/cpp/llama-impl.h +61 -0
- package/cpp/llama-io.cpp +15 -0
- package/cpp/llama-io.h +35 -0
- package/cpp/llama-kv-cache-iswa.cpp +318 -0
- package/cpp/llama-kv-cache-iswa.h +135 -0
- package/cpp/llama-kv-cache.cpp +2059 -0
- package/cpp/llama-kv-cache.h +374 -0
- package/cpp/llama-kv-cells.h +491 -0
- package/cpp/llama-memory-hybrid.cpp +258 -0
- package/cpp/llama-memory-hybrid.h +137 -0
- package/cpp/llama-memory-recurrent.cpp +1146 -0
- package/cpp/llama-memory-recurrent.h +179 -0
- package/cpp/llama-memory.cpp +59 -0
- package/cpp/llama-memory.h +119 -0
- package/cpp/llama-mmap.cpp +609 -0
- package/cpp/llama-mmap.h +68 -0
- package/cpp/llama-model-loader.cpp +1166 -0
- package/cpp/llama-model-loader.h +170 -0
- package/cpp/llama-model-saver.cpp +282 -0
- package/cpp/llama-model-saver.h +37 -0
- package/cpp/llama-model.cpp +19061 -0
- package/cpp/llama-model.h +491 -0
- package/cpp/llama-sampling.cpp +2575 -0
- package/cpp/llama-sampling.h +32 -0
- package/cpp/llama-vocab.cpp +3792 -0
- package/cpp/llama-vocab.h +176 -0
- package/cpp/llama.cpp +358 -0
- package/cpp/llama.h +1373 -0
- package/cpp/log.cpp +428 -0
- package/cpp/log.h +103 -0
- package/cpp/minja/chat-template.hpp +550 -0
- package/cpp/minja/minja.hpp +3009 -0
- package/cpp/nlohmann/json.hpp +25526 -0
- package/cpp/nlohmann/json_fwd.hpp +187 -0
- package/cpp/regex-partial.cpp +204 -0
- package/cpp/regex-partial.h +56 -0
- package/cpp/sampling.cpp +579 -0
- package/cpp/sampling.h +107 -0
- package/cpp/tools/mtmd/clip-impl.h +473 -0
- package/cpp/tools/mtmd/clip.cpp +4322 -0
- package/cpp/tools/mtmd/clip.h +106 -0
- package/cpp/tools/mtmd/miniaudio/miniaudio.h +93468 -0
- package/cpp/tools/mtmd/mtmd-audio.cpp +769 -0
- package/cpp/tools/mtmd/mtmd-audio.h +47 -0
- package/cpp/tools/mtmd/mtmd-helper.cpp +460 -0
- package/cpp/tools/mtmd/mtmd-helper.h +95 -0
- package/cpp/tools/mtmd/mtmd.cpp +1066 -0
- package/cpp/tools/mtmd/mtmd.h +302 -0
- package/cpp/tools/mtmd/stb/stb_image.h +7988 -0
- package/cpp/unicode-data.cpp +7034 -0
- package/cpp/unicode-data.h +20 -0
- package/cpp/unicode.cpp +1061 -0
- package/cpp/unicode.h +68 -0
- package/cpp/vendor/cpp-httplib/httplib.cpp +16509 -0
- package/cpp/vendor/cpp-httplib/httplib.h +3883 -0
- package/desktop/electron-builder.config.cjs +157 -0
- package/desktop/entitlements.mac.plist +12 -0
- package/desktop/package.json +11 -0
- package/desktop/resolve-package-root.cjs +88 -0
- package/desktop/src/main/backend-selector.cjs +148 -0
- package/desktop/src/main/gpu-probe.cjs +142 -0
- package/desktop/src/main/index.cjs +58 -0
- package/desktop/src/main/ipc-handlers.cjs +212 -0
- package/desktop/src/main/model-store.cjs +50 -0
- package/desktop/src/main/preload.cjs +39 -0
- package/desktop/src/main/sidecar-client.cjs +76 -0
- package/desktop/src/main/sidecar-manager.cjs +364 -0
- package/dist/docs.json +14357 -0
- package/dist/esm/definitions.d.ts +731 -0
- package/dist/esm/definitions.js +2 -0
- package/dist/esm/definitions.js.map +1 -0
- package/dist/esm/desktop.d.ts +37 -0
- package/dist/esm/desktop.js +133 -0
- package/dist/esm/desktop.js.map +1 -0
- package/dist/esm/index.d.ts +200 -0
- package/dist/esm/index.js +612 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/isomorphic/desktop.runtime.d.ts +37 -0
- package/dist/esm/isomorphic/desktop.runtime.js +36 -0
- package/dist/esm/isomorphic/desktop.runtime.js.map +1 -0
- package/dist/esm/isomorphic/errors.d.ts +6 -0
- package/dist/esm/isomorphic/errors.js +9 -0
- package/dist/esm/isomorphic/errors.js.map +1 -0
- package/dist/esm/isomorphic/model.admission.d.ts +17 -0
- package/dist/esm/isomorphic/model.admission.js +27 -0
- package/dist/esm/isomorphic/model.admission.js.map +1 -0
- package/dist/esm/isomorphic/model.scheduler.d.ts +31 -0
- package/dist/esm/isomorphic/model.scheduler.js +95 -0
- package/dist/esm/isomorphic/model.scheduler.js.map +1 -0
- package/dist/esm/isomorphic/provider.desktop.d.ts +40 -0
- package/dist/esm/isomorphic/provider.desktop.js +411 -0
- package/dist/esm/isomorphic/provider.desktop.js.map +1 -0
- package/dist/esm/isomorphic/provider.factory.d.ts +2 -0
- package/dist/esm/isomorphic/provider.factory.js +16 -0
- package/dist/esm/isomorphic/provider.factory.js.map +1 -0
- package/dist/esm/isomorphic/provider.interface.d.ts +76 -0
- package/dist/esm/isomorphic/provider.interface.js +2 -0
- package/dist/esm/isomorphic/provider.interface.js.map +1 -0
- package/dist/esm/isomorphic/provider.native.d.ts +18 -0
- package/dist/esm/isomorphic/provider.native.js +173 -0
- package/dist/esm/isomorphic/provider.native.js.map +1 -0
- package/dist/esm/isomorphic/provider.web.d.ts +88 -0
- package/dist/esm/isomorphic/provider.web.js +573 -0
- package/dist/esm/isomorphic/provider.web.js.map +1 -0
- package/dist/esm/isomorphic/sidecar-sse.d.ts +14 -0
- package/dist/esm/isomorphic/sidecar-sse.js +76 -0
- package/dist/esm/isomorphic/sidecar-sse.js.map +1 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.d.ts +26 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.js +60 -0
- package/dist/esm/isomorphic/wasmMemoryCalibration.js.map +1 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.d.ts +55 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.js +93 -0
- package/dist/esm/isomorphic/wasmMemoryPolicy.js.map +1 -0
- package/dist/esm/storage/manifest.d.ts +13 -0
- package/dist/esm/storage/manifest.js +87 -0
- package/dist/esm/storage/manifest.js.map +1 -0
- package/dist/esm/storage/opfs.store.d.ts +31 -0
- package/dist/esm/storage/opfs.store.js +241 -0
- package/dist/esm/storage/opfs.store.js.map +1 -0
- package/dist/esm/web.d.ts +206 -0
- package/dist/esm/web.js +521 -0
- package/dist/esm/web.js.map +1 -0
- package/dist/esm/workers/async-file.d.ts +13 -0
- package/dist/esm/workers/async-file.js +12 -0
- package/dist/esm/workers/async-file.js.map +1 -0
- package/dist/esm/workers/heapfs.d.ts +55 -0
- package/dist/esm/workers/heapfs.js +115 -0
- package/dist/esm/workers/heapfs.js.map +1 -0
- package/dist/esm/workers/wasm.engine.d.ts +86 -0
- package/dist/esm/workers/wasm.engine.js +504 -0
- package/dist/esm/workers/wasm.engine.js.map +1 -0
- package/dist/esm/workers/worker.protocol.d.ts +160 -0
- package/dist/esm/workers/worker.protocol.js +2 -0
- package/dist/esm/workers/worker.protocol.js.map +1 -0
- package/dist/plugin.cjs +3179 -0
- package/dist/plugin.cjs.map +1 -0
- package/dist/plugin.js +3181 -0
- package/dist/plugin.js.map +1 -0
- package/dist/wasm/llama_engine.d.ts +74 -0
- package/dist/wasm/llama_engine.js +1829 -0
- package/dist/wasm/llama_engine.wasm +0 -0
- package/dist/wasm/llama_engine_emscripten.mjs +2 -0
- package/dist/wasm/package.json +16 -0
- package/dist/workers/llm.worker.js +1226 -0
- package/dist/workers/llm.worker.js.map +7 -0
- package/extraResources/llama-wasm/llama_engine.d.ts +74 -0
- package/extraResources/llama-wasm/llama_engine.js +1829 -0
- package/extraResources/llama-wasm/llama_engine.wasm +0 -0
- package/extraResources/llama-wasm/llama_engine_emscripten.mjs +2 -0
- package/extraResources/llama-wasm/package.json +16 -0
- package/extraResources/sidecar/README.md +11 -0
- package/extraResources/sidecar/darwin-arm64 +0 -0
- package/extraResources/sidecar/darwin-x64 +0 -0
- package/ios/CMakeLists-arm64.txt +161 -0
- package/ios/CMakeLists-x86_64.txt +188 -0
- package/ios/CMakeLists.txt +161 -0
- package/ios/Frameworks/llama-cpp.framework/Info.plist +28 -0
- package/ios/Frameworks/llama-cpp.framework/llama-cpp +0 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaCpp.swift +1365 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaCppPlugin.swift +694 -0
- package/ios/Sources/LlamaCppCapacitor/LlamaNativeBridge.swift +349 -0
- package/ios/Sources/LlamaCppCapacitor/ModelAdmissionController.swift +177 -0
- package/ios/embed-metal-shaders.sh +24 -0
- package/ios/metal-embed.cmake +29 -0
- package/package.json +281 -0
- package/scripts/build-js-preserve-wasm.cjs +53 -0
- package/scripts/build-sidecar-linux.sh +6 -0
- package/scripts/build-sidecar-win.bat +19 -0
- package/scripts/build-sidecar.sh +184 -0
- package/scripts/embed-llama-ios-app-framework.sh +63 -0
- package/scripts/ensure-desktop-sidecar-bundle.cjs +103 -0
- package/scripts/ensure-llama-ios-xcframework.sh +108 -0
- package/scripts/fix-esm-extensions.cjs +45 -0
- package/scripts/prepare-js-dist.cjs +28 -0
- package/scripts/stage-desktop-resources.cjs +116 -0
- package/sidecar/CMakeLists.txt +192 -0
- package/sidecar/cap-sidecar-main.cpp +68 -0
- package/types/llama-cpp-pro.d.ts +441 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Preflight check before electron-builder packaging.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
* node scripts/ensure-desktop-sidecar-bundle.cjs
|
|
7
|
+
* node scripts/ensure-desktop-sidecar-bundle.cjs --platform=darwin|linux|win32
|
|
8
|
+
* node scripts/ensure-desktop-sidecar-bundle.cjs --arch=arm64|x64|universal
|
|
9
|
+
*
|
|
10
|
+
* By default, only the current host platform/arch binary is required
|
|
11
|
+
* (correct for local Electron dev on Apple Silicon). Pass --arch=universal
|
|
12
|
+
* on macOS to require both darwin-arm64 and darwin-x64.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
'use strict';
|
|
16
|
+
|
|
17
|
+
const fs = require('fs');
|
|
18
|
+
const path = require('path');
|
|
19
|
+
const os = require('os');
|
|
20
|
+
|
|
21
|
+
const root = path.resolve(__dirname, '..');
|
|
22
|
+
const extra = path.join(root, 'extraResources', 'sidecar');
|
|
23
|
+
|
|
24
|
+
function argValue(name) {
|
|
25
|
+
const prefix = `--${name}=`;
|
|
26
|
+
const hit = process.argv.find((a) => a.startsWith(prefix));
|
|
27
|
+
if (hit) return hit.slice(prefix.length);
|
|
28
|
+
const idx = process.argv.indexOf(`--${name}`);
|
|
29
|
+
if (idx >= 0 && process.argv[idx + 1] && !process.argv[idx + 1].startsWith('-')) {
|
|
30
|
+
return process.argv[idx + 1];
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const platform = argValue('platform') || process.platform;
|
|
36
|
+
const archOpt = argValue('arch');
|
|
37
|
+
|
|
38
|
+
function hostArchLabel() {
|
|
39
|
+
const a = os.arch();
|
|
40
|
+
if (a === 'arm64') return 'arm64';
|
|
41
|
+
if (a === 'x64' || a === 'x86_64') return 'x64';
|
|
42
|
+
return a;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function requiredBinaries(plat, archMode) {
|
|
46
|
+
if (plat === 'darwin') {
|
|
47
|
+
if (archMode === 'universal' || archMode === 'all') {
|
|
48
|
+
return ['darwin-arm64', 'darwin-x64'];
|
|
49
|
+
}
|
|
50
|
+
const arch = archMode === 'x64' || archMode === 'arm64' ? archMode : hostArchLabel();
|
|
51
|
+
return [`darwin-${arch}`];
|
|
52
|
+
}
|
|
53
|
+
if (plat === 'linux') {
|
|
54
|
+
return ['linux-x64'];
|
|
55
|
+
}
|
|
56
|
+
if (plat === 'win32') {
|
|
57
|
+
return ['win32-x64.exe'];
|
|
58
|
+
}
|
|
59
|
+
return [];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const optional = {
|
|
63
|
+
darwin: [],
|
|
64
|
+
linux: ['linux-x64-rocm', 'linux-x64-cuda', 'linux-x64-vulkan', 'linux-x64-openblas'],
|
|
65
|
+
win32: ['win32-x64-rocm.exe', 'win32-x64-cuda.exe', 'win32-x64-vulkan.exe', 'win32-x64-openblas.exe'],
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const required = requiredBinaries(platform, archOpt);
|
|
69
|
+
const errors = [];
|
|
70
|
+
|
|
71
|
+
if (!required.length) {
|
|
72
|
+
process.stderr.write(`Unsupported platform: ${platform}\n`);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
for (const name of required) {
|
|
77
|
+
const p = path.join(extra, name);
|
|
78
|
+
if (!fs.existsSync(p)) {
|
|
79
|
+
errors.push(`Missing required: extraResources/sidecar/${name}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (errors.length) {
|
|
84
|
+
process.stderr.write('Desktop sidecar bundle incomplete:\n\n');
|
|
85
|
+
for (const e of errors) process.stderr.write(` • ${e}\n`);
|
|
86
|
+
process.stderr.write('\nRun: npm run build:sidecar && npm run stage:desktop\n');
|
|
87
|
+
if (platform === 'darwin') {
|
|
88
|
+
process.stderr.write(
|
|
89
|
+
'Tip: on Apple Silicon only darwin-arm64 is required for local Electron.\n' +
|
|
90
|
+
' For universal Mac packages: npm run verify:desktop:bundle -- --arch=universal\n',
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const foundOptional = (optional[platform] || []).filter((n) =>
|
|
97
|
+
fs.existsSync(path.join(extra, n)),
|
|
98
|
+
);
|
|
99
|
+
process.stdout.write(
|
|
100
|
+
`Desktop bundle OK (${platform}): ${required.join(', ')}` +
|
|
101
|
+
(foundOptional.length ? `; GPU variants: ${foundOptional.join(', ')}` : '') +
|
|
102
|
+
'\n',
|
|
103
|
+
);
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Build llama-cpp.xcframework (device + simulator) inside this npm package.
|
|
3
|
+
#
|
|
4
|
+
# Consumer Capacitor apps — run from app root after npm install (do not copy this file):
|
|
5
|
+
# bash node_modules/llama-cpp-capacitor/scripts/ensure-llama-ios-xcframework.sh
|
|
6
|
+
#
|
|
7
|
+
# Plugin developers — from this repo:
|
|
8
|
+
# npm run build:ios:xcframework
|
|
9
|
+
set -euo pipefail
|
|
10
|
+
|
|
11
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
12
|
+
|
|
13
|
+
# Plugin root: this script lives in scripts/ inside the npm package.
|
|
14
|
+
if [ -f "$SCRIPT_DIR/../ios/CMakeLists.txt" ] && [ -f "$SCRIPT_DIR/../package.json" ]; then
|
|
15
|
+
PLUGIN_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
16
|
+
else
|
|
17
|
+
echo "Error: could not locate llama-cpp-capacitor plugin root (expected ios/CMakeLists.txt next to package.json)."
|
|
18
|
+
exit 1
|
|
19
|
+
fi
|
|
20
|
+
|
|
21
|
+
IOS_DIR="$PLUGIN_DIR/ios"
|
|
22
|
+
FRAMEWORK_DIR="$IOS_DIR/Frameworks"
|
|
23
|
+
XCFRAMEWORK_DIR="$FRAMEWORK_DIR/llama-cpp.xcframework"
|
|
24
|
+
BUILD_PROFILE_FILE="$FRAMEWORK_DIR/.llama-cpp-build-profile"
|
|
25
|
+
# Bump when native sources change (e.g. Metal embed) so cached xcframework is rebuilt.
|
|
26
|
+
EXPECTED_BUILD_PROFILE="metal-embed-cpu-fallback-v1"
|
|
27
|
+
DEVICE_BUILD_DIR="$IOS_DIR/build-device"
|
|
28
|
+
SIM_BUILD_DIR="$IOS_DIR/build-simulator"
|
|
29
|
+
|
|
30
|
+
if [[ "$OSTYPE" != darwin* ]]; then
|
|
31
|
+
echo "Skipping llama-cpp xcframework build: macOS with Xcode is required."
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
if [ -d "$XCFRAMEWORK_DIR" ]; then
|
|
36
|
+
if [ -f "$BUILD_PROFILE_FILE" ] && [ "$(cat "$BUILD_PROFILE_FILE")" = "$EXPECTED_BUILD_PROFILE" ]; then
|
|
37
|
+
echo "llama-cpp iOS xcframework is already present at $XCFRAMEWORK_DIR"
|
|
38
|
+
exit 0
|
|
39
|
+
fi
|
|
40
|
+
echo "Rebuilding llama-cpp iOS xcframework (build profile changed or missing)."
|
|
41
|
+
rm -rf "$XCFRAMEWORK_DIR"
|
|
42
|
+
fi
|
|
43
|
+
|
|
44
|
+
rm -rf "$DEVICE_BUILD_DIR" "$SIM_BUILD_DIR"
|
|
45
|
+
|
|
46
|
+
if ! command -v cmake >/dev/null 2>&1; then
|
|
47
|
+
echo "Error: cmake is required to build llama-cpp for iOS."
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
build_framework() {
|
|
52
|
+
local build_dir="$1"
|
|
53
|
+
local sdk="$2"
|
|
54
|
+
local architectures="$3"
|
|
55
|
+
|
|
56
|
+
rm -rf "$build_dir"
|
|
57
|
+
mkdir -p "$build_dir"
|
|
58
|
+
cmake -S "$IOS_DIR" -B "$build_dir" \
|
|
59
|
+
-DCMAKE_BUILD_TYPE=Release \
|
|
60
|
+
-DCMAKE_OSX_SYSROOT="$sdk" \
|
|
61
|
+
-DCMAKE_OSX_ARCHITECTURES="$architectures" \
|
|
62
|
+
-DCMAKE_OSX_DEPLOYMENT_TARGET=15.0 \
|
|
63
|
+
-DCMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE=NO \
|
|
64
|
+
>&2
|
|
65
|
+
|
|
66
|
+
local jobs
|
|
67
|
+
jobs="$(sysctl -n hw.ncpu 2>/dev/null || echo 4)"
|
|
68
|
+
cmake --build "$build_dir" --config Release -- -j"$jobs" >&2
|
|
69
|
+
|
|
70
|
+
if [ -d "$build_dir/llama-cpp.framework" ]; then
|
|
71
|
+
printf '%s\n' "$build_dir/llama-cpp.framework"
|
|
72
|
+
return 0
|
|
73
|
+
fi
|
|
74
|
+
|
|
75
|
+
echo "Error: llama-cpp.framework was not produced in $build_dir" >&2
|
|
76
|
+
exit 1
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
echo "Building llama-cpp for iOS device (arm64)..."
|
|
80
|
+
DEVICE_FRAMEWORK="$(build_framework "$DEVICE_BUILD_DIR" iphoneos arm64)"
|
|
81
|
+
|
|
82
|
+
echo "Building llama-cpp for iOS simulator..."
|
|
83
|
+
SIM_ARCHITECTURES="arm64"
|
|
84
|
+
if [ "$(uname -m)" = "x86_64" ]; then
|
|
85
|
+
SIM_ARCHITECTURES="x86_64"
|
|
86
|
+
fi
|
|
87
|
+
SIM_FRAMEWORK="$(build_framework "$SIM_BUILD_DIR" iphonesimulator "$SIM_ARCHITECTURES")"
|
|
88
|
+
|
|
89
|
+
rm -rf "$XCFRAMEWORK_DIR"
|
|
90
|
+
xcodebuild -create-xcframework \
|
|
91
|
+
-framework "$DEVICE_FRAMEWORK" \
|
|
92
|
+
-framework "$SIM_FRAMEWORK" \
|
|
93
|
+
-output "$XCFRAMEWORK_DIR"
|
|
94
|
+
|
|
95
|
+
if [ ! -d "$XCFRAMEWORK_DIR" ]; then
|
|
96
|
+
echo "Error: failed to create $XCFRAMEWORK_DIR"
|
|
97
|
+
exit 1
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
mkdir -p "$FRAMEWORK_DIR"
|
|
101
|
+
printf '%s' "$EXPECTED_BUILD_PROFILE" > "$BUILD_PROFILE_FILE"
|
|
102
|
+
|
|
103
|
+
# Keep a flat device framework copy for CocoaPods / dlopen (arm64 slice).
|
|
104
|
+
rm -rf "$FRAMEWORK_DIR/llama-cpp.framework"
|
|
105
|
+
cp -R "$DEVICE_FRAMEWORK" "$FRAMEWORK_DIR/llama-cpp.framework"
|
|
106
|
+
|
|
107
|
+
echo "Created llama-cpp xcframework at $XCFRAMEWORK_DIR"
|
|
108
|
+
echo "Updated device framework at $FRAMEWORK_DIR/llama-cpp.framework"
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TypeScript emits extensionless relative imports under moduleResolution:node.
|
|
3
|
+
* Native ESM (Node + Vite exclude) needs explicit .js suffixes.
|
|
4
|
+
*/
|
|
5
|
+
const { readdirSync, readFileSync, writeFileSync, statSync } = require('node:fs');
|
|
6
|
+
const { join, extname } = require('node:path');
|
|
7
|
+
|
|
8
|
+
const esmRoot = join(__dirname, '..', 'dist', 'esm');
|
|
9
|
+
|
|
10
|
+
const IMPORT_RE =
|
|
11
|
+
/(from\s+|import\s*\(\s*|export\s+\*\s+from\s+|export\s+\{[^}]*\}\s+from\s+)(['"])(\.[^'"]+?)\2/g;
|
|
12
|
+
|
|
13
|
+
function walk(dir, out = []) {
|
|
14
|
+
for (const name of readdirSync(dir)) {
|
|
15
|
+
const p = join(dir, name);
|
|
16
|
+
const st = statSync(p);
|
|
17
|
+
if (st.isDirectory()) walk(p, out);
|
|
18
|
+
else if (extname(p) === '.js') out.push(p);
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function rewrite(source) {
|
|
24
|
+
return source.replace(IMPORT_RE, (full, prefix, quote, spec) => {
|
|
25
|
+
if (/\.(js|mjs|cjs|json|wasm)(\?|$)/.test(spec)) return full;
|
|
26
|
+
return `${prefix}${quote}${spec}.js${quote}`;
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (!statSync(esmRoot, { throwIfNoEntry: false })?.isDirectory()) {
|
|
31
|
+
console.warn('[llama-cpp-pro] fix-esm-extensions: dist/esm missing');
|
|
32
|
+
process.exit(0);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let changed = 0;
|
|
36
|
+
for (const file of walk(esmRoot)) {
|
|
37
|
+
const before = readFileSync(file, 'utf8');
|
|
38
|
+
const after = rewrite(before);
|
|
39
|
+
if (after !== before) {
|
|
40
|
+
writeFileSync(file, after);
|
|
41
|
+
changed += 1;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
console.log(`[llama-cpp-pro] fixed ESM import extensions in ${changed} file(s)`);
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs on npm pack/install (prepare). Builds JS dist when missing; no-ops otherwise.
|
|
3
|
+
*/
|
|
4
|
+
const { existsSync } = require('node:fs');
|
|
5
|
+
const { join } = require('node:path');
|
|
6
|
+
const { spawnSync } = require('node:child_process');
|
|
7
|
+
|
|
8
|
+
const root = join(__dirname, '..');
|
|
9
|
+
const marker = join(root, 'dist', 'esm', 'index.js');
|
|
10
|
+
|
|
11
|
+
if (existsSync(marker)) {
|
|
12
|
+
process.exit(0);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const tsc = join(root, 'node_modules', '.bin', 'tsc');
|
|
16
|
+
if (!existsSync(tsc)) {
|
|
17
|
+
console.warn(
|
|
18
|
+
'[llama-cpp-pro] dist/ missing and local build tools not installed yet. Run: npm run build:js',
|
|
19
|
+
);
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const r = spawnSync('npm', ['run', 'build:js'], {
|
|
24
|
+
cwd: root,
|
|
25
|
+
stdio: 'inherit',
|
|
26
|
+
shell: process.platform === 'win32',
|
|
27
|
+
});
|
|
28
|
+
process.exit(r.status ?? 1);
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Stage sidecar binaries, ggml GPU plugins, and WASM assets into extraResources/
|
|
4
|
+
* for electron-builder packaging.
|
|
5
|
+
*
|
|
6
|
+
* Usage: node scripts/stage-desktop-resources.cjs [--platform darwin|linux|win32]
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
'use strict';
|
|
10
|
+
|
|
11
|
+
const fs = require('fs');
|
|
12
|
+
const path = require('path');
|
|
13
|
+
|
|
14
|
+
const root = path.resolve(__dirname, '..');
|
|
15
|
+
const srcBin = path.join(root, 'sidecar', 'bin');
|
|
16
|
+
const dstRoot = path.join(root, 'extraResources', 'sidecar');
|
|
17
|
+
|
|
18
|
+
const platformArg = process.argv.find((a) => a.startsWith('--platform='));
|
|
19
|
+
const onlyPlatform = platformArg ? platformArg.split('=')[1] : null;
|
|
20
|
+
|
|
21
|
+
function mkdirp(p) {
|
|
22
|
+
fs.mkdirSync(p, { recursive: true });
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function copyFile(src, dst) {
|
|
26
|
+
if (!fs.existsSync(src)) return false;
|
|
27
|
+
mkdirp(path.dirname(dst));
|
|
28
|
+
fs.copyFileSync(src, dst);
|
|
29
|
+
return true;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function copyDir(src, dst, filter) {
|
|
33
|
+
if (!fs.existsSync(src)) return 0;
|
|
34
|
+
mkdirp(dst);
|
|
35
|
+
let n = 0;
|
|
36
|
+
for (const name of fs.readdirSync(src)) {
|
|
37
|
+
const sp = path.join(src, name);
|
|
38
|
+
const dp = path.join(dst, name);
|
|
39
|
+
const st = fs.statSync(sp);
|
|
40
|
+
if (st.isDirectory()) {
|
|
41
|
+
n += copyDir(sp, dp, filter);
|
|
42
|
+
} else if (!filter || filter(name)) {
|
|
43
|
+
fs.copyFileSync(sp, dp);
|
|
44
|
+
n += 1;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return n;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const BIN_PATTERNS = [
|
|
51
|
+
/^darwin-(arm64|x64)$/,
|
|
52
|
+
/^linux-x64(-(rocm|cuda|vulkan|openblas))?$/,
|
|
53
|
+
/^win32-x64(-(rocm|cuda|vulkan|openblas))?\.exe$/,
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
function shouldCopyBin(name) {
|
|
57
|
+
return BIN_PATTERNS.some((re) => re.test(name));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function stageSidecarBins() {
|
|
61
|
+
if (!fs.existsSync(srcBin)) {
|
|
62
|
+
console.error(`Missing ${srcBin} — run npm run build:sidecar first`);
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
mkdirp(dstRoot);
|
|
66
|
+
let copied = 0;
|
|
67
|
+
for (const name of fs.readdirSync(srcBin)) {
|
|
68
|
+
if (!shouldCopyBin(name)) continue;
|
|
69
|
+
if (onlyPlatform && !name.startsWith(onlyPlatform)) continue;
|
|
70
|
+
const ok = copyFile(path.join(srcBin, name), path.join(dstRoot, name));
|
|
71
|
+
if (ok) {
|
|
72
|
+
copied += 1;
|
|
73
|
+
console.log(` staged ${name}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return copied;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function stageGgmlPlugins() {
|
|
80
|
+
const srcPlugins = path.join(srcBin, 'ggml-plugins');
|
|
81
|
+
if (!fs.existsSync(srcPlugins)) return 0;
|
|
82
|
+
return copyDir(srcPlugins, path.join(dstRoot, 'ggml-plugins'), (n) =>
|
|
83
|
+
/\.(so|dll|dylib)/i.test(n) || !n.includes('.'),
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function stageRuntimeLibs() {
|
|
88
|
+
const srcLibs = path.join(srcBin, 'runtime-libs');
|
|
89
|
+
if (!fs.existsSync(srcLibs)) return 0;
|
|
90
|
+
return copyDir(srcLibs, path.join(dstRoot, 'runtime-libs'), (n) =>
|
|
91
|
+
/\.(so|dll|dylib)/i.test(n) || !n.includes('.'),
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function stageWasm() {
|
|
96
|
+
const srcWasm = path.join(root, 'dist', 'wasm');
|
|
97
|
+
const dstWasm = path.join(root, 'extraResources', 'llama-wasm');
|
|
98
|
+
if (!fs.existsSync(srcWasm)) {
|
|
99
|
+
console.warn(' wasm: dist/wasm not found — run npm run build:pwa');
|
|
100
|
+
return 0;
|
|
101
|
+
}
|
|
102
|
+
return copyDir(srcWasm, dstWasm);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
console.log('Staging desktop resources...');
|
|
106
|
+
const bins = stageSidecarBins();
|
|
107
|
+
const plugins = stageGgmlPlugins();
|
|
108
|
+
const libs = stageRuntimeLibs();
|
|
109
|
+
const wasm = stageWasm();
|
|
110
|
+
|
|
111
|
+
console.log(`Done: ${bins} sidecar binary(ies), ${plugins} plugin file(s), ${libs} runtime lib(s), ${wasm} wasm file(s)`);
|
|
112
|
+
|
|
113
|
+
if (bins === 0) {
|
|
114
|
+
console.error('No sidecar binaries staged.');
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
# =============================================================================
|
|
2
|
+
# llama-cpp-sidecar — Native accelerated desktop sidecar binary
|
|
3
|
+
#
|
|
4
|
+
# Builds a standalone executable with the embedded cap-native-server HTTP API.
|
|
5
|
+
# GPU backends (Vulkan, CUDA, ROCm/HIP) are loaded dynamically at runtime from
|
|
6
|
+
# libggml-*.so / ggml-*.dll placed next to the binary (see cmake/ggml-backends.cmake).
|
|
7
|
+
#
|
|
8
|
+
# Usage:
|
|
9
|
+
# cmake -B build -DCMAKE_BUILD_TYPE=Release -DSIDECAR_VARIANT=<variant>
|
|
10
|
+
# cmake --build build --config Release
|
|
11
|
+
#
|
|
12
|
+
# Variants (set via -DSIDECAR_VARIANT):
|
|
13
|
+
# vulkan-openblas — CPU + dynamic Vulkan [default win/linux x64]
|
|
14
|
+
# vulkan — dynamic Vulkan only
|
|
15
|
+
# openblas — CPU-optimized (OpenBLAS when available)
|
|
16
|
+
# cuda — dynamic CUDA (NVIDIA)
|
|
17
|
+
# rocm — dynamic ROCm/HIP (AMD)
|
|
18
|
+
# metal — Apple Metal GPU (macOS)
|
|
19
|
+
# metal-coreml — Metal + CoreML ANE (macOS arm64)
|
|
20
|
+
# cpu — CPU-only universal fallback
|
|
21
|
+
# =============================================================================
|
|
22
|
+
|
|
23
|
+
cmake_minimum_required(VERSION 3.16)
|
|
24
|
+
project(llama-cpp-sidecar VERSION 0.2.0 LANGUAGES C CXX)
|
|
25
|
+
|
|
26
|
+
set(CMAKE_CXX_STANDARD 17)
|
|
27
|
+
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
28
|
+
|
|
29
|
+
include(${CMAKE_CURRENT_LIST_DIR}/../cmake/desktop-sources.cmake)
|
|
30
|
+
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
# Platform / architecture detection
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
|
36
|
+
set(SIDECAR_PLATFORM "win32")
|
|
37
|
+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
|
38
|
+
set(SIDECAR_PLATFORM "darwin")
|
|
39
|
+
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
40
|
+
set(SIDECAR_PLATFORM "linux")
|
|
41
|
+
else()
|
|
42
|
+
set(SIDECAR_PLATFORM "${CMAKE_SYSTEM_NAME}")
|
|
43
|
+
endif()
|
|
44
|
+
|
|
45
|
+
set(_SIDECAR_DETECTED_PROC "${CMAKE_SYSTEM_PROCESSOR}")
|
|
46
|
+
if(CMAKE_OSX_ARCHITECTURES AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "")
|
|
47
|
+
set(_SIDECAR_DETECTED_PROC "${CMAKE_OSX_ARCHITECTURES}")
|
|
48
|
+
endif()
|
|
49
|
+
|
|
50
|
+
if(_SIDECAR_DETECTED_PROC MATCHES "^(aarch64|arm64|ARM64)$")
|
|
51
|
+
set(SIDECAR_ARCH "arm64")
|
|
52
|
+
elseif(_SIDECAR_DETECTED_PROC MATCHES "^(x86_64|AMD64|amd64)$")
|
|
53
|
+
set(SIDECAR_ARCH "x64")
|
|
54
|
+
else()
|
|
55
|
+
set(SIDECAR_ARCH "${_SIDECAR_DETECTED_PROC}")
|
|
56
|
+
endif()
|
|
57
|
+
|
|
58
|
+
# ---------------------------------------------------------------------------
|
|
59
|
+
# Variant selection
|
|
60
|
+
# ---------------------------------------------------------------------------
|
|
61
|
+
|
|
62
|
+
set(SIDECAR_VARIANT "" CACHE STRING
|
|
63
|
+
"Build variant: vulkan-openblas, cuda, rocm, metal, metal-coreml, cpu, openblas, vulkan")
|
|
64
|
+
|
|
65
|
+
if(NOT SIDECAR_VARIANT)
|
|
66
|
+
if(SIDECAR_PLATFORM STREQUAL "darwin" AND SIDECAR_ARCH STREQUAL "arm64")
|
|
67
|
+
set(SIDECAR_VARIANT "metal-coreml")
|
|
68
|
+
elseif(SIDECAR_PLATFORM STREQUAL "darwin")
|
|
69
|
+
set(SIDECAR_VARIANT "metal")
|
|
70
|
+
else()
|
|
71
|
+
set(SIDECAR_VARIANT "vulkan-openblas")
|
|
72
|
+
endif()
|
|
73
|
+
endif()
|
|
74
|
+
|
|
75
|
+
set(SIDECAR_NEEDS_SUFFIX ON)
|
|
76
|
+
if(SIDECAR_VARIANT STREQUAL "vulkan-openblas" AND NOT SIDECAR_PLATFORM STREQUAL "darwin")
|
|
77
|
+
set(SIDECAR_NEEDS_SUFFIX OFF)
|
|
78
|
+
elseif(SIDECAR_VARIANT STREQUAL "metal-coreml" AND SIDECAR_PLATFORM STREQUAL "darwin" AND SIDECAR_ARCH STREQUAL "arm64")
|
|
79
|
+
set(SIDECAR_NEEDS_SUFFIX OFF)
|
|
80
|
+
elseif(SIDECAR_VARIANT STREQUAL "metal" AND SIDECAR_PLATFORM STREQUAL "darwin")
|
|
81
|
+
set(SIDECAR_NEEDS_SUFFIX OFF)
|
|
82
|
+
endif()
|
|
83
|
+
|
|
84
|
+
if(SIDECAR_NEEDS_SUFFIX)
|
|
85
|
+
set(SIDECAR_BINARY_NAME "${SIDECAR_PLATFORM}-${SIDECAR_ARCH}-${SIDECAR_VARIANT}")
|
|
86
|
+
else()
|
|
87
|
+
set(SIDECAR_BINARY_NAME "${SIDECAR_PLATFORM}-${SIDECAR_ARCH}")
|
|
88
|
+
endif()
|
|
89
|
+
|
|
90
|
+
message(STATUS "Sidecar target: ${SIDECAR_BINARY_NAME}")
|
|
91
|
+
message(STATUS "Platform: ${SIDECAR_PLATFORM} Arch: ${SIDECAR_ARCH} Variant: ${SIDECAR_VARIANT}")
|
|
92
|
+
|
|
93
|
+
# ---------------------------------------------------------------------------
|
|
94
|
+
# Compile definitions per variant
|
|
95
|
+
# ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
set(SIDECAR_COMPILE_DEFS
|
|
98
|
+
-DNDEBUG
|
|
99
|
+
-DLM_GGML_USE_CPU
|
|
100
|
+
)
|
|
101
|
+
|
|
102
|
+
set(SIDECAR_SOURCES ${ANNADATA_DESKTOP_CORE_SOURCES})
|
|
103
|
+
|
|
104
|
+
if(SIDECAR_VARIANT MATCHES "metal")
|
|
105
|
+
list(APPEND SIDECAR_SOURCES ${ANNADATA_CPP_DIR}/ggml-metal.m)
|
|
106
|
+
list(APPEND SIDECAR_COMPILE_DEFS
|
|
107
|
+
-DLM_GGML_USE_METAL
|
|
108
|
+
-DLM_GGML_METAL_EMBED_LIBRARY
|
|
109
|
+
-DLM_GGML_METAL_USE_BF16
|
|
110
|
+
)
|
|
111
|
+
if(APPLE)
|
|
112
|
+
list(APPEND SIDECAR_COMPILE_DEFS -DLM_GGML_USE_ACCELERATE)
|
|
113
|
+
endif()
|
|
114
|
+
endif()
|
|
115
|
+
|
|
116
|
+
# Vulkan/CUDA/ROCm are loaded dynamically via lm_ggml_backend_load_all_from_path().
|
|
117
|
+
# Variant names select which plugin DLLs to bundle (see scripts/build-ggml-backends.sh).
|
|
118
|
+
|
|
119
|
+
# ---------------------------------------------------------------------------
|
|
120
|
+
# Metal shader embedding (macOS)
|
|
121
|
+
# ---------------------------------------------------------------------------
|
|
122
|
+
|
|
123
|
+
if(SIDECAR_VARIANT MATCHES "metal" AND APPLE)
|
|
124
|
+
enable_language(ASM)
|
|
125
|
+
include(${CMAKE_CURRENT_LIST_DIR}/../cmake/desktop-metal-embed.cmake)
|
|
126
|
+
list(APPEND SIDECAR_SOURCES ${METALLIB_EMBED_ASM})
|
|
127
|
+
endif()
|
|
128
|
+
|
|
129
|
+
# ---------------------------------------------------------------------------
|
|
130
|
+
# Executable target
|
|
131
|
+
# ---------------------------------------------------------------------------
|
|
132
|
+
|
|
133
|
+
add_executable(${SIDECAR_BINARY_NAME}
|
|
134
|
+
${CMAKE_CURRENT_SOURCE_DIR}/cap-sidecar-main.cpp
|
|
135
|
+
${SIDECAR_SOURCES}
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
target_include_directories(${SIDECAR_BINARY_NAME} PRIVATE
|
|
139
|
+
${ANNADATA_CPP_DIR}
|
|
140
|
+
${ANNADATA_CPP_DIR}/ggml-cpu
|
|
141
|
+
${ANNADATA_CPP_DIR}/tools/mtmd
|
|
142
|
+
${ANNADATA_CPP_DIR}/vendor/cpp-httplib
|
|
143
|
+
)
|
|
144
|
+
|
|
145
|
+
target_compile_options(${SIDECAR_BINARY_NAME} PRIVATE ${SIDECAR_COMPILE_DEFS})
|
|
146
|
+
|
|
147
|
+
find_package(Threads REQUIRED)
|
|
148
|
+
target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE Threads::Threads)
|
|
149
|
+
|
|
150
|
+
if(APPLE)
|
|
151
|
+
find_library(ACCELERATE_FRAMEWORK Accelerate)
|
|
152
|
+
find_library(METAL_FRAMEWORK Metal)
|
|
153
|
+
find_library(FOUNDATION_FRAMEWORK Foundation)
|
|
154
|
+
find_library(METALKIT_FRAMEWORK MetalKit)
|
|
155
|
+
target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE
|
|
156
|
+
${ACCELERATE_FRAMEWORK}
|
|
157
|
+
${METAL_FRAMEWORK}
|
|
158
|
+
${FOUNDATION_FRAMEWORK}
|
|
159
|
+
${METALKIT_FRAMEWORK}
|
|
160
|
+
)
|
|
161
|
+
# Honor target arch (allows arm64→x86_64 cross-builds via CMAKE_OSX_ARCHITECTURES)
|
|
162
|
+
if(SIDECAR_ARCH STREQUAL "arm64")
|
|
163
|
+
set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES OSX_ARCHITECTURES "arm64")
|
|
164
|
+
elseif(SIDECAR_ARCH STREQUAL "x64")
|
|
165
|
+
set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES OSX_ARCHITECTURES "x86_64")
|
|
166
|
+
endif()
|
|
167
|
+
endif()
|
|
168
|
+
|
|
169
|
+
if(WIN32)
|
|
170
|
+
target_link_libraries(${SIDECAR_BINARY_NAME} PRIVATE ws2_32)
|
|
171
|
+
if(MSVC)
|
|
172
|
+
set_property(TARGET ${SIDECAR_BINARY_NAME} PROPERTY
|
|
173
|
+
MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
|
|
174
|
+
endif()
|
|
175
|
+
endif()
|
|
176
|
+
|
|
177
|
+
if(UNIX AND NOT APPLE)
|
|
178
|
+
target_link_options(${SIDECAR_BINARY_NAME} PRIVATE -static-libgcc -static-libstdc++)
|
|
179
|
+
endif()
|
|
180
|
+
|
|
181
|
+
set_target_properties(${SIDECAR_BINARY_NAME} PROPERTIES
|
|
182
|
+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin"
|
|
183
|
+
OUTPUT_NAME "${SIDECAR_BINARY_NAME}"
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
# Optional: build ggml backend plugins from upstream llama.cpp
|
|
187
|
+
set(LLAMA_CPP_UPSTREAM "" CACHE PATH "Path to upstream llama.cpp for ggml GPU backend plugins")
|
|
188
|
+
if(LLAMA_CPP_UPSTREAM AND EXISTS "${LLAMA_CPP_UPSTREAM}/CMakeLists.txt")
|
|
189
|
+
include(${CMAKE_CURRENT_LIST_DIR}/../cmake/ggml-backends.cmake)
|
|
190
|
+
endif()
|
|
191
|
+
|
|
192
|
+
install(TARGETS ${SIDECAR_BINARY_NAME} RUNTIME DESTINATION "sidecar")
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone desktop sidecar entry point.
|
|
3
|
+
*
|
|
4
|
+
* Loads optional ggml GPU backend plugins (libggml-vulkan.so, libggml-cuda.so, …)
|
|
5
|
+
* from the executable directory, then runs cap_llama_server_main until SIGINT/SIGTERM.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
#include "cap-native-server.h"
|
|
9
|
+
#include "ggml-backend.h"
|
|
10
|
+
#include "llama.h"
|
|
11
|
+
|
|
12
|
+
#include <atomic>
|
|
13
|
+
#include <chrono>
|
|
14
|
+
#include <csignal>
|
|
15
|
+
#include <cstring>
|
|
16
|
+
#include <filesystem>
|
|
17
|
+
#include <thread>
|
|
18
|
+
|
|
19
|
+
namespace {
|
|
20
|
+
|
|
21
|
+
std::atomic<bool> g_shutdown{false};
|
|
22
|
+
|
|
23
|
+
void on_signal(int) {
|
|
24
|
+
g_shutdown.store(true);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
void install_signal_handlers() {
|
|
28
|
+
std::signal(SIGINT, on_signal);
|
|
29
|
+
std::signal(SIGTERM, on_signal);
|
|
30
|
+
#ifndef _WIN32
|
|
31
|
+
std::signal(SIGHUP, on_signal);
|
|
32
|
+
#endif
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const char * resolve_backend_dir(int argc, char ** argv) {
|
|
36
|
+
for (int i = 1; i < argc - 1; i++) {
|
|
37
|
+
if (argv[i] && std::strcmp(argv[i], "--backend-dir") == 0 && argv[i + 1]) {
|
|
38
|
+
return argv[i + 1];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return nullptr;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
void load_dynamic_backends(int argc, char ** argv) {
|
|
45
|
+
const char * dir = resolve_backend_dir(argc, argv);
|
|
46
|
+
lm_ggml_backend_load_all_from_path(dir);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
} // namespace
|
|
50
|
+
|
|
51
|
+
int main(int argc, char ** argv) {
|
|
52
|
+
install_signal_handlers();
|
|
53
|
+
llama_backend_init();
|
|
54
|
+
load_dynamic_backends(argc, argv);
|
|
55
|
+
|
|
56
|
+
if (cap_llama_server_main(argc, argv) != 0) {
|
|
57
|
+
llama_backend_free();
|
|
58
|
+
return 1;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
while (!g_shutdown.load() && cap_llama_server_is_running()) {
|
|
62
|
+
std::this_thread::sleep_for(std::chrono::milliseconds(200));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
cap_llama_server_stop();
|
|
66
|
+
llama_backend_free();
|
|
67
|
+
return 0;
|
|
68
|
+
}
|