@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,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request bodies of the audio routes, read strictly: closed enums, finite numbers, `null` taken as
|
|
3
|
+
* absent for anything optional, unknown fields ignored. A body that does not fit is `INVALID_REQUEST`,
|
|
4
|
+
* and nothing downstream has to doubt a type again (as image generation's `parse.ts`).
|
|
5
|
+
*/
|
|
6
|
+
import { AUDIO_MODES, AUDIO_TASKS } from '../contracts/index.js';
|
|
7
|
+
import { audioError } from './errors.js';
|
|
8
|
+
function invalid(field, expected) {
|
|
9
|
+
throw audioError('INVALID_REQUEST', 'The request is not valid.', `${field}: expected ${expected}`);
|
|
10
|
+
}
|
|
11
|
+
function fields(value, field) {
|
|
12
|
+
if (value === null || typeof value !== 'object' || Array.isArray(value))
|
|
13
|
+
invalid(field, 'an object');
|
|
14
|
+
return value;
|
|
15
|
+
}
|
|
16
|
+
/** `undefined` for a field that is absent or `null`. */
|
|
17
|
+
function present(source, key) {
|
|
18
|
+
const value = source[key];
|
|
19
|
+
return value === null ? undefined : value;
|
|
20
|
+
}
|
|
21
|
+
function string(value, field) {
|
|
22
|
+
if (typeof value !== 'string')
|
|
23
|
+
invalid(field, 'a string');
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function nonEmpty(value, field) {
|
|
27
|
+
if (typeof value !== 'string' || value.trim() === '')
|
|
28
|
+
invalid(field, 'a non-empty string');
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
function number(value, field) {
|
|
32
|
+
if (typeof value !== 'number' || !Number.isFinite(value))
|
|
33
|
+
invalid(field, 'a number');
|
|
34
|
+
return value;
|
|
35
|
+
}
|
|
36
|
+
function positive(value, field) {
|
|
37
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0)
|
|
38
|
+
invalid(field, 'a number above zero');
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
function integer(value, field) {
|
|
42
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value))
|
|
43
|
+
invalid(field, 'a whole number');
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function positiveInteger(value, field) {
|
|
47
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value <= 0)
|
|
48
|
+
invalid(field, 'a whole number above zero');
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function wholeNumber(value, field) {
|
|
52
|
+
if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0)
|
|
53
|
+
invalid(field, 'a whole number, zero or more');
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
function oneOf(value, field, allowed) {
|
|
57
|
+
if (typeof value !== 'string' || !allowed.includes(value))
|
|
58
|
+
invalid(field, `one of ${allowed.join(', ')}`);
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function options(value, field) {
|
|
62
|
+
const source = fields(value, field);
|
|
63
|
+
const out = {};
|
|
64
|
+
for (const [key, entry] of Object.entries(source)) {
|
|
65
|
+
if (typeof entry !== 'string' &&
|
|
66
|
+
typeof entry !== 'boolean' &&
|
|
67
|
+
!(typeof entry === 'number' && Number.isFinite(entry)))
|
|
68
|
+
invalid(`${field}.${key}`, 'a string, a number or true/false');
|
|
69
|
+
out[key] = entry;
|
|
70
|
+
}
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/** Set `target[key]` from `source[key]` when it is present, through `read`. */
|
|
74
|
+
function copy(target, key, source, read) {
|
|
75
|
+
const value = present(source, key);
|
|
76
|
+
if (value !== undefined)
|
|
77
|
+
target[key] = read(value, key);
|
|
78
|
+
}
|
|
79
|
+
export function parseAudioMode(value) {
|
|
80
|
+
return oneOf(value, 'mode', AUDIO_MODES);
|
|
81
|
+
}
|
|
82
|
+
function audioSource(value, field) {
|
|
83
|
+
const source = fields(value, field);
|
|
84
|
+
const path = present(source, 'path');
|
|
85
|
+
const base64 = present(source, 'base64');
|
|
86
|
+
if ((path === undefined) === (base64 === undefined))
|
|
87
|
+
invalid(field, 'either a path or base64');
|
|
88
|
+
return path !== undefined
|
|
89
|
+
? { path: nonEmpty(path, `${field}.path`) }
|
|
90
|
+
: { base64: nonEmpty(base64, `${field}.base64`) };
|
|
91
|
+
}
|
|
92
|
+
export function parseAudioConfig(body) {
|
|
93
|
+
const source = fields(body, 'config');
|
|
94
|
+
const config = {};
|
|
95
|
+
if ('outputDir' in source)
|
|
96
|
+
config.outputDir = source['outputDir'] === null ? null : string(source['outputDir'], 'outputDir');
|
|
97
|
+
copy(config, 'idleUnloadSecs', source, wholeNumber);
|
|
98
|
+
return config;
|
|
99
|
+
}
|
|
100
|
+
export function parseLoadAudioModelRequest(body) {
|
|
101
|
+
const source = fields(body, 'request');
|
|
102
|
+
const request = {
|
|
103
|
+
modelId: nonEmpty(source['modelId'], 'modelId'),
|
|
104
|
+
displayName: string(source['displayName'], 'displayName'),
|
|
105
|
+
mode: parseAudioMode(source['mode']),
|
|
106
|
+
file: nonEmpty(source['file'], 'file'),
|
|
107
|
+
family: nonEmpty(source['family'], 'family'),
|
|
108
|
+
task: oneOf(source['task'], 'task', AUDIO_TASKS),
|
|
109
|
+
};
|
|
110
|
+
copy(request, 'loadOptions', source, options);
|
|
111
|
+
copy(request, 'sessionOptions', source, options);
|
|
112
|
+
copy(request, 'defaultRequestOptions', source, options);
|
|
113
|
+
copy(request, 'defaultVoice', source, string);
|
|
114
|
+
copy(request, 'threads', source, positiveInteger);
|
|
115
|
+
copy(request, 'startupTimeoutSecs', source, positiveInteger);
|
|
116
|
+
return request;
|
|
117
|
+
}
|
|
118
|
+
export function parseAudioGenerateRequest(body) {
|
|
119
|
+
const source = fields(body, 'request');
|
|
120
|
+
const request = { text: nonEmpty(source['text'], 'text') };
|
|
121
|
+
copy(request, 'voice', source, string);
|
|
122
|
+
copy(request, 'voiceRef', source, audioSource);
|
|
123
|
+
copy(request, 'referenceText', source, string);
|
|
124
|
+
copy(request, 'speed', source, positive);
|
|
125
|
+
copy(request, 'language', source, string);
|
|
126
|
+
copy(request, 'instruct', source, string);
|
|
127
|
+
copy(request, 'lyrics', source, string);
|
|
128
|
+
copy(request, 'durationSec', source, number);
|
|
129
|
+
copy(request, 'bpm', source, positive);
|
|
130
|
+
copy(request, 'seed', source, integer);
|
|
131
|
+
copy(request, 'steps', source, positiveInteger);
|
|
132
|
+
copy(request, 'negativePrompt', source, string);
|
|
133
|
+
copy(request, 'options', source, options);
|
|
134
|
+
return request;
|
|
135
|
+
}
|
|
136
|
+
/** `POST /audio/jobs`: `{mode, request}`. */
|
|
137
|
+
export function parseAudioJobSubmission(body) {
|
|
138
|
+
const source = fields(body, 'body');
|
|
139
|
+
return { mode: parseAudioMode(source['mode']), request: parseAudioGenerateRequest(source['request']) };
|
|
140
|
+
}
|
|
141
|
+
export function parseAudioGalleryListOptions(body) {
|
|
142
|
+
const source = fields(body, 'options');
|
|
143
|
+
return { offset: wholeNumber(source['offset'], 'offset'), limit: wholeNumber(source['limit'], 'limit') };
|
|
144
|
+
}
|
|
145
|
+
/** One required string out of a body, for the routes that take nothing else (`path`, `relativePath`). */
|
|
146
|
+
export function requireAudioString(body, key) {
|
|
147
|
+
return string(fields(body, 'body')[key], key);
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/audio/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The recipe written next to every clip as `<jobId>.json`: what was asked, with which model, engine
|
|
3
|
+
* and seed, and how long the engine took. A WAV whose recipe does not parse is not ours. Pure.
|
|
4
|
+
*/
|
|
5
|
+
import type { AudioGenerateRequest, AudioOptions, AudioRecipe } from '../contracts/index.js';
|
|
6
|
+
import type { AudioServerSpec } from './types.js';
|
|
7
|
+
export interface RecipeInput {
|
|
8
|
+
jobId: string;
|
|
9
|
+
request: AudioGenerateRequest;
|
|
10
|
+
spec: AudioServerSpec;
|
|
11
|
+
seed: number;
|
|
12
|
+
/** The options sent to the engine, named fields merged in. */
|
|
13
|
+
options: AudioOptions;
|
|
14
|
+
createdAtMs: number;
|
|
15
|
+
durationMs: number;
|
|
16
|
+
}
|
|
17
|
+
/** The recipe of a finished job. Speech fields are `null` for music and effects, and the other way round. */
|
|
18
|
+
export declare function buildAudioRecipe(input: RecipeInput): AudioRecipe;
|
|
19
|
+
/** Two-space JSON with every key, `null`s included. */
|
|
20
|
+
export declare function serializeAudioRecipe(recipe: AudioRecipe): string;
|
|
21
|
+
/** The recipe in a sidecar's text, or `undefined` when it is not one of ours. */
|
|
22
|
+
export declare function parseAudioRecipe(text: string): AudioRecipe | undefined;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The recipe written next to every clip as `<jobId>.json`: what was asked, with which model, engine
|
|
3
|
+
* and seed, and how long the engine took. A WAV whose recipe does not parse is not ours. Pure.
|
|
4
|
+
*/
|
|
5
|
+
import { AUDIO_BACKENDS, AUDIO_MODES, AUDIO_TASKS } from '../contracts/index.js';
|
|
6
|
+
const basename = (path) => path.split(/[\\/]/).filter(Boolean).pop() ?? path;
|
|
7
|
+
/** The recipe of a finished job. Speech fields are `null` for music and effects, and the other way round. */
|
|
8
|
+
export function buildAudioRecipe(input) {
|
|
9
|
+
const { request, spec } = input;
|
|
10
|
+
const speech = spec.mode === 'speech';
|
|
11
|
+
const or = (value, applies) => applies && value !== undefined ? value : null;
|
|
12
|
+
return {
|
|
13
|
+
jobId: input.jobId,
|
|
14
|
+
mode: spec.mode,
|
|
15
|
+
text: request.text,
|
|
16
|
+
voice: or(request.voice, speech),
|
|
17
|
+
voiceRef: speech && request.voiceRef !== undefined,
|
|
18
|
+
speed: or(request.speed, speech),
|
|
19
|
+
language: or(request.language, speech),
|
|
20
|
+
instruct: or(request.instruct, speech),
|
|
21
|
+
lyrics: or(request.lyrics, !speech),
|
|
22
|
+
durationSec: or(request.durationSec, !speech),
|
|
23
|
+
bpm: or(request.bpm, !speech),
|
|
24
|
+
seed: input.seed,
|
|
25
|
+
steps: or(request.steps, !speech),
|
|
26
|
+
negativePrompt: or(request.negativePrompt, !speech),
|
|
27
|
+
options: { ...input.options },
|
|
28
|
+
model: {
|
|
29
|
+
modelId: spec.modelId,
|
|
30
|
+
family: spec.family,
|
|
31
|
+
task: spec.task,
|
|
32
|
+
displayName: spec.displayName,
|
|
33
|
+
filename: basename(spec.modelPath),
|
|
34
|
+
},
|
|
35
|
+
engine: { kind: 'audio-cpp', backend: spec.backend, tag: spec.tag },
|
|
36
|
+
createdAtMs: input.createdAtMs,
|
|
37
|
+
durationMs: input.durationMs,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** Two-space JSON with every key, `null`s included. */
|
|
41
|
+
export function serializeAudioRecipe(recipe) {
|
|
42
|
+
return `${JSON.stringify(recipe, null, 2)}\n`;
|
|
43
|
+
}
|
|
44
|
+
const isRecord = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
45
|
+
const stringOrNull = (value) => value === null || typeof value === 'string';
|
|
46
|
+
const numberOrNull = (value) => value === null || (typeof value === 'number' && Number.isFinite(value));
|
|
47
|
+
const isOptions = (value) => isRecord(value) &&
|
|
48
|
+
Object.values(value).every((v) => typeof v === 'string' || typeof v === 'boolean' || (typeof v === 'number' && Number.isFinite(v)));
|
|
49
|
+
/** The recipe in a sidecar's text, or `undefined` when it is not one of ours. */
|
|
50
|
+
export function parseAudioRecipe(text) {
|
|
51
|
+
let raw;
|
|
52
|
+
try {
|
|
53
|
+
raw = JSON.parse(text);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
if (!isRecord(raw))
|
|
59
|
+
return undefined;
|
|
60
|
+
const model = raw['model'];
|
|
61
|
+
const engine = raw['engine'];
|
|
62
|
+
if (typeof raw['jobId'] !== 'string' ||
|
|
63
|
+
!AUDIO_MODES.includes(raw['mode']) ||
|
|
64
|
+
typeof raw['text'] !== 'string' ||
|
|
65
|
+
!stringOrNull(raw['voice']) ||
|
|
66
|
+
typeof raw['voiceRef'] !== 'boolean' ||
|
|
67
|
+
!numberOrNull(raw['speed']) ||
|
|
68
|
+
!stringOrNull(raw['language']) ||
|
|
69
|
+
!stringOrNull(raw['instruct']) ||
|
|
70
|
+
!stringOrNull(raw['lyrics']) ||
|
|
71
|
+
!numberOrNull(raw['durationSec']) ||
|
|
72
|
+
!numberOrNull(raw['bpm']) ||
|
|
73
|
+
typeof raw['seed'] !== 'number' ||
|
|
74
|
+
!numberOrNull(raw['steps']) ||
|
|
75
|
+
!stringOrNull(raw['negativePrompt']) ||
|
|
76
|
+
!isOptions(raw['options']) ||
|
|
77
|
+
!isRecord(model) ||
|
|
78
|
+
typeof model['modelId'] !== 'string' ||
|
|
79
|
+
typeof model['family'] !== 'string' ||
|
|
80
|
+
!AUDIO_TASKS.includes(model['task']) ||
|
|
81
|
+
typeof model['displayName'] !== 'string' ||
|
|
82
|
+
typeof model['filename'] !== 'string' ||
|
|
83
|
+
!isRecord(engine) ||
|
|
84
|
+
engine['kind'] !== 'audio-cpp' ||
|
|
85
|
+
!AUDIO_BACKENDS.includes(engine['backend']) ||
|
|
86
|
+
typeof engine['tag'] !== 'string' ||
|
|
87
|
+
typeof raw['createdAtMs'] !== 'number' ||
|
|
88
|
+
typeof raw['durationMs'] !== 'number')
|
|
89
|
+
return undefined;
|
|
90
|
+
return raw;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","sourceRoot":"","sources":["../../src/audio/recipe.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAehF,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAA;AAE5F,6GAA6G;AAC7G,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAA;IACrC,MAAM,EAAE,GAAG,CAAI,KAAoB,EAAE,OAAgB,EAAY,EAAE,CACjE,OAAO,IAAI,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;IAC/C,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QAChC,QAAQ,EAAE,MAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAClD,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;QAChC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QACtC,MAAM,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC;QACnC,WAAW,EAAE,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;QAC7C,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC;QACjC,cAAc,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,MAAM,CAAC;QACnD,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE;QAC7B,KAAK,EAAE;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC;SACnC;QACD,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE;QACnE,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,UAAU,EAAE,KAAK,CAAC,UAAU;KAC7B,CAAA;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAA;AAC/C,CAAC;AAED,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AACtE,MAAM,YAAY,GAAG,CAAC,KAAc,EAA0B,EAAE,CAAC,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAA;AAC5G,MAAM,YAAY,GAAG,CAAC,KAAc,EAA0B,EAAE,CAC9D,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;AACzE,MAAM,SAAS,GAAG,CAAC,KAAc,EAAyB,EAAE,CAC1D,QAAQ,CAAC,KAAK,CAAC;IACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CACxB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CACxG,CAAA;AAEH,iFAAiF;AACjF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,IAAI,GAAY,CAAA;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAA;IACpC,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,CAAA;IAC1B,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAA;IAC5B,IACE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ;QAChC,CAAE,WAAkC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC/B,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS;QACpC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACjC,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ;QAC/B,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACpC,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC,QAAQ,CAAC,KAAK,CAAC;QAChB,OAAO,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ;QACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,QAAQ;QACnC,CAAE,WAAkC,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,QAAQ;QACxC,OAAO,KAAK,CAAC,UAAU,CAAC,KAAK,QAAQ;QACrC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACjB,MAAM,CAAC,MAAM,CAAC,KAAK,WAAW;QAC9B,CAAE,cAAqC,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ;QACtC,OAAO,GAAG,CAAC,YAAY,CAAC,KAAK,QAAQ;QAErC,OAAO,SAAS,CAAA;IAClB,OAAO,GAA6B,CAAA;AACtC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a job sends `audiocpp_server` and how its answer is read. Pure.
|
|
3
|
+
*
|
|
4
|
+
* Speech goes to `POST /v1/audio/speech` (OpenAI's shape: `input`, `voice`, `speed`, plus audio.cpp's
|
|
5
|
+
* `seed`, `language`, `voice_ref`, `reference_text` and `options`) and answers WAV bytes. Music and
|
|
6
|
+
* effects go to `POST /v1/tasks/run` (`request.text` and `request.options`) and answer JSON with the
|
|
7
|
+
* WAV as base64 `audio` — and the same bytes again under `named_audio_outputs`, which is ignored.
|
|
8
|
+
*
|
|
9
|
+
* audio.cpp refuses an option the family does not declare ("unknown … request option"), so a named
|
|
10
|
+
* field is sent only when the request sets it; it then wins over the same key in `options`. A style
|
|
11
|
+
* instruction travels as the `instruct` option (Qwen3-TTS declares it): the top-level `instructions`
|
|
12
|
+
* becomes an `instruction` option no family declares.
|
|
13
|
+
*/
|
|
14
|
+
import type { AudioGenerateRequest, AudioMode, AudioOptions } from '../contracts/index.js';
|
|
15
|
+
export declare const SPEECH_PATH = "/v1/audio/speech";
|
|
16
|
+
export declare const TASK_PATH = "/v1/tasks/run";
|
|
17
|
+
/** The request's own `options`, minus every key a named field (the seed included) of `mode` sets. */
|
|
18
|
+
export declare function extraOptions(mode: AudioMode, request: AudioGenerateRequest): AudioOptions;
|
|
19
|
+
/** `POST /v1/audio/speech`. `voiceRef` is the reference WAV, base64. */
|
|
20
|
+
export declare function buildSpeechBody(modelId: string, request: AudioGenerateRequest, seed: number, voiceRef?: string): Record<string, unknown>;
|
|
21
|
+
/** `POST /v1/tasks/run` for music and effects. */
|
|
22
|
+
export declare function buildTaskBody(modelId: string, request: AudioGenerateRequest, seed: number): Record<string, unknown>;
|
|
23
|
+
/** The WAV of a `/v1/tasks/run` answer; `INVALID_OUTPUT` when there is none. */
|
|
24
|
+
export declare function decodeTaskAudio(body: Buffer): Buffer;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a job sends `audiocpp_server` and how its answer is read. Pure.
|
|
3
|
+
*
|
|
4
|
+
* Speech goes to `POST /v1/audio/speech` (OpenAI's shape: `input`, `voice`, `speed`, plus audio.cpp's
|
|
5
|
+
* `seed`, `language`, `voice_ref`, `reference_text` and `options`) and answers WAV bytes. Music and
|
|
6
|
+
* effects go to `POST /v1/tasks/run` (`request.text` and `request.options`) and answer JSON with the
|
|
7
|
+
* WAV as base64 `audio` — and the same bytes again under `named_audio_outputs`, which is ignored.
|
|
8
|
+
*
|
|
9
|
+
* audio.cpp refuses an option the family does not declare ("unknown … request option"), so a named
|
|
10
|
+
* field is sent only when the request sets it; it then wins over the same key in `options`. A style
|
|
11
|
+
* instruction travels as the `instruct` option (Qwen3-TTS declares it): the top-level `instructions`
|
|
12
|
+
* becomes an `instruction` option no family declares.
|
|
13
|
+
*/
|
|
14
|
+
import { audioError } from './errors.js';
|
|
15
|
+
export const SPEECH_PATH = '/v1/audio/speech';
|
|
16
|
+
export const TASK_PATH = '/v1/tasks/run';
|
|
17
|
+
/** The engine option each named field of a speech request stands for. */
|
|
18
|
+
const SPEECH_NAMED = [
|
|
19
|
+
['voice', 'voice_id'],
|
|
20
|
+
['speed', 'speed'],
|
|
21
|
+
['language', 'language'],
|
|
22
|
+
['instruct', 'instruct'],
|
|
23
|
+
['referenceText', 'reference_text'],
|
|
24
|
+
];
|
|
25
|
+
/** The engine option each named field of a music or effects request stands for. */
|
|
26
|
+
const TASK_NAMED = [
|
|
27
|
+
['durationSec', 'duration_sec'],
|
|
28
|
+
['lyrics', 'lyrics'],
|
|
29
|
+
['bpm', 'bpm'],
|
|
30
|
+
['steps', 'num_inference_steps'],
|
|
31
|
+
['negativePrompt', 'negative_prompt'],
|
|
32
|
+
];
|
|
33
|
+
/** The request's own `options`, minus every key a named field (the seed included) of `mode` sets. */
|
|
34
|
+
export function extraOptions(mode, request) {
|
|
35
|
+
const out = { ...(request.options ?? {}) };
|
|
36
|
+
delete out['seed'];
|
|
37
|
+
for (const [field, key] of mode === 'speech' ? SPEECH_NAMED : TASK_NAMED)
|
|
38
|
+
if (request[field] !== undefined)
|
|
39
|
+
delete out[key];
|
|
40
|
+
return out;
|
|
41
|
+
}
|
|
42
|
+
/** `POST /v1/audio/speech`. `voiceRef` is the reference WAV, base64. */
|
|
43
|
+
export function buildSpeechBody(modelId, request, seed, voiceRef) {
|
|
44
|
+
const options = extraOptions('speech', request);
|
|
45
|
+
if (request.instruct !== undefined)
|
|
46
|
+
options['instruct'] = request.instruct;
|
|
47
|
+
const body = { model: modelId, input: request.text, seed };
|
|
48
|
+
if (request.voice !== undefined)
|
|
49
|
+
body['voice'] = request.voice;
|
|
50
|
+
if (request.speed !== undefined)
|
|
51
|
+
body['speed'] = request.speed;
|
|
52
|
+
if (request.language !== undefined)
|
|
53
|
+
body['language'] = request.language;
|
|
54
|
+
if (voiceRef !== undefined)
|
|
55
|
+
body['voice_ref'] = { type: 'base64', data: voiceRef };
|
|
56
|
+
if (request.referenceText !== undefined)
|
|
57
|
+
body['reference_text'] = request.referenceText;
|
|
58
|
+
if (Object.keys(options).length > 0)
|
|
59
|
+
body['options'] = options;
|
|
60
|
+
return body;
|
|
61
|
+
}
|
|
62
|
+
/** `POST /v1/tasks/run` for music and effects. */
|
|
63
|
+
export function buildTaskBody(modelId, request, seed) {
|
|
64
|
+
const options = { ...extraOptions('music', request), seed };
|
|
65
|
+
for (const [field, key] of TASK_NAMED) {
|
|
66
|
+
const value = request[field];
|
|
67
|
+
if (typeof value === 'string' || typeof value === 'number')
|
|
68
|
+
options[key] = value;
|
|
69
|
+
}
|
|
70
|
+
return { model: modelId, request: { text: request.text, options } };
|
|
71
|
+
}
|
|
72
|
+
/** The WAV of a `/v1/tasks/run` answer; `INVALID_OUTPUT` when there is none. */
|
|
73
|
+
export function decodeTaskAudio(body) {
|
|
74
|
+
let parsed;
|
|
75
|
+
try {
|
|
76
|
+
parsed = JSON.parse(body.toString('utf8'));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
throw audioError('INVALID_OUTPUT', 'The audio engine answered with something that is not JSON.', error instanceof Error ? error.message : String(error));
|
|
80
|
+
}
|
|
81
|
+
const audio = parsed?.audio;
|
|
82
|
+
if (typeof audio !== 'string' || audio === '')
|
|
83
|
+
throw audioError('INVALID_OUTPUT', 'The audio engine answered without audio.');
|
|
84
|
+
return Buffer.from(audio, 'base64');
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/audio/request.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 type { BackendOutputSink } from '../runtime/shared/index.js';
|
|
11
|
+
import type { AudioHttpClient } from './http.js';
|
|
12
|
+
import type { AudioServerHandle, AudioServerSpec } from './types.js';
|
|
13
|
+
export declare const HEALTH_PATH = "/health";
|
|
14
|
+
export declare const MODELS_PATH = "/v1/models?include_params=true";
|
|
15
|
+
export declare const VOICES_PATH = "/v1/audio/voices";
|
|
16
|
+
export declare const READY_POLL_INTERVAL_MS = 300;
|
|
17
|
+
export declare const READY_REQUEST_TIMEOUT_MS = 2000;
|
|
18
|
+
export declare const PROBE_TIMEOUT_MS = 10000;
|
|
19
|
+
/** SIGTERM → this long → SIGKILL. */
|
|
20
|
+
export declare const TERMINATE_GRACE_MS = 5000;
|
|
21
|
+
/** How many output lines a server keeps for its own post-mortem. */
|
|
22
|
+
export declare const TAIL_CAPACITY = 200;
|
|
23
|
+
/** The file the core writes the server's config to, under `<data>/audio/run`. */
|
|
24
|
+
export declare const SERVER_CONFIG_FILE = "server.json";
|
|
25
|
+
export interface SpawnAudioServerDeps {
|
|
26
|
+
http: AudioHttpClient;
|
|
27
|
+
/** `<data>/audio/run`: where `server.json` is written. */
|
|
28
|
+
runDir: string;
|
|
29
|
+
/** `<data>/audio/tmp`: the child's `TMPDIR`. */
|
|
30
|
+
tmpDir: string;
|
|
31
|
+
platform?: NodeJS.Platform;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
log?: (level: 'info' | 'warn' | 'debug', msg: string) => void;
|
|
34
|
+
/** Every stdout/stderr line the server prints, for the life of the session. */
|
|
35
|
+
backendOutput?: BackendOutputSink;
|
|
36
|
+
/** Called with the child right after it started, before readiness: the journal entry goes here. */
|
|
37
|
+
onSpawned?: (pid: number, port: number, exe: string) => Promise<void>;
|
|
38
|
+
/** Called when a child that `onSpawned` saw is dead and will never become a session. */
|
|
39
|
+
onGone?: (pid: number) => Promise<void>;
|
|
40
|
+
/** Stops a load still waiting for the model (an unload or a shutdown); the child is killed. */
|
|
41
|
+
signal?: AbortSignal;
|
|
42
|
+
freePort?: () => Promise<number>;
|
|
43
|
+
readyPollIntervalMs?: number;
|
|
44
|
+
sleep?: (ms: number) => Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Spawn `audiocpp_server` for `spec`, wait until it serves the model, and read what it declares. On
|
|
48
|
+
* any failure the child is dead when this rejects. A start that died because its port was taken
|
|
49
|
+
* before the engine could bind it goes again on another port.
|
|
50
|
+
*/
|
|
51
|
+
export declare function spawnAudioServer(spec: AudioServerSpec, deps: SpawnAudioServerDeps): Promise<AudioServerHandle>;
|