@elizaos/plugin-elizacloud 2.0.0-alpha.8 → 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/LICENSE +21 -0
- package/README.md +196 -0
- package/auto-enable.ts +22 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -38
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +9112 -2265
- package/dist/cjs/index.node.js.map +68 -30
- 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.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +283 -0
- package/dist/cloud/auth.js.map +12 -0
- package/dist/cloud/backup.d.ts +18 -0
- package/dist/cloud/backup.d.ts.map +1 -0
- package/dist/cloud/backup.js +63 -0
- package/dist/cloud/backup.js.map +10 -0
- package/dist/cloud/base-url.d.ts +7 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +29 -0
- package/dist/cloud/base-url.js.map +10 -0
- package/dist/cloud/bridge-client.d.ts +126 -0
- package/dist/cloud/bridge-client.d.ts.map +1 -0
- package/dist/cloud/bridge-client.js +384 -0
- package/dist/cloud/bridge-client.js.map +11 -0
- 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.d.ts +26 -0
- package/dist/cloud/cloud-api-key.d.ts.map +1 -0
- package/dist/cloud/cloud-api-key.js +60 -0
- package/dist/cloud/cloud-api-key.js.map +10 -0
- package/dist/cloud/cloud-manager.d.ts +33 -0
- package/dist/cloud/cloud-manager.d.ts.map +1 -0
- package/dist/cloud/cloud-manager.js +806 -0
- package/dist/cloud/cloud-manager.js.map +16 -0
- package/dist/cloud/cloud-proxy.d.ts +20 -0
- package/dist/cloud/cloud-proxy.d.ts.map +1 -0
- package/dist/cloud/cloud-proxy.js +54 -0
- package/dist/cloud/cloud-proxy.js.map +10 -0
- package/dist/cloud/cloud-wallet.d.ts +94 -0
- package/dist/cloud/cloud-wallet.d.ts.map +1 -0
- package/dist/cloud/cloud-wallet.js +362 -0
- package/dist/cloud/cloud-wallet.js.map +13 -0
- 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 +15 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +1811 -0
- package/dist/cloud/index.js.map +24 -0
- 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.d.ts +26 -0
- package/dist/cloud/reconnect.d.ts.map +1 -0
- package/dist/cloud/reconnect.js +104 -0
- package/dist/cloud/reconnect.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 +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +175 -0
- package/dist/cloud/validate-url.js.map +10 -0
- 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.d.ts.map +1 -1
- package/dist/cloud-providers/cloud-status.js +78 -0
- package/dist/cloud-providers/cloud-status.js.map +10 -0
- package/dist/cloud-providers/container-health.d.ts.map +1 -1
- package/dist/cloud-providers/container-health.js +74 -0
- package/dist/cloud-providers/container-health.js.map +10 -0
- package/dist/cloud-providers/credit-balance.d.ts.map +1 -1
- package/dist/cloud-providers/credit-balance.js +85 -0
- package/dist/cloud-providers/credit-balance.js.map +10 -0
- package/dist/cloud-providers/index.d.ts.map +1 -1
- package/dist/cloud-providers/index.js +24 -0
- package/dist/cloud-providers/index.js.map +9 -0
- package/dist/cloud-providers/model-registry.d.ts.map +1 -1
- package/dist/cloud-providers/model-registry.js +71 -0
- package/dist/cloud-providers/model-registry.js.map +10 -0
- package/dist/cloud-setup.d.ts +36 -0
- package/dist/cloud-setup.d.ts.map +1 -0
- package/dist/cloud-setup.js +883 -0
- 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 +15 -3
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9862 -0
- package/dist/index.js.map +77 -0
- package/dist/index.node.d.ts +21 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +182 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +77 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +654 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +10 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +36 -0
- package/dist/lib/cloud-secrets.js.map +10 -0
- package/dist/lib/config-env.d.ts +5 -0
- package/dist/lib/config-env.d.ts.map +1 -0
- package/dist/lib/config-env.js +191 -0
- package/dist/lib/config-env.js.map +11 -0
- package/dist/lib/config-like.d.ts +40 -0
- package/dist/lib/config-like.d.ts.map +1 -0
- package/dist/lib/config-like.js +103 -0
- package/dist/lib/config-like.js.map +10 -0
- package/dist/lib/credential-type-map.d.ts +53 -0
- package/dist/lib/credential-type-map.d.ts.map +1 -0
- package/dist/lib/credential-type-map.js +88 -0
- package/dist/lib/credential-type-map.js.map +10 -0
- package/dist/lib/feature-flags.d.ts +2 -0
- package/dist/lib/feature-flags.d.ts.map +1 -0
- package/dist/lib/feature-flags.js +40 -0
- package/dist/lib/feature-flags.js.map +10 -0
- package/dist/lib/http.d.ts +11 -0
- package/dist/lib/http.d.ts.map +1 -0
- package/dist/lib/http.js +107 -0
- package/dist/lib/http.js.map +10 -0
- package/dist/lib/server-cloud-tts.d.ts +21 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +251 -0
- package/dist/lib/server-cloud-tts.js.map +10 -0
- package/dist/lib/state-paths.d.ts +4 -0
- package/dist/lib/state-paths.d.ts.map +1 -0
- package/dist/lib/state-paths.js +52 -0
- package/dist/lib/state-paths.js.map +10 -0
- package/dist/lib/tts-debug.d.ts +6 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +24 -0
- package/dist/lib/tts-debug.js.map +9 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +329 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +401 -0
- package/dist/models/image.js.map +14 -0
- package/dist/models/index.d.ts +1 -2
- package/dist/models/index.d.ts.map +1 -1
- package/dist/models/index.js +1896 -0
- package/dist/models/index.js.map +19 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +341 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts +61 -3
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +429 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +111 -3
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +1173 -0
- package/dist/models/text.js.map +14 -0
- package/dist/models/tokenization.d.ts.map +1 -1
- package/dist/models/tokenization.js +65 -0
- package/dist/models/tokenization.js.map +10 -0
- package/dist/models/transcription.d.ts.map +1 -1
- package/dist/models/transcription.js +297 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +9189 -2295
- package/dist/node/index.node.js.map +68 -30
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +2937 -0
- package/dist/plugin.js.map +28 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +136 -0
- package/dist/providers/openai.js.map +11 -0
- package/dist/register-routes.d.ts +2 -0
- package/dist/register-routes.d.ts.map +1 -0
- package/dist/register-routes.js +2938 -0
- package/dist/register-routes.js.map +29 -0
- package/dist/routes/cloud-billing-routes.d.ts +9 -0
- package/dist/routes/cloud-billing-routes.d.ts.map +1 -0
- package/dist/routes/cloud-billing-routes.js +764 -0
- package/dist/routes/cloud-billing-routes.js.map +15 -0
- 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 +10 -0
- package/dist/routes/cloud-compat-routes.d.ts.map +1 -0
- package/dist/routes/cloud-compat-routes.js +495 -0
- package/dist/routes/cloud-compat-routes.js.map +15 -0
- package/dist/routes/cloud-features-routes.d.ts +9 -0
- package/dist/routes/cloud-features-routes.d.ts.map +1 -0
- package/dist/routes/cloud-features-routes.js +124 -0
- package/dist/routes/cloud-features-routes.js.map +11 -0
- package/dist/routes/cloud-provisioning.d.ts +14 -0
- package/dist/routes/cloud-provisioning.d.ts.map +1 -0
- package/dist/routes/cloud-provisioning.js +37 -0
- package/dist/routes/cloud-provisioning.js.map +10 -0
- package/dist/routes/cloud-relay-routes.d.ts +23 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +142 -0
- package/dist/routes/cloud-relay-routes.js.map +11 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +82 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +1252 -0
- package/dist/routes/cloud-routes-autonomous.js.map +18 -0
- package/dist/routes/cloud-routes.d.ts +35 -0
- package/dist/routes/cloud-routes.d.ts.map +1 -0
- package/dist/routes/cloud-routes.js +2173 -0
- package/dist/routes/cloud-routes.js.map +23 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +14 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +349 -0
- package/dist/routes/cloud-status-routes-autonomous.js.map +13 -0
- package/dist/routes/cloud-status-routes.d.ts +4 -0
- package/dist/routes/cloud-status-routes.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes.js +695 -0
- package/dist/routes/cloud-status-routes.js.map +15 -0
- 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 +140 -5
- package/dist/services/cloud-auth.d.ts.map +1 -1
- package/dist/services/cloud-auth.js +368 -0
- package/dist/services/cloud-auth.js.map +12 -0
- package/dist/services/cloud-backup.d.ts.map +1 -1
- package/dist/services/cloud-backup.js +176 -0
- package/dist/services/cloud-backup.js.map +11 -0
- package/dist/services/cloud-bootstrap.d.ts +38 -0
- package/dist/services/cloud-bootstrap.d.ts.map +1 -0
- package/dist/services/cloud-bootstrap.js +84 -0
- package/dist/services/cloud-bootstrap.js.map +10 -0
- package/dist/services/cloud-bridge.d.ts +1 -1
- package/dist/services/cloud-bridge.d.ts.map +1 -1
- package/dist/services/cloud-bridge.js +308 -0
- package/dist/services/cloud-bridge.js.map +11 -0
- 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 +292 -0
- package/dist/services/cloud-container.js.map +11 -0
- package/dist/services/cloud-credential-provider.d.ts +55 -0
- package/dist/services/cloud-credential-provider.d.ts.map +1 -0
- package/dist/services/cloud-credential-provider.js +190 -0
- package/dist/services/cloud-credential-provider.js.map +11 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts +38 -0
- package/dist/services/cloud-managed-gateway-relay.d.ts.map +1 -0
- package/dist/services/cloud-managed-gateway-relay.js +479 -0
- package/dist/services/cloud-managed-gateway-relay.js.map +10 -0
- package/dist/services/cloud-model-registry.d.ts.map +1 -1
- package/dist/services/cloud-model-registry.js +175 -0
- package/dist/services/cloud-model-registry.js.map +10 -0
- package/dist/services/index.d.ts +3 -1
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +29 -0
- package/dist/services/index.js.map +9 -0
- package/dist/types/cloud.d.ts +42 -19
- package/dist/types/cloud.d.ts.map +1 -1
- package/dist/types/cloud.js +52 -0
- package/dist/types/cloud.js.map +10 -0
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +9 -0
- package/dist/utils/cloud-api.d.ts +2 -27
- package/dist/utils/cloud-api.d.ts.map +1 -1
- package/dist/utils/cloud-api.js +33 -0
- package/dist/utils/cloud-api.js.map +10 -0
- package/dist/utils/cloud-sdk/client.d.ts +133 -0
- package/dist/utils/cloud-sdk/client.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/client.js +3693 -0
- package/dist/utils/cloud-sdk/client.js.map +13 -0
- package/dist/utils/cloud-sdk/http.d.ts +37 -0
- package/dist/utils/cloud-sdk/http.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/http.js +237 -0
- package/dist/utils/cloud-sdk/http.js.map +11 -0
- package/dist/utils/cloud-sdk/index.d.ts +6 -0
- package/dist/utils/cloud-sdk/index.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/index.js +29 -0
- package/dist/utils/cloud-sdk/index.js.map +9 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts +5563 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +3048 -0
- package/dist/utils/cloud-sdk/public-routes.js.map +10 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts +101 -0
- package/dist/utils/cloud-sdk/types.cloud-api.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js +2 -0
- package/dist/utils/cloud-sdk/types.cloud-api.js.map +9 -0
- package/dist/utils/cloud-sdk/types.d.ts +653 -0
- package/dist/utils/cloud-sdk/types.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/types.js +29 -0
- package/dist/utils/cloud-sdk/types.js.map +10 -0
- package/dist/utils/config.d.ts +16 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +147 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts +23 -2
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +45 -0
- package/dist/utils/events.js.map +10 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +103 -0
- package/dist/utils/helpers.js.map +10 -0
- package/dist/utils/responses-output.d.ts +13 -0
- package/dist/utils/responses-output.d.ts.map +1 -0
- package/dist/utils/responses-output.js +102 -0
- package/dist/utils/responses-output.js.map +10 -0
- package/dist/utils/sdk-client.d.ts +5 -0
- package/dist/utils/sdk-client.d.ts.map +1 -0
- package/dist/utils/sdk-client.js +157 -0
- package/dist/utils/sdk-client.js.map +11 -0
- 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 +139 -21
- package/src/cloud/auth-service-types.ts +24 -0
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +6 -0
- package/src/cloud/bridge-client.ts +602 -0
- package/src/cloud/clack-observer.ts +189 -0
- package/src/cloud/cloud-api-key.ts +80 -0
- package/src/cloud/cloud-manager.ts +163 -0
- package/src/cloud/cloud-proxy.ts +52 -0
- package/src/cloud/cloud-wallet.ts +341 -0
- package/src/cloud/duffel-client.ts +847 -0
- package/src/cloud/index.ts +38 -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/reconnect.ts +111 -0
- package/src/cloud/setup-observer.ts +125 -0
- package/src/cloud/validate-url.ts +187 -0
- package/src/cloud/x402-payment-handler.ts +215 -0
- package/src/cloud-providers/cloud-status.ts +75 -0
- package/src/cloud-providers/container-health.ts +68 -0
- package/src/cloud-providers/credit-balance.ts +70 -0
- package/src/cloud-providers/index.ts +3 -0
- package/src/cloud-providers/model-registry.ts +74 -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 +39 -0
- package/src/index.node.ts +69 -0
- package/src/index.ts +419 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +661 -0
- package/src/lib/cloud-secrets.ts +14 -0
- package/src/lib/config-env.ts +168 -0
- package/src/lib/config-like.ts +149 -0
- package/src/lib/credential-type-map.ts +130 -0
- package/src/lib/feature-flags.ts +26 -0
- package/src/lib/http.ts +122 -0
- package/src/lib/server-cloud-tts.ts +301 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +5 -0
- package/src/models/embeddings.ts +298 -0
- package/src/models/image.ts +234 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +275 -0
- package/src/models/speech.ts +324 -0
- package/src/models/text.ts +1493 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +101 -0
- package/src/plugin.ts +281 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +744 -0
- package/src/routes/cloud-coding-container-routes.ts +198 -0
- package/src/routes/cloud-compat-routes.ts +304 -0
- package/src/routes/cloud-features-routes.ts +57 -0
- package/src/routes/cloud-provisioning.ts +37 -0
- package/src/routes/cloud-relay-routes.ts +135 -0
- package/src/routes/cloud-routes-autonomous.ts +993 -0
- package/src/routes/cloud-routes.ts +637 -0
- package/src/routes/cloud-status-routes-autonomous.ts +238 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- 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 +574 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +106 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +390 -0
- package/src/services/cloud-credential-provider.ts +210 -0
- package/src/services/cloud-managed-gateway-relay.ts +663 -0
- package/src/services/cloud-model-registry.ts +202 -0
- package/src/services/index.ts +17 -0
- package/{types → src/types}/cloud.ts +74 -29
- package/{types → src/types}/index.ts +25 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +774 -0
- package/src/utils/cloud-sdk/http.ts +291 -0
- package/src/utils/cloud-sdk/index.ts +23 -0
- package/src/utils/cloud-sdk/public-routes.ts +5238 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +760 -0
- package/src/utils/config.ts +193 -0
- package/src/utils/events.ts +65 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +41 -0
- package/src/utils/waifu-metering.ts +302 -0
- package/dist/actions/check-credits.d.ts +0 -6
- package/dist/actions/check-credits.d.ts.map +0 -1
- package/dist/actions/freeze-agent.d.ts +0 -9
- package/dist/actions/freeze-agent.d.ts.map +0 -1
- package/dist/actions/index.d.ts +0 -5
- package/dist/actions/index.d.ts.map +0 -1
- package/dist/actions/provision-agent.d.ts +0 -8
- package/dist/actions/provision-agent.d.ts.map +0 -1
- package/dist/actions/resume-agent.d.ts +0 -9
- package/dist/actions/resume-agent.d.ts.map +0 -1
- package/dist/build.d.ts +0 -3
- package/dist/build.d.ts.map +0 -1
- package/dist/generated/specs/specs.d.ts +0 -55
- package/dist/generated/specs/specs.d.ts.map +0 -1
- package/dist/models/object.d.ts +0 -4
- package/dist/models/object.d.ts.map +0 -1
- package/dist/utils/forwarded-settings.d.ts +0 -8
- package/dist/utils/forwarded-settings.d.ts.map +0 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloud TTS helpers — proxy to Eliza Cloud (`elizacloud.ai`).
|
|
3
|
+
*
|
|
4
|
+
* Pure / config-driven helpers (TTS API key resolution, base URL resolution,
|
|
5
|
+
* voice / model id normalization, compat header mirroring) live in
|
|
6
|
+
* `@elizaos/shared/elizacloud/server-cloud-tts` so host-layer packages can
|
|
7
|
+
* resolve cloud TTS configuration without reverse-importing this plugin.
|
|
8
|
+
*
|
|
9
|
+
* The HTTP request handler (`handleCloudTtsPreviewRoute`) stays here because
|
|
10
|
+
* it wires together the runtime route system.
|
|
11
|
+
*/
|
|
12
|
+
import type http from "node:http";
|
|
13
|
+
import { sanitizeSpeechText } from "@elizaos/core";
|
|
14
|
+
import {
|
|
15
|
+
_internalResolveCloudApiKey,
|
|
16
|
+
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
|
|
17
|
+
resolveCloudProxyTtsModel,
|
|
18
|
+
resolveCloudTtsCandidateUrls,
|
|
19
|
+
resolveElizaCloudTtsVoiceId,
|
|
20
|
+
shouldRetryCloudTtsUpstream,
|
|
21
|
+
ttsDebug,
|
|
22
|
+
ttsDebugTextPreview,
|
|
23
|
+
} from "@elizaos/shared";
|
|
24
|
+
|
|
25
|
+
export {
|
|
26
|
+
__resetCloudBaseUrlCache,
|
|
27
|
+
ELIZA_CLOUD_TTS_MAX_TEXT_CHARS,
|
|
28
|
+
ensureCloudTtsApiKeyAlias,
|
|
29
|
+
mirrorCompatHeaders,
|
|
30
|
+
normalizeElizaCloudTtsModelId,
|
|
31
|
+
resolveCloudProxyTtsModel,
|
|
32
|
+
resolveCloudTtsBaseUrl,
|
|
33
|
+
resolveCloudTtsCandidateUrls,
|
|
34
|
+
resolveElevenLabsApiKeyForCloudMode,
|
|
35
|
+
resolveElizaCloudTtsVoiceId,
|
|
36
|
+
shouldRetryCloudTtsUpstream,
|
|
37
|
+
} from "@elizaos/shared";
|
|
38
|
+
|
|
39
|
+
/** Browser → API correlation (never forwarded to Eliza Cloud). */
|
|
40
|
+
export function readTtsDebugClientHeaders(
|
|
41
|
+
req: Pick<http.IncomingMessage, "headers">,
|
|
42
|
+
): {
|
|
43
|
+
messageId?: string;
|
|
44
|
+
clipSegment?: string;
|
|
45
|
+
hearingFull?: string;
|
|
46
|
+
} {
|
|
47
|
+
const pick = (name: string): string | undefined => {
|
|
48
|
+
const raw = req.headers[name];
|
|
49
|
+
if (raw == null) return undefined;
|
|
50
|
+
const v = Array.isArray(raw) ? raw[0] : raw;
|
|
51
|
+
return typeof v === "string" && v.trim() ? v.trim() : undefined;
|
|
52
|
+
};
|
|
53
|
+
const decode = (enc: string | undefined): string | undefined => {
|
|
54
|
+
if (!enc) return undefined;
|
|
55
|
+
try {
|
|
56
|
+
return decodeURIComponent(enc);
|
|
57
|
+
} catch {
|
|
58
|
+
return enc;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
messageId: decode(pick("x-elizaos-tts-message-id")),
|
|
63
|
+
clipSegment: decode(pick("x-elizaos-tts-clip-segment")),
|
|
64
|
+
hearingFull: decode(pick("x-elizaos-tts-full-preview")),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function ttsClientDbgFields(
|
|
69
|
+
hdr: ReturnType<typeof readTtsDebugClientHeaders>,
|
|
70
|
+
): Record<string, string> {
|
|
71
|
+
const o: Record<string, string> = {};
|
|
72
|
+
if (hdr.messageId) o.messageId = hdr.messageId;
|
|
73
|
+
if (hdr.clipSegment) o.clipSegment = hdr.clipSegment;
|
|
74
|
+
if (hdr.hearingFull) o.hearingFull = hdr.hearingFull;
|
|
75
|
+
return o;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function pickBodyString(
|
|
79
|
+
body: Record<string, unknown>,
|
|
80
|
+
camel: string,
|
|
81
|
+
snake: string,
|
|
82
|
+
): unknown {
|
|
83
|
+
const a = body[camel];
|
|
84
|
+
if (typeof a === "string" && a.trim()) return a;
|
|
85
|
+
const b = body[snake];
|
|
86
|
+
if (typeof b === "string" && b.trim()) return b;
|
|
87
|
+
return undefined;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async function readRawRequestBody(req: http.IncomingMessage): Promise<Buffer> {
|
|
91
|
+
const chunks: Buffer[] = [];
|
|
92
|
+
for await (const chunk of req) {
|
|
93
|
+
chunks.push(typeof chunk === "string" ? Buffer.from(chunk) : chunk);
|
|
94
|
+
}
|
|
95
|
+
return Buffer.concat(chunks);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
function sendJsonResponse(
|
|
99
|
+
res: http.ServerResponse,
|
|
100
|
+
status: number,
|
|
101
|
+
body: unknown,
|
|
102
|
+
): void {
|
|
103
|
+
if (res.headersSent) return;
|
|
104
|
+
res.statusCode = status;
|
|
105
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
106
|
+
res.end(JSON.stringify(body));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function sendJsonErrorResponse(
|
|
110
|
+
res: http.ServerResponse,
|
|
111
|
+
status: number,
|
|
112
|
+
message: string,
|
|
113
|
+
): void {
|
|
114
|
+
sendJsonResponse(res, status, { error: message });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function forwardCloudTtsUpstreamError(
|
|
118
|
+
res: http.ServerResponse,
|
|
119
|
+
status: number,
|
|
120
|
+
bodyText: string,
|
|
121
|
+
): void {
|
|
122
|
+
if (res.headersSent) return;
|
|
123
|
+
const trimmed = bodyText.trim();
|
|
124
|
+
if (
|
|
125
|
+
(trimmed.startsWith("{") && trimmed.endsWith("}")) ||
|
|
126
|
+
(trimmed.startsWith("[") && trimmed.endsWith("]"))
|
|
127
|
+
) {
|
|
128
|
+
try {
|
|
129
|
+
const parsed: unknown = JSON.parse(trimmed);
|
|
130
|
+
sendJsonResponse(res, status, parsed);
|
|
131
|
+
return;
|
|
132
|
+
} catch {
|
|
133
|
+
/* fall through */
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
res.statusCode = status;
|
|
137
|
+
res.setHeader("content-type", "application/json; charset=utf-8");
|
|
138
|
+
res.end(
|
|
139
|
+
JSON.stringify({ error: trimmed || "Eliza Cloud TTS request failed" }),
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export async function handleCloudTtsPreviewRoute(
|
|
144
|
+
req: http.IncomingMessage,
|
|
145
|
+
res: http.ServerResponse,
|
|
146
|
+
): Promise<boolean> {
|
|
147
|
+
const clientTtsDbg = readTtsDebugClientHeaders(req);
|
|
148
|
+
const dbgExtra = ttsClientDbgFields(clientTtsDbg);
|
|
149
|
+
|
|
150
|
+
const cloudApiKey = _internalResolveCloudApiKey();
|
|
151
|
+
if (!cloudApiKey) {
|
|
152
|
+
ttsDebug("server:cloud-tts:reject", {
|
|
153
|
+
reason: "no_api_key",
|
|
154
|
+
...dbgExtra,
|
|
155
|
+
});
|
|
156
|
+
sendJsonErrorResponse(
|
|
157
|
+
res,
|
|
158
|
+
401,
|
|
159
|
+
"Eliza Cloud is not connected. Connect your Eliza Cloud account first.",
|
|
160
|
+
);
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const rawBody = await readRawRequestBody(req);
|
|
165
|
+
let body: Record<string, unknown>;
|
|
166
|
+
try {
|
|
167
|
+
body = JSON.parse(rawBody.toString("utf8")) as Record<string, unknown>;
|
|
168
|
+
} catch {
|
|
169
|
+
sendJsonErrorResponse(res, 400, "Invalid JSON request body");
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const text = sanitizeSpeechText(
|
|
174
|
+
typeof body.text === "string" ? body.text : "",
|
|
175
|
+
);
|
|
176
|
+
if (!text) {
|
|
177
|
+
sendJsonErrorResponse(res, 400, "Missing text");
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (text.length > ELIZA_CLOUD_TTS_MAX_TEXT_CHARS) {
|
|
182
|
+
sendJsonErrorResponse(
|
|
183
|
+
res,
|
|
184
|
+
400,
|
|
185
|
+
`Text too long. Maximum length is ${ELIZA_CLOUD_TTS_MAX_TEXT_CHARS} characters`,
|
|
186
|
+
);
|
|
187
|
+
return true;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
const cloudModel = resolveCloudProxyTtsModel(
|
|
191
|
+
pickBodyString(body, "modelId", "model_id"),
|
|
192
|
+
);
|
|
193
|
+
const cloudVoice = resolveElizaCloudTtsVoiceId(
|
|
194
|
+
pickBodyString(body, "voiceId", "voice_id"),
|
|
195
|
+
);
|
|
196
|
+
const cloudUrls = resolveCloudTtsCandidateUrls();
|
|
197
|
+
|
|
198
|
+
const ttsPreview = ttsDebugTextPreview(text);
|
|
199
|
+
ttsDebug("server:cloud-tts:proxy", {
|
|
200
|
+
textChars: text.length,
|
|
201
|
+
preview: ttsPreview,
|
|
202
|
+
modelId: cloudModel,
|
|
203
|
+
voiceId: cloudVoice,
|
|
204
|
+
urlCandidates: cloudUrls.length,
|
|
205
|
+
...dbgExtra,
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
try {
|
|
209
|
+
let lastStatus = 0;
|
|
210
|
+
let lastDetails = "unknown error";
|
|
211
|
+
let cloudResponse: Response | null = null;
|
|
212
|
+
for (let i = 0; i < cloudUrls.length; i++) {
|
|
213
|
+
const cloudUrl = cloudUrls[i];
|
|
214
|
+
if (cloudUrl === undefined) {
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
const attempt = await fetch(cloudUrl, {
|
|
218
|
+
method: "POST",
|
|
219
|
+
headers: {
|
|
220
|
+
Authorization: `Bearer ${cloudApiKey}`,
|
|
221
|
+
"x-api-key": cloudApiKey,
|
|
222
|
+
"Content-Type": "application/json",
|
|
223
|
+
Accept: "audio/mpeg",
|
|
224
|
+
},
|
|
225
|
+
body: JSON.stringify({
|
|
226
|
+
text,
|
|
227
|
+
voiceId: cloudVoice,
|
|
228
|
+
modelId: cloudModel,
|
|
229
|
+
}),
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
if (attempt.ok) {
|
|
233
|
+
cloudResponse = attempt;
|
|
234
|
+
ttsDebug("server:cloud-tts:upstream-ok", {
|
|
235
|
+
urlIndex: i,
|
|
236
|
+
status: attempt.status,
|
|
237
|
+
preview: ttsPreview,
|
|
238
|
+
...dbgExtra,
|
|
239
|
+
});
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
lastStatus = attempt.status;
|
|
244
|
+
lastDetails = await attempt.text().catch(() => "unknown error");
|
|
245
|
+
ttsDebug("server:cloud-tts:upstream-retry", {
|
|
246
|
+
urlIndex: i,
|
|
247
|
+
status: attempt.status,
|
|
248
|
+
preview: ttsPreview,
|
|
249
|
+
...dbgExtra,
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
const hasMoreCandidates = i < cloudUrls.length - 1;
|
|
253
|
+
if (!hasMoreCandidates || !shouldRetryCloudTtsUpstream(attempt.status)) {
|
|
254
|
+
break;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (!cloudResponse) {
|
|
258
|
+
ttsDebug("server:cloud-tts:reject", {
|
|
259
|
+
reason: "upstream_failed",
|
|
260
|
+
lastStatus,
|
|
261
|
+
preview: ttsPreview,
|
|
262
|
+
...dbgExtra,
|
|
263
|
+
});
|
|
264
|
+
if (
|
|
265
|
+
lastStatus === 400 ||
|
|
266
|
+
lastStatus === 401 ||
|
|
267
|
+
lastStatus === 402 ||
|
|
268
|
+
lastStatus === 403 ||
|
|
269
|
+
lastStatus === 429
|
|
270
|
+
) {
|
|
271
|
+
forwardCloudTtsUpstreamError(res, lastStatus, lastDetails);
|
|
272
|
+
return true;
|
|
273
|
+
}
|
|
274
|
+
sendJsonErrorResponse(
|
|
275
|
+
res,
|
|
276
|
+
502,
|
|
277
|
+
`Eliza Cloud TTS failed (${lastStatus || 502}): ${lastDetails}`,
|
|
278
|
+
);
|
|
279
|
+
return true;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const audioBuffer = Buffer.from(await cloudResponse.arrayBuffer());
|
|
283
|
+
ttsDebug("server:cloud-tts:success", {
|
|
284
|
+
bytes: audioBuffer.length,
|
|
285
|
+
preview: ttsPreview,
|
|
286
|
+
...dbgExtra,
|
|
287
|
+
});
|
|
288
|
+
res.statusCode = 200;
|
|
289
|
+
res.setHeader("Content-Type", "audio/mpeg");
|
|
290
|
+
res.setHeader("Cache-Control", "no-store");
|
|
291
|
+
res.end(audioBuffer);
|
|
292
|
+
return true;
|
|
293
|
+
} catch (err) {
|
|
294
|
+
sendJsonErrorResponse(
|
|
295
|
+
res,
|
|
296
|
+
502,
|
|
297
|
+
`Eliza Cloud TTS request failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
298
|
+
);
|
|
299
|
+
return true;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import {
|
|
4
|
+
getElizaNamespace,
|
|
5
|
+
resolveStateDir,
|
|
6
|
+
resolveUserPath,
|
|
7
|
+
} from "@elizaos/core";
|
|
8
|
+
|
|
9
|
+
export { getElizaNamespace, resolveStateDir, resolveUserPath };
|
|
10
|
+
|
|
11
|
+
export function resolveConfigPath(
|
|
12
|
+
env: NodeJS.ProcessEnv = process.env,
|
|
13
|
+
stateDirPath: string = resolveStateDir(env),
|
|
14
|
+
): string {
|
|
15
|
+
const override = env.ELIZA_CONFIG_PATH?.trim();
|
|
16
|
+
if (override) return resolveUserPath(override);
|
|
17
|
+
|
|
18
|
+
const namespace = getElizaNamespace(env);
|
|
19
|
+
const primaryPath = path.join(stateDirPath, `${namespace}.json`);
|
|
20
|
+
if (fs.existsSync(primaryPath)) return primaryPath;
|
|
21
|
+
|
|
22
|
+
if (namespace !== "eliza") {
|
|
23
|
+
const legacyPath = path.join(stateDirPath, "eliza.json");
|
|
24
|
+
if (fs.existsSync(legacyPath)) return legacyPath;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return primaryPath;
|
|
28
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import type { IAgentRuntime, TextEmbeddingParams } from "@elizaos/core";
|
|
2
|
+
import {
|
|
3
|
+
logger,
|
|
4
|
+
ModelType,
|
|
5
|
+
timeInferenceSpan,
|
|
6
|
+
VECTOR_DIMS,
|
|
7
|
+
} from "@elizaos/core";
|
|
8
|
+
import { getSetting } from "../utils/config";
|
|
9
|
+
import { emitModelUsageEvent } from "../utils/events";
|
|
10
|
+
import { createCloudApiClient } from "../utils/sdk-client";
|
|
11
|
+
|
|
12
|
+
const MAX_BATCH_SIZE = 100;
|
|
13
|
+
|
|
14
|
+
// ── Bounded retry/backoff for the /embeddings round-trip ──────────────────
|
|
15
|
+
// Embeddings are off the turn's critical path (queueEmbeddingGeneration is
|
|
16
|
+
// fire-and-forget), so a stall here delays the embedding QUEUE, not a reply.
|
|
17
|
+
// The old behaviour — one blind 30s (or full retry-after) sleep then a single
|
|
18
|
+
// retry — could park the queue for 30s+ on a transient 429. Replaced with
|
|
19
|
+
// bounded exponential backoff + jitter, a CAP on any single wait (so a large
|
|
20
|
+
// server retry-after can't stall the queue indefinitely), and a per-request
|
|
21
|
+
// client-side timeout (the endpoint had none, so a hung gateway hung the
|
|
22
|
+
// queue forever).
|
|
23
|
+
//
|
|
24
|
+
// Handler retries are deliberately SMALL: the EmbeddingGenerationService
|
|
25
|
+
// BatchQueue already wraps generateEmbedding in its own multi-attempt backoff,
|
|
26
|
+
// so this layer absorbs only a single transient burst (one quick retry) and
|
|
27
|
+
// defers sustained pressure to the queue — otherwise the two backoffs compound.
|
|
28
|
+
const EMBED_MAX_ATTEMPTS = 2;
|
|
29
|
+
const EMBED_BACKOFF_BASE_MS = 1_000;
|
|
30
|
+
const EMBED_BACKOFF_CAP_MS = 8_000;
|
|
31
|
+
const EMBED_REQUEST_TIMEOUT_MS = 60_000;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Backoff before the next embedding attempt. Exponential (base·2^attempt) as a
|
|
35
|
+
* floor, honoring the server's `retry-after` when present, but never longer
|
|
36
|
+
* than {@link EMBED_BACKOFF_CAP_MS}; ±25% jitter spreads retries from a burst.
|
|
37
|
+
*/
|
|
38
|
+
function embeddingBackoffMs(attempt: number, retryAfterSec?: number): number {
|
|
39
|
+
const exp = EMBED_BACKOFF_BASE_MS * 2 ** attempt;
|
|
40
|
+
const serverHint =
|
|
41
|
+
typeof retryAfterSec === "number" && retryAfterSec > 0
|
|
42
|
+
? retryAfterSec * 1000
|
|
43
|
+
: 0;
|
|
44
|
+
const base = Math.min(EMBED_BACKOFF_CAP_MS, Math.max(exp, serverHint));
|
|
45
|
+
return Math.round(base * (1 + Math.random() * 0.25));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function sleep(ms: number): Promise<void> {
|
|
49
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function extractRateLimitInfo(response: Response): {
|
|
53
|
+
remainingRequests?: number;
|
|
54
|
+
remainingTokens?: number;
|
|
55
|
+
limitRequests?: number;
|
|
56
|
+
limitTokens?: number;
|
|
57
|
+
resetRequests?: string;
|
|
58
|
+
resetTokens?: string;
|
|
59
|
+
retryAfter?: number;
|
|
60
|
+
} {
|
|
61
|
+
return {
|
|
62
|
+
remainingRequests:
|
|
63
|
+
parseInt(response.headers.get("x-ratelimit-remaining-requests") || "", 10) || undefined,
|
|
64
|
+
remainingTokens:
|
|
65
|
+
parseInt(response.headers.get("x-ratelimit-remaining-tokens") || "", 10) || undefined,
|
|
66
|
+
limitRequests:
|
|
67
|
+
parseInt(response.headers.get("x-ratelimit-limit-requests") || "", 10) || undefined,
|
|
68
|
+
limitTokens: parseInt(response.headers.get("x-ratelimit-limit-tokens") || "", 10) || undefined,
|
|
69
|
+
resetRequests: response.headers.get("x-ratelimit-reset-requests") || undefined,
|
|
70
|
+
resetTokens: response.headers.get("x-ratelimit-reset-tokens") || undefined,
|
|
71
|
+
retryAfter: parseInt(response.headers.get("retry-after") || "", 10) || undefined,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function getEmbeddingConfig(runtime: IAgentRuntime) {
|
|
76
|
+
const embeddingModelName = getSetting(
|
|
77
|
+
runtime,
|
|
78
|
+
"ELIZAOS_CLOUD_EMBEDDING_MODEL",
|
|
79
|
+
"text-embedding-3-small"
|
|
80
|
+
);
|
|
81
|
+
const embeddingDimension = Number.parseInt(
|
|
82
|
+
getSetting(runtime, "ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS", "1536") || "1536",
|
|
83
|
+
10
|
|
84
|
+
) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];
|
|
85
|
+
|
|
86
|
+
if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {
|
|
87
|
+
const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(", ")}`;
|
|
88
|
+
logger.error(errorMsg);
|
|
89
|
+
throw new Error(errorMsg);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
return { embeddingModelName, embeddingDimension };
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* The init probe vector. `runtime.ensureEmbeddingDimension()` calls the handler
|
|
97
|
+
* with `null` purely to learn the vector length; it only inspects `.length`, so
|
|
98
|
+
* a deterministic non-zero[0] marker vector is the correct, legitimate response.
|
|
99
|
+
* This is the ONLY place a synthetic vector is returned — every real failure
|
|
100
|
+
* throws so it can never be persisted as a corrupt embedding (Commandment 8).
|
|
101
|
+
*/
|
|
102
|
+
function createInitProbeVector(dimension: number): number[] {
|
|
103
|
+
const vector = Array(dimension).fill(0);
|
|
104
|
+
vector[0] = 0.1;
|
|
105
|
+
return vector;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export interface BatchEmbeddingParams {
|
|
109
|
+
texts: string[];
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export async function handleTextEmbedding(
|
|
113
|
+
runtime: IAgentRuntime,
|
|
114
|
+
params: TextEmbeddingParams | string | null
|
|
115
|
+
): Promise<number[]> {
|
|
116
|
+
const { embeddingDimension } = getEmbeddingConfig(runtime);
|
|
117
|
+
|
|
118
|
+
if (params === null) {
|
|
119
|
+
logger.debug("Creating test embedding for initialization");
|
|
120
|
+
return createInitProbeVector(embeddingDimension);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
let text: string;
|
|
124
|
+
if (typeof params === "string") {
|
|
125
|
+
text = params;
|
|
126
|
+
} else if (typeof params === "object" && params.text) {
|
|
127
|
+
text = params.text;
|
|
128
|
+
} else {
|
|
129
|
+
// A malformed request is a programming error, not a recoverable runtime
|
|
130
|
+
// state. Throw instead of returning a marker vector that would silently
|
|
131
|
+
// corrupt the embedding store (Commandment 8).
|
|
132
|
+
throw new Error("Invalid input format for embedding: expected string or { text: string }");
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!text.trim()) {
|
|
136
|
+
throw new Error("Cannot generate embedding for empty text");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
const results = await handleBatchTextEmbedding(runtime, [text]);
|
|
140
|
+
return results[0];
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface BatchEmbeddingResult {
|
|
144
|
+
embedding: number[];
|
|
145
|
+
index: number;
|
|
146
|
+
success: boolean;
|
|
147
|
+
error?: string;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export async function handleBatchTextEmbedding(
|
|
151
|
+
runtime: IAgentRuntime,
|
|
152
|
+
texts: string[]
|
|
153
|
+
): Promise<number[][]> {
|
|
154
|
+
const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);
|
|
155
|
+
const client = createCloudApiClient(runtime, true);
|
|
156
|
+
|
|
157
|
+
if (!texts || texts.length === 0) {
|
|
158
|
+
return [];
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Every text must be non-empty: an empty input cannot produce a meaningful
|
|
162
|
+
// vector, and a marker/zero vector would silently corrupt the store. Surface
|
|
163
|
+
// the bad input to the caller (Commandment 8) instead of papering over it.
|
|
164
|
+
const validTexts: { text: string; originalIndex: number }[] = [];
|
|
165
|
+
for (let i = 0; i < texts.length; i++) {
|
|
166
|
+
const text = texts[i]?.trim();
|
|
167
|
+
if (!text) {
|
|
168
|
+
throw new Error(`Cannot generate embedding for empty text at index ${i}`);
|
|
169
|
+
}
|
|
170
|
+
validTexts.push({ text, originalIndex: i });
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
const results: number[][] = new Array(texts.length);
|
|
174
|
+
|
|
175
|
+
for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {
|
|
176
|
+
const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);
|
|
177
|
+
const batch = validTexts.slice(batchStart, batchEnd);
|
|
178
|
+
const batchTexts = batch.map((b) => b.text);
|
|
179
|
+
|
|
180
|
+
logger.info(
|
|
181
|
+
`[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
try {
|
|
185
|
+
// Records a `cloud.embedding` span on the active per-turn timer when an
|
|
186
|
+
// embedding happens to be on a turn's critical path (most are queued /
|
|
187
|
+
// detached, so this is a no-op there — which is exactly what proves they
|
|
188
|
+
// don't add to turn latency). Retries transient throttling/5xx with
|
|
189
|
+
// bounded exponential backoff (see EMBED_* constants) instead of a single
|
|
190
|
+
// 30s blind sleep.
|
|
191
|
+
let response: Response | null = null;
|
|
192
|
+
for (let attempt = 0; attempt < EMBED_MAX_ATTEMPTS; attempt++) {
|
|
193
|
+
const resp = await timeInferenceSpan(
|
|
194
|
+
"cloud.embedding",
|
|
195
|
+
() =>
|
|
196
|
+
client.requestRaw("POST", "/embeddings", {
|
|
197
|
+
json: {
|
|
198
|
+
model: embeddingModelName,
|
|
199
|
+
input: batchTexts,
|
|
200
|
+
},
|
|
201
|
+
timeoutMs: EMBED_REQUEST_TIMEOUT_MS,
|
|
202
|
+
}),
|
|
203
|
+
{ batch: batchTexts.length, attempt }
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
const rateLimitInfo = extractRateLimitInfo(resp);
|
|
207
|
+
if (
|
|
208
|
+
rateLimitInfo.remainingRequests !== undefined &&
|
|
209
|
+
rateLimitInfo.remainingRequests < 50
|
|
210
|
+
) {
|
|
211
|
+
logger.warn(
|
|
212
|
+
`[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const transient =
|
|
217
|
+
resp.status === 429 ||
|
|
218
|
+
resp.status === 502 ||
|
|
219
|
+
resp.status === 503 ||
|
|
220
|
+
resp.status === 504;
|
|
221
|
+
if (transient && attempt < EMBED_MAX_ATTEMPTS - 1) {
|
|
222
|
+
const delay = embeddingBackoffMs(attempt, rateLimitInfo.retryAfter);
|
|
223
|
+
logger.warn(
|
|
224
|
+
`[BatchEmbeddings] ${resp.status} (attempt ${attempt + 1}/${EMBED_MAX_ATTEMPTS}) — backing off ${delay}ms`
|
|
225
|
+
);
|
|
226
|
+
// Drain the body so the underlying connection can be reused.
|
|
227
|
+
await resp.text().catch(() => undefined);
|
|
228
|
+
await sleep(delay);
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
response = resp;
|
|
232
|
+
break;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Type guard: the loop assigns `response` on its final iteration, so this
|
|
236
|
+
// is unreachable in practice.
|
|
237
|
+
if (!response) {
|
|
238
|
+
throw new Error("[BatchEmbeddings] No response after retry loop");
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
// Auth errors (401/403) are non-recoverable with the current key.
|
|
243
|
+
// Every other non-OK status is just as fatal for this batch — neither
|
|
244
|
+
// can produce real vectors. Throw in both cases so the router falls
|
|
245
|
+
// through to the next provider (e.g. local inference) instead of
|
|
246
|
+
// silently persisting marker/zero vectors that corrupt the embedding
|
|
247
|
+
// store. Commandment 8: don't hide broken pipelines behind fallbacks.
|
|
248
|
+
if (response.status === 401 || response.status === 403) {
|
|
249
|
+
throw new Error(
|
|
250
|
+
`[BatchEmbeddings] Authentication failed (${response.status}). ` +
|
|
251
|
+
`Check ELIZAOS_CLOUD_API_KEY or ELIZAOS_CLOUD_EMBEDDING_API_KEY — ` +
|
|
252
|
+
`the current key is not authorized for the embedding endpoint.`
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
throw new Error(
|
|
256
|
+
`[BatchEmbeddings] API error: ${response.status} ${response.statusText}`
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const data = (await response.json()) as {
|
|
261
|
+
data?: Array<{ embedding: number[]; index: number }>;
|
|
262
|
+
usage?: { prompt_tokens: number; total_tokens: number };
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
if (!data?.data || !Array.isArray(data.data)) {
|
|
266
|
+
throw new Error("[BatchEmbeddings] API returned invalid response structure");
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
for (const item of data.data) {
|
|
270
|
+
const originalIndex = batch[item.index].originalIndex;
|
|
271
|
+
results[originalIndex] = item.embedding;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
if (data.usage) {
|
|
275
|
+
const usage = {
|
|
276
|
+
inputTokens: data.usage.prompt_tokens,
|
|
277
|
+
outputTokens: 0,
|
|
278
|
+
totalTokens: data.usage.total_tokens,
|
|
279
|
+
};
|
|
280
|
+
emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
logger.debug(
|
|
284
|
+
`[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d)`
|
|
285
|
+
);
|
|
286
|
+
} catch (error) {
|
|
287
|
+
// Any failure in this batch (HTTP error, transport error, malformed body)
|
|
288
|
+
// means we have no real vectors for it. Log context and re-throw so the
|
|
289
|
+
// router can fall through to another provider; never persist marker/zero
|
|
290
|
+
// vectors that would corrupt the embedding store (Commandment 8).
|
|
291
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
292
|
+
logger.error(`[BatchEmbeddings] Batch failed: ${message}`);
|
|
293
|
+
throw error instanceof Error ? error : new Error(message);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return results;
|
|
298
|
+
}
|