@atomic-chat/core 0.19.1 → 0.20.6
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/audio/args.d.ts +19 -0
- package/dist/audio/args.js +39 -0
- package/dist/audio/args.js.map +1 -0
- package/dist/audio/capabilities.d.ts +24 -0
- package/dist/audio/capabilities.js +96 -0
- package/dist/audio/capabilities.js.map +1 -0
- package/dist/audio/config.d.ts +40 -0
- package/dist/audio/config.js +57 -0
- package/dist/audio/config.js.map +1 -0
- package/dist/audio/errors.d.ts +23 -0
- package/dist/audio/errors.js +52 -0
- package/dist/audio/errors.js.map +1 -0
- package/dist/audio/gallery.d.ts +30 -0
- package/dist/audio/gallery.js +152 -0
- package/dist/audio/gallery.js.map +1 -0
- package/dist/audio/http.d.ts +26 -0
- package/dist/audio/http.js +56 -0
- package/dist/audio/http.js.map +1 -0
- package/dist/audio/idle.d.ts +22 -0
- package/dist/audio/idle.js +44 -0
- package/dist/audio/idle.js.map +1 -0
- package/dist/audio/index.d.ts +26 -0
- package/dist/audio/index.js +27 -0
- package/dist/audio/index.js.map +1 -0
- package/dist/audio/install.d.ts +57 -0
- package/dist/audio/install.js +196 -0
- package/dist/audio/install.js.map +1 -0
- package/dist/audio/jobs.d.ts +77 -0
- package/dist/audio/jobs.js +340 -0
- package/dist/audio/jobs.js.map +1 -0
- package/dist/audio/model-files.d.ts +12 -0
- package/dist/audio/model-files.js +42 -0
- package/dist/audio/model-files.js.map +1 -0
- package/dist/audio/output.d.ts +32 -0
- package/dist/audio/output.js +93 -0
- package/dist/audio/output.js.map +1 -0
- package/dist/audio/parse.d.ts +15 -0
- package/dist/audio/parse.js +149 -0
- package/dist/audio/parse.js.map +1 -0
- package/dist/audio/recipe.d.ts +22 -0
- package/dist/audio/recipe.js +92 -0
- package/dist/audio/recipe.js.map +1 -0
- package/dist/audio/request.d.ts +24 -0
- package/dist/audio/request.js +86 -0
- package/dist/audio/request.js.map +1 -0
- package/dist/audio/server-process.d.ts +51 -0
- package/dist/audio/server-process.js +202 -0
- package/dist/audio/server-process.js.map +1 -0
- package/dist/audio/service.d.ts +107 -0
- package/dist/audio/service.js +402 -0
- package/dist/audio/service.js.map +1 -0
- package/dist/audio/session.d.ts +73 -0
- package/dist/audio/session.js +216 -0
- package/dist/audio/session.js.map +1 -0
- package/dist/audio/state.d.ts +68 -0
- package/dist/audio/state.js +88 -0
- package/dist/audio/state.js.map +1 -0
- package/dist/audio/types.d.ts +52 -0
- package/dist/audio/types.js +8 -0
- package/dist/audio/types.js.map +1 -0
- package/dist/audio/wav.d.ts +22 -0
- package/dist/audio/wav.js +56 -0
- package/dist/audio/wav.js.map +1 -0
- package/dist/audio/wiring.d.ts +31 -0
- package/dist/audio/wiring.js +41 -0
- package/dist/audio/wiring.js.map +1 -0
- package/dist/backend/install/service.js +4 -2
- package/dist/backend/install/service.js.map +1 -1
- package/dist/cli/launch.js +2 -0
- package/dist/cli/launch.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 +21 -1
- package/dist/client/control-client.js +50 -0
- package/dist/client/control-client.js.map +1 -1
- package/dist/client/index.d.ts +1 -0
- package/dist/client/index.js +1 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/model-catalog.d.ts +40 -0
- package/dist/client/model-catalog.js +149 -0
- package/dist/client/model-catalog.js.map +1 -0
- package/dist/cloud/registry.js +1 -0
- package/dist/cloud/registry.js.map +1 -1
- package/dist/config/paths.d.ts +22 -1
- package/dist/config/paths.js +24 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/contracts/audio.d.ts +290 -0
- package/dist/contracts/audio.js +24 -0
- package/dist/contracts/audio.js.map +1 -0
- package/dist/contracts/embedding.js +1 -0
- package/dist/contracts/embedding.js.map +1 -1
- package/dist/contracts/engine-builds.d.ts +10 -4
- package/dist/contracts/engine-builds.js +10 -2
- package/dist/contracts/engine-builds.js.map +1 -1
- package/dist/contracts/engines.d.ts +1 -1
- package/dist/contracts/engines.js +4 -0
- package/dist/contracts/engines.js.map +1 -1
- package/dist/contracts/errors.d.ts +14 -2
- package/dist/contracts/errors.js +29 -0
- package/dist/contracts/errors.js.map +1 -1
- package/dist/contracts/events.d.ts +10 -0
- package/dist/contracts/geniex.d.ts +98 -0
- package/dist/contracts/geniex.js +15 -0
- package/dist/contracts/geniex.js.map +1 -0
- package/dist/contracts/index.d.ts +2 -0
- package/dist/contracts/index.js +2 -0
- package/dist/contracts/index.js.map +1 -1
- package/dist/contracts/model-yml.d.ts +40 -0
- package/dist/contracts/model-yml.js +7 -0
- package/dist/contracts/model-yml.js.map +1 -1
- package/dist/contracts/session.d.ts +6 -1
- package/dist/contracts/session.js.map +1 -1
- package/dist/contracts/settings.d.ts +12 -1
- package/dist/contracts/settings.js.map +1 -1
- package/dist/core/atomic-core.d.ts +6 -1
- package/dist/core/atomic-core.js +7 -1
- package/dist/core/atomic-core.js.map +1 -1
- package/dist/core/create.js +105 -6
- package/dist/core/create.js.map +1 -1
- package/dist/core/gpu-residency.d.ts +8 -2
- package/dist/core/gpu-residency.js +9 -1
- package/dist/core/gpu-residency.js.map +1 -1
- package/dist/core/types.d.ts +3 -0
- package/dist/core/types.js.map +1 -1
- package/dist/diffusion/install.d.ts +6 -3
- package/dist/diffusion/install.js +5 -4
- package/dist/diffusion/install.js.map +1 -1
- package/dist/embedding/index.js +1 -0
- package/dist/embedding/index.js.map +1 -1
- package/dist/engine-builds/engines.d.ts +31 -8
- package/dist/engine-builds/engines.js +118 -14
- package/dist/engine-builds/engines.js.map +1 -1
- package/dist/engine-builds/geniex.d.ts +35 -0
- package/dist/engine-builds/geniex.js +111 -0
- package/dist/engine-builds/geniex.js.map +1 -0
- package/dist/engine-builds/index.d.ts +3 -2
- package/dist/engine-builds/index.js +3 -2
- package/dist/engine-builds/index.js.map +1 -1
- package/dist/engine-builds/manifest.d.ts +95 -5
- package/dist/engine-builds/manifest.js +152 -9
- package/dist/engine-builds/manifest.js.map +1 -1
- package/dist/engine-builds/order.d.ts +7 -1
- package/dist/engine-builds/order.js +13 -0
- package/dist/engine-builds/order.js.map +1 -1
- package/dist/engine-builds/select.d.ts +43 -11
- package/dist/engine-builds/select.js +64 -16
- package/dist/engine-builds/select.js.map +1 -1
- package/dist/engine-builds/service.d.ts +19 -11
- package/dist/engine-builds/service.js +31 -9
- package/dist/engine-builds/service.js.map +1 -1
- package/dist/engines/service.d.ts +4 -3
- package/dist/engines/service.js +5 -3
- package/dist/engines/service.js.map +1 -1
- package/dist/engines/versions.js +3 -0
- package/dist/engines/versions.js.map +1 -1
- package/dist/integrations/catalog.d.ts +3 -1
- package/dist/integrations/catalog.js +8 -2
- package/dist/integrations/catalog.js.map +1 -1
- package/dist/integrations/config-io.d.ts +45 -4
- package/dist/integrations/config-io.js +91 -6
- package/dist/integrations/config-io.js.map +1 -1
- package/dist/integrations/configure/codex-repair.d.ts +75 -0
- package/dist/integrations/configure/codex-repair.js +254 -0
- package/dist/integrations/configure/codex-repair.js.map +1 -0
- package/dist/integrations/configure/codex.d.ts +48 -10
- package/dist/integrations/configure/codex.js +126 -32
- package/dist/integrations/configure/codex.js.map +1 -1
- package/dist/integrations/configure/registry.d.ts +4 -1
- package/dist/integrations/configure/registry.js +1 -0
- package/dist/integrations/configure/registry.js.map +1 -1
- package/dist/lock/process-journal.d.ts +3 -3
- package/dist/models/compatibility/rules-baseline.js +1 -0
- package/dist/models/compatibility/rules-baseline.js.map +1 -1
- package/dist/models/compatibility/rules.js +1 -0
- package/dist/models/compatibility/rules.js.map +1 -1
- package/dist/models/gguf/kv-cache.d.ts +5 -0
- package/dist/models/gguf/kv-cache.js +35 -2
- package/dist/models/gguf/kv-cache.js.map +1 -1
- package/dist/models/gguf/reader.d.ts +5 -0
- package/dist/models/gguf/reader.js +15 -3
- package/dist/models/gguf/reader.js.map +1 -1
- package/dist/models/hf.d.ts +3 -0
- package/dist/models/hf.js +11 -4
- package/dist/models/hf.js.map +1 -1
- package/dist/router/resolve.d.ts +3 -2
- package/dist/router/resolve.js +3 -1
- package/dist/router/resolve.js.map +1 -1
- package/dist/runtime/geniex/accelerators.d.ts +20 -0
- package/dist/runtime/geniex/accelerators.js +53 -0
- package/dist/runtime/geniex/accelerators.js.map +1 -0
- package/dist/runtime/geniex/check.d.ts +34 -0
- package/dist/runtime/geniex/check.js +117 -0
- package/dist/runtime/geniex/check.js.map +1 -0
- package/dist/runtime/geniex/chip.d.ts +29 -0
- package/dist/runtime/geniex/chip.js +35 -0
- package/dist/runtime/geniex/chip.js.map +1 -0
- package/dist/runtime/geniex/devices.d.ts +13 -0
- package/dist/runtime/geniex/devices.js +32 -0
- package/dist/runtime/geniex/devices.js.map +1 -0
- package/dist/runtime/geniex/geniex-host.d.ts +17 -0
- package/dist/runtime/geniex/geniex-host.js +26 -0
- package/dist/runtime/geniex/geniex-host.js.map +1 -0
- package/dist/runtime/geniex/host/args.d.ts +56 -0
- package/dist/runtime/geniex/host/args.js +115 -0
- package/dist/runtime/geniex/host/args.js.map +1 -0
- package/dist/runtime/geniex/host/engine.d.ts +76 -0
- package/dist/runtime/geniex/host/engine.js +122 -0
- package/dist/runtime/geniex/host/engine.js.map +1 -0
- package/dist/runtime/geniex/host/ffi-bun.d.ts +15 -0
- package/dist/runtime/geniex/host/ffi-bun.js +415 -0
- package/dist/runtime/geniex/host/ffi-bun.js.map +1 -0
- package/dist/runtime/geniex/host/grammar.d.ts +11 -0
- package/dist/runtime/geniex/host/grammar.js +223 -0
- package/dist/runtime/geniex/host/grammar.js.map +1 -0
- package/dist/runtime/geniex/host/inspect.d.ts +25 -0
- package/dist/runtime/geniex/host/inspect.js +177 -0
- package/dist/runtime/geniex/host/inspect.js.map +1 -0
- package/dist/runtime/geniex/host/library.d.ts +117 -0
- package/dist/runtime/geniex/host/library.js +38 -0
- package/dist/runtime/geniex/host/library.js.map +1 -0
- package/dist/runtime/geniex/host/openai.d.ts +62 -0
- package/dist/runtime/geniex/host/openai.js +458 -0
- package/dist/runtime/geniex/host/openai.js.map +1 -0
- package/dist/runtime/geniex/host/run.d.ts +48 -0
- package/dist/runtime/geniex/host/run.js +208 -0
- package/dist/runtime/geniex/host/run.js.map +1 -0
- package/dist/runtime/geniex/host/server.d.ts +39 -0
- package/dist/runtime/geniex/host/server.js +232 -0
- package/dist/runtime/geniex/host/server.js.map +1 -0
- package/dist/runtime/geniex/host/worker-protocol.d.ts +76 -0
- package/dist/runtime/geniex/host/worker-protocol.js +116 -0
- package/dist/runtime/geniex/host/worker-protocol.js.map +1 -0
- package/dist/runtime/geniex/host/worker-source.generated.d.ts +1 -0
- package/dist/runtime/geniex/host/worker-source.generated.js +4 -0
- package/dist/runtime/geniex/host/worker-source.generated.js.map +1 -0
- package/dist/runtime/geniex/host/worker.d.ts +7 -0
- package/dist/runtime/geniex/host/worker.js +19 -0
- package/dist/runtime/geniex/host/worker.js.map +1 -0
- package/dist/runtime/geniex/host-process.d.ts +48 -0
- package/dist/runtime/geniex/host-process.js +104 -0
- package/dist/runtime/geniex/host-process.js.map +1 -0
- package/dist/runtime/geniex/index.d.ts +11 -0
- package/dist/runtime/geniex/index.js +12 -0
- package/dist/runtime/geniex/index.js.map +1 -0
- package/dist/runtime/geniex/model-yml.d.ts +8 -0
- package/dist/runtime/geniex/model-yml.js +98 -0
- package/dist/runtime/geniex/model-yml.js.map +1 -0
- package/dist/runtime/geniex/runtime.d.ts +94 -0
- package/dist/runtime/geniex/runtime.js +366 -0
- package/dist/runtime/geniex/runtime.js.map +1 -0
- package/dist/runtime/litert-lm/host/openai.d.ts +4 -37
- package/dist/runtime/litert-lm/host/openai.js +11 -96
- package/dist/runtime/litert-lm/host/openai.js.map +1 -1
- package/dist/runtime/litert-lm/host/pool.d.ts +1 -7
- package/dist/runtime/litert-lm/host/pool.js +1 -17
- package/dist/runtime/litert-lm/host/pool.js.map +1 -1
- package/dist/runtime/litert-lm/host/server.js +11 -53
- package/dist/runtime/litert-lm/host/server.js.map +1 -1
- package/dist/runtime/llamacpp/args.d.ts +5 -0
- package/dist/runtime/llamacpp/args.js +2 -0
- package/dist/runtime/llamacpp/args.js.map +1 -1
- package/dist/runtime/llamacpp/fit-margin.d.ts +44 -0
- package/dist/runtime/llamacpp/fit-margin.js +50 -0
- package/dist/runtime/llamacpp/fit-margin.js.map +1 -1
- package/dist/runtime/llamacpp/load-plan.d.ts +5 -0
- package/dist/runtime/llamacpp/load-plan.js +57 -22
- package/dist/runtime/llamacpp/load-plan.js.map +1 -1
- package/dist/runtime/llamacpp/runtime.d.ts +2 -1
- package/dist/runtime/llamacpp/runtime.js +3 -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/runtime/shared/fifo-lock.d.ts +10 -0
- package/dist/runtime/shared/fifo-lock.js +21 -0
- package/dist/runtime/shared/fifo-lock.js.map +1 -0
- package/dist/runtime/shared/index.d.ts +2 -0
- package/dist/runtime/shared/index.js +2 -0
- package/dist/runtime/shared/index.js.map +1 -1
- package/dist/runtime/shared/openai-sse.d.ts +112 -0
- package/dist/runtime/shared/openai-sse.js +178 -0
- package/dist/runtime/shared/openai-sse.js.map +1 -0
- package/dist/server/control/index.d.ts +1 -1
- package/dist/server/control/router.js +4 -0
- package/dist/server/control/router.js.map +1 -1
- package/dist/server/control/routes/audio.d.ts +15 -0
- package/dist/server/control/routes/audio.js +59 -0
- package/dist/server/control/routes/audio.js.map +1 -0
- package/dist/server/control/routes/geniex.d.ts +7 -0
- package/dist/server/control/routes/geniex.js +22 -0
- package/dist/server/control/routes/geniex.js.map +1 -0
- package/dist/server/control/types.d.ts +36 -2
- package/dist/server/control/types.js.map +1 -1
- package/dist/server/http.js +4 -0
- package/dist/server/http.js.map +1 -1
- package/dist/server/public/audio-speech-params.d.ts +47 -0
- package/dist/server/public/audio-speech-params.js +177 -0
- package/dist/server/public/audio-speech-params.js.map +1 -0
- package/dist/server/public/audio-speech.d.ts +14 -0
- package/dist/server/public/audio-speech.js +118 -0
- package/dist/server/public/audio-speech.js.map +1 -0
- package/dist/server/public/embedding.d.ts +8 -7
- package/dist/server/public/embedding.js +15 -7
- package/dist/server/public/embedding.js.map +1 -1
- package/dist/server/public/forward.js +15 -1
- package/dist/server/public/forward.js.map +1 -1
- package/dist/server/public/index.d.ts +1 -1
- package/dist/server/public/index.js +7 -0
- package/dist/server/public/index.js.map +1 -1
- package/dist/server/public/listing.js +1 -0
- package/dist/server/public/listing.js.map +1 -1
- package/dist/server/public/responses.js +9 -0
- package/dist/server/public/responses.js.map +1 -1
- package/dist/server/public/trace.js +2 -0
- package/dist/server/public/trace.js.map +1 -1
- package/dist/server/public/types.d.ts +29 -1
- package/dist/server/public/validate.d.ts +32 -0
- package/dist/server/public/validate.js +146 -0
- package/dist/server/public/validate.js.map +1 -0
- package/dist/settings/schema/geniex.json +63 -0
- package/dist/settings/schema/mlx.json +1 -1
- package/dist/settings/schema.js +11 -0
- package/dist/settings/schema.js.map +1 -1
- package/dist/telemetry/reports.d.ts +12 -0
- package/dist/telemetry/reports.js +38 -0
- package/dist/telemetry/reports.js.map +1 -1
- package/dist/telemetry/subscribe.d.ts +3 -3
- package/dist/telemetry/subscribe.js +8 -3
- package/dist/telemetry/subscribe.js.map +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +11 -2
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Spawning and supervising `audiocpp_server` for one model.
|
|
3
|
+
*
|
|
4
|
+
* Readiness is real: with `lazy_load: false` audio.cpp loads the model before it binds the port, so a
|
|
5
|
+
* 200 from `GET /health` means the model is loaded, and a load failure exits the process before it
|
|
6
|
+
* listens (`audiocpp_server failed: …`). `/health` is a route other servers answer too, so the model
|
|
7
|
+
* listing is read next: it must name our model with the family and task the load asked for, loaded —
|
|
8
|
+
* otherwise the port belongs to someone else, or the engine serves something else.
|
|
9
|
+
*/
|
|
10
|
+
import { mkdir, stat, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { join } from 'node:path';
|
|
12
|
+
import { AtomicCoreError } from '../contracts/index.js';
|
|
13
|
+
import { OutputRecords } from '../diffusion/index.js';
|
|
14
|
+
import { diagnosticTail } from '../diffusion/index.js';
|
|
15
|
+
import { backendOutputReporter, buildProcessEnv, discoverCudaPaths, nodeCudaProbeEnv, randomFreePort, retryOnTakenPort, spawnManaged, } from '../runtime/shared/index.js';
|
|
16
|
+
import { audioChildEnv, buildAudioServerArgs } from './args.js';
|
|
17
|
+
import { buildCapabilities, parseServedModels, parseVoiceList } from './capabilities.js';
|
|
18
|
+
import { buildServerConfig } from './config.js';
|
|
19
|
+
import { audioError, audioIoError } from './errors.js';
|
|
20
|
+
import { audioServerBinaryName } from './install.js';
|
|
21
|
+
import { audioEarlyExitError, describeAudioExit, exitedOnTakenAudioPort, readModelFact } from './output.js';
|
|
22
|
+
export const HEALTH_PATH = '/health';
|
|
23
|
+
export const MODELS_PATH = '/v1/models?include_params=true';
|
|
24
|
+
export const VOICES_PATH = '/v1/audio/voices';
|
|
25
|
+
export const READY_POLL_INTERVAL_MS = 300;
|
|
26
|
+
export const READY_REQUEST_TIMEOUT_MS = 2_000;
|
|
27
|
+
export const PROBE_TIMEOUT_MS = 10_000;
|
|
28
|
+
/** SIGTERM → this long → SIGKILL. */
|
|
29
|
+
export const TERMINATE_GRACE_MS = 5_000;
|
|
30
|
+
/** How many output lines a server keeps for its own post-mortem. */
|
|
31
|
+
export const TAIL_CAPACITY = 200;
|
|
32
|
+
/** The file the core writes the server's config to, under `<data>/audio/run`. */
|
|
33
|
+
export const SERVER_CONFIG_FILE = 'server.json';
|
|
34
|
+
const defaultSleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
35
|
+
/**
|
|
36
|
+
* Spawn `audiocpp_server` for `spec`, wait until it serves the model, and read what it declares. On
|
|
37
|
+
* any failure the child is dead when this rejects. A start that died because its port was taken
|
|
38
|
+
* before the engine could bind it goes again on another port.
|
|
39
|
+
*/
|
|
40
|
+
export async function spawnAudioServer(spec, deps) {
|
|
41
|
+
return retryOnTakenPort(() => spawnOnce(spec, deps), (error) => error instanceof AtomicCoreError &&
|
|
42
|
+
error.code === 'MODEL_LOAD_FAILED' &&
|
|
43
|
+
exitedOnTakenAudioPort(error.details), (attempt) => deps.log?.('warn', `audiocpp_server's port was taken while it started; retrying (${attempt})`));
|
|
44
|
+
}
|
|
45
|
+
async function spawnOnce(spec, deps) {
|
|
46
|
+
const platform = deps.platform ?? process.platform;
|
|
47
|
+
const baseEnv = deps.env ?? process.env;
|
|
48
|
+
const log = deps.log ?? (() => { });
|
|
49
|
+
const exe = join(spec.binaryDir, audioServerBinaryName(platform));
|
|
50
|
+
const isFile = await stat(exe).then((s) => s.isFile(), () => false);
|
|
51
|
+
if (!isFile)
|
|
52
|
+
throw audioError('ENGINE_MISSING', 'The audio engine is not installed.', `missing binary: ${exe}`);
|
|
53
|
+
for (const dir of [deps.runDir, deps.tmpDir])
|
|
54
|
+
await mkdir(dir, { recursive: true }).catch((error) => {
|
|
55
|
+
throw audioIoError('Could not create the audio folders.', error);
|
|
56
|
+
});
|
|
57
|
+
const port = await (deps.freePort ?? (() => randomFreePort([])))().catch((error) => {
|
|
58
|
+
throw audioError('INTERNAL', 'No free port for audiocpp_server.', error instanceof Error ? error.message : String(error));
|
|
59
|
+
});
|
|
60
|
+
const configFile = join(deps.runDir, SERVER_CONFIG_FILE);
|
|
61
|
+
await writeFile(configFile, JSON.stringify(buildServerConfig(spec, port), null, 2)).catch((error) => {
|
|
62
|
+
throw audioIoError('Could not write the audio server config.', error);
|
|
63
|
+
});
|
|
64
|
+
const args = buildAudioServerArgs(configFile, port, spec.backend, spec.threads);
|
|
65
|
+
log('info', `starting audiocpp_server: ${args.join(' ')}`);
|
|
66
|
+
log('debug', `launch tag=${spec.tag} backend=${spec.backendId} binary=${exe} model=${spec.modelPath}`);
|
|
67
|
+
const { env } = buildProcessEnv({
|
|
68
|
+
platform,
|
|
69
|
+
baseEnv,
|
|
70
|
+
exeDir: spec.binaryDir,
|
|
71
|
+
cuda: discoverCudaPaths(nodeCudaProbeEnv(platform, baseEnv)),
|
|
72
|
+
userEnv: audioChildEnv(platform, deps.tmpDir),
|
|
73
|
+
});
|
|
74
|
+
const tail = [];
|
|
75
|
+
const facts = {};
|
|
76
|
+
const records = { stdout: new OutputRecords(), stderr: new OutputRecords() };
|
|
77
|
+
const reportOutput = backendOutputReporter(deps.backendOutput, deps.log);
|
|
78
|
+
const deliver = (stream, lines) => {
|
|
79
|
+
for (const line of lines) {
|
|
80
|
+
reportOutput({ provider: 'audio-cpp', model: spec.modelId, stream, line });
|
|
81
|
+
if (tail.length >= TAIL_CAPACITY)
|
|
82
|
+
tail.shift();
|
|
83
|
+
tail.push(line);
|
|
84
|
+
readModelFact(facts, line);
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
// The build's own folder is the working directory on every platform: its runtime DLLs sit there.
|
|
88
|
+
const proc = spawnManaged({ exe, args, env, cwd: spec.binaryDir, platform }, undefined, {
|
|
89
|
+
captureOutput: false,
|
|
90
|
+
onData: (stream, chunk) => deliver(stream, records[stream].push(chunk)),
|
|
91
|
+
});
|
|
92
|
+
const flushed = proc.exited.then((exit) => {
|
|
93
|
+
for (const stream of ['stdout', 'stderr'])
|
|
94
|
+
deliver(stream, records[stream].finish());
|
|
95
|
+
return exit;
|
|
96
|
+
});
|
|
97
|
+
let exit;
|
|
98
|
+
void flushed.then((e) => (exit = e));
|
|
99
|
+
const handle = {
|
|
100
|
+
pid: proc.pid,
|
|
101
|
+
port,
|
|
102
|
+
exe,
|
|
103
|
+
capabilities: {
|
|
104
|
+
modelId: spec.modelId,
|
|
105
|
+
mode: spec.mode,
|
|
106
|
+
family: spec.family,
|
|
107
|
+
task: spec.task,
|
|
108
|
+
params: [],
|
|
109
|
+
voices: [],
|
|
110
|
+
supportsVoiceRef: false,
|
|
111
|
+
requiresVoiceRef: false,
|
|
112
|
+
},
|
|
113
|
+
tail: () => [...tail],
|
|
114
|
+
exitStatus: () => exit,
|
|
115
|
+
exited: flushed,
|
|
116
|
+
terminate: (graceMs = TERMINATE_GRACE_MS) => proc.terminate(graceMs).then(() => flushed),
|
|
117
|
+
};
|
|
118
|
+
try {
|
|
119
|
+
await deps.onSpawned?.(proc.pid, port, exe);
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
await handle.terminate(0);
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
await awaitReady(spec, handle, proc, tail, facts, deps, exe);
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
await deps.onGone?.(proc.pid);
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
return handle;
|
|
133
|
+
}
|
|
134
|
+
async function awaitReady(spec, handle, proc, tail, facts, deps, exe) {
|
|
135
|
+
const log = deps.log ?? (() => { });
|
|
136
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
137
|
+
const abandon = async (graceMs, error) => {
|
|
138
|
+
await handle.terminate(graceMs);
|
|
139
|
+
throw error;
|
|
140
|
+
};
|
|
141
|
+
const url = `http://127.0.0.1:${handle.port}`;
|
|
142
|
+
const deadline = Date.now() + spec.startupTimeoutMs;
|
|
143
|
+
for (;;) {
|
|
144
|
+
if (deps.signal?.aborted)
|
|
145
|
+
await abandon(0, audioError('CANCELLED', 'The audio model load was stopped.'));
|
|
146
|
+
const spawnFailure = proc.spawnFailure();
|
|
147
|
+
if (spawnFailure)
|
|
148
|
+
throw audioError('MODEL_LOAD_FAILED', 'audiocpp_server could not be started.', `${exe}: ${spawnFailure.message}`);
|
|
149
|
+
const exit = handle.exitStatus();
|
|
150
|
+
if (exit !== undefined) {
|
|
151
|
+
// Give the pipes a moment to flush the final lines.
|
|
152
|
+
await sleep(100);
|
|
153
|
+
const error = audioEarlyExitError(exit, tail);
|
|
154
|
+
log('warn', `audiocpp_server exited early (${describeAudioExit(exit)}):\n${error.details ?? ''}`);
|
|
155
|
+
throw error;
|
|
156
|
+
}
|
|
157
|
+
if (Date.now() >= deadline)
|
|
158
|
+
await abandon(TERMINATE_GRACE_MS, audioError('MODEL_LOAD_FAILED', `The audio model did not finish loading within ${Math.round(spec.startupTimeoutMs / 1000)} seconds.`, diagnosticTail(tail)));
|
|
159
|
+
const ready = await deps.http.get(`${url}${HEALTH_PATH}`, { timeoutMs: READY_REQUEST_TIMEOUT_MS }).then((response) => response.status === 200, () => false);
|
|
160
|
+
if (ready)
|
|
161
|
+
break;
|
|
162
|
+
await sleep(deps.readyPollIntervalMs ?? READY_POLL_INTERVAL_MS);
|
|
163
|
+
}
|
|
164
|
+
const foreign = (why) => abandon(TERMINATE_GRACE_MS, audioError('MODEL_LOAD_FAILED', "Another process answered on the audio server's port.", why));
|
|
165
|
+
const listing = await deps.http
|
|
166
|
+
.get(`${url}${MODELS_PATH}`, { timeoutMs: PROBE_TIMEOUT_MS })
|
|
167
|
+
.catch((error) => foreign(`${MODELS_PATH}: ${error instanceof Error ? error.message : String(error)}`));
|
|
168
|
+
let body;
|
|
169
|
+
try {
|
|
170
|
+
body = JSON.parse(listing.body.toString('utf8'));
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
body = undefined;
|
|
174
|
+
}
|
|
175
|
+
if (listing.status !== 200 || body === undefined)
|
|
176
|
+
await foreign(`${MODELS_PATH} answered ${listing.status}: the listener is not audio.cpp`);
|
|
177
|
+
const served = parseServedModels(body).find((model) => model.id === spec.modelId);
|
|
178
|
+
if (!served)
|
|
179
|
+
return foreign(`${MODELS_PATH} does not list ${spec.modelId}: the listener is not our audio.cpp`);
|
|
180
|
+
if (served.family !== spec.family || served.task !== spec.task)
|
|
181
|
+
await abandon(TERMINATE_GRACE_MS, audioError('MODEL_INCOMPATIBLE', 'The audio engine serves this model as something else.', `family=${served.family} task=${served.task}; wanted family=${spec.family} task=${spec.task}`));
|
|
182
|
+
if (!served.loaded)
|
|
183
|
+
await abandon(TERMINATE_GRACE_MS, audioError('MODEL_LOAD_FAILED', 'The audio engine listed the model without loading it.', spec.modelId));
|
|
184
|
+
// A voice list beyond what `voice_id` declares: read only when the declaration has none.
|
|
185
|
+
let listedVoices = [];
|
|
186
|
+
const voiceParam = served.params.find((param) => param.name === 'voice_id');
|
|
187
|
+
if (spec.mode === 'speech' && !(voiceParam?.values && voiceParam.values.length > 0)) {
|
|
188
|
+
const voices = await deps.http
|
|
189
|
+
.get(`${url}${VOICES_PATH}?model=${encodeURIComponent(spec.modelId)}`, { timeoutMs: PROBE_TIMEOUT_MS })
|
|
190
|
+
.catch(() => undefined);
|
|
191
|
+
if (voices?.status === 200) {
|
|
192
|
+
try {
|
|
193
|
+
listedVoices = parseVoiceList(JSON.parse(voices.body.toString('utf8')));
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
log('warn', 'the voice list was not JSON');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
handle.capabilities = buildCapabilities(spec, served, facts, listedVoices);
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=server-process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-process.js","sourceRoot":"","sources":["../../src/audio/server-process.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The audio-generation service: one resident `audiocpp_server` for the loaded model, jobs against it,
|
|
3
|
+
* the gallery and the model files, and what the engine-builds module and GPU residency need of it.
|
|
4
|
+
* The shape of image generation's `DiffusionService`, much smaller.
|
|
5
|
+
*/
|
|
6
|
+
import type { AudioPaths } from '../config/index.js';
|
|
7
|
+
import type { AudioCancelResult, AudioCapabilities, AudioConfig, AudioGalleryListOptions, AudioGalleryPage, AudioGenerateRequest, AudioJob, AudioMode, AudioModelFile, AudioStatus, LoadAudioModelRequest, LoadedAudioModel } from '../contracts/index.js';
|
|
8
|
+
import type { EngineHost } from '../engine-builds/service.js';
|
|
9
|
+
import type { AudioSpeechBackend } from '../server/index.js';
|
|
10
|
+
import type { BackendOutputSink, GpuClaimHook, GpuOccupancy } from '../runtime/shared/index.js';
|
|
11
|
+
import type { AudioHttpClient } from './http.js';
|
|
12
|
+
import type { AudioJobOutcome, AudioJobTimings } from './jobs.js';
|
|
13
|
+
import type { AudioEmitter, AudioLogger } from './session.js';
|
|
14
|
+
import { AudioState } from './state.js';
|
|
15
|
+
import type { AudioServerHandle, AudioServerSpec } from './types.js';
|
|
16
|
+
export interface AudioServiceDeps {
|
|
17
|
+
paths: AudioPaths;
|
|
18
|
+
emit: AudioEmitter;
|
|
19
|
+
log: AudioLogger;
|
|
20
|
+
/** The child journal: written right after the spawn, cleared when the server is gone. */
|
|
21
|
+
journal?: {
|
|
22
|
+
add(pid: number, port: number, exe: string, modelId: string): Promise<void>;
|
|
23
|
+
remove(pid: number): Promise<void>;
|
|
24
|
+
};
|
|
25
|
+
http?: AudioHttpClient;
|
|
26
|
+
/** Every stdout/stderr line `audiocpp_server` prints, for the life of the session. */
|
|
27
|
+
backendOutput?: BackendOutputSink;
|
|
28
|
+
platform?: NodeJS.Platform;
|
|
29
|
+
env?: NodeJS.ProcessEnv;
|
|
30
|
+
now?: () => number;
|
|
31
|
+
sleep?: (ms: number) => Promise<void>;
|
|
32
|
+
timings?: Partial<AudioJobTimings>;
|
|
33
|
+
idleTickMs?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Core's GPU residency: asked before every `audiocpp_server` spawn — a load, a respawn after a
|
|
36
|
+
* cancel or a crash — to free the GPU of the other engines. Absent, nothing is asked.
|
|
37
|
+
*/
|
|
38
|
+
claimGpu?: GpuClaimHook;
|
|
39
|
+
/** Test seams. */
|
|
40
|
+
spawn?: (spec: AudioServerSpec, signal?: AbortSignal) => Promise<AudioServerHandle>;
|
|
41
|
+
drawSeed?: () => number;
|
|
42
|
+
}
|
|
43
|
+
export declare class AudioService {
|
|
44
|
+
readonly state: AudioState;
|
|
45
|
+
private readonly deps;
|
|
46
|
+
private readonly platform;
|
|
47
|
+
private readonly env;
|
|
48
|
+
private readonly idleTickMs;
|
|
49
|
+
private idle;
|
|
50
|
+
/** Stops a load still waiting for its model when the model is unloaded or the core shuts down. */
|
|
51
|
+
private loading;
|
|
52
|
+
/** GPU claims in flight, a load's or a respawn's; an unload aborts them rather than wait behind them. */
|
|
53
|
+
private readonly claims;
|
|
54
|
+
/** Unloads asked for and not finished: a GPU claim that starts meanwhile gives up at once. */
|
|
55
|
+
private unloadRequests;
|
|
56
|
+
constructor(options: AudioServiceDeps);
|
|
57
|
+
/** Arm the idle timer. */
|
|
58
|
+
start(): void;
|
|
59
|
+
/** Optional settings: the output folder (`null` restores `<data>/audios`) and the idle unload. */
|
|
60
|
+
config(config: AudioConfig): Promise<AudioStatus>;
|
|
61
|
+
status(): Promise<AudioStatus>;
|
|
62
|
+
/** The gallery folder; an empty path restores `<data>/audios`. */
|
|
63
|
+
setOutputDir(path: string): Promise<AudioStatus>;
|
|
64
|
+
/**
|
|
65
|
+
* What the engine-builds module needs of audio generation: the load lock, the build directories in
|
|
66
|
+
* use, and the activation of a new build — cancel the running job, unload a model whose build the
|
|
67
|
+
* new one replaces (`engine-updated`), report the install.
|
|
68
|
+
*/
|
|
69
|
+
engineHost(): EngineHost;
|
|
70
|
+
/**
|
|
71
|
+
* The GPU the resident, stopping or starting `audiocpp_server` holds, for core's residency rule. The
|
|
72
|
+
* resident or starting one is `busy` while a job runs on it that nobody asked to cancel: residency
|
|
73
|
+
* then refuses a chat load (`GPU_BUSY`) instead of stopping the clip.
|
|
74
|
+
*/
|
|
75
|
+
gpuOccupancy(): GpuOccupancy[];
|
|
76
|
+
/** What the active job is making on `spec`; none when no job is live. */
|
|
77
|
+
private working;
|
|
78
|
+
/** The session's claim hook over core's: abortable by an unload, whatever signal the caller had. */
|
|
79
|
+
private claimGpu;
|
|
80
|
+
listModelFiles(): Promise<AudioModelFile[]>;
|
|
81
|
+
/** Delete a file named relative to `<data>/audio/models`; the loaded model's own file is refused. */
|
|
82
|
+
deleteModelFile(relativePath: string): Promise<void>;
|
|
83
|
+
/** Answers once the server serves the model. One load at a time; a load replaces the resident model. */
|
|
84
|
+
loadModel(request: LoadAudioModelRequest): Promise<LoadedAudioModel>;
|
|
85
|
+
/** What a load runs: the newest installed build, the model file checked. */
|
|
86
|
+
private specFor;
|
|
87
|
+
unloadModel(): Promise<void>;
|
|
88
|
+
/** Reset the idle-unload deadline without generating. */
|
|
89
|
+
touchIdle(): void;
|
|
90
|
+
capabilities(): AudioCapabilities;
|
|
91
|
+
/** Start a job; answers it at once, its phases and outcome arrive as `audio:job` events. */
|
|
92
|
+
generate(mode: AudioMode, request: AudioGenerateRequest): Promise<AudioJob>;
|
|
93
|
+
/** Run one job to completion and answer the clip. */
|
|
94
|
+
runJob(mode: AudioMode, request: AudioGenerateRequest): Promise<AudioJobOutcome>;
|
|
95
|
+
/**
|
|
96
|
+
* What `POST /v1/audio/speech` needs: the loaded model and what it makes, and a speech job started
|
|
97
|
+
* the way `runJob` starts one — same validation, events, gallery and idle timer — but answered with
|
|
98
|
+
* its id at once, so a client that hangs up can have it cancelled.
|
|
99
|
+
*/
|
|
100
|
+
speechBackend(): AudioSpeechBackend;
|
|
101
|
+
getJob(id: string): AudioJob | null;
|
|
102
|
+
cancelJob(id: string): Promise<AudioCancelResult>;
|
|
103
|
+
gallery(options: AudioGalleryListOptions): Promise<AudioGalleryPage>;
|
|
104
|
+
deleteGalleryItem(id: string): Promise<void>;
|
|
105
|
+
/** Owner exit: an `audiocpp_server` must not outlive the core. No events, a short grace. */
|
|
106
|
+
shutdown(): Promise<void>;
|
|
107
|
+
}
|