@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
|
@@ -19,7 +19,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
19
19
|
// src/utils/config.ts
|
|
20
20
|
import { logger } from "@elizaos/core";
|
|
21
21
|
import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
|
|
22
|
-
var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "
|
|
22
|
+
var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "zai-glm-4.7";
|
|
23
23
|
function getEnvValue(key) {
|
|
24
24
|
if (typeof process === "undefined") {
|
|
25
25
|
return;
|
|
@@ -109,9 +109,18 @@ function getExperimentalTelemetry(runtime) {
|
|
|
109
109
|
const setting = getSetting(runtime, "ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY", "false");
|
|
110
110
|
return String(setting).toLowerCase() === "true";
|
|
111
111
|
}
|
|
112
|
+
function resolveCloudTimeoutMs(envKey, defaultMs) {
|
|
113
|
+
const raw = typeof process !== "undefined" ? process.env[envKey] : undefined;
|
|
114
|
+
if (raw === undefined || raw.trim() === "")
|
|
115
|
+
return defaultMs;
|
|
116
|
+
const parsed = Number.parseInt(raw, 10);
|
|
117
|
+
if (!Number.isFinite(parsed))
|
|
118
|
+
return defaultMs;
|
|
119
|
+
return parsed <= 0 ? undefined : parsed;
|
|
120
|
+
}
|
|
112
121
|
|
|
113
122
|
// src/utils/sdk-client.ts
|
|
114
|
-
import {
|
|
123
|
+
import { ElizaCloudClient } from "@elizaos/cloud-sdk";
|
|
115
124
|
function trimTrailingSlash(value) {
|
|
116
125
|
return value.replace(/\/+$/, "");
|
|
117
126
|
}
|
|
@@ -126,7 +135,11 @@ function apiKeyForRuntime(runtime, embedding = false) {
|
|
|
126
135
|
}
|
|
127
136
|
function createCloudApiClient(runtime, embedding = false) {
|
|
128
137
|
const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);
|
|
129
|
-
return new
|
|
138
|
+
return new ElizaCloudClient({
|
|
139
|
+
apiBaseUrl: trimTrailingSlash(baseUrl),
|
|
140
|
+
baseUrl: apiBaseToSiteBaseUrl(baseUrl),
|
|
141
|
+
apiKey: apiKeyForRuntime(runtime, embedding)
|
|
142
|
+
}).v1;
|
|
130
143
|
}
|
|
131
144
|
function createElizaCloudClient(runtime) {
|
|
132
145
|
const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));
|
|
@@ -141,7 +154,7 @@ function createElizaCloudClient(runtime) {
|
|
|
141
154
|
import {
|
|
142
155
|
EventType
|
|
143
156
|
} from "@elizaos/core";
|
|
144
|
-
function emitModelUsageEvent(runtime, type, _prompt, usage) {
|
|
157
|
+
function emitModelUsageEvent(runtime, type, _prompt, usage, meta = {}) {
|
|
145
158
|
const inputTokens = Number(usage.inputTokens || 0);
|
|
146
159
|
const outputTokens = Number(usage.outputTokens || 0);
|
|
147
160
|
const totalTokens = Number(usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens);
|
|
@@ -153,14 +166,34 @@ function emitModelUsageEvent(runtime, type, _prompt, usage) {
|
|
|
153
166
|
prompt: inputTokens,
|
|
154
167
|
completion: outputTokens,
|
|
155
168
|
total: totalTokens
|
|
156
|
-
}
|
|
169
|
+
},
|
|
170
|
+
...meta.modelName ? { modelName: meta.modelName } : {},
|
|
171
|
+
...typeof meta.costUsd === "number" && Number.isFinite(meta.costUsd) ? { costUsd: meta.costUsd } : {}
|
|
157
172
|
};
|
|
158
173
|
runtime.emitEvent(EventType.MODEL_USED, payload);
|
|
159
174
|
}
|
|
160
175
|
|
|
161
176
|
// src/models/embeddings.ts
|
|
162
|
-
import {
|
|
177
|
+
import {
|
|
178
|
+
logger as logger2,
|
|
179
|
+
ModelType,
|
|
180
|
+
timeInferenceSpan,
|
|
181
|
+
VECTOR_DIMS
|
|
182
|
+
} from "@elizaos/core";
|
|
163
183
|
var MAX_BATCH_SIZE = 100;
|
|
184
|
+
var EMBED_MAX_ATTEMPTS = 2;
|
|
185
|
+
var EMBED_BACKOFF_BASE_MS = 1000;
|
|
186
|
+
var EMBED_BACKOFF_CAP_MS = 8000;
|
|
187
|
+
var EMBED_REQUEST_TIMEOUT_MS = 60000;
|
|
188
|
+
function embeddingBackoffMs(attempt, retryAfterSec) {
|
|
189
|
+
const exp = EMBED_BACKOFF_BASE_MS * 2 ** attempt;
|
|
190
|
+
const serverHint = typeof retryAfterSec === "number" && retryAfterSec > 0 ? retryAfterSec * 1000 : 0;
|
|
191
|
+
const base = Math.min(EMBED_BACKOFF_CAP_MS, Math.max(exp, serverHint));
|
|
192
|
+
return Math.round(base * (1 + Math.random() * 0.25));
|
|
193
|
+
}
|
|
194
|
+
function sleep(ms) {
|
|
195
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
196
|
+
}
|
|
164
197
|
function extractRateLimitInfo(response) {
|
|
165
198
|
return {
|
|
166
199
|
remainingRequests: parseInt(response.headers.get("x-ratelimit-remaining-requests") || "", 10) || undefined,
|
|
@@ -182,16 +215,16 @@ function getEmbeddingConfig(runtime) {
|
|
|
182
215
|
}
|
|
183
216
|
return { embeddingModelName, embeddingDimension };
|
|
184
217
|
}
|
|
185
|
-
function
|
|
218
|
+
function createInitProbeVector(dimension) {
|
|
186
219
|
const vector = Array(dimension).fill(0);
|
|
187
|
-
vector[0] =
|
|
220
|
+
vector[0] = 0.1;
|
|
188
221
|
return vector;
|
|
189
222
|
}
|
|
190
223
|
async function handleTextEmbedding(runtime, params) {
|
|
191
224
|
const { embeddingDimension } = getEmbeddingConfig(runtime);
|
|
192
225
|
if (params === null) {
|
|
193
226
|
logger2.debug("Creating test embedding for initialization");
|
|
194
|
-
return
|
|
227
|
+
return createInitProbeVector(embeddingDimension);
|
|
195
228
|
}
|
|
196
229
|
let text;
|
|
197
230
|
if (typeof params === "string") {
|
|
@@ -199,12 +232,10 @@ async function handleTextEmbedding(runtime, params) {
|
|
|
199
232
|
} else if (typeof params === "object" && params.text) {
|
|
200
233
|
text = params.text;
|
|
201
234
|
} else {
|
|
202
|
-
|
|
203
|
-
return createErrorVector(embeddingDimension, 0.2);
|
|
235
|
+
throw new Error("Invalid input format for embedding: expected string or { text: string }");
|
|
204
236
|
}
|
|
205
237
|
if (!text.trim()) {
|
|
206
|
-
|
|
207
|
-
return createErrorVector(embeddingDimension, 0.3);
|
|
238
|
+
throw new Error("Cannot generate embedding for empty text");
|
|
208
239
|
}
|
|
209
240
|
const results = await handleBatchTextEmbedding(runtime, [text]);
|
|
210
241
|
return results[0];
|
|
@@ -213,80 +244,61 @@ async function handleBatchTextEmbedding(runtime, texts) {
|
|
|
213
244
|
const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);
|
|
214
245
|
const client = createCloudApiClient(runtime, true);
|
|
215
246
|
if (!texts || texts.length === 0) {
|
|
216
|
-
logger2.warn("[BatchEmbeddings] Empty texts array");
|
|
217
247
|
return [];
|
|
218
248
|
}
|
|
219
249
|
const validTexts = [];
|
|
220
|
-
const results = new Array(texts.length);
|
|
221
250
|
for (let i = 0;i < texts.length; i++) {
|
|
222
251
|
const text = texts[i]?.trim();
|
|
223
|
-
if (text) {
|
|
224
|
-
|
|
225
|
-
} else {
|
|
226
|
-
results[i] = createErrorVector(embeddingDimension, 0.3);
|
|
252
|
+
if (!text) {
|
|
253
|
+
throw new Error(`Cannot generate embedding for empty text at index ${i}`);
|
|
227
254
|
}
|
|
255
|
+
validTexts.push({ text, originalIndex: i });
|
|
228
256
|
}
|
|
229
|
-
|
|
230
|
-
logger2.warn("[BatchEmbeddings] All texts were empty");
|
|
231
|
-
return results;
|
|
232
|
-
}
|
|
257
|
+
const results = new Array(texts.length);
|
|
233
258
|
for (let batchStart = 0;batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {
|
|
234
259
|
const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);
|
|
235
260
|
const batch = validTexts.slice(batchStart, batchEnd);
|
|
236
261
|
const batchTexts = batch.map((b) => b.text);
|
|
237
262
|
logger2.info(`[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`);
|
|
238
263
|
try {
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
input: batchTexts
|
|
243
|
-
}
|
|
244
|
-
});
|
|
245
|
-
const rateLimitInfo = extractRateLimitInfo(response);
|
|
246
|
-
if (rateLimitInfo.remainingRequests !== undefined && rateLimitInfo.remainingRequests < 50) {
|
|
247
|
-
logger2.warn(`[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`);
|
|
248
|
-
}
|
|
249
|
-
if (response.status === 429) {
|
|
250
|
-
const retryAfter = rateLimitInfo.retryAfter || 30;
|
|
251
|
-
logger2.warn(`[BatchEmbeddings] Rate limited, waiting ${retryAfter}s...`);
|
|
252
|
-
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
|
|
253
|
-
const retryResponse = await client.requestRaw("POST", "/embeddings", {
|
|
264
|
+
let response = null;
|
|
265
|
+
for (let attempt = 0;attempt < EMBED_MAX_ATTEMPTS; attempt++) {
|
|
266
|
+
const resp = await timeInferenceSpan("cloud.embedding", () => client.requestRaw("POST", "/embeddings", {
|
|
254
267
|
json: {
|
|
255
268
|
model: embeddingModelName,
|
|
256
269
|
input: batchTexts
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
}
|
|
264
|
-
continue;
|
|
270
|
+
},
|
|
271
|
+
timeoutMs: EMBED_REQUEST_TIMEOUT_MS
|
|
272
|
+
}), { batch: batchTexts.length, attempt });
|
|
273
|
+
const rateLimitInfo = extractRateLimitInfo(resp);
|
|
274
|
+
if (rateLimitInfo.remainingRequests !== undefined && rateLimitInfo.remainingRequests < 50) {
|
|
275
|
+
logger2.warn(`[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`);
|
|
265
276
|
}
|
|
266
|
-
const
|
|
267
|
-
if (
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
277
|
+
const transient = resp.status === 429 || resp.status === 502 || resp.status === 503 || resp.status === 504;
|
|
278
|
+
if (transient && attempt < EMBED_MAX_ATTEMPTS - 1) {
|
|
279
|
+
const delay = embeddingBackoffMs(attempt, rateLimitInfo.retryAfter);
|
|
280
|
+
logger2.warn(`[BatchEmbeddings] ${resp.status} (attempt ${attempt + 1}/${EMBED_MAX_ATTEMPTS}) — backing off ${delay}ms`);
|
|
281
|
+
await resp.text().catch(() => {
|
|
282
|
+
return;
|
|
283
|
+
});
|
|
284
|
+
await sleep(delay);
|
|
285
|
+
continue;
|
|
273
286
|
}
|
|
274
|
-
|
|
287
|
+
response = resp;
|
|
288
|
+
break;
|
|
289
|
+
}
|
|
290
|
+
if (!response) {
|
|
291
|
+
throw new Error("[BatchEmbeddings] No response after retry loop");
|
|
275
292
|
}
|
|
276
293
|
if (!response.ok) {
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.4);
|
|
294
|
+
if (response.status === 401 || response.status === 403) {
|
|
295
|
+
throw new Error(`[BatchEmbeddings] Authentication failed (${response.status}). ` + `Check ELIZAOS_CLOUD_API_KEY or ELIZAOS_CLOUD_EMBEDDING_API_KEY — ` + `the current key is not authorized for the embedding endpoint.`);
|
|
280
296
|
}
|
|
281
|
-
|
|
297
|
+
throw new Error(`[BatchEmbeddings] API error: ${response.status} ${response.statusText}`);
|
|
282
298
|
}
|
|
283
299
|
const data = await response.json();
|
|
284
300
|
if (!data?.data || !Array.isArray(data.data)) {
|
|
285
|
-
|
|
286
|
-
for (const item of batch) {
|
|
287
|
-
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.5);
|
|
288
|
-
}
|
|
289
|
-
continue;
|
|
301
|
+
throw new Error("[BatchEmbeddings] API returned invalid response structure");
|
|
290
302
|
}
|
|
291
303
|
for (const item of data.data) {
|
|
292
304
|
const originalIndex = batch[item.index].originalIndex;
|
|
@@ -300,13 +312,11 @@ async function handleBatchTextEmbedding(runtime, texts) {
|
|
|
300
312
|
};
|
|
301
313
|
emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);
|
|
302
314
|
}
|
|
303
|
-
logger2.debug(`[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)
|
|
315
|
+
logger2.debug(`[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)`);
|
|
304
316
|
} catch (error) {
|
|
305
317
|
const message = error instanceof Error ? error.message : String(error);
|
|
306
|
-
logger2.error(`[BatchEmbeddings]
|
|
307
|
-
|
|
308
|
-
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.6);
|
|
309
|
-
}
|
|
318
|
+
logger2.error(`[BatchEmbeddings] Batch failed: ${message}`);
|
|
319
|
+
throw error instanceof Error ? error : new Error(message);
|
|
310
320
|
}
|
|
311
321
|
}
|
|
312
322
|
return results;
|
|
@@ -316,4 +326,4 @@ export {
|
|
|
316
326
|
handleBatchTextEmbedding
|
|
317
327
|
};
|
|
318
328
|
|
|
319
|
-
//# debugId=
|
|
329
|
+
//# debugId=BE25054212D928B264756E2164756E21
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/utils/config.ts", "../src/utils/sdk-client.ts", "../src/utils/events.ts", "../src/models/embeddings.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from \"@elizaos/core\";\n\nexport const DEFAULT_ELIZA_CLOUD_LARGE_MODEL = \"
|
|
6
|
-
"import { CloudApiClient, ElizaCloudClient } from \"@elizaos/cloud-sdk\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n getApiKey,\n getBaseURL,\n getEmbeddingApiKey,\n getEmbeddingBaseURL,\n isBrowser,\n} from \"./config\";\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction apiBaseToSiteBaseUrl(apiBaseUrl: string): string {\n const trimmed = trimTrailingSlash(apiBaseUrl);\n return trimmed.endsWith(\"/api/v1\") ? trimmed.slice(0, -\"/api/v1\".length) : trimmed;\n}\n\nfunction apiKeyForRuntime(runtime: IAgentRuntime, embedding = false): string | undefined {\n if (isBrowser()) return undefined;\n return embedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);\n}\n\nexport function createCloudApiClient(runtime: IAgentRuntime, embedding = false): CloudApiClient {\n const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);\n return new
|
|
7
|
-
"import {\n EventType,\n type IAgentRuntime,\n type ModelEventPayload,\n type ModelTypeName,\n} from \"@elizaos/core\";\nimport type { LanguageModelUsage } from \"ai\";\n\nexport function emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n _prompt: string,\n usage: Partial<LanguageModelUsage> & {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n }\n) {\n const inputTokens = Number(usage.inputTokens || 0);\n const outputTokens = Number(usage.outputTokens || 0);\n const totalTokens = Number(\n usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens\n );\n\n const payload:
|
|
8
|
-
"import type { IAgentRuntime, TextEmbeddingParams } from \"@elizaos/core\";\nimport { logger, ModelType, VECTOR_DIMS } from \"@elizaos/core\";\nimport { getSetting } from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { createCloudApiClient } from \"../utils/sdk-client\";\n\nconst MAX_BATCH_SIZE = 100;\nfunction extractRateLimitInfo(response: Response): {\n remainingRequests?: number;\n remainingTokens?: number;\n limitRequests?: number;\n limitTokens?: number;\n resetRequests?: string;\n resetTokens?: string;\n retryAfter?: number;\n} {\n return {\n remainingRequests:\n parseInt(response.headers.get(\"x-ratelimit-remaining-requests\") || \"\", 10) || undefined,\n remainingTokens:\n parseInt(response.headers.get(\"x-ratelimit-remaining-tokens\") || \"\", 10) || undefined,\n limitRequests:\n parseInt(response.headers.get(\"x-ratelimit-limit-requests\") || \"\", 10) || undefined,\n limitTokens: parseInt(response.headers.get(\"x-ratelimit-limit-tokens\") || \"\", 10) || undefined,\n resetRequests: response.headers.get(\"x-ratelimit-reset-requests\") || undefined,\n resetTokens: response.headers.get(\"x-ratelimit-reset-tokens\") || undefined,\n retryAfter: parseInt(response.headers.get(\"retry-after\") || \"\", 10) || undefined,\n };\n}\n\nfunction getEmbeddingConfig(runtime: IAgentRuntime) {\n const embeddingModelName = getSetting(\n runtime,\n \"ELIZAOS_CLOUD_EMBEDDING_MODEL\",\n \"text-embedding-3-small\"\n );\n const embeddingDimension = Number.parseInt(\n getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS\", \"1536\") || \"1536\",\n 10\n ) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];\n\n if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {\n const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(\", \")}`;\n logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n return { embeddingModelName, embeddingDimension };\n}\n\nfunction createErrorVector(dimension: number, marker: number): number[] {\n const vector = Array(dimension).fill(0);\n vector[0] = marker;\n return vector;\n}\n\nexport interface BatchEmbeddingParams {\n texts: string[];\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n const { embeddingDimension } = getEmbeddingConfig(runtime);\n\n if (params === null) {\n logger.debug(\"Creating test embedding for initialization\");\n return createErrorVector(embeddingDimension, 0.1);\n }\n\n let text: string;\n if (typeof params === \"string\") {\n text = params;\n } else if (typeof params === \"object\" && params.text) {\n text = params.text;\n } else {\n logger.warn(\"Invalid input format for embedding\");\n return createErrorVector(embeddingDimension, 0.2);\n }\n\n if (!text.trim()) {\n logger.warn(\"Empty text for embedding\");\n return createErrorVector(embeddingDimension, 0.3);\n }\n\n const results = await handleBatchTextEmbedding(runtime, [text]);\n return results[0];\n}\n\nexport interface BatchEmbeddingResult {\n embedding: number[];\n index: number;\n success: boolean;\n error?: string;\n}\n\nexport async function handleBatchTextEmbedding(\n runtime: IAgentRuntime,\n texts: string[]\n): Promise<number[][]> {\n const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);\n const client = createCloudApiClient(runtime, true);\n\n if (!texts || texts.length === 0) {\n logger.warn(\"[BatchEmbeddings] Empty texts array\");\n return [];\n }\n\n const validTexts: { text: string; originalIndex: number }[] = [];\n const results: number[][] = new Array(texts.length);\n\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i]?.trim();\n if (text) {\n validTexts.push({ text, originalIndex: i });\n } else {\n results[i] = createErrorVector(embeddingDimension, 0.3);\n }\n }\n\n if (validTexts.length === 0) {\n logger.warn(\"[BatchEmbeddings] All texts were empty\");\n return results;\n }\n\n for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);\n const batch = validTexts.slice(batchStart, batchEnd);\n const batchTexts = batch.map((b) => b.text);\n\n logger.info(\n `[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`\n );\n\n try {\n const response = await client.requestRaw(\"POST\", \"/embeddings\", {\n json: {\n model: embeddingModelName,\n input: batchTexts,\n },\n });\n\n const rateLimitInfo = extractRateLimitInfo(response);\n\n if (rateLimitInfo.remainingRequests !== undefined && rateLimitInfo.remainingRequests < 50) {\n logger.warn(\n `[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`\n );\n }\n\n if (response.status === 429) {\n const retryAfter = rateLimitInfo.retryAfter || 30;\n logger.warn(`[BatchEmbeddings] Rate limited, waiting ${retryAfter}s...`);\n await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));\n\n const retryResponse = await client.requestRaw(\"POST\", \"/embeddings\", {\n json: {\n model: embeddingModelName,\n input: batchTexts,\n },\n });\n\n if (!retryResponse.ok) {\n logger.error(`[BatchEmbeddings] Retry failed: ${retryResponse.status}`);\n for (const item of batch) {\n results[item.originalIndex] = createErrorVector(embeddingDimension, 0.4);\n }\n continue;\n }\n\n const retryData = (await retryResponse.json()) as {\n data: Array<{ embedding: number[]; index: number }>;\n };\n\n if (retryData?.data) {\n for (const item of retryData.data) {\n const originalIndex = batch[item.index].originalIndex;\n results[originalIndex] = item.embedding;\n }\n logger.info(`[BatchEmbeddings] Retry successful for ${batch.length} embeddings`);\n }\n continue;\n }\n\n if (!response.ok) {\n logger.error(`[BatchEmbeddings] API error: ${response.status} - ${response.statusText}`);\n for (const item of batch) {\n results[item.originalIndex] = createErrorVector(embeddingDimension, 0.4);\n }\n continue;\n }\n\n const data = (await response.json()) as {\n data: Array<{ embedding: number[]; index: number }>;\n usage?: { prompt_tokens: number; total_tokens: number };\n };\n\n if (!data?.data || !Array.isArray(data.data)) {\n logger.error(\"[BatchEmbeddings] API returned invalid structure\");\n for (const item of batch) {\n results[item.originalIndex] = createErrorVector(embeddingDimension, 0.5);\n }\n continue;\n }\n\n for (const item of data.data) {\n const originalIndex = batch[item.index].originalIndex;\n results[originalIndex] = item.embedding;\n }\n\n if (data.usage) {\n const usage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: 0,\n totalTokens: data.usage.total_tokens,\n };\n emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);\n }\n\n logger.debug(\n `[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d), remaining: ${rateLimitInfo.remainingRequests ?? \"unknown\"}`\n );\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[BatchEmbeddings] Error: ${message}`);\n for (const item of batch) {\n results[item.originalIndex] = createErrorVector(embeddingDimension, 0.6);\n }\n }\n }\n\n return results;\n}\n"
|
|
5
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from \"@elizaos/core\";\n\nexport const DEFAULT_ELIZA_CLOUD_LARGE_MODEL = \"zai-glm-4.7\";\n\nfunction getEnvValue(key: string): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const value = process.env[key];\n return value === undefined ? undefined : String(value);\n}\n\nexport function getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return getEnvValue(key) ?? defaultValue;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { document?: Document }).document !== \"undefined\"\n );\n}\n\nexport function isProxyMode(runtime: IAgentRuntime): boolean {\n return isBrowser() && !!getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n}\n\nexport function getBaseURL(runtime: IAgentRuntime): string {\n const browserURL = getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n const baseURL = (\n isBrowser() && browserURL\n ? browserURL\n : getSetting(runtime, \"ELIZAOS_CLOUD_BASE_URL\", \"https://www.elizacloud.ai/api/v1\")\n ) as string;\n return baseURL;\n}\n\nexport function getEmbeddingBaseURL(runtime: IAgentRuntime): string {\n const embeddingURL = isBrowser()\n ? getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_EMBEDDING_URL\") ||\n getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\")\n : getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_URL\");\n if (embeddingURL) {\n logger.debug(`[ELIZAOS_CLOUD] Using specific embedding base URL: ${embeddingURL}`);\n return embeddingURL;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general base URL for embeddings.\");\n return getBaseURL(runtime);\n}\n\nexport function getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, \"ELIZAOS_CLOUD_API_KEY\");\n}\n\nexport function getEmbeddingApiKey(runtime: IAgentRuntime): string | undefined {\n const embeddingApiKey = getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_API_KEY\");\n if (embeddingApiKey) {\n logger.debug(\"[ELIZAOS_CLOUD] Using specific embedding API key (present)\");\n return embeddingApiKey;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general API key for embeddings.\");\n return getApiKey(runtime);\n}\n\nexport function getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_SMALL_MODEL\") ??\n (getSetting(runtime, \"SMALL_MODEL\", DEFAULT_ELIZA_CLOUD_TEXT_MODEL) as string)\n );\n}\n\nexport function getNanoModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_NANO_MODEL\") ??\n getSetting(runtime, \"NANO_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getMediumModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEDIUM_MODEL\") ??\n getSetting(runtime, \"MEDIUM_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_LARGE_MODEL\") ??\n (getSetting(runtime, \"LARGE_MODEL\", DEFAULT_ELIZA_CLOUD_LARGE_MODEL) as string)\n );\n}\n\nexport function getMegaModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEGA_MODEL\") ??\n getSetting(runtime, \"MEGA_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseHandlerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL\") ??\n getSetting(runtime, \"RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"SHOULD_RESPOND_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getActionPlannerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_PLANNER_MODEL\") ??\n getSetting(runtime, \"ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"PLANNER_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_MODEL\") ??\n getSetting(runtime, \"RESPONSE_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getImageDescriptionModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\", \"gpt-5.4-mini\") as string;\n}\n\nexport function getImageGenerationModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\", \"google/gemini-2.5-flash-image\") ??\n \"google/gemini-2.5-flash-image\"\n );\n}\n\nexport function getResearchModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESEARCH_MODEL\") ??\n (getSetting(runtime, \"RESEARCH_MODEL\", \"o3-deep-research\") as string)\n );\n}\n\nexport function getTTSModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_TTS_MODEL\", \"gpt-5-mini-tts\") as string;\n}\n\nexport function getTranscriptionModel(runtime: IAgentRuntime): string {\n return getSetting(\n runtime,\n \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n \"gpt-5-mini-transcribe\"\n ) as string;\n}\n\nexport function getExperimentalTelemetry(runtime: IAgentRuntime): boolean {\n const setting = getSetting(runtime, \"ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY\", \"false\");\n return String(setting).toLowerCase() === \"true\";\n}\n\n/**\n * Resolve a client-side timeout (ms) for a cloud model round-trip from `envKey`,\n * falling back to `defaultMs`. `0`/negative/non-numeric → undefined (opt out).\n *\n * cloud-sdk applies NO default timeout (a fetch with no signal hangs until the\n * platform default), so turn-blocking calls (TTS/STT in a voice turn, deep\n * research) need an explicit ceiling or a stalled gateway hangs the turn.\n */\nexport function resolveCloudTimeoutMs(\n envKey: string,\n defaultMs: number\n): number | undefined {\n const raw = typeof process !== \"undefined\" ? process.env[envKey] : undefined;\n if (raw === undefined || raw.trim() === \"\") return defaultMs;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed)) return defaultMs;\n return parsed <= 0 ? undefined : parsed;\n}\n",
|
|
6
|
+
"import { CloudApiClient, ElizaCloudClient } from \"@elizaos/cloud-sdk\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n getApiKey,\n getBaseURL,\n getEmbeddingApiKey,\n getEmbeddingBaseURL,\n isBrowser,\n} from \"./config\";\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction apiBaseToSiteBaseUrl(apiBaseUrl: string): string {\n const trimmed = trimTrailingSlash(apiBaseUrl);\n return trimmed.endsWith(\"/api/v1\") ? trimmed.slice(0, -\"/api/v1\".length) : trimmed;\n}\n\nfunction apiKeyForRuntime(runtime: IAgentRuntime, embedding = false): string | undefined {\n if (isBrowser()) return undefined;\n return embedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);\n}\n\nexport function createCloudApiClient(runtime: IAgentRuntime, embedding = false): CloudApiClient {\n const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);\n return new ElizaCloudClient({\n apiBaseUrl: trimTrailingSlash(baseUrl),\n baseUrl: apiBaseToSiteBaseUrl(baseUrl),\n apiKey: apiKeyForRuntime(runtime, embedding),\n }).v1;\n}\n\nexport function createElizaCloudClient(runtime: IAgentRuntime): ElizaCloudClient {\n const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));\n return new ElizaCloudClient({\n apiBaseUrl,\n baseUrl: apiBaseToSiteBaseUrl(apiBaseUrl),\n apiKey: apiKeyForRuntime(runtime),\n });\n}\n",
|
|
7
|
+
"import {\n EventType,\n type IAgentRuntime,\n type ModelEventPayload,\n type ModelTypeName,\n} from \"@elizaos/core\";\nimport type { LanguageModelUsage } from \"ai\";\n\n/**\n * Extra metadata that rides along with a {@link ModelEventPayload} so that\n * downstream consumers (e.g. the waifu metering bridge) can attribute spend\n * to a concrete model id and, when the cloud surfaces it, the authoritative\n * post-markup USD cost it just debited from the org's credit balance.\n *\n * These are additive fields layered onto the standard payload — the core\n * {@link ModelEventPayload} shape is unchanged for every other listener.\n */\nexport interface ModelUsageEventMeta {\n /** Resolved provider model id, e.g. \"anthropic/claude-opus-4.7\". */\n modelName?: string;\n /**\n * Authoritative USD cost the metered gateway charged for this call, when\n * available (e.g. from a `usage.cost_usd` field or `X-Eliza-Cost-Usd`\n * response header). Undefined when the cloud does not surface it; consumers\n * then fall back to a token-based estimate.\n */\n costUsd?: number;\n}\n\nexport type ModelUsageEventPayload = ModelEventPayload & ModelUsageEventMeta;\n\nexport function emitModelUsageEvent(\n runtime: IAgentRuntime,\n type: ModelTypeName,\n _prompt: string,\n usage: Partial<LanguageModelUsage> & {\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n },\n meta: ModelUsageEventMeta = {}\n) {\n const inputTokens = Number(usage.inputTokens || 0);\n const outputTokens = Number(usage.outputTokens || 0);\n const totalTokens = Number(\n usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens\n );\n\n const payload: ModelUsageEventPayload = {\n runtime,\n source: \"elizacloud\",\n type,\n tokens: {\n prompt: inputTokens,\n completion: outputTokens,\n total: totalTokens,\n },\n ...(meta.modelName ? { modelName: meta.modelName } : {}),\n ...(typeof meta.costUsd === \"number\" && Number.isFinite(meta.costUsd)\n ? { costUsd: meta.costUsd }\n : {}),\n };\n\n runtime.emitEvent(EventType.MODEL_USED, payload);\n}\n",
|
|
8
|
+
"import type { IAgentRuntime, TextEmbeddingParams } from \"@elizaos/core\";\nimport {\n logger,\n ModelType,\n timeInferenceSpan,\n VECTOR_DIMS,\n} from \"@elizaos/core\";\nimport { getSetting } from \"../utils/config\";\nimport { emitModelUsageEvent } from \"../utils/events\";\nimport { createCloudApiClient } from \"../utils/sdk-client\";\n\nconst MAX_BATCH_SIZE = 100;\n\n// ── Bounded retry/backoff for the /embeddings round-trip ──────────────────\n// Embeddings are off the turn's critical path (queueEmbeddingGeneration is\n// fire-and-forget), so a stall here delays the embedding QUEUE, not a reply.\n// The old behaviour — one blind 30s (or full retry-after) sleep then a single\n// retry — could park the queue for 30s+ on a transient 429. Replaced with\n// bounded exponential backoff + jitter, a CAP on any single wait (so a large\n// server retry-after can't stall the queue indefinitely), and a per-request\n// client-side timeout (the endpoint had none, so a hung gateway hung the\n// queue forever).\n//\n// Handler retries are deliberately SMALL: the EmbeddingGenerationService\n// BatchQueue already wraps generateEmbedding in its own multi-attempt backoff,\n// so this layer absorbs only a single transient burst (one quick retry) and\n// defers sustained pressure to the queue — otherwise the two backoffs compound.\nconst EMBED_MAX_ATTEMPTS = 2;\nconst EMBED_BACKOFF_BASE_MS = 1_000;\nconst EMBED_BACKOFF_CAP_MS = 8_000;\nconst EMBED_REQUEST_TIMEOUT_MS = 60_000;\n\n/**\n * Backoff before the next embedding attempt. Exponential (base·2^attempt) as a\n * floor, honoring the server's `retry-after` when present, but never longer\n * than {@link EMBED_BACKOFF_CAP_MS}; ±25% jitter spreads retries from a burst.\n */\nfunction embeddingBackoffMs(attempt: number, retryAfterSec?: number): number {\n const exp = EMBED_BACKOFF_BASE_MS * 2 ** attempt;\n const serverHint =\n typeof retryAfterSec === \"number\" && retryAfterSec > 0\n ? retryAfterSec * 1000\n : 0;\n const base = Math.min(EMBED_BACKOFF_CAP_MS, Math.max(exp, serverHint));\n return Math.round(base * (1 + Math.random() * 0.25));\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction extractRateLimitInfo(response: Response): {\n remainingRequests?: number;\n remainingTokens?: number;\n limitRequests?: number;\n limitTokens?: number;\n resetRequests?: string;\n resetTokens?: string;\n retryAfter?: number;\n} {\n return {\n remainingRequests:\n parseInt(response.headers.get(\"x-ratelimit-remaining-requests\") || \"\", 10) || undefined,\n remainingTokens:\n parseInt(response.headers.get(\"x-ratelimit-remaining-tokens\") || \"\", 10) || undefined,\n limitRequests:\n parseInt(response.headers.get(\"x-ratelimit-limit-requests\") || \"\", 10) || undefined,\n limitTokens: parseInt(response.headers.get(\"x-ratelimit-limit-tokens\") || \"\", 10) || undefined,\n resetRequests: response.headers.get(\"x-ratelimit-reset-requests\") || undefined,\n resetTokens: response.headers.get(\"x-ratelimit-reset-tokens\") || undefined,\n retryAfter: parseInt(response.headers.get(\"retry-after\") || \"\", 10) || undefined,\n };\n}\n\nfunction getEmbeddingConfig(runtime: IAgentRuntime) {\n const embeddingModelName = getSetting(\n runtime,\n \"ELIZAOS_CLOUD_EMBEDDING_MODEL\",\n \"text-embedding-3-small\"\n );\n const embeddingDimension = Number.parseInt(\n getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS\", \"1536\") || \"1536\",\n 10\n ) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];\n\n if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {\n const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(\", \")}`;\n logger.error(errorMsg);\n throw new Error(errorMsg);\n }\n\n return { embeddingModelName, embeddingDimension };\n}\n\n/**\n * The init probe vector. `runtime.ensureEmbeddingDimension()` calls the handler\n * with `null` purely to learn the vector length; it only inspects `.length`, so\n * a deterministic non-zero[0] marker vector is the correct, legitimate response.\n * This is the ONLY place a synthetic vector is returned — every real failure\n * throws so it can never be persisted as a corrupt embedding (Commandment 8).\n */\nfunction createInitProbeVector(dimension: number): number[] {\n const vector = Array(dimension).fill(0);\n vector[0] = 0.1;\n return vector;\n}\n\nexport interface BatchEmbeddingParams {\n texts: string[];\n}\n\nexport async function handleTextEmbedding(\n runtime: IAgentRuntime,\n params: TextEmbeddingParams | string | null\n): Promise<number[]> {\n const { embeddingDimension } = getEmbeddingConfig(runtime);\n\n if (params === null) {\n logger.debug(\"Creating test embedding for initialization\");\n return createInitProbeVector(embeddingDimension);\n }\n\n let text: string;\n if (typeof params === \"string\") {\n text = params;\n } else if (typeof params === \"object\" && params.text) {\n text = params.text;\n } else {\n // A malformed request is a programming error, not a recoverable runtime\n // state. Throw instead of returning a marker vector that would silently\n // corrupt the embedding store (Commandment 8).\n throw new Error(\"Invalid input format for embedding: expected string or { text: string }\");\n }\n\n if (!text.trim()) {\n throw new Error(\"Cannot generate embedding for empty text\");\n }\n\n const results = await handleBatchTextEmbedding(runtime, [text]);\n return results[0];\n}\n\nexport interface BatchEmbeddingResult {\n embedding: number[];\n index: number;\n success: boolean;\n error?: string;\n}\n\nexport async function handleBatchTextEmbedding(\n runtime: IAgentRuntime,\n texts: string[]\n): Promise<number[][]> {\n const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);\n const client = createCloudApiClient(runtime, true);\n\n if (!texts || texts.length === 0) {\n return [];\n }\n\n // Every text must be non-empty: an empty input cannot produce a meaningful\n // vector, and a marker/zero vector would silently corrupt the store. Surface\n // the bad input to the caller (Commandment 8) instead of papering over it.\n const validTexts: { text: string; originalIndex: number }[] = [];\n for (let i = 0; i < texts.length; i++) {\n const text = texts[i]?.trim();\n if (!text) {\n throw new Error(`Cannot generate embedding for empty text at index ${i}`);\n }\n validTexts.push({ text, originalIndex: i });\n }\n\n const results: number[][] = new Array(texts.length);\n\n for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {\n const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);\n const batch = validTexts.slice(batchStart, batchEnd);\n const batchTexts = batch.map((b) => b.text);\n\n logger.info(\n `[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`\n );\n\n try {\n // Records a `cloud.embedding` span on the active per-turn timer when an\n // embedding happens to be on a turn's critical path (most are queued /\n // detached, so this is a no-op there — which is exactly what proves they\n // don't add to turn latency). Retries transient throttling/5xx with\n // bounded exponential backoff (see EMBED_* constants) instead of a single\n // 30s blind sleep.\n let response: Response | null = null;\n for (let attempt = 0; attempt < EMBED_MAX_ATTEMPTS; attempt++) {\n const resp = await timeInferenceSpan(\n \"cloud.embedding\",\n () =>\n client.requestRaw(\"POST\", \"/embeddings\", {\n json: {\n model: embeddingModelName,\n input: batchTexts,\n },\n timeoutMs: EMBED_REQUEST_TIMEOUT_MS,\n }),\n { batch: batchTexts.length, attempt }\n );\n\n const rateLimitInfo = extractRateLimitInfo(resp);\n if (\n rateLimitInfo.remainingRequests !== undefined &&\n rateLimitInfo.remainingRequests < 50\n ) {\n logger.warn(\n `[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`\n );\n }\n\n const transient =\n resp.status === 429 ||\n resp.status === 502 ||\n resp.status === 503 ||\n resp.status === 504;\n if (transient && attempt < EMBED_MAX_ATTEMPTS - 1) {\n const delay = embeddingBackoffMs(attempt, rateLimitInfo.retryAfter);\n logger.warn(\n `[BatchEmbeddings] ${resp.status} (attempt ${attempt + 1}/${EMBED_MAX_ATTEMPTS}) — backing off ${delay}ms`\n );\n // Drain the body so the underlying connection can be reused.\n await resp.text().catch(() => undefined);\n await sleep(delay);\n continue;\n }\n response = resp;\n break;\n }\n\n // Type guard: the loop assigns `response` on its final iteration, so this\n // is unreachable in practice.\n if (!response) {\n throw new Error(\"[BatchEmbeddings] No response after retry loop\");\n }\n\n if (!response.ok) {\n // Auth errors (401/403) are non-recoverable with the current key.\n // Every other non-OK status is just as fatal for this batch — neither\n // can produce real vectors. Throw in both cases so the router falls\n // through to the next provider (e.g. local inference) instead of\n // silently persisting marker/zero vectors that corrupt the embedding\n // store. Commandment 8: don't hide broken pipelines behind fallbacks.\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `[BatchEmbeddings] Authentication failed (${response.status}). ` +\n `Check ELIZAOS_CLOUD_API_KEY or ELIZAOS_CLOUD_EMBEDDING_API_KEY — ` +\n `the current key is not authorized for the embedding endpoint.`\n );\n }\n throw new Error(\n `[BatchEmbeddings] API error: ${response.status} ${response.statusText}`\n );\n }\n\n const data = (await response.json()) as {\n data?: Array<{ embedding: number[]; index: number }>;\n usage?: { prompt_tokens: number; total_tokens: number };\n };\n\n if (!data?.data || !Array.isArray(data.data)) {\n throw new Error(\"[BatchEmbeddings] API returned invalid response structure\");\n }\n\n for (const item of data.data) {\n const originalIndex = batch[item.index].originalIndex;\n results[originalIndex] = item.embedding;\n }\n\n if (data.usage) {\n const usage = {\n inputTokens: data.usage.prompt_tokens,\n outputTokens: 0,\n totalTokens: data.usage.total_tokens,\n };\n emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);\n }\n\n logger.debug(\n `[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)`\n );\n } catch (error) {\n // Any failure in this batch (HTTP error, transport error, malformed body)\n // means we have no real vectors for it. Log context and re-throw so the\n // router can fall through to another provider; never persist marker/zero\n // vectors that would corrupt the embedding store (Commandment 8).\n const message = error instanceof Error ? error.message : String(error);\n logger.error(`[BatchEmbeddings] Batch failed: ${message}`);\n throw error instanceof Error ? error : new Error(message);\n }\n }\n\n return results;\n}\n"
|
|
9
9
|
],
|
|
10
|
-
"mappings": "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
|
|
11
|
-
"debugId": "
|
|
10
|
+
"mappings": "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",
|
|
11
|
+
"debugId": "BE25054212D928B264756E2164756E21",
|
|
12
12
|
"names": []
|
|
13
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/models/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/models/image.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAYlG,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAiC5B;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,sBAAsB,GAAG,MAAM,GACtC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAoLjD"}
|
package/dist/models/image.js
CHANGED
|
@@ -19,7 +19,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
|
19
19
|
// src/utils/config.ts
|
|
20
20
|
import { logger } from "@elizaos/core";
|
|
21
21
|
import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
|
|
22
|
-
var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "
|
|
22
|
+
var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "zai-glm-4.7";
|
|
23
23
|
function getEnvValue(key) {
|
|
24
24
|
if (typeof process === "undefined") {
|
|
25
25
|
return;
|
|
@@ -109,9 +109,18 @@ function getExperimentalTelemetry(runtime) {
|
|
|
109
109
|
const setting = getSetting(runtime, "ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY", "false");
|
|
110
110
|
return String(setting).toLowerCase() === "true";
|
|
111
111
|
}
|
|
112
|
+
function resolveCloudTimeoutMs(envKey, defaultMs) {
|
|
113
|
+
const raw = typeof process !== "undefined" ? process.env[envKey] : undefined;
|
|
114
|
+
if (raw === undefined || raw.trim() === "")
|
|
115
|
+
return defaultMs;
|
|
116
|
+
const parsed = Number.parseInt(raw, 10);
|
|
117
|
+
if (!Number.isFinite(parsed))
|
|
118
|
+
return defaultMs;
|
|
119
|
+
return parsed <= 0 ? undefined : parsed;
|
|
120
|
+
}
|
|
112
121
|
|
|
113
122
|
// src/utils/sdk-client.ts
|
|
114
|
-
import {
|
|
123
|
+
import { ElizaCloudClient } from "@elizaos/cloud-sdk";
|
|
115
124
|
function trimTrailingSlash(value) {
|
|
116
125
|
return value.replace(/\/+$/, "");
|
|
117
126
|
}
|
|
@@ -126,7 +135,11 @@ function apiKeyForRuntime(runtime, embedding = false) {
|
|
|
126
135
|
}
|
|
127
136
|
function createCloudApiClient(runtime, embedding = false) {
|
|
128
137
|
const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);
|
|
129
|
-
return new
|
|
138
|
+
return new ElizaCloudClient({
|
|
139
|
+
apiBaseUrl: trimTrailingSlash(baseUrl),
|
|
140
|
+
baseUrl: apiBaseToSiteBaseUrl(baseUrl),
|
|
141
|
+
apiKey: apiKeyForRuntime(runtime, embedding)
|
|
142
|
+
}).v1;
|
|
130
143
|
}
|
|
131
144
|
function createElizaCloudClient(runtime) {
|
|
132
145
|
const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));
|
|
@@ -141,7 +154,7 @@ function createElizaCloudClient(runtime) {
|
|
|
141
154
|
import {
|
|
142
155
|
EventType
|
|
143
156
|
} from "@elizaos/core";
|
|
144
|
-
function emitModelUsageEvent(runtime, type, _prompt, usage) {
|
|
157
|
+
function emitModelUsageEvent(runtime, type, _prompt, usage, meta = {}) {
|
|
145
158
|
const inputTokens = Number(usage.inputTokens || 0);
|
|
146
159
|
const outputTokens = Number(usage.outputTokens || 0);
|
|
147
160
|
const totalTokens = Number(usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens);
|
|
@@ -153,7 +166,9 @@ function emitModelUsageEvent(runtime, type, _prompt, usage) {
|
|
|
153
166
|
prompt: inputTokens,
|
|
154
167
|
completion: outputTokens,
|
|
155
168
|
total: totalTokens
|
|
156
|
-
}
|
|
169
|
+
},
|
|
170
|
+
...meta.modelName ? { modelName: meta.modelName } : {},
|
|
171
|
+
...typeof meta.costUsd === "number" && Number.isFinite(meta.costUsd) ? { costUsd: meta.costUsd } : {}
|
|
157
172
|
};
|
|
158
173
|
runtime.emitEvent(EventType.MODEL_USED, payload);
|
|
159
174
|
}
|
|
@@ -270,7 +285,10 @@ async function handleImageGeneration(runtime, params) {
|
|
|
270
285
|
}
|
|
271
286
|
async function handleImageDescription(runtime, params) {
|
|
272
287
|
const disableSetting = getSetting(runtime, "DISABLE_IMAGE_DESCRIPTION", "");
|
|
273
|
-
const disabled = disableSetting
|
|
288
|
+
const disabled = [disableSetting, process.env.DISABLE_IMAGE_DESCRIPTION].some((value) => {
|
|
289
|
+
const normalized = value?.trim().toLowerCase();
|
|
290
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
|
|
291
|
+
});
|
|
274
292
|
if (disabled) {
|
|
275
293
|
logger3.debug("[ELIZAOS_CLOUD] IMAGE_DESCRIPTION skipped — DISABLE_IMAGE_DESCRIPTION is set");
|
|
276
294
|
return {
|
|
@@ -309,16 +327,21 @@ async function handleImageDescription(runtime, params) {
|
|
|
309
327
|
let response = null;
|
|
310
328
|
let attemptedRetry = false;
|
|
311
329
|
for (let attempt = 0;attempt < 2; attempt++) {
|
|
312
|
-
|
|
313
|
-
json: requestBody
|
|
330
|
+
const attemptResponse = await client.routes.postApiV1ChatCompletionsRaw({
|
|
331
|
+
json: requestBody,
|
|
332
|
+
timeoutMs: resolveCloudTimeoutMs("ELIZAOS_CLOUD_IMAGE_TIMEOUT_MS", 120000)
|
|
314
333
|
});
|
|
315
|
-
if (
|
|
334
|
+
if (!attemptResponse) {
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
response = attemptResponse;
|
|
338
|
+
if (attemptResponse.status !== 429 || attemptedRetry)
|
|
316
339
|
break;
|
|
317
|
-
const headerValue =
|
|
340
|
+
const headerValue = attemptResponse.headers.get("retry-after");
|
|
318
341
|
const headerRetryAfter = headerValue !== null && Number.isFinite(Number(headerValue)) ? Number(headerValue) : undefined;
|
|
319
342
|
let bodyRetryAfter;
|
|
320
343
|
try {
|
|
321
|
-
const peek = await
|
|
344
|
+
const peek = await attemptResponse.clone().json();
|
|
322
345
|
bodyRetryAfter = typeof peek?.retryAfter === "number" && Number.isFinite(peek.retryAfter) ? peek.retryAfter : undefined;
|
|
323
346
|
} catch {}
|
|
324
347
|
const retryAfter = headerRetryAfter ?? bodyRetryAfter ?? 0;
|
|
@@ -331,8 +354,12 @@ async function handleImageDescription(runtime, params) {
|
|
|
331
354
|
logger3.warn(`[ELIZAOS_CLOUD] Image analysis rate-limited (429); upstream retryAfter=${retryAfter || "unknown"}s — failing fast`);
|
|
332
355
|
break;
|
|
333
356
|
}
|
|
334
|
-
if (!response
|
|
335
|
-
|
|
357
|
+
if (!response) {
|
|
358
|
+
throw new Error("ElizaOS Cloud API did not return a response");
|
|
359
|
+
}
|
|
360
|
+
const finalResponse = response;
|
|
361
|
+
if (!finalResponse.ok) {
|
|
362
|
+
const status = finalResponse.status;
|
|
336
363
|
if (status === 402) {
|
|
337
364
|
throw new Error("Eliza Cloud credits exhausted — top up at https://www.elizacloud.ai/dashboard/settings?tab=billing");
|
|
338
365
|
}
|
|
@@ -341,7 +368,7 @@ async function handleImageDescription(runtime, params) {
|
|
|
341
368
|
}
|
|
342
369
|
throw new Error(`ElizaOS Cloud API error: ${status}`);
|
|
343
370
|
}
|
|
344
|
-
const typedResult = await
|
|
371
|
+
const typedResult = await finalResponse.json();
|
|
345
372
|
const content = typedResult.choices?.[0]?.message?.content;
|
|
346
373
|
if (typedResult.usage) {
|
|
347
374
|
emitModelUsageEvent(runtime, ModelType.IMAGE_DESCRIPTION, typeof params === "string" ? params : params.prompt || "", {
|
|
@@ -371,4 +398,4 @@ export {
|
|
|
371
398
|
handleImageDescription
|
|
372
399
|
};
|
|
373
400
|
|
|
374
|
-
//# debugId=
|
|
401
|
+
//# debugId=579602FD6FB0EC2B64756E2164756E21
|