@elizaos/plugin-elizacloud 2.0.0-beta.1 → 2.0.3-beta.3
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 +2918 -5924
- 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/backup.js +1 -1
- package/dist/cloud/backup.js.map +1 -1
- 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-api-key.js +1 -1
- package/dist/cloud/cloud-api-key.js.map +1 -1
- package/dist/cloud/cloud-manager.js +45 -92
- package/dist/cloud/cloud-manager.js.map +6 -6
- package/dist/cloud/cloud-proxy.js +1 -1
- package/dist/cloud/cloud-proxy.js.map +1 -1
- 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/reconnect.js +1 -1
- package/dist/cloud/reconnect.js.map +1 -1
- 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-providers/cloud-status.js +1 -1
- package/dist/cloud-providers/cloud-status.js.map +1 -1
- package/dist/cloud-providers/container-health.js +1 -1
- package/dist/cloud-providers/container-health.js.map +1 -1
- package/dist/cloud-providers/credit-balance.js +1 -1
- package/dist/cloud-providers/credit-balance.js.map +1 -1
- package/dist/cloud-providers/index.js +1 -1
- package/dist/cloud-providers/index.js.map +1 -1
- package/dist/cloud-providers/model-registry.js +1 -1
- package/dist/cloud-providers/model-registry.js.map +1 -1
- 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 +5458 -8412
- 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-env.js +1 -1
- package/dist/lib/config-env.js.map +1 -1
- 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 +1 -1
- package/dist/lib/credential-type-map.js.map +2 -2
- package/dist/lib/feature-flags.js +1 -1
- package/dist/lib/feature-flags.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 +1 -1
- package/dist/lib/http.js.map +3 -3
- 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/state-paths.js +1 -1
- package/dist/lib/state-paths.js.map +1 -1
- 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 +7 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +98 -73
- 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 +719 -175
- 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 +114 -1
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +481 -88
- package/dist/models/text.js.map +7 -8
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js +1 -1
- package/dist/models/tokenization.js.map +3 -3
- 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 +2872 -5847
- 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-provisioning.js +1 -1
- package/dist/routes/cloud-provisioning.js.map +1 -1
- 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 +1 -1
- package/dist/services/cloud-backup.js.map +3 -3
- package/dist/services/cloud-bootstrap.d.ts.map +1 -1
- package/dist/services/cloud-bootstrap.js +1 -1
- package/dist/services/cloud-bootstrap.js.map +3 -3
- package/dist/services/cloud-bridge.js +1 -1
- package/dist/services/cloud-bridge.js.map +4 -4
- 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 +1 -1
- package/dist/services/cloud-credential-provider.js.map +3 -3
- package/dist/services/cloud-managed-gateway-relay.js +1 -1
- package/dist/services/cloud-managed-gateway-relay.js.map +1 -1
- package/dist/services/cloud-model-registry.js +1 -1
- package/dist/services/cloud-model-registry.js.map +3 -3
- package/dist/services/index.js +1 -1
- package/dist/services/index.js.map +1 -1
- package/dist/types/cloud.d.ts +1 -0
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js +1 -1
- package/dist/types/cloud.js.map +3 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/utils/cloud-api.js +1 -1
- package/dist/utils/cloud-api.js.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 +1 -1
- package/dist/utils/cloud-sdk/http.js.map +2 -2
- package/dist/utils/cloud-sdk/index.js +1 -1
- package/dist/utils/cloud-sdk/index.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 +1 -1
- package/dist/utils/cloud-sdk/types.js.map +2 -2
- 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/helpers.js +1 -1
- package/dist/utils/helpers.js.map +1 -1
- package/dist/utils/responses-output.js +1 -1
- package/dist/utils/responses-output.js.map +1 -1
- 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 +52 -22
- package/registry-entry.json +208 -0
- 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 +81 -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 +187 -78
- 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 +756 -114
- 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,26 +336,53 @@ 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
|
|
295
|
-
|
|
296
|
-
return !RESPONSES_ROUTED_PREFIXES.some((prefix) => lower.startsWith(prefix));
|
|
384
|
+
function isCerebrasServedModel(modelName) {
|
|
385
|
+
return modelName.toLowerCase().includes("gpt-oss");
|
|
297
386
|
}
|
|
298
387
|
function isRecord(value) {
|
|
299
388
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -371,26 +460,39 @@ function unwrapJsonSchema(value) {
|
|
|
371
460
|
const record = asRecord2(value);
|
|
372
461
|
return record.schema ?? record.jsonSchema ?? value;
|
|
373
462
|
}
|
|
463
|
+
function normalizeNativeToolEntry(rawTool, fallbackName) {
|
|
464
|
+
const tool = asRecord2(rawTool);
|
|
465
|
+
const nested = asRecord2(tool.function);
|
|
466
|
+
const name = firstString(nested.name, tool.name, fallbackName);
|
|
467
|
+
if (!name) {
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const description = firstString(nested.description, tool.description);
|
|
471
|
+
const inputSchema = unwrapJsonSchema(nested.parameters ?? tool.inputSchema ?? tool.parameters ?? tool.schema ?? { type: "object" });
|
|
472
|
+
return {
|
|
473
|
+
type: "function",
|
|
474
|
+
function: {
|
|
475
|
+
name,
|
|
476
|
+
...description ? { description } : {},
|
|
477
|
+
parameters: inputSchema
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
}
|
|
374
481
|
function normalizeNativeTools(tools) {
|
|
375
482
|
if (!tools) {
|
|
376
483
|
return;
|
|
377
484
|
}
|
|
378
485
|
if (Array.isArray(tools)) {
|
|
379
|
-
|
|
486
|
+
const normalized2 = tools.map((tool) => normalizeNativeToolEntry(tool)).filter((tool) => tool !== undefined);
|
|
487
|
+
return normalized2.length > 0 ? normalized2 : undefined;
|
|
380
488
|
}
|
|
381
489
|
const toolSet = asRecord2(tools);
|
|
382
490
|
const normalized = [];
|
|
383
491
|
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
|
-
});
|
|
492
|
+
const entry = normalizeNativeToolEntry(rawTool, name);
|
|
493
|
+
if (entry) {
|
|
494
|
+
normalized.push(entry);
|
|
495
|
+
}
|
|
394
496
|
}
|
|
395
497
|
return normalized.length > 0 ? normalized : undefined;
|
|
396
498
|
}
|
|
@@ -403,7 +505,15 @@ function normalizeNativeToolChoice(toolChoice) {
|
|
|
403
505
|
}
|
|
404
506
|
const choice = asRecord2(toolChoice);
|
|
405
507
|
if (choice.type === "function") {
|
|
406
|
-
|
|
508
|
+
const functionChoice2 = recordAt(choice, "function");
|
|
509
|
+
const toolName2 = firstString(functionChoice2.name, choice.name, choice.toolName);
|
|
510
|
+
return toolName2 ? {
|
|
511
|
+
type: "function",
|
|
512
|
+
function: {
|
|
513
|
+
...functionChoice2,
|
|
514
|
+
name: toolName2
|
|
515
|
+
}
|
|
516
|
+
} : undefined;
|
|
407
517
|
}
|
|
408
518
|
if (choice.type === "tool") {
|
|
409
519
|
const toolName2 = firstString(choice.toolName, choice.name);
|
|
@@ -413,10 +523,13 @@ function normalizeNativeToolChoice(toolChoice) {
|
|
|
413
523
|
const toolName = firstString(choice.toolName, choice.name, functionChoice.name);
|
|
414
524
|
return toolName ? { type: "function", function: { name: toolName } } : toolChoice;
|
|
415
525
|
}
|
|
416
|
-
function buildNativeResponseFormat(responseSchema) {
|
|
526
|
+
function buildNativeResponseFormat(responseSchema, modelName) {
|
|
417
527
|
if (!responseSchema) {
|
|
418
528
|
return;
|
|
419
529
|
}
|
|
530
|
+
if (isCerebrasServedModel(modelName)) {
|
|
531
|
+
return { type: "json_object" };
|
|
532
|
+
}
|
|
420
533
|
const schemaRecord = asRecord2(responseSchema);
|
|
421
534
|
if (schemaRecord.responseFormat) {
|
|
422
535
|
return schemaRecord.responseFormat;
|
|
@@ -494,15 +607,20 @@ function buildNativeRequestBody(params, modelName, promptText, systemPrompt) {
|
|
|
494
607
|
const promptCacheKey = providerOptions ? resolvePromptCacheKey(providerOptions) : undefined;
|
|
495
608
|
const tools = normalizeNativeTools(params.tools);
|
|
496
609
|
const toolChoice = normalizeNativeToolChoice(params.toolChoice);
|
|
497
|
-
const responseFormat = buildNativeResponseFormat(params.responseSchema);
|
|
610
|
+
const responseFormat = buildNativeResponseFormat(params.responseSchema, modelName);
|
|
498
611
|
const requestBody = {
|
|
499
612
|
model: modelName,
|
|
500
|
-
messages: buildNativeMessages(params, promptText, systemPrompt)
|
|
501
|
-
max_tokens: params.maxTokens ?? 8192
|
|
613
|
+
messages: buildNativeMessages(params, promptText, systemPrompt)
|
|
502
614
|
};
|
|
615
|
+
if (!params.omitMaxTokens) {
|
|
616
|
+
requestBody.max_tokens = params.maxTokens ?? 8192;
|
|
617
|
+
}
|
|
503
618
|
if (!isReasoningModel(modelName) && typeof params.temperature === "number") {
|
|
504
619
|
requestBody.temperature = params.temperature;
|
|
505
620
|
}
|
|
621
|
+
if (isCerebrasServedModel(modelName) && recordAt(asRecord2(params.providerOptions), "eliza").thinking === "off") {
|
|
622
|
+
requestBody.reasoning_effort = "low";
|
|
623
|
+
}
|
|
506
624
|
if (tools) {
|
|
507
625
|
requestBody.tools = tools;
|
|
508
626
|
}
|
|
@@ -616,16 +734,8 @@ function getModelNameForType(runtime, modelType) {
|
|
|
616
734
|
}
|
|
617
735
|
}
|
|
618
736
|
function buildGenerateParams(runtime, modelType, params) {
|
|
619
|
-
const paramsWithAttachments = params;
|
|
620
737
|
const prompt = params.prompt ?? "";
|
|
621
|
-
const maxTokens = params.maxTokens ?? 8192;
|
|
622
|
-
const openai = createOpenAIClient(runtime);
|
|
623
738
|
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
739
|
const systemPrompt = resolveEffectiveSystemPrompt({
|
|
630
740
|
params,
|
|
631
741
|
fallback: buildCanonicalSystemPrompt({ character: runtime.character })
|
|
@@ -633,28 +743,24 @@ function buildGenerateParams(runtime, modelType, params) {
|
|
|
633
743
|
const promptText = renderChatMessagesForPrompt(params.messages, {
|
|
634
744
|
omitDuplicateSystem: systemPrompt
|
|
635
745
|
}) ?? 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 };
|
|
746
|
+
return { modelName, modelType, prompt: promptText, systemPrompt };
|
|
647
747
|
}
|
|
648
748
|
async function generateTextWithModel(runtime, modelType, params) {
|
|
649
749
|
const { modelName, prompt, systemPrompt } = buildGenerateParams(runtime, modelType, params);
|
|
650
750
|
const paramsWithNative = params;
|
|
651
751
|
logger2.debug(`[ELIZAOS_CLOUD] Generating text with ${modelType} model: ${modelName}`);
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
}
|
|
752
|
+
const paramsStreaming = params;
|
|
753
|
+
const wantsStream = Boolean(paramsStreaming.stream) && paramsStreaming.streamStructured === true && resolveStreamingEnabled();
|
|
655
754
|
logger2.log(`[ELIZAOS_CLOUD] Using ${modelType} model: ${modelName}`);
|
|
656
755
|
logger2.log(prompt);
|
|
657
756
|
if (hasNativeTransportOptions(paramsWithNative)) {
|
|
757
|
+
if (wantsStream) {
|
|
758
|
+
return streamNativeChatCompletion(runtime, modelType, paramsWithNative, {
|
|
759
|
+
modelName,
|
|
760
|
+
prompt,
|
|
761
|
+
systemPrompt
|
|
762
|
+
});
|
|
763
|
+
}
|
|
658
764
|
const nativeResult = await generateNativeChatCompletion(runtime, modelType, paramsWithNative, {
|
|
659
765
|
modelName,
|
|
660
766
|
prompt,
|
|
@@ -676,19 +782,29 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
676
782
|
});
|
|
677
783
|
const requestBody = {
|
|
678
784
|
model: modelName,
|
|
679
|
-
input
|
|
680
|
-
max_output_tokens: params.maxTokens ?? 8192
|
|
785
|
+
input
|
|
681
786
|
};
|
|
787
|
+
if (!params.omitMaxTokens) {
|
|
788
|
+
requestBody.max_output_tokens = params.maxTokens ?? 8192;
|
|
789
|
+
}
|
|
682
790
|
if (!reasoning && typeof params.temperature === "number") {
|
|
683
791
|
requestBody.temperature = params.temperature;
|
|
684
792
|
}
|
|
685
|
-
const
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
793
|
+
const responsesHeaders = {
|
|
794
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
795
|
+
"X-Eliza-Model-Type": modelType
|
|
796
|
+
};
|
|
797
|
+
if (isSpanSamplerHonoringModel(modelName)) {
|
|
798
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
799
|
+
if (samplerHeader) {
|
|
800
|
+
responsesHeaders["x-eliza-span-samplers"] = samplerHeader;
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/responses", {
|
|
804
|
+
headers: responsesHeaders,
|
|
805
|
+
json: requestBody,
|
|
806
|
+
timeoutMs: resolveTextTimeoutMs()
|
|
807
|
+
}), "responses");
|
|
692
808
|
const responseText = await response.text();
|
|
693
809
|
let data = {};
|
|
694
810
|
if (responseText) {
|
|
@@ -713,6 +829,12 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
713
829
|
inputTokens: data.usage.input_tokens ?? 0,
|
|
714
830
|
outputTokens: data.usage.output_tokens ?? 0,
|
|
715
831
|
totalTokens: data.usage.total_tokens ?? 0
|
|
832
|
+
}, {
|
|
833
|
+
modelName: getModelNameForType(runtime, modelType),
|
|
834
|
+
...(() => {
|
|
835
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
836
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
837
|
+
})()
|
|
716
838
|
});
|
|
717
839
|
}
|
|
718
840
|
const text = extractResponsesOutputText(data);
|
|
@@ -723,13 +845,21 @@ async function generateTextWithModel(runtime, modelType, params) {
|
|
|
723
845
|
}
|
|
724
846
|
async function generateNativeChatCompletion(runtime, modelType, params, context) {
|
|
725
847
|
const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
|
|
726
|
-
const
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
848
|
+
const headers = {
|
|
849
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
850
|
+
"X-Eliza-Model-Type": modelType
|
|
851
|
+
};
|
|
852
|
+
if (isSpanSamplerHonoringModel(context.modelName)) {
|
|
853
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
854
|
+
if (samplerHeader) {
|
|
855
|
+
headers["x-eliza-span-samplers"] = samplerHeader;
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
|
|
859
|
+
headers,
|
|
860
|
+
json: requestBody,
|
|
861
|
+
timeoutMs: resolveTextTimeoutMs()
|
|
862
|
+
}), "chat/completions");
|
|
733
863
|
const responseText = await response.text();
|
|
734
864
|
let data = {};
|
|
735
865
|
if (responseText) {
|
|
@@ -751,7 +881,13 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
|
|
|
751
881
|
}
|
|
752
882
|
const usage = convertNativeUsage(data.usage);
|
|
753
883
|
if (usage) {
|
|
754
|
-
emitModelUsageEvent(runtime, modelType, context.prompt, usage
|
|
884
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
|
|
885
|
+
modelName: context.modelName,
|
|
886
|
+
...(() => {
|
|
887
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
888
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
889
|
+
})()
|
|
890
|
+
});
|
|
755
891
|
}
|
|
756
892
|
const text = extractChatCompletionText(data);
|
|
757
893
|
const toolCalls = extractNativeToolCalls(data);
|
|
@@ -769,6 +905,251 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
|
|
|
769
905
|
}
|
|
770
906
|
};
|
|
771
907
|
}
|
|
908
|
+
function deferred() {
|
|
909
|
+
let resolve;
|
|
910
|
+
const promise = new Promise((r) => {
|
|
911
|
+
resolve = r;
|
|
912
|
+
});
|
|
913
|
+
return { promise, resolve };
|
|
914
|
+
}
|
|
915
|
+
async function* parseOpenAiSseStream(body) {
|
|
916
|
+
const reader = body.getReader();
|
|
917
|
+
const decoder = new TextDecoder;
|
|
918
|
+
let buffer = "";
|
|
919
|
+
const handle = (line) => {
|
|
920
|
+
const trimmed = line.trimStart();
|
|
921
|
+
if (!trimmed.startsWith("data:"))
|
|
922
|
+
return null;
|
|
923
|
+
const payload = trimmed.slice(5).trim();
|
|
924
|
+
if (payload === "")
|
|
925
|
+
return null;
|
|
926
|
+
if (payload === "[DONE]")
|
|
927
|
+
return "DONE";
|
|
928
|
+
try {
|
|
929
|
+
return JSON.parse(payload);
|
|
930
|
+
} catch {
|
|
931
|
+
return null;
|
|
932
|
+
}
|
|
933
|
+
};
|
|
934
|
+
try {
|
|
935
|
+
for (;; ) {
|
|
936
|
+
const { value, done } = await reader.read();
|
|
937
|
+
if (done)
|
|
938
|
+
break;
|
|
939
|
+
buffer += decoder.decode(value, { stream: true });
|
|
940
|
+
let nl;
|
|
941
|
+
while ((nl = buffer.indexOf(`
|
|
942
|
+
`)) >= 0) {
|
|
943
|
+
const line = buffer.slice(0, nl);
|
|
944
|
+
buffer = buffer.slice(nl + 1);
|
|
945
|
+
const frame = handle(line);
|
|
946
|
+
if (frame === "DONE")
|
|
947
|
+
return;
|
|
948
|
+
if (frame)
|
|
949
|
+
yield frame;
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
const tail = handle(buffer);
|
|
953
|
+
if (tail && tail !== "DONE")
|
|
954
|
+
yield tail;
|
|
955
|
+
} finally {
|
|
956
|
+
try {
|
|
957
|
+
await reader.cancel();
|
|
958
|
+
} catch {}
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
function accumulateToolCallDeltas(acc, deltas) {
|
|
962
|
+
if (!Array.isArray(deltas))
|
|
963
|
+
return;
|
|
964
|
+
for (const raw of deltas) {
|
|
965
|
+
const d = asRecord2(raw);
|
|
966
|
+
const index = typeof d.index === "number" ? d.index : 0;
|
|
967
|
+
const cur = acc.get(index) ?? { args: "" };
|
|
968
|
+
const id = firstString(d.id);
|
|
969
|
+
if (id)
|
|
970
|
+
cur.id = id;
|
|
971
|
+
const fn = recordAt(d, "function");
|
|
972
|
+
const name = firstString(fn.name);
|
|
973
|
+
if (name)
|
|
974
|
+
cur.name = name;
|
|
975
|
+
if (typeof fn.arguments === "string")
|
|
976
|
+
cur.args += fn.arguments;
|
|
977
|
+
acc.set(index, cur);
|
|
978
|
+
}
|
|
979
|
+
}
|
|
980
|
+
function finalizeStreamedToolCalls(acc) {
|
|
981
|
+
const out = [];
|
|
982
|
+
for (const [index, c] of [...acc.entries()].sort((a, b) => a[0] - b[0])) {
|
|
983
|
+
if (!c.name)
|
|
984
|
+
continue;
|
|
985
|
+
out.push({
|
|
986
|
+
type: "tool-call",
|
|
987
|
+
toolCallId: c.id ?? `call_${c.name}_${index}`,
|
|
988
|
+
toolName: c.name,
|
|
989
|
+
input: parseJsonIfPossible(c.args.trim() === "" ? "{}" : c.args)
|
|
990
|
+
});
|
|
991
|
+
}
|
|
992
|
+
return out;
|
|
993
|
+
}
|
|
994
|
+
async function streamNativeChatCompletion(runtime, modelType, params, context) {
|
|
995
|
+
const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
|
|
996
|
+
requestBody.stream = true;
|
|
997
|
+
requestBody.stream_options = { include_usage: true };
|
|
998
|
+
const headers = {
|
|
999
|
+
"X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
|
|
1000
|
+
"X-Eliza-Model-Type": modelType
|
|
1001
|
+
};
|
|
1002
|
+
if (isSpanSamplerHonoringModel(context.modelName)) {
|
|
1003
|
+
const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
|
|
1004
|
+
if (samplerHeader) {
|
|
1005
|
+
headers["x-eliza-span-samplers"] = samplerHeader;
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
const abortSignal = params.signal;
|
|
1009
|
+
const signal = buildStreamAbortSignal(abortSignal, resolveTextTimeoutMs());
|
|
1010
|
+
const limiter = getNativeChatLimiter();
|
|
1011
|
+
const waitStartedAt = Date.now();
|
|
1012
|
+
await limiter.acquire();
|
|
1013
|
+
recordInferenceSpan("cloud.semaphore-wait", Date.now() - waitStartedAt, {
|
|
1014
|
+
route: "chat/completions:stream"
|
|
1015
|
+
});
|
|
1016
|
+
let permitReleased = false;
|
|
1017
|
+
const releasePermit = () => {
|
|
1018
|
+
if (!permitReleased) {
|
|
1019
|
+
permitReleased = true;
|
|
1020
|
+
limiter.release();
|
|
1021
|
+
}
|
|
1022
|
+
};
|
|
1023
|
+
let response;
|
|
1024
|
+
try {
|
|
1025
|
+
response = await createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
|
|
1026
|
+
headers,
|
|
1027
|
+
json: requestBody,
|
|
1028
|
+
...signal ? { signal } : {}
|
|
1029
|
+
});
|
|
1030
|
+
} catch (err) {
|
|
1031
|
+
releasePermit();
|
|
1032
|
+
throw err;
|
|
1033
|
+
}
|
|
1034
|
+
if (!response.ok) {
|
|
1035
|
+
let errorBody;
|
|
1036
|
+
try {
|
|
1037
|
+
const errText = await response.text();
|
|
1038
|
+
if (errText) {
|
|
1039
|
+
errorBody = JSON.parse(errText).error;
|
|
1040
|
+
}
|
|
1041
|
+
} catch {}
|
|
1042
|
+
releasePermit();
|
|
1043
|
+
const message = typeof errorBody?.message === "string" && errorBody.message.trim() ? errorBody.message.trim() : `elizaOS Cloud error ${response.status}`;
|
|
1044
|
+
const requestError = new Error(message);
|
|
1045
|
+
requestError.status = response.status;
|
|
1046
|
+
if (errorBody)
|
|
1047
|
+
requestError.error = errorBody;
|
|
1048
|
+
throw requestError;
|
|
1049
|
+
}
|
|
1050
|
+
const contentType = response.headers.get("content-type") ?? "";
|
|
1051
|
+
const isSse = contentType.includes("text/event-stream") && response.body !== null;
|
|
1052
|
+
if (!isSse) {
|
|
1053
|
+
const bufferedText = await response.text();
|
|
1054
|
+
releasePermit();
|
|
1055
|
+
let data = {};
|
|
1056
|
+
if (bufferedText) {
|
|
1057
|
+
try {
|
|
1058
|
+
data = JSON.parse(bufferedText);
|
|
1059
|
+
} catch (parseErr) {
|
|
1060
|
+
logger2.error(`[ELIZAOS_CLOUD] Failed to parse buffered chat completions JSON: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`);
|
|
1061
|
+
}
|
|
1062
|
+
}
|
|
1063
|
+
const text = extractChatCompletionText(data);
|
|
1064
|
+
const toolCalls = extractNativeToolCalls(data);
|
|
1065
|
+
const usage = convertNativeUsage(data.usage);
|
|
1066
|
+
if (usage) {
|
|
1067
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
|
|
1068
|
+
modelName: context.modelName,
|
|
1069
|
+
...(() => {
|
|
1070
|
+
const costUsd = extractCostUsd(data.usage, response);
|
|
1071
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
1072
|
+
})()
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
if (!text.trim() && toolCalls.length === 0) {
|
|
1076
|
+
throw new Error("elizaOS Cloud returned no text or tool calls");
|
|
1077
|
+
}
|
|
1078
|
+
async function* single() {
|
|
1079
|
+
if (text)
|
|
1080
|
+
yield text;
|
|
1081
|
+
}
|
|
1082
|
+
return {
|
|
1083
|
+
textStream: single(),
|
|
1084
|
+
text: Promise.resolve(text),
|
|
1085
|
+
usage: Promise.resolve(usage),
|
|
1086
|
+
finishReason: Promise.resolve(data.choices?.[0]?.finish_reason),
|
|
1087
|
+
toolCalls: Promise.resolve(toolCalls),
|
|
1088
|
+
providerMetadata: { modelName: context.modelName, usage: data.usage }
|
|
1089
|
+
};
|
|
1090
|
+
}
|
|
1091
|
+
const body = response.body;
|
|
1092
|
+
const toolAcc = new Map;
|
|
1093
|
+
let accumulated = "";
|
|
1094
|
+
let nativeUsage;
|
|
1095
|
+
let rawUsage;
|
|
1096
|
+
let finishReason;
|
|
1097
|
+
const textD = deferred();
|
|
1098
|
+
const usageD = deferred();
|
|
1099
|
+
const finishD = deferred();
|
|
1100
|
+
const toolCallsD = deferred();
|
|
1101
|
+
async function* generate() {
|
|
1102
|
+
try {
|
|
1103
|
+
for await (const frame of parseOpenAiSseStream(body)) {
|
|
1104
|
+
if (frame.error) {
|
|
1105
|
+
const message = asRecord2(frame.error).message;
|
|
1106
|
+
throw new Error(typeof message === "string" && message.trim() ? message.trim() : "elizaOS Cloud stream error");
|
|
1107
|
+
}
|
|
1108
|
+
const choices = Array.isArray(frame.choices) ? frame.choices : [];
|
|
1109
|
+
const choice = asRecord2(choices[0]);
|
|
1110
|
+
const delta = recordAt(choice, "delta");
|
|
1111
|
+
if (typeof delta.content === "string" && delta.content.length > 0) {
|
|
1112
|
+
accumulated += delta.content;
|
|
1113
|
+
yield delta.content;
|
|
1114
|
+
}
|
|
1115
|
+
if (delta.tool_calls) {
|
|
1116
|
+
accumulateToolCallDeltas(toolAcc, delta.tool_calls);
|
|
1117
|
+
}
|
|
1118
|
+
const fr = firstString(choice.finish_reason);
|
|
1119
|
+
if (fr)
|
|
1120
|
+
finishReason = fr;
|
|
1121
|
+
if (frame.usage) {
|
|
1122
|
+
rawUsage = frame.usage;
|
|
1123
|
+
nativeUsage = convertNativeUsage(frame.usage);
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
} finally {
|
|
1127
|
+
releasePermit();
|
|
1128
|
+
const toolCalls = finalizeStreamedToolCalls(toolAcc);
|
|
1129
|
+
textD.resolve(accumulated);
|
|
1130
|
+
usageD.resolve(nativeUsage);
|
|
1131
|
+
finishD.resolve(finishReason);
|
|
1132
|
+
toolCallsD.resolve(toolCalls);
|
|
1133
|
+
if (nativeUsage) {
|
|
1134
|
+
emitModelUsageEvent(runtime, modelType, context.prompt, nativeUsage, {
|
|
1135
|
+
modelName: context.modelName,
|
|
1136
|
+
...(() => {
|
|
1137
|
+
const costUsd = extractCostUsd(rawUsage, response);
|
|
1138
|
+
return typeof costUsd === "number" ? { costUsd } : {};
|
|
1139
|
+
})()
|
|
1140
|
+
});
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
return {
|
|
1145
|
+
textStream: generate(),
|
|
1146
|
+
text: textD.promise,
|
|
1147
|
+
usage: usageD.promise,
|
|
1148
|
+
finishReason: finishD.promise,
|
|
1149
|
+
toolCalls: toolCallsD.promise,
|
|
1150
|
+
providerMetadata: { modelName: context.modelName }
|
|
1151
|
+
};
|
|
1152
|
+
}
|
|
772
1153
|
async function handleTextSmall(runtime, params) {
|
|
773
1154
|
return generateTextWithModel(runtime, TEXT_SMALL_MODEL_TYPE, params);
|
|
774
1155
|
}
|
|
@@ -791,13 +1172,25 @@ async function handleActionPlanner(runtime, params) {
|
|
|
791
1172
|
return generateTextWithModel(runtime, ACTION_PLANNER_MODEL_TYPE, params);
|
|
792
1173
|
}
|
|
793
1174
|
export {
|
|
1175
|
+
withNativeChatLimit,
|
|
1176
|
+
streamNativeChatCompletion,
|
|
1177
|
+
resolveTextTimeoutMs,
|
|
1178
|
+
resolveStreamingEnabled,
|
|
1179
|
+
parseOpenAiSseStream,
|
|
1180
|
+
normalizeNativeTools,
|
|
1181
|
+
normalizeNativeToolChoice,
|
|
794
1182
|
handleTextSmall,
|
|
795
1183
|
handleTextNano,
|
|
796
1184
|
handleTextMega,
|
|
797
1185
|
handleTextMedium,
|
|
798
1186
|
handleTextLarge,
|
|
799
1187
|
handleResponseHandler,
|
|
800
|
-
handleActionPlanner
|
|
1188
|
+
handleActionPlanner,
|
|
1189
|
+
generateNativeChatCompletion,
|
|
1190
|
+
finalizeStreamedToolCalls,
|
|
1191
|
+
buildStreamAbortSignal,
|
|
1192
|
+
accumulateToolCallDeltas,
|
|
1193
|
+
__resetNativeChatLimiterForTests
|
|
801
1194
|
};
|
|
802
1195
|
|
|
803
|
-
//# debugId=
|
|
1196
|
+
//# debugId=8C7301DC53E50E9164756E2164756E21
|