@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
package/dist/models/text.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,22 +166,13 @@ 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
|
-
// src/providers/openai.ts
|
|
162
|
-
import { createOpenAI } from "@ai-sdk/openai";
|
|
163
|
-
function createOpenAIClient(runtime) {
|
|
164
|
-
const baseURL = getBaseURL(runtime);
|
|
165
|
-
const apiKey = getApiKey(runtime) ?? (isProxyMode(runtime) ? "eliza-proxy" : undefined);
|
|
166
|
-
return createOpenAI({
|
|
167
|
-
apiKey: apiKey ?? "",
|
|
168
|
-
baseURL
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
|
|
172
176
|
// src/utils/responses-output.ts
|
|
173
177
|
function asRecord(value) {
|
|
174
178
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
@@ -254,8 +258,11 @@ import {
|
|
|
254
258
|
buildCanonicalSystemPrompt,
|
|
255
259
|
logger as logger2,
|
|
256
260
|
ModelType,
|
|
261
|
+
recordInferenceSpan,
|
|
257
262
|
renderChatMessagesForPrompt,
|
|
258
|
-
resolveEffectiveSystemPrompt
|
|
263
|
+
resolveEffectiveSystemPrompt,
|
|
264
|
+
Semaphore,
|
|
265
|
+
timeInferenceSpan
|
|
259
266
|
} from "@elizaos/core";
|
|
260
267
|
var TEXT_NANO_MODEL_TYPE = ModelType.TEXT_NANO ?? "TEXT_NANO";
|
|
261
268
|
var TEXT_MEDIUM_MODEL_TYPE = ModelType.TEXT_MEDIUM ?? "TEXT_MEDIUM";
|
|
@@ -264,6 +271,61 @@ var TEXT_LARGE_MODEL_TYPE = ModelType.TEXT_LARGE;
|
|
|
264
271
|
var TEXT_MEGA_MODEL_TYPE = ModelType.TEXT_MEGA ?? "TEXT_MEGA";
|
|
265
272
|
var RESPONSE_HANDLER_MODEL_TYPE = ModelType.RESPONSE_HANDLER ?? "RESPONSE_HANDLER";
|
|
266
273
|
var ACTION_PLANNER_MODEL_TYPE = ModelType.ACTION_PLANNER ?? "ACTION_PLANNER";
|
|
274
|
+
var NATIVE_CONCURRENCY_ENV = "ELIZAOS_CLOUD_NATIVE_CONCURRENCY";
|
|
275
|
+
var DEFAULT_NATIVE_CONCURRENCY = 8;
|
|
276
|
+
var TEXT_TIMEOUT_ENV = "ELIZAOS_CLOUD_TEXT_TIMEOUT_MS";
|
|
277
|
+
var DEFAULT_TEXT_TIMEOUT_MS = 120000;
|
|
278
|
+
function resolveTextTimeoutMs() {
|
|
279
|
+
const raw = typeof process !== "undefined" ? process.env[TEXT_TIMEOUT_ENV] : undefined;
|
|
280
|
+
if (raw === undefined || raw.trim() === "")
|
|
281
|
+
return DEFAULT_TEXT_TIMEOUT_MS;
|
|
282
|
+
const parsed = Number.parseInt(raw, 10);
|
|
283
|
+
if (!Number.isFinite(parsed))
|
|
284
|
+
return DEFAULT_TEXT_TIMEOUT_MS;
|
|
285
|
+
return parsed <= 0 ? undefined : parsed;
|
|
286
|
+
}
|
|
287
|
+
var STREAMING_ENV = "ELIZAOS_CLOUD_STREAMING";
|
|
288
|
+
function resolveStreamingEnabled() {
|
|
289
|
+
const raw = typeof process !== "undefined" ? process.env[STREAMING_ENV] : undefined;
|
|
290
|
+
if (raw === undefined)
|
|
291
|
+
return true;
|
|
292
|
+
const v = raw.trim().toLowerCase();
|
|
293
|
+
return v !== "0" && v !== "false" && v !== "off";
|
|
294
|
+
}
|
|
295
|
+
function buildStreamAbortSignal(abortSignal, timeoutMs) {
|
|
296
|
+
const timeoutSig = typeof timeoutMs === "number" && timeoutMs > 0 ? AbortSignal.timeout(timeoutMs) : undefined;
|
|
297
|
+
if (abortSignal && timeoutSig)
|
|
298
|
+
return AbortSignal.any([abortSignal, timeoutSig]);
|
|
299
|
+
return abortSignal ?? timeoutSig;
|
|
300
|
+
}
|
|
301
|
+
var nativeChatLimiter = null;
|
|
302
|
+
function resolveNativeConcurrency() {
|
|
303
|
+
const raw = typeof process !== "undefined" ? process.env[NATIVE_CONCURRENCY_ENV] : undefined;
|
|
304
|
+
const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;
|
|
305
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_NATIVE_CONCURRENCY;
|
|
306
|
+
}
|
|
307
|
+
function getNativeChatLimiter() {
|
|
308
|
+
if (!nativeChatLimiter) {
|
|
309
|
+
nativeChatLimiter = new Semaphore(resolveNativeConcurrency());
|
|
310
|
+
}
|
|
311
|
+
return nativeChatLimiter;
|
|
312
|
+
}
|
|
313
|
+
async function withNativeChatLimit(fn, label = "native") {
|
|
314
|
+
const limiter = getNativeChatLimiter();
|
|
315
|
+
const waitStartedAt = Date.now();
|
|
316
|
+
await limiter.acquire();
|
|
317
|
+
recordInferenceSpan("cloud.semaphore-wait", Date.now() - waitStartedAt, {
|
|
318
|
+
route: label
|
|
319
|
+
});
|
|
320
|
+
try {
|
|
321
|
+
return await timeInferenceSpan(`cloud.http:${label}`, fn, { route: label });
|
|
322
|
+
} finally {
|
|
323
|
+
limiter.release();
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
function __resetNativeChatLimiterForTests() {
|
|
327
|
+
nativeChatLimiter = null;
|
|
328
|
+
}
|
|
267
329
|
var REASONING_MODEL_PATTERNS = [
|
|
268
330
|
"o1",
|
|
269
331
|
"o3",
|
|
@@ -274,27 +336,51 @@ var REASONING_MODEL_PATTERNS = [
|
|
|
274
336
|
"claude-opus-4-7",
|
|
275
337
|
"gpt-5"
|
|
276
338
|
];
|
|
277
|
-
var
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
339
|
+
var SPAN_SAMPLER_HONORING_MODEL_PREFIXES = [
|
|
340
|
+
"vast/eliza-1-",
|
|
341
|
+
"elizaos/eliza-1-",
|
|
342
|
+
"eliza-1-"
|
|
343
|
+
];
|
|
344
|
+
function isSpanSamplerHonoringModel(modelName) {
|
|
345
|
+
const lower = modelName.toLowerCase();
|
|
346
|
+
return SPAN_SAMPLER_HONORING_MODEL_PREFIXES.some((prefix) => lower.startsWith(prefix));
|
|
347
|
+
}
|
|
348
|
+
function buildSpanSamplerHeader(plan) {
|
|
349
|
+
if (!plan || plan.overrides.length === 0)
|
|
350
|
+
return;
|
|
351
|
+
const overrides = plan.overrides.map((o) => {
|
|
352
|
+
const wire = {
|
|
353
|
+
span_index: o.spanIndex,
|
|
354
|
+
temperature: o.temperature
|
|
355
|
+
};
|
|
356
|
+
if (typeof o.topK === "number")
|
|
357
|
+
wire.top_k = o.topK;
|
|
358
|
+
if (typeof o.topP === "number")
|
|
359
|
+
wire.top_p = o.topP;
|
|
360
|
+
return wire;
|
|
361
|
+
});
|
|
362
|
+
const body = { overrides };
|
|
363
|
+
if (plan.strict === true)
|
|
364
|
+
body.strict = true;
|
|
365
|
+
return JSON.stringify(body);
|
|
366
|
+
}
|
|
367
|
+
function extractCostUsd(usage, response) {
|
|
368
|
+
const fromBody = firstNumber(asRecord2(usage).cost_usd, asRecord2(usage).costUsd, asRecord2(usage).cost);
|
|
369
|
+
if (typeof fromBody === "number" && Number.isFinite(fromBody)) {
|
|
370
|
+
return fromBody;
|
|
371
|
+
}
|
|
372
|
+
const header = response?.headers?.get?.("X-Eliza-Cost-Usd");
|
|
373
|
+
if (header) {
|
|
374
|
+
const parsed = Number(header);
|
|
375
|
+
if (Number.isFinite(parsed))
|
|
376
|
+
return parsed;
|
|
287
377
|
}
|
|
288
|
-
return
|
|
378
|
+
return;
|
|
289
379
|
}
|
|
290
380
|
function isReasoningModel(modelName) {
|
|
291
381
|
const lower = modelName.toLowerCase();
|
|
292
382
|
return REASONING_MODEL_PATTERNS.some((pattern) => lower.includes(pattern));
|
|
293
383
|
}
|
|
294
|
-
function supportsStopSequences(modelName) {
|
|
295
|
-
const lower = modelName.toLowerCase();
|
|
296
|
-
return !RESPONSES_ROUTED_PREFIXES.some((prefix) => lower.startsWith(prefix));
|
|
297
|
-
}
|
|
298
384
|
function isRecord(value) {
|
|
299
385
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
300
386
|
}
|
|
@@ -371,26 +457,39 @@ function unwrapJsonSchema(value) {
|
|
|
371
457
|
const record = asRecord2(value);
|
|
372
458
|
return record.schema ?? record.jsonSchema ?? value;
|
|
373
459
|
}
|
|
460
|
+
function normalizeNativeToolEntry(rawTool, fallbackName) {
|
|
461
|
+
const tool = asRecord2(rawTool);
|
|
462
|
+
const nested = asRecord2(tool.function);
|
|
463
|
+
const name = firstString(nested.name, tool.name, fallbackName);
|
|
464
|
+
if (!name) {
|
|
465
|
+
return;
|
|
466
|
+
}
|
|
467
|
+
const description = firstString(nested.description, tool.description);
|
|
468
|
+
const inputSchema = unwrapJsonSchema(nested.parameters ?? tool.inputSchema ?? tool.parameters ?? tool.schema ?? { type: "object" });
|
|
469
|
+
return {
|
|
470
|
+
type: "function",
|
|
471
|
+
function: {
|
|
472
|
+
name,
|
|
473
|
+
...description ? { description } : {},
|
|
474
|
+
parameters: inputSchema
|
|
475
|
+
}
|
|
476
|
+
};
|
|
477
|
+
}
|
|
374
478
|
function normalizeNativeTools(tools) {
|
|
375
479
|
if (!tools) {
|
|
376
480
|
return;
|
|
377
481
|
}
|
|
378
482
|
if (Array.isArray(tools)) {
|
|
379
|
-
|
|
483
|
+
const normalized2 = tools.map((tool) => normalizeNativeToolEntry(tool)).filter((tool) => tool !== undefined);
|
|
484
|
+
return normalized2.length > 0 ? normalized2 : undefined;
|
|
380
485
|
}
|
|
381
486
|
const toolSet = asRecord2(tools);
|
|
382
487
|
const normalized = [];
|
|
383
488
|
for (const [name, rawTool] of Object.entries(toolSet)) {
|
|
384
|
-
const
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
function: {
|
|
389
|
-
name,
|
|
390
|
-
...typeof tool.description === "string" ? { description: tool.description } : {},
|
|
391
|
-
parameters: inputSchema
|
|
392
|
-
}
|
|
393
|
-
});
|
|
489
|
+
const entry = normalizeNativeToolEntry(rawTool, name);
|
|
490
|
+
if (entry) {
|
|
491
|
+
normalized.push(entry);
|
|
492
|
+
}
|
|
394
493
|
}
|
|
395
494
|
return normalized.length > 0 ? normalized : undefined;
|
|
396
495
|
}
|
|
@@ -616,16 +715,8 @@ function getModelNameForType(runtime, modelType) {
|
|
|
616
715
|
}
|
|
617
716
|
}
|
|
618
717
|
function buildGenerateParams(runtime, modelType, params) {
|
|
619
|
-
const paramsWithAttachments = params;
|
|
620
718
|
const prompt = params.prompt ?? "";
|
|
621
|
-
const maxTokens = params.maxTokens ?? 8192;
|
|
622
|
-
const openai = createOpenAIClient(runtime);
|
|
623
719
|
const modelName = getModelNameForType(runtime, modelType);
|
|
624
|
-
const experimentalTelemetry = getExperimentalTelemetry(runtime);
|
|
625
|
-
const userContent = (paramsWithAttachments.attachments?.length ?? 0) > 0 ? buildUserContent(paramsWithAttachments) : undefined;
|
|
626
|
-
const model = openai.chat(modelName);
|
|
627
|
-
const reasoning = isReasoningModel(modelName);
|
|
628
|
-
const stopSequences = !reasoning && supportsStopSequences(modelName) && Array.isArray(params.stopSequences) && params.stopSequences.length > 0 ? params.stopSequences : undefined;
|
|
629
720
|
const systemPrompt = resolveEffectiveSystemPrompt({
|
|
630
721
|
params,
|
|
631
722
|
fallback: buildCanonicalSystemPrompt({ character: runtime.character })
|
|
@@ -633,28 +724,24 @@ function buildGenerateParams(runtime, modelType, params) {
|
|
|
633
724
|
const promptText = renderChatMessagesForPrompt(params.messages, {
|
|
634
725
|
omitDuplicateSystem: systemPrompt
|
|
635
726
|
}) ?? prompt;
|
|
636
|
-
|
|
637
|
-
model,
|
|
638
|
-
...userContent ? { messages: [{ role: "user", content: userContent }] } : { prompt: promptText },
|
|
639
|
-
system: systemPrompt,
|
|
640
|
-
...stopSequences ? { stopSequences } : {},
|
|
641
|
-
maxOutputTokens: maxTokens,
|
|
642
|
-
experimental_telemetry: {
|
|
643
|
-
isEnabled: experimentalTelemetry
|
|
644
|
-
}
|
|
645
|
-
};
|
|
646
|
-
return { generateParams, modelName, modelType, prompt: promptText, systemPrompt };
|
|
727
|
+
return { modelName, modelType, prompt: promptText, systemPrompt };
|
|
647
728
|
}
|
|
648
729
|
async function generateTextWithModel(runtime, modelType, params) {
|
|
649
730
|
const { modelName, prompt, systemPrompt } = buildGenerateParams(runtime, modelType, params);
|
|
650
731
|
const paramsWithNative = params;
|
|
651
732
|
logger2.debug(`[ELIZAOS_CLOUD] Generating text with ${modelType} model: ${modelName}`);
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
}
|
|
733
|
+
const paramsStreaming = params;
|
|
734
|
+
const wantsStream = Boolean(paramsStreaming.stream) && paramsStreaming.streamStructured === true && resolveStreamingEnabled();
|
|
655
735
|
logger2.log(`[ELIZAOS_CLOUD] Using ${modelType} model: ${modelName}`);
|
|
656
736
|
logger2.log(prompt);
|
|
657
737
|
if (hasNativeTransportOptions(paramsWithNative)) {
|
|
738
|
+
if (wantsStream) {
|
|
739
|
+
return streamNativeChatCompletion(runtime, modelType, paramsWithNative, {
|
|
740
|
+
modelName,
|
|
741
|
+
prompt,
|
|
742
|
+
systemPrompt
|
|
743
|
+
});
|
|
744
|
+
}
|
|
658
745
|
const nativeResult = await generateNativeChatCompletion(runtime, modelType, paramsWithNative, {
|
|
659
746
|
modelName,
|
|
660
747
|
prompt,
|
|
@@ -682,13 +769,21 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
682
769
|
if (!reasoning && typeof params.temperature === "number") {
|
|
683
770
|
requestBody.temperature = params.temperature;
|
|
684
771
|
}
|
|
685
|
-
const
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
772
|
+
const responsesHeaders = {
|
|
773
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
774
|
+
"X-Eliza-Model-Type": modelType
|
|
775
|
+
};
|
|
776
|
+
if (isSpanSamplerHonoringModel(modelName)) {
|
|
777
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
778
|
+
if (samplerHeader) {
|
|
779
|
+
responsesHeaders["x-eliza-span-samplers"] = samplerHeader;
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/responses", {
|
|
783
|
+
headers: responsesHeaders,
|
|
784
|
+
json: requestBody,
|
|
785
|
+
timeoutMs: resolveTextTimeoutMs()
|
|
786
|
+
}), "responses");
|
|
692
787
|
const responseText = await response.text();
|
|
693
788
|
let data = {};
|
|
694
789
|
if (responseText) {
|
|
@@ -713,6 +808,12 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
713
808
|
inputTokens: data.usage.input_tokens ?? 0,
|
|
714
809
|
outputTokens: data.usage.output_tokens ?? 0,
|
|
715
810
|
totalTokens: data.usage.total_tokens ?? 0
|
|
811
|
+
}, {
|
|
812
|
+
modelName: getModelNameForType(runtime, modelType),
|
|
813
|
+
...(() => {
|
|
814
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
815
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
816
|
+
})()
|
|
716
817
|
});
|
|
717
818
|
}
|
|
718
819
|
const text = extractResponsesOutputText(data);
|
|
@@ -723,13 +824,21 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
723
824
|
}
|
|
724
825
|
async function generateNativeChatCompletion(runtime, modelType, params, context) {
|
|
725
826
|
const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
|
|
726
|
-
const
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
827
|
+
const headers = {
|
|
828
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
829
|
+
"X-Eliza-Model-Type": modelType
|
|
830
|
+
};
|
|
831
|
+
if (isSpanSamplerHonoringModel(context.modelName)) {
|
|
832
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
833
|
+
if (samplerHeader) {
|
|
834
|
+
headers["x-eliza-span-samplers"] = samplerHeader;
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
|
|
838
|
+
headers,
|
|
839
|
+
json: requestBody,
|
|
840
|
+
timeoutMs: resolveTextTimeoutMs()
|
|
841
|
+
}), "chat/completions");
|
|
733
842
|
const responseText = await response.text();
|
|
734
843
|
let data = {};
|
|
735
844
|
if (responseText) {
|
|
@@ -751,7 +860,13 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
|
|
|
751
860
|
}
|
|
752
861
|
const usage = convertNativeUsage(data.usage);
|
|
753
862
|
if (usage) {
|
|
754
|
-
emitModelUsageEvent(runtime, modelType, context.prompt, usage
|
|
863
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
|
|
864
|
+
modelName: context.modelName,
|
|
865
|
+
...(() => {
|
|
866
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
867
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
868
|
+
})()
|
|
869
|
+
});
|
|
755
870
|
}
|
|
756
871
|
const text = extractChatCompletionText(data);
|
|
757
872
|
const toolCalls = extractNativeToolCalls(data);
|
|
@@ -769,6 +884,251 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
|
|
|
769
884
|
}
|
|
770
885
|
};
|
|
771
886
|
}
|
|
887
|
+
function deferred() {
|
|
888
|
+
let resolve;
|
|
889
|
+
const promise = new Promise((r) => {
|
|
890
|
+
resolve = r;
|
|
891
|
+
});
|
|
892
|
+
return { promise, resolve };
|
|
893
|
+
}
|
|
894
|
+
async function* parseOpenAiSseStream(body) {
|
|
895
|
+
const reader = body.getReader();
|
|
896
|
+
const decoder = new TextDecoder;
|
|
897
|
+
let buffer = "";
|
|
898
|
+
const handle = (line) => {
|
|
899
|
+
const trimmed = line.trimStart();
|
|
900
|
+
if (!trimmed.startsWith("data:"))
|
|
901
|
+
return null;
|
|
902
|
+
const payload = trimmed.slice(5).trim();
|
|
903
|
+
if (payload === "")
|
|
904
|
+
return null;
|
|
905
|
+
if (payload === "[DONE]")
|
|
906
|
+
return "DONE";
|
|
907
|
+
try {
|
|
908
|
+
return JSON.parse(payload);
|
|
909
|
+
} catch {
|
|
910
|
+
return null;
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
try {
|
|
914
|
+
for (;; ) {
|
|
915
|
+
const { value, done } = await reader.read();
|
|
916
|
+
if (done)
|
|
917
|
+
break;
|
|
918
|
+
buffer += decoder.decode(value, { stream: true });
|
|
919
|
+
let nl;
|
|
920
|
+
while ((nl = buffer.indexOf(`
|
|
921
|
+
`)) >= 0) {
|
|
922
|
+
const line = buffer.slice(0, nl);
|
|
923
|
+
buffer = buffer.slice(nl + 1);
|
|
924
|
+
const frame = handle(line);
|
|
925
|
+
if (frame === "DONE")
|
|
926
|
+
return;
|
|
927
|
+
if (frame)
|
|
928
|
+
yield frame;
|
|
929
|
+
}
|
|
930
|
+
}
|
|
931
|
+
const tail = handle(buffer);
|
|
932
|
+
if (tail && tail !== "DONE")
|
|
933
|
+
yield tail;
|
|
934
|
+
} finally {
|
|
935
|
+
try {
|
|
936
|
+
await reader.cancel();
|
|
937
|
+
} catch {}
|
|
938
|
+
}
|
|
939
|
+
}
|
|
940
|
+
function accumulateToolCallDeltas(acc, deltas) {
|
|
941
|
+
if (!Array.isArray(deltas))
|
|
942
|
+
return;
|
|
943
|
+
for (const raw of deltas) {
|
|
944
|
+
const d = asRecord2(raw);
|
|
945
|
+
const index = typeof d.index === "number" ? d.index : 0;
|
|
946
|
+
const cur = acc.get(index) ?? { args: "" };
|
|
947
|
+
const id = firstString(d.id);
|
|
948
|
+
if (id)
|
|
949
|
+
cur.id = id;
|
|
950
|
+
const fn = recordAt(d, "function");
|
|
951
|
+
const name = firstString(fn.name);
|
|
952
|
+
if (name)
|
|
953
|
+
cur.name = name;
|
|
954
|
+
if (typeof fn.arguments === "string")
|
|
955
|
+
cur.args += fn.arguments;
|
|
956
|
+
acc.set(index, cur);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
function finalizeStreamedToolCalls(acc) {
|
|
960
|
+
const out = [];
|
|
961
|
+
for (const [index, c] of [...acc.entries()].sort((a, b) => a[0] - b[0])) {
|
|
962
|
+
if (!c.name)
|
|
963
|
+
continue;
|
|
964
|
+
out.push({
|
|
965
|
+
type: "tool-call",
|
|
966
|
+
toolCallId: c.id ?? `call_${c.name}_${index}`,
|
|
967
|
+
toolName: c.name,
|
|
968
|
+
input: parseJsonIfPossible(c.args.trim() === "" ? "{}" : c.args)
|
|
969
|
+
});
|
|
970
|
+
}
|
|
971
|
+
return out;
|
|
972
|
+
}
|
|
973
|
+
async function streamNativeChatCompletion(runtime, modelType, params, context) {
|
|
974
|
+
const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
|
|
975
|
+
requestBody.stream = true;
|
|
976
|
+
requestBody.stream_options = { include_usage: true };
|
|
977
|
+
const headers = {
|
|
978
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
979
|
+
"X-Eliza-Model-Type": modelType
|
|
980
|
+
};
|
|
981
|
+
if (isSpanSamplerHonoringModel(context.modelName)) {
|
|
982
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
983
|
+
if (samplerHeader) {
|
|
984
|
+
headers["x-eliza-span-samplers"] = samplerHeader;
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
const abortSignal = params.signal;
|
|
988
|
+
const signal = buildStreamAbortSignal(abortSignal, resolveTextTimeoutMs());
|
|
989
|
+
const limiter = getNativeChatLimiter();
|
|
990
|
+
const waitStartedAt = Date.now();
|
|
991
|
+
await limiter.acquire();
|
|
992
|
+
recordInferenceSpan("cloud.semaphore-wait", Date.now() - waitStartedAt, {
|
|
993
|
+
route: "chat/completions:stream"
|
|
994
|
+
});
|
|
995
|
+
let permitReleased = false;
|
|
996
|
+
const releasePermit = () => {
|
|
997
|
+
if (!permitReleased) {
|
|
998
|
+
permitReleased = true;
|
|
999
|
+
limiter.release();
|
|
1000
|
+
}
|
|
1001
|
+
};
|
|
1002
|
+
let response;
|
|
1003
|
+
try {
|
|
1004
|
+
response = await createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
|
|
1005
|
+
headers,
|
|
1006
|
+
json: requestBody,
|
|
1007
|
+
...signal ? { signal } : {}
|
|
1008
|
+
});
|
|
1009
|
+
} catch (err) {
|
|
1010
|
+
releasePermit();
|
|
1011
|
+
throw err;
|
|
1012
|
+
}
|
|
1013
|
+
if (!response.ok) {
|
|
1014
|
+
let errorBody;
|
|
1015
|
+
try {
|
|
1016
|
+
const errText = await response.text();
|
|
1017
|
+
if (errText) {
|
|
1018
|
+
errorBody = JSON.parse(errText).error;
|
|
1019
|
+
}
|
|
1020
|
+
} catch {}
|
|
1021
|
+
releasePermit();
|
|
1022
|
+
const message = typeof errorBody?.message === "string" && errorBody.message.trim() ? errorBody.message.trim() : `elizaOS Cloud error ${response.status}`;
|
|
1023
|
+
const requestError = new Error(message);
|
|
1024
|
+
requestError.status = response.status;
|
|
1025
|
+
if (errorBody)
|
|
1026
|
+
requestError.error = errorBody;
|
|
1027
|
+
throw requestError;
|
|
1028
|
+
}
|
|
1029
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
1030
|
+
const isSse = contentType.includes("text/event-stream") && response.body !== null;
|
|
1031
|
+
if (!isSse) {
|
|
1032
|
+
const bufferedText = await response.text();
|
|
1033
|
+
releasePermit();
|
|
1034
|
+
let data = {};
|
|
1035
|
+
if (bufferedText) {
|
|
1036
|
+
try {
|
|
1037
|
+
data = JSON.parse(bufferedText);
|
|
1038
|
+
} catch (parseErr) {
|
|
1039
|
+
logger2.error(`[ELIZAOS_CLOUD] Failed to parse buffered chat completions JSON: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
const text = extractChatCompletionText(data);
|
|
1043
|
+
const toolCalls = extractNativeToolCalls(data);
|
|
1044
|
+
const usage = convertNativeUsage(data.usage);
|
|
1045
|
+
if (usage) {
|
|
1046
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
|
|
1047
|
+
modelName: context.modelName,
|
|
1048
|
+
...(() => {
|
|
1049
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
1050
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
1051
|
+
})()
|
|
1052
|
+
});
|
|
1053
|
+
}
|
|
1054
|
+
if (!text.trim() && toolCalls.length === 0) {
|
|
1055
|
+
throw new Error("elizaOS Cloud returned no text or tool calls");
|
|
1056
|
+
}
|
|
1057
|
+
async function* single() {
|
|
1058
|
+
if (text)
|
|
1059
|
+
yield text;
|
|
1060
|
+
}
|
|
1061
|
+
return {
|
|
1062
|
+
textStream: single(),
|
|
1063
|
+
text: Promise.resolve(text),
|
|
1064
|
+
usage: Promise.resolve(usage),
|
|
1065
|
+
finishReason: Promise.resolve(data.choices?.[0]?.finish_reason),
|
|
1066
|
+
toolCalls: Promise.resolve(toolCalls),
|
|
1067
|
+
providerMetadata: { modelName: context.modelName, usage: data.usage }
|
|
1068
|
+
};
|
|
1069
|
+
}
|
|
1070
|
+
const body = response.body;
|
|
1071
|
+
const toolAcc = new Map;
|
|
1072
|
+
let accumulated = "";
|
|
1073
|
+
let nativeUsage;
|
|
1074
|
+
let rawUsage;
|
|
1075
|
+
let finishReason;
|
|
1076
|
+
const textD = deferred();
|
|
1077
|
+
const usageD = deferred();
|
|
1078
|
+
const finishD = deferred();
|
|
1079
|
+
const toolCallsD = deferred();
|
|
1080
|
+
async function* generate() {
|
|
1081
|
+
try {
|
|
1082
|
+
for await (const frame of parseOpenAiSseStream(body)) {
|
|
1083
|
+
if (frame.error) {
|
|
1084
|
+
const message = asRecord2(frame.error).message;
|
|
1085
|
+
throw new Error(typeof message === "string" && message.trim() ? message.trim() : "elizaOS Cloud stream error");
|
|
1086
|
+
}
|
|
1087
|
+
const choices = Array.isArray(frame.choices) ? frame.choices : [];
|
|
1088
|
+
const choice = asRecord2(choices[0]);
|
|
1089
|
+
const delta = recordAt(choice, "delta");
|
|
1090
|
+
if (typeof delta.content === "string" && delta.content.length > 0) {
|
|
1091
|
+
accumulated += delta.content;
|
|
1092
|
+
yield delta.content;
|
|
1093
|
+
}
|
|
1094
|
+
if (delta.tool_calls) {
|
|
1095
|
+
accumulateToolCallDeltas(toolAcc, delta.tool_calls);
|
|
1096
|
+
}
|
|
1097
|
+
const fr = firstString(choice.finish_reason);
|
|
1098
|
+
if (fr)
|
|
1099
|
+
finishReason = fr;
|
|
1100
|
+
if (frame.usage) {
|
|
1101
|
+
rawUsage = frame.usage;
|
|
1102
|
+
nativeUsage = convertNativeUsage(frame.usage);
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
} finally {
|
|
1106
|
+
releasePermit();
|
|
1107
|
+
const toolCalls = finalizeStreamedToolCalls(toolAcc);
|
|
1108
|
+
textD.resolve(accumulated);
|
|
1109
|
+
usageD.resolve(nativeUsage);
|
|
1110
|
+
finishD.resolve(finishReason);
|
|
1111
|
+
toolCallsD.resolve(toolCalls);
|
|
1112
|
+
if (nativeUsage) {
|
|
1113
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, nativeUsage, {
|
|
1114
|
+
modelName: context.modelName,
|
|
1115
|
+
...(() => {
|
|
1116
|
+
const costUsd = extractCostUsd(rawUsage, response);
|
|
1117
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
1118
|
+
})()
|
|
1119
|
+
});
|
|
1120
|
+
}
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
return {
|
|
1124
|
+
textStream: generate(),
|
|
1125
|
+
text: textD.promise,
|
|
1126
|
+
usage: usageD.promise,
|
|
1127
|
+
finishReason: finishD.promise,
|
|
1128
|
+
toolCalls: toolCallsD.promise,
|
|
1129
|
+
providerMetadata: { modelName: context.modelName }
|
|
1130
|
+
};
|
|
1131
|
+
}
|
|
772
1132
|
async function handleTextSmall(runtime, params) {
|
|
773
1133
|
return generateTextWithModel(runtime, TEXT_SMALL_MODEL_TYPE, params);
|
|
774
1134
|
}
|
|
@@ -791,13 +1151,23 @@ async function handleActionPlanner(runtime, params) {
|
|
|
791
1151
|
return generateTextWithModel(runtime, ACTION_PLANNER_MODEL_TYPE, params);
|
|
792
1152
|
}
|
|
793
1153
|
export {
|
|
1154
|
+
withNativeChatLimit,
|
|
1155
|
+
streamNativeChatCompletion,
|
|
1156
|
+
resolveTextTimeoutMs,
|
|
1157
|
+
resolveStreamingEnabled,
|
|
1158
|
+
parseOpenAiSseStream,
|
|
1159
|
+
normalizeNativeTools,
|
|
794
1160
|
handleTextSmall,
|
|
795
1161
|
handleTextNano,
|
|
796
1162
|
handleTextMega,
|
|
797
1163
|
handleTextMedium,
|
|
798
1164
|
handleTextLarge,
|
|
799
1165
|
handleResponseHandler,
|
|
800
|
-
handleActionPlanner
|
|
1166
|
+
handleActionPlanner,
|
|
1167
|
+
generateNativeChatCompletion,
|
|
1168
|
+
finalizeStreamedToolCalls,
|
|
1169
|
+
accumulateToolCallDeltas,
|
|
1170
|
+
__resetNativeChatLimiterForTests
|
|
801
1171
|
};
|
|
802
1172
|
|
|
803
|
-
//# debugId=
|
|
1173
|
+
//# debugId=8C1B68779D60990B64756E2164756E21
|