@elizaos/plugin-elizacloud 2.0.0-beta.1 → 2.0.11-beta.7
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/README.md +20 -44
- package/auto-enable.ts +10 -5
- package/dist/browser/index.browser.js +2 -2
- package/dist/browser/index.browser.js.map +4 -4
- package/dist/cjs/index.node.cjs +2874 -5915
- package/dist/cjs/index.node.js.map +47 -116
- package/dist/cloud/auth-service-types.d.ts +8 -0
- package/dist/cloud/auth-service-types.d.ts.map +1 -0
- package/dist/cloud/auth-service-types.js +36 -0
- package/dist/cloud/auth-service-types.js.map +10 -0
- package/dist/cloud/auth.js +4 -51
- package/dist/cloud/auth.js.map +4 -4
- package/dist/cloud/base-url.d.ts +6 -2
- package/dist/cloud/base-url.d.ts.map +1 -1
- package/dist/cloud/base-url.js +3 -51
- package/dist/cloud/base-url.js.map +3 -3
- package/dist/cloud/bridge-client.d.ts +3 -3
- package/dist/cloud/bridge-client.d.ts.map +1 -1
- package/dist/cloud/bridge-client.js +3 -51
- package/dist/cloud/bridge-client.js.map +3 -3
- package/dist/cloud/clack-observer.d.ts +35 -0
- package/dist/cloud/clack-observer.d.ts.map +1 -0
- package/dist/cloud/clack-observer.js +143 -0
- package/dist/cloud/clack-observer.js.map +10 -0
- package/dist/cloud/cloud-manager.js +45 -92
- package/dist/cloud/cloud-manager.js.map +6 -6
- package/dist/cloud/cloud-wallet.js +2 -4835
- package/dist/cloud/cloud-wallet.js.map +3 -82
- package/dist/cloud/duffel-client.d.ts +181 -0
- package/dist/cloud/duffel-client.d.ts.map +1 -0
- package/dist/cloud/duffel-client.js +506 -0
- package/dist/cloud/duffel-client.js.map +11 -0
- package/dist/cloud/index.d.ts +6 -0
- package/dist/cloud/index.d.ts.map +1 -1
- package/dist/cloud/index.js +1782 -1
- package/dist/cloud/index.js.map +18 -3
- package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
- package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
- package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
- package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
- package/dist/cloud/managed-payment-clients.d.ts +166 -0
- package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
- package/dist/cloud/managed-payment-clients.js +238 -0
- package/dist/cloud/managed-payment-clients.js.map +11 -0
- package/dist/cloud/null-observer.d.ts +35 -0
- package/dist/cloud/null-observer.d.ts.map +1 -0
- package/dist/cloud/null-observer.js +45 -0
- package/dist/cloud/null-observer.js.map +10 -0
- package/dist/cloud/setup-observer.d.ts +98 -0
- package/dist/cloud/setup-observer.d.ts.map +1 -0
- package/dist/cloud/setup-observer.js +2 -0
- package/dist/cloud/setup-observer.js.map +9 -0
- package/dist/cloud/validate-url.d.ts.map +1 -1
- package/dist/cloud/validate-url.js +2 -1
- package/dist/cloud/validate-url.js.map +3 -3
- package/dist/cloud/x402-payment-handler.d.ts +85 -0
- package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
- package/dist/cloud/x402-payment-handler.js +119 -0
- package/dist/cloud/x402-payment-handler.js.map +10 -0
- package/dist/cloud-setup.d.ts +36 -0
- package/dist/cloud-setup.d.ts.map +1 -0
- package/dist/{onboarding.js → cloud-setup.js} +139 -139
- package/dist/cloud-setup.js.map +14 -0
- package/dist/cloud-voice-catalog.d.ts +65 -0
- package/dist/cloud-voice-catalog.d.ts.map +1 -0
- package/dist/cloud-voice-catalog.js +278 -0
- package/dist/cloud-voice-catalog.js.map +12 -0
- package/dist/index.browser.d.ts +11 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5416 -8405
- package/dist/index.js.map +48 -116
- package/dist/index.node.d.ts +8 -1
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.js +17 -4
- package/dist/init.js.map +4 -4
- package/dist/lib/cloud-connection.d.ts +0 -1
- package/dist/lib/cloud-connection.d.ts.map +1 -1
- package/dist/lib/cloud-connection.js +14 -91
- package/dist/lib/cloud-connection.js.map +7 -7
- package/dist/lib/cloud-secrets.d.ts +5 -18
- package/dist/lib/cloud-secrets.d.ts.map +1 -1
- package/dist/lib/cloud-secrets.js +8 -36
- package/dist/lib/cloud-secrets.js.map +3 -3
- package/dist/lib/config-like.d.ts +1 -1
- package/dist/lib/config-like.d.ts.map +1 -1
- package/dist/lib/config-like.js +3 -3
- package/dist/lib/config-like.js.map +3 -3
- package/dist/lib/credential-type-map.d.ts +1 -1
- package/dist/lib/credential-type-map.js.map +1 -1
- package/dist/lib/http.d.ts +0 -11
- package/dist/lib/http.d.ts.map +1 -1
- package/dist/lib/http.js.map +2 -2
- package/dist/lib/server-cloud-tts.d.ts +12 -25
- package/dist/lib/server-cloud-tts.d.ts.map +1 -1
- package/dist/lib/server-cloud-tts.js +31 -329
- package/dist/lib/server-cloud-tts.js.map +4 -7
- package/dist/lib/tts-debug.d.ts +5 -3
- package/dist/lib/tts-debug.d.ts.map +1 -1
- package/dist/lib/tts-debug.js +1 -34
- package/dist/lib/tts-debug.js.map +3 -4
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +79 -69
- package/dist/models/embeddings.js.map +6 -6
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +42 -15
- package/dist/models/image.js.map +6 -6
- package/dist/models/index.js +676 -166
- package/dist/models/index.js.map +11 -12
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +24 -7
- package/dist/models/research.js.map +6 -6
- package/dist/models/speech.d.ts +61 -3
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +173 -17
- package/dist/models/speech.js.map +5 -5
- package/dist/models/text.d.ts +106 -1
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +452 -82
- package/dist/models/text.js.map +7 -8
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js.map +2 -2
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +20 -6
- package/dist/models/transcription.js.map +5 -5
- package/dist/node/index.node.js +2828 -5838
- package/dist/node/index.node.js.map +47 -116
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +376 -5050
- package/dist/plugin.js.map +16 -92
- package/dist/providers/openai.js +11 -2
- package/dist/providers/openai.js.map +3 -3
- package/dist/register-routes.js +376 -5050
- package/dist/register-routes.js.map +16 -92
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
- package/dist/routes/cloud-billing-routes.js +17 -60
- package/dist/routes/cloud-billing-routes.js.map +8 -7
- package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
- package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
- package/dist/routes/cloud-coding-container-routes.js +214 -0
- package/dist/routes/cloud-coding-container-routes.js.map +11 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
- package/dist/routes/cloud-compat-routes.js +17 -60
- package/dist/routes/cloud-compat-routes.js.map +8 -7
- package/dist/routes/cloud-features-routes.js +2 -2
- package/dist/routes/cloud-features-routes.js.map +4 -4
- package/dist/routes/cloud-relay-routes.d.ts +2 -1
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
- package/dist/routes/cloud-relay-routes.js +84 -2
- package/dist/routes/cloud-relay-routes.js.map +5 -4
- package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-routes-autonomous.js +11 -4893
- package/dist/routes/cloud-routes-autonomous.js.map +8 -87
- package/dist/routes/cloud-routes.d.ts +2 -2
- package/dist/routes/cloud-routes.d.ts.map +1 -1
- package/dist/routes/cloud-routes.js +343 -5058
- package/dist/routes/cloud-routes.js.map +13 -90
- package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
- package/dist/routes/cloud-status-routes-autonomous.js +4 -51
- package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
- package/dist/routes/cloud-status-routes.js +14 -90
- package/dist/routes/cloud-status-routes.js.map +7 -7
- package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
- package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
- package/dist/routes/home-remote-runner-access-url.js +91 -0
- package/dist/routes/home-remote-runner-access-url.js.map +10 -0
- package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
- package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
- package/dist/routes/travel-provider-relay-routes.js +358 -0
- package/dist/routes/travel-provider-relay-routes.js.map +14 -0
- package/dist/services/cloud-auth.d.ts +1 -1
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +7 -2
- package/dist/services/cloud-auth.js.map +4 -4
- package/dist/services/cloud-backup.js.map +2 -2
- package/dist/services/cloud-bootstrap.d.ts.map +1 -1
- package/dist/services/cloud-bootstrap.js.map +2 -2
- package/dist/services/cloud-bridge.js.map +3 -3
- package/dist/services/cloud-container.d.ts +5 -1
- package/dist/services/cloud-container.d.ts.map +1 -1
- package/dist/services/cloud-container.js +52 -1
- package/dist/services/cloud-container.js.map +4 -4
- package/dist/services/cloud-credential-provider.js.map +2 -2
- package/dist/services/cloud-model-registry.js.map +2 -2
- package/dist/types/cloud.d.ts +1 -0
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js.map +2 -2
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/client.js +136 -4
- package/dist/utils/cloud-sdk/client.js.map +5 -5
- package/dist/utils/cloud-sdk/http.js.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/public-routes.js +99 -1
- package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
- package/dist/utils/cloud-sdk/types.d.ts +0 -2
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
- package/dist/utils/cloud-sdk/types.js.map +1 -1
- package/dist/utils/config.d.ts +10 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +12 -2
- package/dist/utils/config.js.map +3 -3
- package/dist/utils/events.d.ts +23 -2
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +5 -3
- package/dist/utils/events.js.map +3 -3
- package/dist/utils/sdk-client.d.ts.map +1 -1
- package/dist/utils/sdk-client.js +17 -4
- package/dist/utils/sdk-client.js.map +4 -4
- package/dist/utils/waifu-metering.d.ts +108 -0
- package/dist/utils/waifu-metering.d.ts.map +1 -0
- package/dist/utils/waifu-metering.js +166 -0
- package/dist/utils/waifu-metering.js.map +10 -0
- package/package.json +51 -22
- package/src/cloud/auth-service-types.ts +24 -0
- package/src/cloud/base-url.ts +6 -62
- package/src/cloud/clack-observer.ts +189 -0
- package/src/cloud/duffel-client.ts +847 -0
- package/src/cloud/index.ts +10 -0
- package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
- package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
- package/src/cloud/managed-payment-clients.ts +374 -0
- package/src/cloud/null-observer.ts +45 -0
- package/src/cloud/setup-observer.ts +125 -0
- package/src/cloud/validate-url.ts +7 -1
- package/src/cloud/x402-payment-handler.ts +215 -0
- package/src/cloud-setup.ts +531 -0
- package/src/cloud-voice-catalog.test.ts +254 -0
- package/src/cloud-voice-catalog.ts +246 -0
- package/src/index.browser.ts +29 -0
- package/src/index.node.ts +31 -1
- package/src/index.ts +76 -4
- package/src/lib/cloud-connection.ts +2 -4
- package/src/lib/cloud-secrets.ts +10 -54
- package/src/lib/config-like.ts +1 -1
- package/src/lib/credential-type-map.ts +2 -2
- package/src/lib/http.ts +0 -17
- package/src/lib/server-cloud-tts.ts +33 -341
- package/src/lib/tts-debug.ts +5 -34
- package/src/models/embeddings.ts +140 -76
- package/src/models/image.ts +29 -14
- package/src/models/research.ts +11 -1
- package/src/models/speech.ts +269 -23
- package/src/models/text.ts +704 -110
- package/src/models/tokenization.ts +2 -2
- package/src/models/transcription.ts +7 -3
- package/src/plugin.ts +38 -0
- package/src/routes/cloud-billing-routes.ts +4 -14
- package/src/routes/cloud-coding-container-routes.ts +198 -0
- package/src/routes/cloud-compat-routes.ts +4 -14
- package/src/routes/cloud-features-routes.ts +1 -1
- package/src/routes/cloud-relay-routes.ts +47 -1
- package/src/routes/cloud-routes-autonomous.ts +7 -10
- package/src/routes/cloud-routes.ts +68 -7
- package/src/routes/cloud-status-routes-autonomous.ts +6 -2
- package/src/routes/home-remote-runner-access-url.ts +83 -0
- package/src/routes/travel-provider-relay-routes.ts +193 -0
- package/src/services/cloud-auth.ts +9 -2
- package/src/services/cloud-bootstrap.ts +1 -3
- package/src/services/cloud-bridge.ts +1 -1
- package/src/services/cloud-container.ts +93 -0
- package/src/services/cloud-credential-provider.ts +1 -1
- package/src/services/cloud-model-registry.ts +1 -1
- package/src/types/cloud.ts +22 -0
- package/src/types/index.ts +19 -0
- package/src/utils/cloud-sdk/client.ts +42 -3
- package/src/utils/cloud-sdk/public-routes.ts +168 -0
- package/src/utils/cloud-sdk/types.ts +0 -2
- package/src/utils/config.ts +20 -1
- package/src/utils/events.ts +30 -2
- package/src/utils/sdk-client.ts +5 -1
- package/src/utils/waifu-metering.ts +302 -0
- package/dist/onboarding.d.ts +0 -35
- package/dist/onboarding.d.ts.map +0 -1
- package/dist/onboarding.js.map +0 -14
- package/src/onboarding.ts +0 -396
|
@@ -16,111 +16,31 @@ var __export = (target, all) => {
|
|
|
16
16
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
17
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
18
|
|
|
19
|
-
// src/lib/state-paths.ts
|
|
20
|
-
import fs from "node:fs";
|
|
21
|
-
import path from "node:path";
|
|
22
|
-
import {
|
|
23
|
-
getElizaNamespace,
|
|
24
|
-
resolveStateDir,
|
|
25
|
-
resolveUserPath
|
|
26
|
-
} from "@elizaos/core";
|
|
27
|
-
function resolveConfigPath(env = process.env, stateDirPath = resolveStateDir(env)) {
|
|
28
|
-
const override = env.ELIZA_CONFIG_PATH?.trim();
|
|
29
|
-
if (override)
|
|
30
|
-
return resolveUserPath(override);
|
|
31
|
-
const namespace = getElizaNamespace(env);
|
|
32
|
-
const primaryPath = path.join(stateDirPath, `${namespace}.json`);
|
|
33
|
-
if (fs.existsSync(primaryPath))
|
|
34
|
-
return primaryPath;
|
|
35
|
-
if (namespace !== "eliza") {
|
|
36
|
-
const legacyPath = path.join(stateDirPath, "eliza.json");
|
|
37
|
-
if (fs.existsSync(legacyPath))
|
|
38
|
-
return legacyPath;
|
|
39
|
-
}
|
|
40
|
-
return primaryPath;
|
|
41
|
-
}
|
|
42
|
-
var init_state_paths = () => {};
|
|
43
|
-
|
|
44
|
-
// src/lib/cloud-secrets.ts
|
|
45
|
-
function getCloudSecret(key) {
|
|
46
|
-
return _cloudSecrets[key] ?? process.env[key];
|
|
47
|
-
}
|
|
48
|
-
function scrubCloudSecretsFromEnv() {
|
|
49
|
-
for (const key of [
|
|
50
|
-
"ELIZAOS_CLOUD_API_KEY",
|
|
51
|
-
"ELIZAOS_CLOUD_ENABLED"
|
|
52
|
-
]) {
|
|
53
|
-
if (process.env[key] !== undefined) {
|
|
54
|
-
_cloudSecrets[key] = process.env[key];
|
|
55
|
-
delete process.env[key];
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
function clearCloudSecrets() {
|
|
60
|
-
for (const key of [
|
|
61
|
-
"ELIZAOS_CLOUD_API_KEY",
|
|
62
|
-
"ELIZAOS_CLOUD_ENABLED"
|
|
63
|
-
]) {
|
|
64
|
-
delete _cloudSecrets[key];
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
function _resetCloudSecretsForTesting() {
|
|
68
|
-
for (const key of Object.keys(_cloudSecrets)) {
|
|
69
|
-
delete _cloudSecrets[key];
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
var _cloudSecrets;
|
|
73
|
-
var init_cloud_secrets = __esm(() => {
|
|
74
|
-
_cloudSecrets = Object.create(null);
|
|
75
|
-
Object.defineProperty(_cloudSecrets, Symbol.toStringTag, {
|
|
76
|
-
value: "CloudSecrets",
|
|
77
|
-
enumerable: false
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
// src/lib/tts-debug.ts
|
|
82
|
-
function truthy(raw) {
|
|
83
|
-
if (raw == null)
|
|
84
|
-
return false;
|
|
85
|
-
const value = String(raw).trim().toLowerCase();
|
|
86
|
-
return value === "1" || value === "true" || value === "yes" || value === "on";
|
|
87
|
-
}
|
|
88
|
-
function ttsDebugEnabled() {
|
|
89
|
-
if (typeof process !== "undefined" && process.env) {
|
|
90
|
-
if (truthy(process.env.ELIZA_TTS_DEBUG))
|
|
91
|
-
return true;
|
|
92
|
-
}
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
function isTtsDebugEnabled() {
|
|
96
|
-
return ttsDebugEnabled();
|
|
97
|
-
}
|
|
98
|
-
function ttsDebugTextPreview(text, maxChars = 160) {
|
|
99
|
-
const singleLine = text.replace(/\r?\n/g, "↵ ").replace(/\s+/g, " ").trim();
|
|
100
|
-
if (singleLine.length <= maxChars)
|
|
101
|
-
return singleLine;
|
|
102
|
-
return `${singleLine.slice(0, maxChars)}…`;
|
|
103
|
-
}
|
|
104
|
-
function ttsDebug(phase, detail) {
|
|
105
|
-
if (!ttsDebugEnabled())
|
|
106
|
-
return;
|
|
107
|
-
if (detail && Object.keys(detail).length > 0) {
|
|
108
|
-
console.info(`[eliza][tts] ${phase}`, detail);
|
|
109
|
-
} else {
|
|
110
|
-
console.info(`[eliza][tts] ${phase}`);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
19
|
// src/lib/server-cloud-tts.ts
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
20
|
+
import { sanitizeSpeechText } from "@elizaos/core";
|
|
21
|
+
import {
|
|
22
|
+
_internalResolveCloudApiKey,
|
|
23
|
+
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
|
|
24
|
+
resolveCloudProxyTtsModel,
|
|
25
|
+
resolveCloudTtsCandidateUrls,
|
|
26
|
+
resolveElizaCloudTtsVoiceId,
|
|
27
|
+
shouldRetryCloudTtsUpstream,
|
|
28
|
+
ttsDebug,
|
|
29
|
+
ttsDebugTextPreview
|
|
30
|
+
} from "@elizaos/shared";
|
|
31
|
+
import {
|
|
32
|
+
__resetCloudBaseUrlCache,
|
|
33
|
+
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS as ELIZA_CLOUD_TTS_MAX_TEXT_CHARS2,
|
|
34
|
+
ensureCloudTtsApiKeyAlias,
|
|
35
|
+
mirrorCompatHeaders,
|
|
36
|
+
normalizeElizaCloudTtsModelId,
|
|
37
|
+
resolveCloudProxyTtsModel as resolveCloudProxyTtsModel2,
|
|
38
|
+
resolveCloudTtsBaseUrl,
|
|
39
|
+
resolveCloudTtsCandidateUrls as resolveCloudTtsCandidateUrls2,
|
|
40
|
+
resolveElevenLabsApiKeyForCloudMode,
|
|
41
|
+
resolveElizaCloudTtsVoiceId as resolveElizaCloudTtsVoiceId2,
|
|
42
|
+
shouldRetryCloudTtsUpstream as shouldRetryCloudTtsUpstream2
|
|
43
|
+
} from "@elizaos/shared";
|
|
124
44
|
function readTtsDebugClientHeaders(req) {
|
|
125
45
|
const pick = (name) => {
|
|
126
46
|
const raw = req.headers[name];
|
|
@@ -154,97 +74,6 @@ function ttsClientDbgFields(hdr) {
|
|
|
154
74
|
o.hearingFull = hdr.hearingFull;
|
|
155
75
|
return o;
|
|
156
76
|
}
|
|
157
|
-
function normalizeSecretEnvValue(value) {
|
|
158
|
-
const trimmed = value?.trim();
|
|
159
|
-
if (!trimmed) {
|
|
160
|
-
return null;
|
|
161
|
-
}
|
|
162
|
-
if (trimmed === "REDACTED" || trimmed === "[REDACTED]" || /^\*+$/.test(trimmed)) {
|
|
163
|
-
return null;
|
|
164
|
-
}
|
|
165
|
-
return trimmed;
|
|
166
|
-
}
|
|
167
|
-
var OPENAI_STYLE_VOICE_ALIASES = new Set([
|
|
168
|
-
"alloy",
|
|
169
|
-
"ash",
|
|
170
|
-
"ballad",
|
|
171
|
-
"coral",
|
|
172
|
-
"echo",
|
|
173
|
-
"nova",
|
|
174
|
-
"sage",
|
|
175
|
-
"shimmer",
|
|
176
|
-
"verse"
|
|
177
|
-
]);
|
|
178
|
-
var DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID = "EXAVITQu4vr4xnSDxMaL";
|
|
179
|
-
var DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID = "eleven_flash_v2_5";
|
|
180
|
-
var ELIZA_CLOUD_TTS_MAX_TEXT_CHARS = 5000;
|
|
181
|
-
function isLikelyEdgeOrAzureNeuralVoiceId(raw) {
|
|
182
|
-
const t = raw.trim();
|
|
183
|
-
return /^[a-z]{2}-[A-Z]{2}-/i.test(t) && /Neural$/i.test(t);
|
|
184
|
-
}
|
|
185
|
-
function normalizeElizaCloudVoiceId(raw) {
|
|
186
|
-
const trimmed = raw.trim();
|
|
187
|
-
if (!trimmed)
|
|
188
|
-
return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
|
|
189
|
-
const lower = trimmed.toLowerCase();
|
|
190
|
-
if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {
|
|
191
|
-
return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
|
|
192
|
-
}
|
|
193
|
-
if (isLikelyEdgeOrAzureNeuralVoiceId(trimmed)) {
|
|
194
|
-
return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
|
|
195
|
-
}
|
|
196
|
-
return trimmed;
|
|
197
|
-
}
|
|
198
|
-
function resolveElizaCloudTtsVoiceId(bodyVoiceId, env = process.env) {
|
|
199
|
-
if (typeof bodyVoiceId === "string" && bodyVoiceId.trim()) {
|
|
200
|
-
return normalizeElizaCloudVoiceId(bodyVoiceId);
|
|
201
|
-
}
|
|
202
|
-
const envVoice = env.ELIZAOS_CLOUD_TTS_VOICE?.trim() ?? "";
|
|
203
|
-
if (envVoice) {
|
|
204
|
-
return normalizeElizaCloudVoiceId(envVoice);
|
|
205
|
-
}
|
|
206
|
-
return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;
|
|
207
|
-
}
|
|
208
|
-
function resolveCloudApiKey(env = process.env) {
|
|
209
|
-
const envKey = normalizeSecretEnvValue(env.ELIZAOS_CLOUD_API_KEY);
|
|
210
|
-
if (envKey) {
|
|
211
|
-
return envKey;
|
|
212
|
-
}
|
|
213
|
-
try {
|
|
214
|
-
const config = loadElizaConfig();
|
|
215
|
-
const configKey = normalizeSecretEnvValue(typeof config.cloud?.apiKey === "string" ? config.cloud.apiKey : undefined);
|
|
216
|
-
if (configKey) {
|
|
217
|
-
return configKey;
|
|
218
|
-
}
|
|
219
|
-
} catch {}
|
|
220
|
-
const sealedKey = normalizeSecretEnvValue(getCloudSecret("ELIZAOS_CLOUD_API_KEY"));
|
|
221
|
-
if (sealedKey) {
|
|
222
|
-
return sealedKey;
|
|
223
|
-
}
|
|
224
|
-
return null;
|
|
225
|
-
}
|
|
226
|
-
var cachedCloudBaseUrlFromConfig;
|
|
227
|
-
var hasResolvedCloudBaseUrlFromConfig = false;
|
|
228
|
-
function __resetCloudBaseUrlCache() {
|
|
229
|
-
cachedCloudBaseUrlFromConfig = undefined;
|
|
230
|
-
hasResolvedCloudBaseUrlFromConfig = false;
|
|
231
|
-
}
|
|
232
|
-
function resolveCloudBaseUrlFromConfig() {
|
|
233
|
-
if (hasResolvedCloudBaseUrlFromConfig) {
|
|
234
|
-
return cachedCloudBaseUrlFromConfig ?? null;
|
|
235
|
-
}
|
|
236
|
-
try {
|
|
237
|
-
const config = loadElizaConfig();
|
|
238
|
-
const raw = typeof config.cloud?.baseUrl === "string" ? config.cloud.baseUrl.trim() : "";
|
|
239
|
-
cachedCloudBaseUrlFromConfig = raw.length > 0 ? raw : null;
|
|
240
|
-
hasResolvedCloudBaseUrlFromConfig = true;
|
|
241
|
-
return cachedCloudBaseUrlFromConfig;
|
|
242
|
-
} catch {
|
|
243
|
-
cachedCloudBaseUrlFromConfig = null;
|
|
244
|
-
hasResolvedCloudBaseUrlFromConfig = true;
|
|
245
|
-
return null;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
77
|
function pickBodyString(body, camel, snake) {
|
|
249
78
|
const a = body[camel];
|
|
250
79
|
if (typeof a === "string" && a.trim())
|
|
@@ -271,9 +100,6 @@ function sendJsonResponse(res, status, body) {
|
|
|
271
100
|
function sendJsonErrorResponse(res, status, message) {
|
|
272
101
|
sendJsonResponse(res, status, { error: message });
|
|
273
102
|
}
|
|
274
|
-
function shouldRetryCloudTtsUpstream(status) {
|
|
275
|
-
return status === 404 || status === 502 || status === 503;
|
|
276
|
-
}
|
|
277
103
|
function forwardCloudTtsUpstreamError(res, status, bodyText) {
|
|
278
104
|
if (res.headersSent)
|
|
279
105
|
return;
|
|
@@ -289,114 +115,10 @@ function forwardCloudTtsUpstreamError(res, status, bodyText) {
|
|
|
289
115
|
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
290
116
|
res.end(JSON.stringify({ error: trimmed || "Eliza Cloud TTS request failed" }));
|
|
291
117
|
}
|
|
292
|
-
function normalizeElizaCloudTtsModelId(raw) {
|
|
293
|
-
const trimmed = raw.trim();
|
|
294
|
-
if (!trimmed)
|
|
295
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
296
|
-
const lower = trimmed.toLowerCase();
|
|
297
|
-
if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {
|
|
298
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
299
|
-
}
|
|
300
|
-
if (/^gpt-/i.test(trimmed)) {
|
|
301
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
302
|
-
}
|
|
303
|
-
if (/^tts-1/i.test(trimmed)) {
|
|
304
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
305
|
-
}
|
|
306
|
-
if (/mini-tts/i.test(trimmed)) {
|
|
307
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
308
|
-
}
|
|
309
|
-
return trimmed;
|
|
310
|
-
}
|
|
311
|
-
function resolveCloudProxyTtsModel(bodyModel, env = process.env) {
|
|
312
|
-
const envModel = env.ELIZAOS_CLOUD_TTS_MODEL?.trim() ?? "";
|
|
313
|
-
const raw = typeof bodyModel === "string" && bodyModel.trim() ? bodyModel.trim() : "";
|
|
314
|
-
const chosen = raw || envModel;
|
|
315
|
-
if (!chosen)
|
|
316
|
-
return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;
|
|
317
|
-
return normalizeElizaCloudTtsModelId(chosen);
|
|
318
|
-
}
|
|
319
|
-
function resolveElevenLabsApiKeyForCloudMode(env = process.env) {
|
|
320
|
-
const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);
|
|
321
|
-
if (directKey) {
|
|
322
|
-
return directKey;
|
|
323
|
-
}
|
|
324
|
-
let configWantsCloudTts = false;
|
|
325
|
-
try {
|
|
326
|
-
configWantsCloudTts = isElizaCloudServiceSelectedInConfig(loadElizaConfig(), "tts");
|
|
327
|
-
} catch {
|
|
328
|
-
configWantsCloudTts = false;
|
|
329
|
-
}
|
|
330
|
-
const cloudTtsEnabled = env.ELIZAOS_CLOUD_USE_TTS === "true" || env.ELIZAOS_CLOUD_USE_TTS === undefined && configWantsCloudTts;
|
|
331
|
-
if (!cloudTtsEnabled) {
|
|
332
|
-
return null;
|
|
333
|
-
}
|
|
334
|
-
if (env.ELIZA_CLOUD_TTS_DISABLED === "true") {
|
|
335
|
-
return null;
|
|
336
|
-
}
|
|
337
|
-
return resolveCloudApiKey(env);
|
|
338
|
-
}
|
|
339
|
-
function ensureCloudTtsApiKeyAlias(env = process.env) {
|
|
340
|
-
const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);
|
|
341
|
-
if (directKey) {
|
|
342
|
-
return false;
|
|
343
|
-
}
|
|
344
|
-
const cloudBackedKey = resolveElevenLabsApiKeyForCloudMode(env);
|
|
345
|
-
if (!cloudBackedKey) {
|
|
346
|
-
return false;
|
|
347
|
-
}
|
|
348
|
-
env.ELEVENLABS_API_KEY = cloudBackedKey;
|
|
349
|
-
return true;
|
|
350
|
-
}
|
|
351
|
-
function resolveCloudTtsBaseUrl(env = process.env) {
|
|
352
|
-
const fromEnv = env.ELIZAOS_CLOUD_BASE_URL?.trim() ?? "";
|
|
353
|
-
const fromConfig = fromEnv.length > 0 ? null : resolveCloudBaseUrlFromConfig();
|
|
354
|
-
const configured = fromEnv.length > 0 ? fromEnv : fromConfig?.trim() ?? "";
|
|
355
|
-
const fallback = "https://www.elizacloud.ai/api/v1";
|
|
356
|
-
const base = configured.length > 0 ? configured : fallback;
|
|
357
|
-
try {
|
|
358
|
-
const parsed = new URL(base);
|
|
359
|
-
let path2 = parsed.pathname.replace(/\/+$/, "");
|
|
360
|
-
if (!path2 || path2 === "/") {
|
|
361
|
-
path2 = "/api/v1";
|
|
362
|
-
}
|
|
363
|
-
parsed.pathname = path2;
|
|
364
|
-
return parsed.toString().replace(/\/$/, "");
|
|
365
|
-
} catch {
|
|
366
|
-
return fallback;
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
function resolveCloudTtsCandidateUrls(env = process.env) {
|
|
370
|
-
const base = resolveCloudTtsBaseUrl(env).replace(/\/+$/, "");
|
|
371
|
-
const candidates = new Set;
|
|
372
|
-
const addEndpointsForApiV1Base = (baseUrl) => {
|
|
373
|
-
const trimmed = baseUrl.replace(/\/+$/, "");
|
|
374
|
-
candidates.add(`${trimmed}/voice/tts`);
|
|
375
|
-
try {
|
|
376
|
-
const u = new URL(trimmed);
|
|
377
|
-
const path2 = u.pathname.replace(/\/+$/, "");
|
|
378
|
-
if (path2.endsWith("/api/v1")) {
|
|
379
|
-
candidates.add(`${u.origin}/api/elevenlabs/tts`);
|
|
380
|
-
}
|
|
381
|
-
} catch {}
|
|
382
|
-
};
|
|
383
|
-
addEndpointsForApiV1Base(base);
|
|
384
|
-
try {
|
|
385
|
-
const parsed = new URL(base);
|
|
386
|
-
if (parsed.hostname.startsWith("www.")) {
|
|
387
|
-
parsed.hostname = parsed.hostname.slice(4);
|
|
388
|
-
addEndpointsForApiV1Base(parsed.toString().replace(/\/$/, ""));
|
|
389
|
-
} else {
|
|
390
|
-
parsed.hostname = `www.${parsed.hostname}`;
|
|
391
|
-
addEndpointsForApiV1Base(parsed.toString().replace(/\/$/, ""));
|
|
392
|
-
}
|
|
393
|
-
} catch {}
|
|
394
|
-
return [...candidates];
|
|
395
|
-
}
|
|
396
118
|
async function handleCloudTtsPreviewRoute(req, res) {
|
|
397
119
|
const clientTtsDbg = readTtsDebugClientHeaders(req);
|
|
398
120
|
const dbgExtra = ttsClientDbgFields(clientTtsDbg);
|
|
399
|
-
const cloudApiKey =
|
|
121
|
+
const cloudApiKey = _internalResolveCloudApiKey();
|
|
400
122
|
if (!cloudApiKey) {
|
|
401
123
|
ttsDebug("server:cloud-tts:reject", {
|
|
402
124
|
reason: "no_api_key",
|
|
@@ -510,40 +232,20 @@ async function handleCloudTtsPreviewRoute(req, res) {
|
|
|
510
232
|
return true;
|
|
511
233
|
}
|
|
512
234
|
}
|
|
513
|
-
function mirrorCompatHeaders(req) {
|
|
514
|
-
const HEADER_ALIASES = [
|
|
515
|
-
["x-elizaos-token", "x-eliza-token"],
|
|
516
|
-
["x-elizaos-export-token", "x-eliza-export-token"],
|
|
517
|
-
["x-elizaos-client-id", "x-eliza-client-id"],
|
|
518
|
-
["x-elizaos-terminal-token", "x-eliza-terminal-token"],
|
|
519
|
-
["x-elizaos-ui-language", "x-eliza-ui-language"],
|
|
520
|
-
["x-elizaos-agent-action", "x-eliza-agent-action"]
|
|
521
|
-
];
|
|
522
|
-
for (const [appHeader, elizaHeader] of HEADER_ALIASES) {
|
|
523
|
-
const appValue = req.headers[appHeader];
|
|
524
|
-
const elizaValue = req.headers[elizaHeader];
|
|
525
|
-
if (appValue != null && elizaValue == null) {
|
|
526
|
-
req.headers[elizaHeader] = appValue;
|
|
527
|
-
}
|
|
528
|
-
if (elizaValue != null && appValue == null) {
|
|
529
|
-
req.headers[appHeader] = elizaValue;
|
|
530
|
-
}
|
|
531
|
-
}
|
|
532
|
-
}
|
|
533
235
|
export {
|
|
534
|
-
shouldRetryCloudTtsUpstream,
|
|
535
|
-
resolveElizaCloudTtsVoiceId,
|
|
236
|
+
shouldRetryCloudTtsUpstream2 as shouldRetryCloudTtsUpstream,
|
|
237
|
+
resolveElizaCloudTtsVoiceId2 as resolveElizaCloudTtsVoiceId,
|
|
536
238
|
resolveElevenLabsApiKeyForCloudMode,
|
|
537
|
-
resolveCloudTtsCandidateUrls,
|
|
239
|
+
resolveCloudTtsCandidateUrls2 as resolveCloudTtsCandidateUrls,
|
|
538
240
|
resolveCloudTtsBaseUrl,
|
|
539
|
-
resolveCloudProxyTtsModel,
|
|
241
|
+
resolveCloudProxyTtsModel2 as resolveCloudProxyTtsModel,
|
|
540
242
|
readTtsDebugClientHeaders,
|
|
541
243
|
normalizeElizaCloudTtsModelId,
|
|
542
244
|
mirrorCompatHeaders,
|
|
543
245
|
handleCloudTtsPreviewRoute,
|
|
544
246
|
ensureCloudTtsApiKeyAlias,
|
|
545
247
|
__resetCloudBaseUrlCache,
|
|
546
|
-
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS
|
|
248
|
+
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS2 as ELIZA_CLOUD_TTS_MAX_TEXT_CHARS
|
|
547
249
|
};
|
|
548
250
|
|
|
549
|
-
//# debugId=
|
|
251
|
+
//# debugId=8E6B79F7D105205464756E2164756E21
|
|
@@ -1,13 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/lib/
|
|
3
|
+
"sources": ["../src/lib/server-cloud-tts.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"
|
|
6
|
-
"/**\n * Sealed in-process secret store for cloud credentials.\n *\n * Cloud API keys are scrubbed from process.env after login and stored\n * here so they are not visible in environment dumps, child processes,\n * or /proc/self/environ.\n *\n * This module has NO external dependencies so it can be imported by\n * any module without pulling in host-layer packages.\n */\n\nconst _cloudSecrets: Record<string, string | undefined> = Object.create(null);\n\nObject.defineProperty(_cloudSecrets, Symbol.toStringTag, {\n value: \"CloudSecrets\",\n enumerable: false,\n});\n\n/**\n * Read a cloud secret without exposing it in process.env.\n * Falls back to process.env for backwards compatibility with code that\n * sets the key before this module loads (e.g. docker entrypoints).\n */\nexport function getCloudSecret(\n key: \"ELIZAOS_CLOUD_API_KEY\" | \"ELIZAOS_CLOUD_ENABLED\",\n): string | undefined {\n return _cloudSecrets[key] ?? process.env[key];\n}\n\n/** Scrub cloud secrets from process.env and capture into the sealed store. */\nexport function scrubCloudSecretsFromEnv(): void {\n for (const key of [\n \"ELIZAOS_CLOUD_API_KEY\",\n \"ELIZAOS_CLOUD_ENABLED\",\n ] as const) {\n if (process.env[key] !== undefined) {\n _cloudSecrets[key] = process.env[key];\n delete process.env[key];\n }\n }\n}\n\n/** Clear any sealed cloud secrets after an explicit disconnect. */\nexport function clearCloudSecrets(): void {\n for (const key of [\n \"ELIZAOS_CLOUD_API_KEY\",\n \"ELIZAOS_CLOUD_ENABLED\",\n ] as const) {\n delete _cloudSecrets[key];\n }\n}\n\n/** Reset the sealed secret store. Test-only. */\nexport function _resetCloudSecretsForTesting(): void {\n for (const key of Object.keys(_cloudSecrets)) {\n delete _cloudSecrets[key];\n }\n}\n",
|
|
7
|
-
"function truthy(raw: string | undefined | null): boolean {\n if (raw == null) return false;\n const value = String(raw).trim().toLowerCase();\n return value === \"1\" || value === \"true\" || value === \"yes\" || value === \"on\";\n}\n\nfunction ttsDebugEnabled(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n if (truthy(process.env.ELIZA_TTS_DEBUG)) return true;\n }\n return false;\n}\n\nexport function isTtsDebugEnabled(): boolean {\n return ttsDebugEnabled();\n}\n\nexport function ttsDebugTextPreview(text: string, maxChars = 160): string {\n const singleLine = text.replace(/\\r?\\n/g, \"↵ \").replace(/\\s+/g, \" \").trim();\n if (singleLine.length <= maxChars) return singleLine;\n return `${singleLine.slice(0, maxChars)}…`;\n}\n\nexport function ttsDebug(\n phase: string,\n detail?: Record<string, unknown>,\n): void {\n if (!ttsDebugEnabled()) return;\n if (detail && Object.keys(detail).length > 0) {\n console.info(`[eliza][tts] ${phase}`, detail);\n } else {\n console.info(`[eliza][tts] ${phase}`);\n }\n}\n",
|
|
8
|
-
"/**\n * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).\n *\n * Upstream routes (see eliza-cloud-v2): `POST /api/v1/voice/tts` and legacy\n * `POST /api/elevenlabs/tts`. Both accept `{ text, voiceId?, modelId? }` with\n * **ElevenLabs** voice and model ids; the cloud runs ElevenLabs server-side.\n */\nimport fs from \"node:fs\";\nimport type http from \"node:http\";\nimport { isElizaCloudServiceSelectedInConfig, sanitizeSpeechText } from \"@elizaos/core\";\nimport { getCloudSecret } from \"./cloud-secrets\";\nimport { resolveConfigPath } from \"./state-paths\";\nimport { ttsDebug, ttsDebugTextPreview } from \"./tts-debug\";\n\n// ---------------------------------------------------------------------------\n// Internal helpers (not exported)\n// ---------------------------------------------------------------------------\n\ntype ConfigLike = Record<string, unknown> & {\n cloud?: {\n apiKey?: unknown;\n baseUrl?: unknown;\n };\n};\n\nfunction loadElizaConfig(): ConfigLike {\n const raw = fs.readFileSync(resolveConfigPath(), \"utf8\");\n const parsed = JSON.parse(raw) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as ConfigLike)\n : {};\n}\n\n/** Browser → API correlation (never forwarded to Eliza Cloud). */\nexport function readTtsDebugClientHeaders(\n req: Pick<http.IncomingMessage, \"headers\">,\n): {\n messageId?: string;\n clipSegment?: string;\n hearingFull?: string;\n} {\n const pick = (name: string): string | undefined => {\n const raw = req.headers[name];\n if (raw == null) return undefined;\n const v = Array.isArray(raw) ? raw[0] : raw;\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined;\n };\n const decode = (enc: string | undefined): string | undefined => {\n if (!enc) return undefined;\n try {\n return decodeURIComponent(enc);\n } catch {\n return enc;\n }\n };\n return {\n messageId: decode(pick(\"x-elizaos-tts-message-id\")),\n clipSegment: decode(pick(\"x-elizaos-tts-clip-segment\")),\n hearingFull: decode(pick(\"x-elizaos-tts-full-preview\")),\n };\n}\n\nfunction ttsClientDbgFields(\n hdr: ReturnType<typeof readTtsDebugClientHeaders>,\n): Record<string, string> {\n const o: Record<string, string> = {};\n if (hdr.messageId) o.messageId = hdr.messageId;\n if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;\n if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;\n return o;\n}\n\nfunction normalizeSecretEnvValue(value: string | undefined): string | null {\n const trimmed = value?.trim();\n if (!trimmed) {\n return null;\n }\n if (\n trimmed === \"REDACTED\" ||\n trimmed === \"[REDACTED]\" ||\n /^\\*+$/.test(trimmed)\n ) {\n return null;\n }\n return trimmed;\n}\n\n/** OpenAI-style names — not valid ElevenLabs `voiceId`; map to default voice. */\nconst OPENAI_STYLE_VOICE_ALIASES = new Set([\n \"alloy\",\n \"ash\",\n \"ballad\",\n \"coral\",\n \"echo\",\n \"nova\",\n \"sage\",\n \"shimmer\",\n \"verse\",\n]);\n\n/** Eliza Cloud default premade voice (matches eliza-cloud-v2 ElevenLabs service). */\nconst DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID = \"EXAVITQu4vr4xnSDxMaL\";\nconst DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID = \"eleven_flash_v2_5\";\n\n/** Matches `MAX_TEXT_LENGTH` in eliza-cloud-v2 `app/api/v1/voice/tts/route.ts`. */\nexport const ELIZA_CLOUD_TTS_MAX_TEXT_CHARS = 5000;\n\n/** Edge / Azure neural ids (e.g. `en-US-AriaNeural`) are not ElevenLabs `voiceId`s. */\nfunction isLikelyEdgeOrAzureNeuralVoiceId(raw: string): boolean {\n const t = raw.trim();\n return /^[a-z]{2}-[A-Z]{2}-/i.test(t) && /Neural$/i.test(t);\n}\n\nfunction normalizeElizaCloudVoiceId(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;\n const lower = trimmed.toLowerCase();\n if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {\n return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;\n }\n if (isLikelyEdgeOrAzureNeuralVoiceId(trimmed)) {\n return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;\n }\n return trimmed;\n}\n\n/**\n * Resolve `voiceId` for Eliza Cloud TTS (ElevenLabs ids). OpenAI-style names\n * in the request are replaced with the default premade voice.\n */\nexport function resolveElizaCloudTtsVoiceId(\n bodyVoiceId: unknown,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n if (typeof bodyVoiceId === \"string\" && bodyVoiceId.trim()) {\n return normalizeElizaCloudVoiceId(bodyVoiceId);\n }\n const envVoice = env.ELIZAOS_CLOUD_TTS_VOICE?.trim() ?? \"\";\n if (envVoice) {\n return normalizeElizaCloudVoiceId(envVoice);\n }\n return DEFAULT_ELIZA_CLOUD_TTS_VOICE_ID;\n}\n\nfunction resolveCloudApiKey(\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n const envKey = normalizeSecretEnvValue(env.ELIZAOS_CLOUD_API_KEY);\n if (envKey) {\n return envKey;\n }\n\n try {\n const config = loadElizaConfig();\n const configKey = normalizeSecretEnvValue(\n typeof config.cloud?.apiKey === \"string\"\n ? config.cloud.apiKey\n : undefined,\n );\n if (configKey) {\n return configKey;\n }\n } catch {\n // ignore config load errors and continue with secret store fallback\n }\n\n const sealedKey = normalizeSecretEnvValue(\n getCloudSecret(\"ELIZAOS_CLOUD_API_KEY\"),\n );\n if (sealedKey) {\n return sealedKey;\n }\n\n return null;\n}\n\nlet cachedCloudBaseUrlFromConfig: string | null | undefined;\nlet hasResolvedCloudBaseUrlFromConfig = false;\n\nexport function __resetCloudBaseUrlCache(): void {\n cachedCloudBaseUrlFromConfig = undefined;\n hasResolvedCloudBaseUrlFromConfig = false;\n}\n\nfunction resolveCloudBaseUrlFromConfig(): string | null {\n if (hasResolvedCloudBaseUrlFromConfig) {\n return cachedCloudBaseUrlFromConfig ?? null;\n }\n\n try {\n const config = loadElizaConfig();\n const raw =\n typeof config.cloud?.baseUrl === \"string\"\n ? config.cloud.baseUrl.trim()\n : \"\";\n cachedCloudBaseUrlFromConfig = raw.length > 0 ? raw : null;\n hasResolvedCloudBaseUrlFromConfig = true;\n return cachedCloudBaseUrlFromConfig;\n } catch {\n // On failure, remember that we attempted resolution to avoid repeated I/O.\n cachedCloudBaseUrlFromConfig = null;\n hasResolvedCloudBaseUrlFromConfig = true;\n return null;\n }\n}\n\nfunction pickBodyString(\n body: Record<string, unknown>,\n camel: string,\n snake: string,\n): unknown {\n const a = body[camel];\n if (typeof a === \"string\" && a.trim()) return a;\n const b = body[snake];\n if (typeof b === \"string\" && b.trim()) return b;\n return undefined;\n}\n\nasync function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks);\n}\n\nfunction sendJsonResponse(\n res: http.ServerResponse,\n status: number,\n body: unknown,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nfunction sendJsonErrorResponse(\n res: http.ServerResponse,\n status: number,\n message: string,\n): void {\n sendJsonResponse(res, status, { error: message });\n}\n\n/**\n * After a non-OK upstream response, only try the next URL for likely-transient /\n * wrong-route issues. Avoid retrying 401/402/429 etc. so we do not double-charge TTS.\n */\nexport function shouldRetryCloudTtsUpstream(status: number): boolean {\n return status === 404 || status === 502 || status === 503;\n}\n\nfunction forwardCloudTtsUpstreamError(\n res: http.ServerResponse,\n status: number,\n bodyText: string,\n): void {\n if (res.headersSent) return;\n const trimmed = bodyText.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n sendJsonResponse(res, status, parsed);\n return;\n } catch {\n /* fall through */\n }\n }\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(\n JSON.stringify({ error: trimmed || \"Eliza Cloud TTS request failed\" }),\n );\n}\n\n/**\n * Coerce stored/configured values to an ElevenLabs model id Eliza Cloud accepts.\n * Maps OpenAI TTS ids and common copy-paste mistakes; passes through real `eleven_*` ids.\n */\nexport function normalizeElizaCloudTtsModelId(raw: string): string {\n const trimmed = raw.trim();\n if (!trimmed) return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n const lower = trimmed.toLowerCase();\n if (OPENAI_STYLE_VOICE_ALIASES.has(lower)) {\n return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n }\n if (/^gpt-/i.test(trimmed)) {\n return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n }\n if (/^tts-1/i.test(trimmed)) {\n return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n }\n if (/mini-tts/i.test(trimmed)) {\n return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n }\n return trimmed;\n}\n\n/** Eliza Cloud TTS `modelId` (ElevenLabs), from body or env or default. */\nexport function resolveCloudProxyTtsModel(\n bodyModel: unknown,\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const envModel = env.ELIZAOS_CLOUD_TTS_MODEL?.trim() ?? \"\";\n const raw =\n typeof bodyModel === \"string\" && bodyModel.trim() ? bodyModel.trim() : \"\";\n const chosen = raw || envModel;\n if (!chosen) return DEFAULT_ELIZA_CLOUD_TTS_MODEL_ID;\n return normalizeElizaCloudTtsModelId(chosen);\n}\n\n// ---------------------------------------------------------------------------\n// Exported Cloud TTS functions\n// ---------------------------------------------------------------------------\n\nexport function resolveElevenLabsApiKeyForCloudMode(\n env: NodeJS.ProcessEnv = process.env,\n): string | null {\n const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);\n if (directKey) {\n return directKey;\n }\n let configWantsCloudTts = false;\n try {\n configWantsCloudTts = isElizaCloudServiceSelectedInConfig(\n loadElizaConfig() as Record<string, unknown>,\n \"tts\",\n );\n } catch {\n configWantsCloudTts = false;\n }\n const cloudTtsEnabled =\n env.ELIZAOS_CLOUD_USE_TTS === \"true\" ||\n (env.ELIZAOS_CLOUD_USE_TTS === undefined && configWantsCloudTts);\n if (!cloudTtsEnabled) {\n return null;\n }\n if (env.ELIZA_CLOUD_TTS_DISABLED === \"true\") {\n return null;\n }\n return resolveCloudApiKey(env);\n}\n\nexport function ensureCloudTtsApiKeyAlias(\n env: NodeJS.ProcessEnv = process.env,\n): boolean {\n const directKey = normalizeSecretEnvValue(env.ELEVENLABS_API_KEY);\n if (directKey) {\n return false;\n }\n const cloudBackedKey = resolveElevenLabsApiKeyForCloudMode(env);\n if (!cloudBackedKey) {\n return false;\n }\n env.ELEVENLABS_API_KEY = cloudBackedKey;\n return true;\n}\n\nexport function resolveCloudTtsBaseUrl(\n env: NodeJS.ProcessEnv = process.env,\n): string {\n const fromEnv = env.ELIZAOS_CLOUD_BASE_URL?.trim() ?? \"\";\n const fromConfig =\n fromEnv.length > 0 ? null : resolveCloudBaseUrlFromConfig();\n const configured = fromEnv.length > 0 ? fromEnv : (fromConfig?.trim() ?? \"\");\n const fallback = \"https://www.elizacloud.ai/api/v1\";\n const base = configured.length > 0 ? configured : fallback;\n\n try {\n const parsed = new URL(base);\n let path = parsed.pathname.replace(/\\/+$/, \"\");\n if (!path || path === \"/\") {\n path = \"/api/v1\";\n }\n parsed.pathname = path;\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return fallback;\n }\n}\n\nexport function resolveCloudTtsCandidateUrls(\n env: NodeJS.ProcessEnv = process.env,\n): string[] {\n const base = resolveCloudTtsBaseUrl(env).replace(/\\/+$/, \"\");\n const candidates = new Set<string>();\n\n const addEndpointsForApiV1Base = (baseUrl: string): void => {\n const trimmed = baseUrl.replace(/\\/+$/, \"\");\n candidates.add(`${trimmed}/voice/tts`);\n try {\n const u = new URL(trimmed);\n const path = u.pathname.replace(/\\/+$/, \"\");\n if (path.endsWith(\"/api/v1\")) {\n // Preserve the ElevenLabs-shaped compat route; `/audio/speech` would\n // require OpenAI-style model/voice ids and is intentionally not used.\n candidates.add(`${u.origin}/api/elevenlabs/tts`);\n }\n } catch {\n /* ignore */\n }\n };\n\n addEndpointsForApiV1Base(base);\n try {\n const parsed = new URL(base);\n if (parsed.hostname.startsWith(\"www.\")) {\n parsed.hostname = parsed.hostname.slice(4);\n addEndpointsForApiV1Base(parsed.toString().replace(/\\/$/, \"\"));\n } else {\n parsed.hostname = `www.${parsed.hostname}`;\n addEndpointsForApiV1Base(parsed.toString().replace(/\\/$/, \"\"));\n }\n } catch {\n // no-op\n }\n\n return [...candidates];\n}\n\nexport async function handleCloudTtsPreviewRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<boolean> {\n const clientTtsDbg = readTtsDebugClientHeaders(req);\n const dbgExtra = ttsClientDbgFields(clientTtsDbg);\n\n const cloudApiKey = resolveCloudApiKey();\n if (!cloudApiKey) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"no_api_key\",\n ...dbgExtra,\n });\n sendJsonErrorResponse(\n res,\n 401,\n \"Eliza Cloud is not connected. Connect your Eliza Cloud account first.\",\n );\n return true;\n }\n\n const rawBody = await readRawRequestBody(req);\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(rawBody.toString(\"utf8\")) as Record<string, unknown>;\n } catch {\n sendJsonErrorResponse(res, 400, \"Invalid JSON request body\");\n return true;\n }\n\n const text = sanitizeSpeechText(\n typeof body.text === \"string\" ? body.text : \"\",\n );\n if (!text) {\n sendJsonErrorResponse(res, 400, \"Missing text\");\n return true;\n }\n\n if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {\n sendJsonErrorResponse(\n res,\n 400,\n `Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,\n );\n return true;\n }\n\n const cloudModel = resolveCloudProxyTtsModel(\n pickBodyString(body, \"modelId\", \"model_id\"),\n );\n const cloudVoice = resolveElizaCloudTtsVoiceId(\n pickBodyString(body, \"voiceId\", \"voice_id\"),\n );\n const cloudUrls = resolveCloudTtsCandidateUrls();\n\n const ttsPreview = ttsDebugTextPreview(text);\n ttsDebug(\"server:cloud-tts:proxy\", {\n textChars: text.length,\n preview: ttsPreview,\n modelId: cloudModel,\n voiceId: cloudVoice,\n urlCandidates: cloudUrls.length,\n ...dbgExtra,\n });\n\n try {\n let lastStatus = 0;\n let lastDetails = \"unknown error\";\n let cloudResponse: Response | null = null;\n for (let i = 0; i < cloudUrls.length; i++) {\n const cloudUrl = cloudUrls[i];\n if (cloudUrl === undefined) {\n continue;\n }\n const attempt = await fetch(cloudUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${cloudApiKey}`,\n \"x-api-key\": cloudApiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"audio/mpeg\",\n },\n body: JSON.stringify({\n text,\n voiceId: cloudVoice,\n modelId: cloudModel,\n }),\n });\n\n if (attempt.ok) {\n cloudResponse = attempt;\n ttsDebug(\"server:cloud-tts:upstream-ok\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n break;\n }\n\n lastStatus = attempt.status;\n lastDetails = await attempt.text().catch(() => \"unknown error\");\n ttsDebug(\"server:cloud-tts:upstream-retry\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n\n const hasMoreCandidates = i < cloudUrls.length - 1;\n if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {\n break;\n }\n }\n if (!cloudResponse) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"upstream_failed\",\n lastStatus,\n preview: ttsPreview,\n ...dbgExtra,\n });\n if (\n lastStatus === 400 ||\n lastStatus === 401 ||\n lastStatus === 402 ||\n lastStatus === 403 ||\n lastStatus === 429\n ) {\n forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);\n return true;\n }\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,\n );\n return true;\n }\n\n const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());\n ttsDebug(\"server:cloud-tts:success\", {\n bytes: audioBuffer.length,\n preview: ttsPreview,\n ...dbgExtra,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"audio/mpeg\");\n res.setHeader(\"Cache-Control\", \"no-store\");\n res.end(audioBuffer);\n return true;\n } catch (err) {\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return true;\n }\n}\n\nexport function mirrorCompatHeaders(\n req: Pick<http.IncomingMessage, \"headers\">,\n): void {\n const HEADER_ALIASES = [\n [\"x-elizaos-token\", \"x-eliza-token\"],\n [\"x-elizaos-export-token\", \"x-eliza-export-token\"],\n [\"x-elizaos-client-id\", \"x-eliza-client-id\"],\n [\"x-elizaos-terminal-token\", \"x-eliza-terminal-token\"],\n [\"x-elizaos-ui-language\", \"x-eliza-ui-language\"],\n [\"x-elizaos-agent-action\", \"x-eliza-agent-action\"],\n ] as const;\n\n for (const [appHeader, elizaHeader] of HEADER_ALIASES) {\n const appValue = req.headers[appHeader];\n const elizaValue = req.headers[elizaHeader];\n\n if (appValue != null && elizaValue == null) {\n req.headers[elizaHeader] = appValue;\n }\n\n if (elizaValue != null && appValue == null) {\n req.headers[appHeader] = elizaValue;\n }\n }\n}\n"
|
|
5
|
+
"/**\n * Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).\n *\n * Pure / config-driven helpers (TTS API key resolution, base URL resolution,\n * voice / model id normalization, compat header mirroring) live in\n * `@elizaos/shared/elizacloud/server-cloud-tts` so host-layer packages can\n * resolve cloud TTS configuration without reverse-importing this plugin.\n *\n * The HTTP request handler (`handleCloudTtsPreviewRoute`) stays here because\n * it wires together the runtime route system.\n */\nimport type http from \"node:http\";\nimport { sanitizeSpeechText } from \"@elizaos/core\";\nimport {\n _internalResolveCloudApiKey,\n ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,\n resolveCloudProxyTtsModel,\n resolveCloudTtsCandidateUrls,\n resolveElizaCloudTtsVoiceId,\n shouldRetryCloudTtsUpstream,\n ttsDebug,\n ttsDebugTextPreview,\n} from \"@elizaos/shared\";\n\nexport {\n __resetCloudBaseUrlCache,\n ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,\n ensureCloudTtsApiKeyAlias,\n mirrorCompatHeaders,\n normalizeElizaCloudTtsModelId,\n resolveCloudProxyTtsModel,\n resolveCloudTtsBaseUrl,\n resolveCloudTtsCandidateUrls,\n resolveElevenLabsApiKeyForCloudMode,\n resolveElizaCloudTtsVoiceId,\n shouldRetryCloudTtsUpstream,\n} from \"@elizaos/shared\";\n\n/** Browser → API correlation (never forwarded to Eliza Cloud). */\nexport function readTtsDebugClientHeaders(\n req: Pick<http.IncomingMessage, \"headers\">,\n): {\n messageId?: string;\n clipSegment?: string;\n hearingFull?: string;\n} {\n const pick = (name: string): string | undefined => {\n const raw = req.headers[name];\n if (raw == null) return undefined;\n const v = Array.isArray(raw) ? raw[0] : raw;\n return typeof v === \"string\" && v.trim() ? v.trim() : undefined;\n };\n const decode = (enc: string | undefined): string | undefined => {\n if (!enc) return undefined;\n try {\n return decodeURIComponent(enc);\n } catch {\n return enc;\n }\n };\n return {\n messageId: decode(pick(\"x-elizaos-tts-message-id\")),\n clipSegment: decode(pick(\"x-elizaos-tts-clip-segment\")),\n hearingFull: decode(pick(\"x-elizaos-tts-full-preview\")),\n };\n}\n\nfunction ttsClientDbgFields(\n hdr: ReturnType<typeof readTtsDebugClientHeaders>,\n): Record<string, string> {\n const o: Record<string, string> = {};\n if (hdr.messageId) o.messageId = hdr.messageId;\n if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;\n if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;\n return o;\n}\n\nfunction pickBodyString(\n body: Record<string, unknown>,\n camel: string,\n snake: string,\n): unknown {\n const a = body[camel];\n if (typeof a === \"string\" && a.trim()) return a;\n const b = body[snake];\n if (typeof b === \"string\" && b.trim()) return b;\n return undefined;\n}\n\nasync function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n return Buffer.concat(chunks);\n}\n\nfunction sendJsonResponse(\n res: http.ServerResponse,\n status: number,\n body: unknown,\n): void {\n if (res.headersSent) return;\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n}\n\nfunction sendJsonErrorResponse(\n res: http.ServerResponse,\n status: number,\n message: string,\n): void {\n sendJsonResponse(res, status, { error: message });\n}\n\nfunction forwardCloudTtsUpstreamError(\n res: http.ServerResponse,\n status: number,\n bodyText: string,\n): void {\n if (res.headersSent) return;\n const trimmed = bodyText.trim();\n if (\n (trimmed.startsWith(\"{\") && trimmed.endsWith(\"}\")) ||\n (trimmed.startsWith(\"[\") && trimmed.endsWith(\"]\"))\n ) {\n try {\n const parsed: unknown = JSON.parse(trimmed);\n sendJsonResponse(res, status, parsed);\n return;\n } catch {\n /* fall through */\n }\n }\n res.statusCode = status;\n res.setHeader(\"content-type\", \"application/json; charset=utf-8\");\n res.end(\n JSON.stringify({ error: trimmed || \"Eliza Cloud TTS request failed\" }),\n );\n}\n\nexport async function handleCloudTtsPreviewRoute(\n req: http.IncomingMessage,\n res: http.ServerResponse,\n): Promise<boolean> {\n const clientTtsDbg = readTtsDebugClientHeaders(req);\n const dbgExtra = ttsClientDbgFields(clientTtsDbg);\n\n const cloudApiKey = _internalResolveCloudApiKey();\n if (!cloudApiKey) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"no_api_key\",\n ...dbgExtra,\n });\n sendJsonErrorResponse(\n res,\n 401,\n \"Eliza Cloud is not connected. Connect your Eliza Cloud account first.\",\n );\n return true;\n }\n\n const rawBody = await readRawRequestBody(req);\n let body: Record<string, unknown>;\n try {\n body = JSON.parse(rawBody.toString(\"utf8\")) as Record<string, unknown>;\n } catch {\n sendJsonErrorResponse(res, 400, \"Invalid JSON request body\");\n return true;\n }\n\n const text = sanitizeSpeechText(\n typeof body.text === \"string\" ? body.text : \"\",\n );\n if (!text) {\n sendJsonErrorResponse(res, 400, \"Missing text\");\n return true;\n }\n\n if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {\n sendJsonErrorResponse(\n res,\n 400,\n `Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,\n );\n return true;\n }\n\n const cloudModel = resolveCloudProxyTtsModel(\n pickBodyString(body, \"modelId\", \"model_id\"),\n );\n const cloudVoice = resolveElizaCloudTtsVoiceId(\n pickBodyString(body, \"voiceId\", \"voice_id\"),\n );\n const cloudUrls = resolveCloudTtsCandidateUrls();\n\n const ttsPreview = ttsDebugTextPreview(text);\n ttsDebug(\"server:cloud-tts:proxy\", {\n textChars: text.length,\n preview: ttsPreview,\n modelId: cloudModel,\n voiceId: cloudVoice,\n urlCandidates: cloudUrls.length,\n ...dbgExtra,\n });\n\n try {\n let lastStatus = 0;\n let lastDetails = \"unknown error\";\n let cloudResponse: Response | null = null;\n for (let i = 0; i < cloudUrls.length; i++) {\n const cloudUrl = cloudUrls[i];\n if (cloudUrl === undefined) {\n continue;\n }\n const attempt = await fetch(cloudUrl, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${cloudApiKey}`,\n \"x-api-key\": cloudApiKey,\n \"Content-Type\": \"application/json\",\n Accept: \"audio/mpeg\",\n },\n body: JSON.stringify({\n text,\n voiceId: cloudVoice,\n modelId: cloudModel,\n }),\n });\n\n if (attempt.ok) {\n cloudResponse = attempt;\n ttsDebug(\"server:cloud-tts:upstream-ok\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n break;\n }\n\n lastStatus = attempt.status;\n lastDetails = await attempt.text().catch(() => \"unknown error\");\n ttsDebug(\"server:cloud-tts:upstream-retry\", {\n urlIndex: i,\n status: attempt.status,\n preview: ttsPreview,\n ...dbgExtra,\n });\n\n const hasMoreCandidates = i < cloudUrls.length - 1;\n if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {\n break;\n }\n }\n if (!cloudResponse) {\n ttsDebug(\"server:cloud-tts:reject\", {\n reason: \"upstream_failed\",\n lastStatus,\n preview: ttsPreview,\n ...dbgExtra,\n });\n if (\n lastStatus === 400 ||\n lastStatus === 401 ||\n lastStatus === 402 ||\n lastStatus === 403 ||\n lastStatus === 429\n ) {\n forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);\n return true;\n }\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,\n );\n return true;\n }\n\n const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());\n ttsDebug(\"server:cloud-tts:success\", {\n bytes: audioBuffer.length,\n preview: ttsPreview,\n ...dbgExtra,\n });\n res.statusCode = 200;\n res.setHeader(\"Content-Type\", \"audio/mpeg\");\n res.setHeader(\"Cache-Control\", \"no-store\");\n res.end(audioBuffer);\n return true;\n } catch (err) {\n sendJsonErrorResponse(\n res,\n 502,\n `Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n return true;\n }\n}\n"
|
|
9
6
|
],
|
|
10
|
-
"mappings": "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",
|
|
11
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "8E6B79F7D105205464756E2164756E21",
|
|
12
9
|
"names": []
|
|
13
10
|
}
|
package/dist/lib/tts-debug.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/**
|
|
2
|
+
* TTS debug logging. Implementation moved to
|
|
3
|
+
* `@elizaos/shared/elizacloud/tts-debug`.
|
|
4
|
+
*/
|
|
5
|
+
export { isTtsDebugEnabled, ttsDebug, ttsDebugTextPreview } from "@elizaos/shared";
|
|
4
6
|
//# sourceMappingURL=tts-debug.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tts-debug.d.ts","sourceRoot":"","sources":["../../src/lib/tts-debug.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tts-debug.d.ts","sourceRoot":"","sources":["../../src/lib/tts-debug.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/lib/tts-debug.js
CHANGED
|
@@ -15,43 +15,10 @@ var __export = (target, all) => {
|
|
|
15
15
|
};
|
|
16
16
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
17
|
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
-
|
|
19
|
-
// src/lib/tts-debug.ts
|
|
20
|
-
function truthy(raw) {
|
|
21
|
-
if (raw == null)
|
|
22
|
-
return false;
|
|
23
|
-
const value = String(raw).trim().toLowerCase();
|
|
24
|
-
return value === "1" || value === "true" || value === "yes" || value === "on";
|
|
25
|
-
}
|
|
26
|
-
function ttsDebugEnabled() {
|
|
27
|
-
if (typeof process !== "undefined" && process.env) {
|
|
28
|
-
if (truthy(process.env.ELIZA_TTS_DEBUG))
|
|
29
|
-
return true;
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
function isTtsDebugEnabled() {
|
|
34
|
-
return ttsDebugEnabled();
|
|
35
|
-
}
|
|
36
|
-
function ttsDebugTextPreview(text, maxChars = 160) {
|
|
37
|
-
const singleLine = text.replace(/\r?\n/g, "↵ ").replace(/\s+/g, " ").trim();
|
|
38
|
-
if (singleLine.length <= maxChars)
|
|
39
|
-
return singleLine;
|
|
40
|
-
return `${singleLine.slice(0, maxChars)}…`;
|
|
41
|
-
}
|
|
42
|
-
function ttsDebug(phase, detail) {
|
|
43
|
-
if (!ttsDebugEnabled())
|
|
44
|
-
return;
|
|
45
|
-
if (detail && Object.keys(detail).length > 0) {
|
|
46
|
-
console.info(`[eliza][tts] ${phase}`, detail);
|
|
47
|
-
} else {
|
|
48
|
-
console.info(`[eliza][tts] ${phase}`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
18
|
export {
|
|
52
19
|
ttsDebugTextPreview,
|
|
53
20
|
ttsDebug,
|
|
54
21
|
isTtsDebugEnabled
|
|
55
22
|
};
|
|
56
23
|
|
|
57
|
-
//# debugId=
|
|
24
|
+
//# debugId=11FA601D97731E0C64756E2164756E21
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": [
|
|
3
|
+
"sources": [],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"function truthy(raw: string | undefined | null): boolean {\n if (raw == null) return false;\n const value = String(raw).trim().toLowerCase();\n return value === \"1\" || value === \"true\" || value === \"yes\" || value === \"on\";\n}\n\nfunction ttsDebugEnabled(): boolean {\n if (typeof process !== \"undefined\" && process.env) {\n if (truthy(process.env.ELIZA_TTS_DEBUG)) return true;\n }\n return false;\n}\n\nexport function isTtsDebugEnabled(): boolean {\n return ttsDebugEnabled();\n}\n\nexport function ttsDebugTextPreview(text: string, maxChars = 160): string {\n const singleLine = text.replace(/\\r?\\n/g, \"↵ \").replace(/\\s+/g, \" \").trim();\n if (singleLine.length <= maxChars) return singleLine;\n return `${singleLine.slice(0, maxChars)}…`;\n}\n\nexport function ttsDebug(\n phase: string,\n detail?: Record<string, unknown>,\n): void {\n if (!ttsDebugEnabled()) return;\n if (detail && Object.keys(detail).length > 0) {\n console.info(`[eliza][tts] ${phase}`, detail);\n } else {\n console.info(`[eliza][tts] ${phase}`);\n }\n}\n"
|
|
6
5
|
],
|
|
7
|
-
"mappings": "
|
|
8
|
-
"debugId": "
|
|
6
|
+
"mappings": "",
|
|
7
|
+
"debugId": "11FA601D97731E0C64756E2164756E21",
|
|
9
8
|
"names": []
|
|
10
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/models/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/models/embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AA2GxE,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,mBAAmB,GAAG,MAAM,GAAG,IAAI,GAC1C,OAAO,CAAC,MAAM,EAAE,CAAC,CA0BnB;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAiJrB"}
|