@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,102 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
+
|
|
19
|
+
// src/utils/responses-output.ts
|
|
20
|
+
function asRecord(value) {
|
|
21
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
function normalizeContentItems(value) {
|
|
27
|
+
if (Array.isArray(value))
|
|
28
|
+
return value;
|
|
29
|
+
if (typeof value === "string")
|
|
30
|
+
return [{ type: "text", text: value }];
|
|
31
|
+
return value && typeof value === "object" ? [value] : [];
|
|
32
|
+
}
|
|
33
|
+
function extractTextFromContentItem(value) {
|
|
34
|
+
if (typeof value === "string") {
|
|
35
|
+
return [value];
|
|
36
|
+
}
|
|
37
|
+
const record = asRecord(value);
|
|
38
|
+
if (!record)
|
|
39
|
+
return [];
|
|
40
|
+
const text = typeof record.text === "string" ? record.text : typeof record.output_text === "string" ? record.output_text : typeof record.content === "string" ? record.content : "";
|
|
41
|
+
const type = typeof record.type === "string" ? record.type : undefined;
|
|
42
|
+
if (text && (!type || type === "output_text" || type === "text")) {
|
|
43
|
+
return [text];
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
function extractTextFromOutputItem(value) {
|
|
48
|
+
const record = asRecord(value);
|
|
49
|
+
if (!record)
|
|
50
|
+
return [];
|
|
51
|
+
const directContent = normalizeContentItems(record.content);
|
|
52
|
+
if (directContent.length > 0) {
|
|
53
|
+
return directContent.flatMap(extractTextFromContentItem);
|
|
54
|
+
}
|
|
55
|
+
const nestedMessage = asRecord(record.message);
|
|
56
|
+
if (nestedMessage) {
|
|
57
|
+
return normalizeContentItems(nestedMessage.content).flatMap(extractTextFromContentItem);
|
|
58
|
+
}
|
|
59
|
+
const type = typeof record.type === "string" ? record.type : undefined;
|
|
60
|
+
const text = typeof record.text === "string" ? record.text : typeof record.output_text === "string" ? record.output_text : "";
|
|
61
|
+
if (text && (type === "output_text" || type === "text")) {
|
|
62
|
+
return [text];
|
|
63
|
+
}
|
|
64
|
+
return [];
|
|
65
|
+
}
|
|
66
|
+
function extractTextFromChoice(value) {
|
|
67
|
+
const record = asRecord(value);
|
|
68
|
+
if (!record)
|
|
69
|
+
return [];
|
|
70
|
+
if (typeof record.text === "string" && record.text) {
|
|
71
|
+
return [record.text];
|
|
72
|
+
}
|
|
73
|
+
const message = asRecord(record.message);
|
|
74
|
+
if (!message) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
return normalizeContentItems(message.content).flatMap(extractTextFromContentItem);
|
|
78
|
+
}
|
|
79
|
+
function extractResponsesOutputText(data) {
|
|
80
|
+
const record = asRecord(data);
|
|
81
|
+
if (!record)
|
|
82
|
+
return "";
|
|
83
|
+
if (typeof record.output_text === "string" && record.output_text.trim()) {
|
|
84
|
+
return record.output_text;
|
|
85
|
+
}
|
|
86
|
+
if (Array.isArray(record.output)) {
|
|
87
|
+
const fromOutput = record.output.flatMap(extractTextFromOutputItem).join("");
|
|
88
|
+
if (fromOutput.trim())
|
|
89
|
+
return fromOutput;
|
|
90
|
+
}
|
|
91
|
+
if (Array.isArray(record.choices)) {
|
|
92
|
+
const fromChoices = record.choices.flatMap(extractTextFromChoice).join("");
|
|
93
|
+
if (fromChoices.trim())
|
|
94
|
+
return fromChoices;
|
|
95
|
+
}
|
|
96
|
+
return "";
|
|
97
|
+
}
|
|
98
|
+
export {
|
|
99
|
+
extractResponsesOutputText
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
//# debugId=EE6436AA65D99EB164756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/responses-output.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"type JsonRecord = Record<string, unknown>;\n\nfunction asRecord(value: unknown): JsonRecord | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n return value as JsonRecord;\n}\n\nfunction normalizeContentItems(value: unknown): unknown[] {\n if (Array.isArray(value)) return value;\n if (typeof value === \"string\") return [{ type: \"text\", text: value }];\n return value && typeof value === \"object\" ? [value] : [];\n}\n\nfunction extractTextFromContentItem(value: unknown): string[] {\n if (typeof value === \"string\") {\n return [value];\n }\n\n const record = asRecord(value);\n if (!record) return [];\n\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.output_text === \"string\"\n ? record.output_text\n : typeof record.content === \"string\"\n ? record.content\n : \"\";\n const type = typeof record.type === \"string\" ? record.type : undefined;\n\n if (text && (!type || type === \"output_text\" || type === \"text\")) {\n return [text];\n }\n\n return [];\n}\n\nfunction extractTextFromOutputItem(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) return [];\n\n const directContent = normalizeContentItems(record.content);\n if (directContent.length > 0) {\n return directContent.flatMap(extractTextFromContentItem);\n }\n\n const nestedMessage = asRecord(record.message);\n if (nestedMessage) {\n return normalizeContentItems(nestedMessage.content).flatMap(extractTextFromContentItem);\n }\n\n const type = typeof record.type === \"string\" ? record.type : undefined;\n const text =\n typeof record.text === \"string\"\n ? record.text\n : typeof record.output_text === \"string\"\n ? record.output_text\n : \"\";\n if (text && (type === \"output_text\" || type === \"text\")) {\n return [text];\n }\n\n return [];\n}\n\nfunction extractTextFromChoice(value: unknown): string[] {\n const record = asRecord(value);\n if (!record) return [];\n\n if (typeof record.text === \"string\" && record.text) {\n return [record.text];\n }\n\n const message = asRecord(record.message);\n if (!message) {\n return [];\n }\n\n return normalizeContentItems(message.content).flatMap(extractTextFromContentItem);\n}\n\n/**\n * Recover text from Responses-style payloads, tolerating both the documented\n * `output_text` field and the common structured `output` item variants.\n *\n * Cloud responses sometimes carry the same body in BOTH `output_text` AND\n * `output[]`/`choices[]`. Joining segments in that case duplicates the model\n * output downstream (caller sees `…json{…}\\n``````json{…}…`), which then\n * trips JSON.parse with \"Unrecognized token '`'\" because of the run of\n * backticks where the two copies meet. Prefer the first non-empty source\n * instead of joining.\n */\nexport function extractResponsesOutputText(data: unknown): string {\n const record = asRecord(data);\n if (!record) return \"\";\n\n if (typeof record.output_text === \"string\" && record.output_text.trim()) {\n return record.output_text;\n }\n\n if (Array.isArray(record.output)) {\n const fromOutput = record.output.flatMap(extractTextFromOutputItem).join(\"\");\n if (fromOutput.trim()) return fromOutput;\n }\n\n if (Array.isArray(record.choices)) {\n const fromChoices = record.choices.flatMap(extractTextFromChoice).join(\"\");\n if (fromChoices.trim()) return fromChoices;\n }\n\n return \"\";\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "EE6436AA65D99EB164756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { CloudApiClient, ElizaCloudClient } from "@elizaos/cloud-sdk";
|
|
2
|
+
import type { IAgentRuntime } from "@elizaos/core";
|
|
3
|
+
export declare function createCloudApiClient(runtime: IAgentRuntime, embedding?: boolean): CloudApiClient;
|
|
4
|
+
export declare function createElizaCloudClient(runtime: IAgentRuntime): ElizaCloudClient;
|
|
5
|
+
//# sourceMappingURL=sdk-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk-client.d.ts","sourceRoot":"","sources":["../../src/utils/sdk-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAuBnD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,UAAQ,GAAG,cAAc,CAO9F;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAO/E"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
+
|
|
19
|
+
// src/utils/config.ts
|
|
20
|
+
import { logger } from "@elizaos/core";
|
|
21
|
+
import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
|
|
22
|
+
var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "zai-glm-4.7";
|
|
23
|
+
function getEnvValue(key) {
|
|
24
|
+
if (typeof process === "undefined") {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const value = process.env[key];
|
|
28
|
+
return value === undefined ? undefined : String(value);
|
|
29
|
+
}
|
|
30
|
+
function getSetting(runtime, key, defaultValue) {
|
|
31
|
+
const value = runtime.getSetting(key);
|
|
32
|
+
if (value !== undefined && value !== null) {
|
|
33
|
+
return String(value);
|
|
34
|
+
}
|
|
35
|
+
return getEnvValue(key) ?? defaultValue;
|
|
36
|
+
}
|
|
37
|
+
function isBrowser() {
|
|
38
|
+
return typeof globalThis !== "undefined" && typeof globalThis.document !== "undefined";
|
|
39
|
+
}
|
|
40
|
+
function isProxyMode(runtime) {
|
|
41
|
+
return isBrowser() && !!getSetting(runtime, "ELIZAOS_CLOUD_BROWSER_BASE_URL");
|
|
42
|
+
}
|
|
43
|
+
function getBaseURL(runtime) {
|
|
44
|
+
const browserURL = getSetting(runtime, "ELIZAOS_CLOUD_BROWSER_BASE_URL");
|
|
45
|
+
const baseURL = isBrowser() && browserURL ? browserURL : getSetting(runtime, "ELIZAOS_CLOUD_BASE_URL", "https://www.elizacloud.ai/api/v1");
|
|
46
|
+
return baseURL;
|
|
47
|
+
}
|
|
48
|
+
function getEmbeddingBaseURL(runtime) {
|
|
49
|
+
const embeddingURL = isBrowser() ? getSetting(runtime, "ELIZAOS_CLOUD_BROWSER_EMBEDDING_URL") || getSetting(runtime, "ELIZAOS_CLOUD_BROWSER_BASE_URL") : getSetting(runtime, "ELIZAOS_CLOUD_EMBEDDING_URL");
|
|
50
|
+
if (embeddingURL) {
|
|
51
|
+
logger.debug(`[ELIZAOS_CLOUD] Using specific embedding base URL: ${embeddingURL}`);
|
|
52
|
+
return embeddingURL;
|
|
53
|
+
}
|
|
54
|
+
logger.debug("[ELIZAOS_CLOUD] Falling back to general base URL for embeddings.");
|
|
55
|
+
return getBaseURL(runtime);
|
|
56
|
+
}
|
|
57
|
+
function getApiKey(runtime) {
|
|
58
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_API_KEY");
|
|
59
|
+
}
|
|
60
|
+
function getEmbeddingApiKey(runtime) {
|
|
61
|
+
const embeddingApiKey = getSetting(runtime, "ELIZAOS_CLOUD_EMBEDDING_API_KEY");
|
|
62
|
+
if (embeddingApiKey) {
|
|
63
|
+
logger.debug("[ELIZAOS_CLOUD] Using specific embedding API key (present)");
|
|
64
|
+
return embeddingApiKey;
|
|
65
|
+
}
|
|
66
|
+
logger.debug("[ELIZAOS_CLOUD] Falling back to general API key for embeddings.");
|
|
67
|
+
return getApiKey(runtime);
|
|
68
|
+
}
|
|
69
|
+
function getSmallModel(runtime) {
|
|
70
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_SMALL_MODEL") ?? getSetting(runtime, "SMALL_MODEL", DEFAULT_ELIZA_CLOUD_TEXT_MODEL);
|
|
71
|
+
}
|
|
72
|
+
function getNanoModel(runtime) {
|
|
73
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_NANO_MODEL") ?? getSetting(runtime, "NANO_MODEL") ?? getSmallModel(runtime);
|
|
74
|
+
}
|
|
75
|
+
function getMediumModel(runtime) {
|
|
76
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_MEDIUM_MODEL") ?? getSetting(runtime, "MEDIUM_MODEL") ?? getSmallModel(runtime);
|
|
77
|
+
}
|
|
78
|
+
function getLargeModel(runtime) {
|
|
79
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_LARGE_MODEL") ?? getSetting(runtime, "LARGE_MODEL", DEFAULT_ELIZA_CLOUD_LARGE_MODEL);
|
|
80
|
+
}
|
|
81
|
+
function getMegaModel(runtime) {
|
|
82
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_MEGA_MODEL") ?? getSetting(runtime, "MEGA_MODEL") ?? getLargeModel(runtime);
|
|
83
|
+
}
|
|
84
|
+
function getResponseHandlerModel(runtime) {
|
|
85
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL") ?? getSetting(runtime, "ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL") ?? getSetting(runtime, "RESPONSE_HANDLER_MODEL") ?? getSetting(runtime, "SHOULD_RESPOND_MODEL") ?? getSmallModel(runtime);
|
|
86
|
+
}
|
|
87
|
+
function getActionPlannerModel(runtime) {
|
|
88
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_ACTION_PLANNER_MODEL") ?? getSetting(runtime, "ELIZAOS_CLOUD_PLANNER_MODEL") ?? getSetting(runtime, "ACTION_PLANNER_MODEL") ?? getSetting(runtime, "PLANNER_MODEL") ?? getLargeModel(runtime);
|
|
89
|
+
}
|
|
90
|
+
function getResponseModel(runtime) {
|
|
91
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_RESPONSE_MODEL") ?? getSetting(runtime, "RESPONSE_MODEL") ?? getLargeModel(runtime);
|
|
92
|
+
}
|
|
93
|
+
function getImageDescriptionModel(runtime) {
|
|
94
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL", "gpt-5.4-mini");
|
|
95
|
+
}
|
|
96
|
+
function getImageGenerationModel(runtime) {
|
|
97
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL", "google/gemini-2.5-flash-image") ?? "google/gemini-2.5-flash-image";
|
|
98
|
+
}
|
|
99
|
+
function getResearchModel(runtime) {
|
|
100
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_RESEARCH_MODEL") ?? getSetting(runtime, "RESEARCH_MODEL", "o3-deep-research");
|
|
101
|
+
}
|
|
102
|
+
function getTTSModel(runtime) {
|
|
103
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_TTS_MODEL", "gpt-5-mini-tts");
|
|
104
|
+
}
|
|
105
|
+
function getTranscriptionModel(runtime) {
|
|
106
|
+
return getSetting(runtime, "ELIZAOS_CLOUD_TRANSCRIPTION_MODEL", "gpt-5-mini-transcribe");
|
|
107
|
+
}
|
|
108
|
+
function getExperimentalTelemetry(runtime) {
|
|
109
|
+
const setting = getSetting(runtime, "ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY", "false");
|
|
110
|
+
return String(setting).toLowerCase() === "true";
|
|
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
|
+
}
|
|
121
|
+
|
|
122
|
+
// src/utils/sdk-client.ts
|
|
123
|
+
import { ElizaCloudClient } from "@elizaos/cloud-sdk";
|
|
124
|
+
function trimTrailingSlash(value) {
|
|
125
|
+
return value.replace(/\/+$/, "");
|
|
126
|
+
}
|
|
127
|
+
function apiBaseToSiteBaseUrl(apiBaseUrl) {
|
|
128
|
+
const trimmed = trimTrailingSlash(apiBaseUrl);
|
|
129
|
+
return trimmed.endsWith("/api/v1") ? trimmed.slice(0, -"/api/v1".length) : trimmed;
|
|
130
|
+
}
|
|
131
|
+
function apiKeyForRuntime(runtime, embedding = false) {
|
|
132
|
+
if (isBrowser())
|
|
133
|
+
return;
|
|
134
|
+
return embedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);
|
|
135
|
+
}
|
|
136
|
+
function createCloudApiClient(runtime, embedding = false) {
|
|
137
|
+
const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);
|
|
138
|
+
return new ElizaCloudClient({
|
|
139
|
+
apiBaseUrl: trimTrailingSlash(baseUrl),
|
|
140
|
+
baseUrl: apiBaseToSiteBaseUrl(baseUrl),
|
|
141
|
+
apiKey: apiKeyForRuntime(runtime, embedding)
|
|
142
|
+
}).v1;
|
|
143
|
+
}
|
|
144
|
+
function createElizaCloudClient(runtime) {
|
|
145
|
+
const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));
|
|
146
|
+
return new ElizaCloudClient({
|
|
147
|
+
apiBaseUrl,
|
|
148
|
+
baseUrl: apiBaseToSiteBaseUrl(apiBaseUrl),
|
|
149
|
+
apiKey: apiKeyForRuntime(runtime)
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export {
|
|
153
|
+
createElizaCloudClient,
|
|
154
|
+
createCloudApiClient
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
//# debugId=0DD7E6E062EFC6E864756E2164756E21
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/config.ts", "../src/utils/sdk-client.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import type { IAgentRuntime } from \"@elizaos/core\";\nimport { logger } from \"@elizaos/core\";\nimport { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from \"@elizaos/core\";\n\nexport const DEFAULT_ELIZA_CLOUD_LARGE_MODEL = \"zai-glm-4.7\";\n\nfunction getEnvValue(key: string): string | undefined {\n if (typeof process === \"undefined\") {\n return undefined;\n }\n const value = process.env[key];\n return value === undefined ? undefined : String(value);\n}\n\nexport function getSetting(\n runtime: IAgentRuntime,\n key: string,\n defaultValue?: string\n): string | undefined {\n const value = runtime.getSetting(key);\n if (value !== undefined && value !== null) {\n return String(value);\n }\n return getEnvValue(key) ?? defaultValue;\n}\n\nexport function isBrowser(): boolean {\n return (\n typeof globalThis !== \"undefined\" &&\n typeof (globalThis as { document?: Document }).document !== \"undefined\"\n );\n}\n\nexport function isProxyMode(runtime: IAgentRuntime): boolean {\n return isBrowser() && !!getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n}\n\nexport function getBaseURL(runtime: IAgentRuntime): string {\n const browserURL = getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\");\n const baseURL = (\n isBrowser() && browserURL\n ? browserURL\n : getSetting(runtime, \"ELIZAOS_CLOUD_BASE_URL\", \"https://www.elizacloud.ai/api/v1\")\n ) as string;\n return baseURL;\n}\n\nexport function getEmbeddingBaseURL(runtime: IAgentRuntime): string {\n const embeddingURL = isBrowser()\n ? getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_EMBEDDING_URL\") ||\n getSetting(runtime, \"ELIZAOS_CLOUD_BROWSER_BASE_URL\")\n : getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_URL\");\n if (embeddingURL) {\n logger.debug(`[ELIZAOS_CLOUD] Using specific embedding base URL: ${embeddingURL}`);\n return embeddingURL;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general base URL for embeddings.\");\n return getBaseURL(runtime);\n}\n\nexport function getApiKey(runtime: IAgentRuntime): string | undefined {\n return getSetting(runtime, \"ELIZAOS_CLOUD_API_KEY\");\n}\n\nexport function getEmbeddingApiKey(runtime: IAgentRuntime): string | undefined {\n const embeddingApiKey = getSetting(runtime, \"ELIZAOS_CLOUD_EMBEDDING_API_KEY\");\n if (embeddingApiKey) {\n logger.debug(\"[ELIZAOS_CLOUD] Using specific embedding API key (present)\");\n return embeddingApiKey;\n }\n logger.debug(\"[ELIZAOS_CLOUD] Falling back to general API key for embeddings.\");\n return getApiKey(runtime);\n}\n\nexport function getSmallModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_SMALL_MODEL\") ??\n (getSetting(runtime, \"SMALL_MODEL\", DEFAULT_ELIZA_CLOUD_TEXT_MODEL) as string)\n );\n}\n\nexport function getNanoModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_NANO_MODEL\") ??\n getSetting(runtime, \"NANO_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getMediumModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEDIUM_MODEL\") ??\n getSetting(runtime, \"MEDIUM_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getLargeModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_LARGE_MODEL\") ??\n (getSetting(runtime, \"LARGE_MODEL\", DEFAULT_ELIZA_CLOUD_LARGE_MODEL) as string)\n );\n}\n\nexport function getMegaModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_MEGA_MODEL\") ??\n getSetting(runtime, \"MEGA_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseHandlerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_SHOULD_RESPOND_MODEL\") ??\n getSetting(runtime, \"RESPONSE_HANDLER_MODEL\") ??\n getSetting(runtime, \"SHOULD_RESPOND_MODEL\") ??\n getSmallModel(runtime)\n );\n}\n\nexport function getActionPlannerModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"ELIZAOS_CLOUD_PLANNER_MODEL\") ??\n getSetting(runtime, \"ACTION_PLANNER_MODEL\") ??\n getSetting(runtime, \"PLANNER_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getResponseModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESPONSE_MODEL\") ??\n getSetting(runtime, \"RESPONSE_MODEL\") ??\n getLargeModel(runtime)\n );\n}\n\nexport function getImageDescriptionModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MODEL\", \"gpt-5.4-mini\") as string;\n}\n\nexport function getImageGenerationModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_IMAGE_GENERATION_MODEL\", \"google/gemini-2.5-flash-image\") ??\n \"google/gemini-2.5-flash-image\"\n );\n}\n\nexport function getResearchModel(runtime: IAgentRuntime): string {\n return (\n getSetting(runtime, \"ELIZAOS_CLOUD_RESEARCH_MODEL\") ??\n (getSetting(runtime, \"RESEARCH_MODEL\", \"o3-deep-research\") as string)\n );\n}\n\nexport function getTTSModel(runtime: IAgentRuntime): string {\n return getSetting(runtime, \"ELIZAOS_CLOUD_TTS_MODEL\", \"gpt-5-mini-tts\") as string;\n}\n\nexport function getTranscriptionModel(runtime: IAgentRuntime): string {\n return getSetting(\n runtime,\n \"ELIZAOS_CLOUD_TRANSCRIPTION_MODEL\",\n \"gpt-5-mini-transcribe\"\n ) as string;\n}\n\nexport function getExperimentalTelemetry(runtime: IAgentRuntime): boolean {\n const setting = getSetting(runtime, \"ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY\", \"false\");\n return String(setting).toLowerCase() === \"true\";\n}\n\n/**\n * Resolve a client-side timeout (ms) for a cloud model round-trip from `envKey`,\n * falling back to `defaultMs`. `0`/negative/non-numeric → undefined (opt out).\n *\n * cloud-sdk applies NO default timeout (a fetch with no signal hangs until the\n * platform default), so turn-blocking calls (TTS/STT in a voice turn, deep\n * research) need an explicit ceiling or a stalled gateway hangs the turn.\n */\nexport function resolveCloudTimeoutMs(\n envKey: string,\n defaultMs: number\n): number | undefined {\n const raw = typeof process !== \"undefined\" ? process.env[envKey] : undefined;\n if (raw === undefined || raw.trim() === \"\") return defaultMs;\n const parsed = Number.parseInt(raw, 10);\n if (!Number.isFinite(parsed)) return defaultMs;\n return parsed <= 0 ? undefined : parsed;\n}\n",
|
|
6
|
+
"import { CloudApiClient, ElizaCloudClient } from \"@elizaos/cloud-sdk\";\nimport type { IAgentRuntime } from \"@elizaos/core\";\nimport {\n getApiKey,\n getBaseURL,\n getEmbeddingApiKey,\n getEmbeddingBaseURL,\n isBrowser,\n} from \"./config\";\n\nfunction trimTrailingSlash(value: string): string {\n return value.replace(/\\/+$/, \"\");\n}\n\nfunction apiBaseToSiteBaseUrl(apiBaseUrl: string): string {\n const trimmed = trimTrailingSlash(apiBaseUrl);\n return trimmed.endsWith(\"/api/v1\") ? trimmed.slice(0, -\"/api/v1\".length) : trimmed;\n}\n\nfunction apiKeyForRuntime(runtime: IAgentRuntime, embedding = false): string | undefined {\n if (isBrowser()) return undefined;\n return embedding ? getEmbeddingApiKey(runtime) : getApiKey(runtime);\n}\n\nexport function createCloudApiClient(runtime: IAgentRuntime, embedding = false): CloudApiClient {\n const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);\n return new ElizaCloudClient({\n apiBaseUrl: trimTrailingSlash(baseUrl),\n baseUrl: apiBaseToSiteBaseUrl(baseUrl),\n apiKey: apiKeyForRuntime(runtime, embedding),\n }).v1;\n}\n\nexport function createElizaCloudClient(runtime: IAgentRuntime): ElizaCloudClient {\n const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));\n return new ElizaCloudClient({\n apiBaseUrl,\n baseUrl: apiBaseToSiteBaseUrl(apiBaseUrl),\n apiKey: apiKeyForRuntime(runtime),\n });\n}\n"
|
|
7
|
+
],
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "0DD7E6E062EFC6E864756E2164756E21",
|
|
10
|
+
"names": []
|
|
11
|
+
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Waifu metering bridge.
|
|
3
|
+
*
|
|
4
|
+
* A hosted waifu agent runs as a sandboxed container whose model inference is
|
|
5
|
+
* routed through the Eliza Cloud metered inference gateway. The gateway is the
|
|
6
|
+
* honest meter: it owns the per-model pricing table and the platform markup,
|
|
7
|
+
* and it debits the organization's credit balance on every call. That debit is
|
|
8
|
+
* authoritative and already happens server-side.
|
|
9
|
+
*
|
|
10
|
+
* What was missing is the *signal back to waifu*: waifu's burn rollup
|
|
11
|
+
* (`apps/worker/src/processors/agent-rollup.ts`) reads `inference.spent`
|
|
12
|
+
* agent_events to compute `agentDailyBurnUsd` / `agentRunwayDays`, but falls
|
|
13
|
+
* back to a $5/day default estimate when no such events exist. Nothing emitted them.
|
|
14
|
+
*
|
|
15
|
+
* This bridge listens for the runtime `MODEL_USED` event (emitted by the cloud
|
|
16
|
+
* model handlers after each inference) and POSTs a signed `inference.spent`
|
|
17
|
+
* webhook to waifu's receiver (`POST /webhooks/eliza-cloud/inference`). It is
|
|
18
|
+
* inactive unless the container is provisioned with the waifu metering env knobs,
|
|
19
|
+
* so it never fires for non-hosted (local dev / standalone) agents.
|
|
20
|
+
*
|
|
21
|
+
* Token counts are exact (reported by the gateway). USD is the authoritative
|
|
22
|
+
* post-markup cost when the gateway surfaces it (`usage.cost_usd` /
|
|
23
|
+
* `X-Eliza-Cost-Usd`); otherwise a conservative token-based estimate is used,
|
|
24
|
+
* configurable per-model via WAIFU_METER_USD_PER_1K_INPUT / _OUTPUT. The credit
|
|
25
|
+
* debit itself is always the cloud's authoritative number; the estimate only
|
|
26
|
+
* affects waifu's burn display until the cloud cost is wired through.
|
|
27
|
+
*/
|
|
28
|
+
import { type IAgentRuntime } from "@elizaos/core";
|
|
29
|
+
import type { ModelUsageEventPayload } from "./events";
|
|
30
|
+
/**
|
|
31
|
+
* The MODEL_USED event `source` set by the Eliza Cloud metered inference path
|
|
32
|
+
* (see ./events.ts emitModelUsageEvent). ElizaOS event dispatch is global: every
|
|
33
|
+
* MODEL_USED handler receives every MODEL_USED event regardless of which plugin
|
|
34
|
+
* emitted it. Only inference that actually went through the cloud metered
|
|
35
|
+
* gateway debits real credits, so we must meter only those events. Other model
|
|
36
|
+
* providers (e.g. plugin-local-inference emits source "local-ai" for free CPU
|
|
37
|
+
* inference, plugin-openrouter emits "openrouter", etc.) must never be metered
|
|
38
|
+
* as cloud burn.
|
|
39
|
+
*/
|
|
40
|
+
export declare const CLOUD_INFERENCE_SOURCE = "elizacloud";
|
|
41
|
+
export interface WaifuMeteringConfig {
|
|
42
|
+
webhookUrl: string;
|
|
43
|
+
secret: string;
|
|
44
|
+
agentId: string;
|
|
45
|
+
usdPer1kInput: number;
|
|
46
|
+
usdPer1kOutput: number;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Resolve the metering config from the container environment. Returns null
|
|
50
|
+
* (bridge disabled) when the required knobs are absent, which is the case for
|
|
51
|
+
* any agent that is not a hosted waifu agent.
|
|
52
|
+
*/
|
|
53
|
+
export declare function resolveWaifuMeteringConfig(runtime: IAgentRuntime): WaifuMeteringConfig | null;
|
|
54
|
+
/**
|
|
55
|
+
* Resolve the inference webhook URL from the container environment.
|
|
56
|
+
*
|
|
57
|
+
* Prefers the explicit WAIFU_INFERENCE_WEBHOOK_URL. If that is absent but a
|
|
58
|
+
* credits webhook URL (WAIFU_WEBHOOK_URL) is present, derive the sibling
|
|
59
|
+
* `/inference` receiver path from the known `/credits` path. We NEVER post
|
|
60
|
+
* inference events to the credits receiver: the credits mapper defaults unknown
|
|
61
|
+
* payloads to `credits.topped_up`, which would corrupt credit state. If we
|
|
62
|
+
* cannot safely derive an inference URL, return undefined so the bridge stays
|
|
63
|
+
* disabled.
|
|
64
|
+
*/
|
|
65
|
+
export declare function resolveInferenceWebhookUrl(runtime: IAgentRuntime): string | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Map a known `/credits` webhook URL to its sibling `/inference` URL. Returns
|
|
68
|
+
* undefined when the input does not contain a `/credits` path segment, so we
|
|
69
|
+
* never accidentally post inference to a non-inference endpoint.
|
|
70
|
+
*/
|
|
71
|
+
export declare function deriveInferenceUrlFromCredits(creditsUrl: string): string | undefined;
|
|
72
|
+
/**
|
|
73
|
+
* HMAC signature compatible with waifu's webhook receiver:
|
|
74
|
+
* `sha256=` + HMAC-SHA256 over `${timestamp}.${rawBody}`.
|
|
75
|
+
*/
|
|
76
|
+
export declare function signWaifuWebhook(rawBody: string, timestamp: string, secret: string): string;
|
|
77
|
+
export declare function estimateUsd(config: WaifuMeteringConfig, inputTokens: number, outputTokens: number): number;
|
|
78
|
+
export interface InferenceSpentPayload {
|
|
79
|
+
agentId: string;
|
|
80
|
+
modelType: string;
|
|
81
|
+
modelName?: string;
|
|
82
|
+
promptTokens: number;
|
|
83
|
+
completionTokens: number;
|
|
84
|
+
totalTokens: number;
|
|
85
|
+
usd: number;
|
|
86
|
+
costSource: "gateway" | "estimate";
|
|
87
|
+
timestamp: string;
|
|
88
|
+
idempotencyKey: string;
|
|
89
|
+
source: "elizacloud";
|
|
90
|
+
}
|
|
91
|
+
export declare function buildInferenceSpentPayload(config: WaifuMeteringConfig, event: ModelUsageEventPayload, now?: Date): InferenceSpentPayload | null;
|
|
92
|
+
/**
|
|
93
|
+
* POST a signed `inference.spent` webhook to waifu. Best-effort: failures are
|
|
94
|
+
* logged but never thrown, so metering never blocks or breaks an agent reply.
|
|
95
|
+
* A 10s AbortSignal bounds the request so a stuck receiver can never leave a
|
|
96
|
+
* background fetch hanging.
|
|
97
|
+
*/
|
|
98
|
+
export declare function postInferenceSpent(config: WaifuMeteringConfig, payload: InferenceSpentPayload, fetchImpl?: typeof fetch): Promise<{
|
|
99
|
+
ok: boolean;
|
|
100
|
+
status?: number;
|
|
101
|
+
}>;
|
|
102
|
+
/**
|
|
103
|
+
* Build the MODEL_USED event handler that forwards inference spend to waifu.
|
|
104
|
+
* Resolves config lazily per-event so it stays inactive until the metering env
|
|
105
|
+
* is present, and so config changes (rare) are picked up without a restart.
|
|
106
|
+
*/
|
|
107
|
+
export declare function createWaifuMeteringHandler(fetchImpl?: typeof fetch): (payload: ModelUsageEventPayload) => Promise<void>;
|
|
108
|
+
//# sourceMappingURL=waifu-metering.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"waifu-metering.d.ts","sourceRoot":"","sources":["../../src/utils/waifu-metering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAU,MAAM,eAAe,CAAC;AAC3D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAKvD;;;;;;;;;GASG;AACH,eAAO,MAAM,sBAAsB,eAAe,CAAC;AAEnD,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;CACxB;AAuBD;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,aAAa,GACrB,mBAAmB,GAAG,IAAI,CAqB5B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAerF;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgBpF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,WAAW,CACzB,MAAM,EAAE,mBAAmB,EAC3B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GACnB,MAAM,CAKR;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,SAAS,GAAG,UAAU,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,mBAAmB,EAC3B,KAAK,EAAE,sBAAsB,EAC7B,GAAG,GAAE,IAAiB,GACrB,qBAAqB,GAAG,IAAI,CAkC9B;AAID;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,mBAAmB,EAC3B,OAAO,EAAE,qBAAqB,EAC9B,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAmC3C;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,GAAE,OAAO,KAAa,GAC9B,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,IAAI,CAAC,CAepD"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __returnValue = (v) => v;
|
|
4
|
+
function __exportSetter(name, newValue) {
|
|
5
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
+
}
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, {
|
|
10
|
+
get: all[name],
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
set: __exportSetter.bind(all, name)
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
+
var __require = /* @__PURE__ */ createRequire(import.meta.url);
|
|
18
|
+
|
|
19
|
+
// src/utils/waifu-metering.ts
|
|
20
|
+
import crypto from "node:crypto";
|
|
21
|
+
import { logger } from "@elizaos/core";
|
|
22
|
+
var DEFAULT_USD_PER_1K_INPUT = 0.003;
|
|
23
|
+
var DEFAULT_USD_PER_1K_OUTPUT = 0.015;
|
|
24
|
+
var CLOUD_INFERENCE_SOURCE = "elizacloud";
|
|
25
|
+
function readEnv(runtime, key) {
|
|
26
|
+
const fromSettings = typeof runtime.getSetting === "function" ? runtime.getSetting(key) : undefined;
|
|
27
|
+
const value = typeof fromSettings === "string" && fromSettings || (typeof process !== "undefined" ? process.env?.[key] : undefined);
|
|
28
|
+
const trimmed = typeof value === "string" ? value.trim() : "";
|
|
29
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
30
|
+
}
|
|
31
|
+
function readNumberEnv(runtime, key, fallback) {
|
|
32
|
+
const raw = readEnv(runtime, key);
|
|
33
|
+
if (!raw)
|
|
34
|
+
return fallback;
|
|
35
|
+
const parsed = Number(raw);
|
|
36
|
+
return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;
|
|
37
|
+
}
|
|
38
|
+
function resolveWaifuMeteringConfig(runtime) {
|
|
39
|
+
const webhookUrl = resolveInferenceWebhookUrl(runtime);
|
|
40
|
+
const secret = readEnv(runtime, "WAIFU_WEBHOOK_SECRET") ?? readEnv(runtime, "WAIFU_INFERENCE_WEBHOOK_SECRET");
|
|
41
|
+
const agentId = readEnv(runtime, "WAIFU_AGENT_ID") ?? readEnv(runtime, "WAIFU_CORE_AGENT_ID");
|
|
42
|
+
if (!webhookUrl || !secret || !agentId) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
webhookUrl,
|
|
47
|
+
secret,
|
|
48
|
+
agentId,
|
|
49
|
+
usdPer1kInput: readNumberEnv(runtime, "WAIFU_METER_USD_PER_1K_INPUT", DEFAULT_USD_PER_1K_INPUT),
|
|
50
|
+
usdPer1kOutput: readNumberEnv(runtime, "WAIFU_METER_USD_PER_1K_OUTPUT", DEFAULT_USD_PER_1K_OUTPUT)
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function resolveInferenceWebhookUrl(runtime) {
|
|
54
|
+
const explicit = readEnv(runtime, "WAIFU_INFERENCE_WEBHOOK_URL");
|
|
55
|
+
if (explicit)
|
|
56
|
+
return explicit;
|
|
57
|
+
const creditsUrl = readEnv(runtime, "WAIFU_WEBHOOK_URL");
|
|
58
|
+
if (!creditsUrl)
|
|
59
|
+
return;
|
|
60
|
+
const derived = deriveInferenceUrlFromCredits(creditsUrl);
|
|
61
|
+
if (derived)
|
|
62
|
+
return derived;
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
function deriveInferenceUrlFromCredits(creditsUrl) {
|
|
66
|
+
try {
|
|
67
|
+
const url = new URL(creditsUrl);
|
|
68
|
+
if (!/\/credits\/?$/.test(url.pathname)) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
url.pathname = url.pathname.replace(/\/credits(\/?)$/, "/inference$1");
|
|
72
|
+
return url.toString();
|
|
73
|
+
} catch {
|
|
74
|
+
if (/\/credits\/?$/.test(creditsUrl)) {
|
|
75
|
+
return creditsUrl.replace(/\/credits(\/?)$/, "/inference$1");
|
|
76
|
+
}
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function signWaifuWebhook(rawBody, timestamp, secret) {
|
|
81
|
+
return `sha256=${crypto.createHmac("sha256", secret).update(`${timestamp}.${rawBody}`).digest("hex")}`;
|
|
82
|
+
}
|
|
83
|
+
function estimateUsd(config, inputTokens, outputTokens) {
|
|
84
|
+
const usd = inputTokens / 1000 * config.usdPer1kInput + outputTokens / 1000 * config.usdPer1kOutput;
|
|
85
|
+
return Number.isFinite(usd) && usd > 0 ? usd : 0;
|
|
86
|
+
}
|
|
87
|
+
function buildInferenceSpentPayload(config, event, now = new Date) {
|
|
88
|
+
const promptTokens = Math.max(0, Math.round(Number(event.tokens?.prompt ?? 0)));
|
|
89
|
+
const completionTokens = Math.max(0, Math.round(Number(event.tokens?.completion ?? 0)));
|
|
90
|
+
const totalTokens = Math.max(0, Math.round(Number(event.tokens?.total ?? promptTokens + completionTokens)));
|
|
91
|
+
if (totalTokens === 0 && promptTokens === 0 && completionTokens === 0) {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
const gatewayCost = typeof event.costUsd === "number" && Number.isFinite(event.costUsd) && event.costUsd >= 0 ? event.costUsd : undefined;
|
|
95
|
+
const usd = gatewayCost ?? estimateUsd(config, promptTokens, completionTokens);
|
|
96
|
+
const timestamp = now.toISOString();
|
|
97
|
+
return {
|
|
98
|
+
agentId: config.agentId,
|
|
99
|
+
modelType: String(event.type ?? "unknown"),
|
|
100
|
+
...event.modelName ? { modelName: event.modelName } : {},
|
|
101
|
+
promptTokens,
|
|
102
|
+
completionTokens,
|
|
103
|
+
totalTokens,
|
|
104
|
+
usd,
|
|
105
|
+
costSource: gatewayCost !== undefined ? "gateway" : "estimate",
|
|
106
|
+
timestamp,
|
|
107
|
+
idempotencyKey: `inference:${config.agentId}:${crypto.randomUUID()}`,
|
|
108
|
+
source: "elizacloud"
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
var POST_TIMEOUT_MS = 1e4;
|
|
112
|
+
async function postInferenceSpent(config, payload, fetchImpl = fetch) {
|
|
113
|
+
const body = JSON.stringify(payload);
|
|
114
|
+
const signature = signWaifuWebhook(body, payload.timestamp, config.secret);
|
|
115
|
+
try {
|
|
116
|
+
const res = await fetchImpl(config.webhookUrl, {
|
|
117
|
+
method: "POST",
|
|
118
|
+
headers: {
|
|
119
|
+
"content-type": "application/json",
|
|
120
|
+
"X-Waifu-Webhook-Signature": signature
|
|
121
|
+
},
|
|
122
|
+
body,
|
|
123
|
+
signal: AbortSignal.timeout(POST_TIMEOUT_MS)
|
|
124
|
+
});
|
|
125
|
+
if (!res.ok) {
|
|
126
|
+
logger.warn(`[waifu-metering] inference.spent POST returned ${res.status} for agent ${config.agentId}`);
|
|
127
|
+
return { ok: false, status: res.status };
|
|
128
|
+
}
|
|
129
|
+
logger.debug(`[waifu-metering] inference.spent posted (agent=${config.agentId} tokens=${payload.totalTokens} usd=${payload.usd.toFixed(6)} src=${payload.costSource})`);
|
|
130
|
+
return { ok: true, status: res.status };
|
|
131
|
+
} catch (err) {
|
|
132
|
+
const aborted = err instanceof Error && err.name === "TimeoutError";
|
|
133
|
+
const detail = aborted ? `timed out after ${POST_TIMEOUT_MS}ms` : err instanceof Error ? err.message : String(err);
|
|
134
|
+
logger.warn(`[waifu-metering] inference.spent POST failed for agent ${config.agentId}: ${detail}`);
|
|
135
|
+
return { ok: false };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function createWaifuMeteringHandler(fetchImpl = fetch) {
|
|
139
|
+
return async (payload) => {
|
|
140
|
+
const runtime = payload?.runtime;
|
|
141
|
+
if (!runtime)
|
|
142
|
+
return;
|
|
143
|
+
if (payload?.source !== CLOUD_INFERENCE_SOURCE)
|
|
144
|
+
return;
|
|
145
|
+
const config = resolveWaifuMeteringConfig(runtime);
|
|
146
|
+
if (!config)
|
|
147
|
+
return;
|
|
148
|
+
const spent = buildInferenceSpentPayload(config, payload);
|
|
149
|
+
if (!spent)
|
|
150
|
+
return;
|
|
151
|
+
await postInferenceSpent(config, spent, fetchImpl);
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
export {
|
|
155
|
+
signWaifuWebhook,
|
|
156
|
+
resolveWaifuMeteringConfig,
|
|
157
|
+
resolveInferenceWebhookUrl,
|
|
158
|
+
postInferenceSpent,
|
|
159
|
+
estimateUsd,
|
|
160
|
+
deriveInferenceUrlFromCredits,
|
|
161
|
+
createWaifuMeteringHandler,
|
|
162
|
+
buildInferenceSpentPayload,
|
|
163
|
+
CLOUD_INFERENCE_SOURCE
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
//# debugId=17310B83242297D764756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/utils/waifu-metering.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"/**\n * Waifu metering bridge.\n *\n * A hosted waifu agent runs as a sandboxed container whose model inference is\n * routed through the Eliza Cloud metered inference gateway. The gateway is the\n * honest meter: it owns the per-model pricing table and the platform markup,\n * and it debits the organization's credit balance on every call. That debit is\n * authoritative and already happens server-side.\n *\n * What was missing is the *signal back to waifu*: waifu's burn rollup\n * (`apps/worker/src/processors/agent-rollup.ts`) reads `inference.spent`\n * agent_events to compute `agentDailyBurnUsd` / `agentRunwayDays`, but falls\n * back to a $5/day default estimate when no such events exist. Nothing emitted them.\n *\n * This bridge listens for the runtime `MODEL_USED` event (emitted by the cloud\n * model handlers after each inference) and POSTs a signed `inference.spent`\n * webhook to waifu's receiver (`POST /webhooks/eliza-cloud/inference`). It is\n * inactive unless the container is provisioned with the waifu metering env knobs,\n * so it never fires for non-hosted (local dev / standalone) agents.\n *\n * Token counts are exact (reported by the gateway). USD is the authoritative\n * post-markup cost when the gateway surfaces it (`usage.cost_usd` /\n * `X-Eliza-Cost-Usd`); otherwise a conservative token-based estimate is used,\n * configurable per-model via WAIFU_METER_USD_PER_1K_INPUT / _OUTPUT. The credit\n * debit itself is always the cloud's authoritative number; the estimate only\n * affects waifu's burn display until the cloud cost is wired through.\n */\n\nimport crypto from \"node:crypto\";\nimport { type IAgentRuntime, logger } from \"@elizaos/core\";\nimport type { ModelUsageEventPayload } from \"./events\";\n\nconst DEFAULT_USD_PER_1K_INPUT = 0.003;\nconst DEFAULT_USD_PER_1K_OUTPUT = 0.015;\n\n/**\n * The MODEL_USED event `source` set by the Eliza Cloud metered inference path\n * (see ./events.ts emitModelUsageEvent). ElizaOS event dispatch is global: every\n * MODEL_USED handler receives every MODEL_USED event regardless of which plugin\n * emitted it. Only inference that actually went through the cloud metered\n * gateway debits real credits, so we must meter only those events. Other model\n * providers (e.g. plugin-local-inference emits source \"local-ai\" for free CPU\n * inference, plugin-openrouter emits \"openrouter\", etc.) must never be metered\n * as cloud burn.\n */\nexport const CLOUD_INFERENCE_SOURCE = \"elizacloud\";\n\nexport interface WaifuMeteringConfig {\n webhookUrl: string;\n secret: string;\n agentId: string;\n usdPer1kInput: number;\n usdPer1kOutput: number;\n}\n\nfunction readEnv(runtime: IAgentRuntime, key: string): string | undefined {\n const fromSettings =\n typeof runtime.getSetting === \"function\" ? runtime.getSetting(key) : undefined;\n const value =\n (typeof fromSettings === \"string\" && fromSettings) ||\n (typeof process !== \"undefined\" ? process.env?.[key] : undefined);\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction readNumberEnv(\n runtime: IAgentRuntime,\n key: string,\n fallback: number\n): number {\n const raw = readEnv(runtime, key);\n if (!raw) return fallback;\n const parsed = Number(raw);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : fallback;\n}\n\n/**\n * Resolve the metering config from the container environment. Returns null\n * (bridge disabled) when the required knobs are absent, which is the case for\n * any agent that is not a hosted waifu agent.\n */\nexport function resolveWaifuMeteringConfig(\n runtime: IAgentRuntime\n): WaifuMeteringConfig | null {\n const webhookUrl = resolveInferenceWebhookUrl(runtime);\n const secret =\n readEnv(runtime, \"WAIFU_WEBHOOK_SECRET\") ?? readEnv(runtime, \"WAIFU_INFERENCE_WEBHOOK_SECRET\");\n const agentId = readEnv(runtime, \"WAIFU_AGENT_ID\") ?? readEnv(runtime, \"WAIFU_CORE_AGENT_ID\");\n\n if (!webhookUrl || !secret || !agentId) {\n return null;\n }\n\n return {\n webhookUrl,\n secret,\n agentId,\n usdPer1kInput: readNumberEnv(runtime, \"WAIFU_METER_USD_PER_1K_INPUT\", DEFAULT_USD_PER_1K_INPUT),\n usdPer1kOutput: readNumberEnv(\n runtime,\n \"WAIFU_METER_USD_PER_1K_OUTPUT\",\n DEFAULT_USD_PER_1K_OUTPUT\n ),\n };\n}\n\n/**\n * Resolve the inference webhook URL from the container environment.\n *\n * Prefers the explicit WAIFU_INFERENCE_WEBHOOK_URL. If that is absent but a\n * credits webhook URL (WAIFU_WEBHOOK_URL) is present, derive the sibling\n * `/inference` receiver path from the known `/credits` path. We NEVER post\n * inference events to the credits receiver: the credits mapper defaults unknown\n * payloads to `credits.topped_up`, which would corrupt credit state. If we\n * cannot safely derive an inference URL, return undefined so the bridge stays\n * disabled.\n */\nexport function resolveInferenceWebhookUrl(runtime: IAgentRuntime): string | undefined {\n const explicit = readEnv(runtime, \"WAIFU_INFERENCE_WEBHOOK_URL\");\n if (explicit) return explicit;\n\n const creditsUrl = readEnv(runtime, \"WAIFU_WEBHOOK_URL\");\n if (!creditsUrl) return undefined;\n\n // Only derive when the credits URL ends in a recognizable `/credits` segment.\n // Replacing the trailing `/credits` with `/inference` keeps the same host,\n // base path, and query string. Anything we cannot confidently map is treated\n // as unsafe and skipped, never reused as-is for inference.\n const derived = deriveInferenceUrlFromCredits(creditsUrl);\n if (derived) return derived;\n\n return undefined;\n}\n\n/**\n * Map a known `/credits` webhook URL to its sibling `/inference` URL. Returns\n * undefined when the input does not contain a `/credits` path segment, so we\n * never accidentally post inference to a non-inference endpoint.\n */\nexport function deriveInferenceUrlFromCredits(creditsUrl: string): string | undefined {\n try {\n const url = new URL(creditsUrl);\n if (!/\\/credits\\/?$/.test(url.pathname)) {\n return undefined;\n }\n url.pathname = url.pathname.replace(/\\/credits(\\/?)$/, \"/inference$1\");\n return url.toString();\n } catch {\n // Fall back to a string replacement for non-absolute URLs, still requiring\n // an explicit `/credits` segment so we cannot mis-route.\n if (/\\/credits\\/?$/.test(creditsUrl)) {\n return creditsUrl.replace(/\\/credits(\\/?)$/, \"/inference$1\");\n }\n return undefined;\n }\n}\n\n/**\n * HMAC signature compatible with waifu's webhook receiver:\n * `sha256=` + HMAC-SHA256 over `${timestamp}.${rawBody}`.\n */\nexport function signWaifuWebhook(rawBody: string, timestamp: string, secret: string): string {\n return `sha256=${crypto.createHmac(\"sha256\", secret).update(`${timestamp}.${rawBody}`).digest(\"hex\")}`;\n}\n\nexport function estimateUsd(\n config: WaifuMeteringConfig,\n inputTokens: number,\n outputTokens: number\n): number {\n const usd =\n (inputTokens / 1000) * config.usdPer1kInput +\n (outputTokens / 1000) * config.usdPer1kOutput;\n return Number.isFinite(usd) && usd > 0 ? usd : 0;\n}\n\nexport interface InferenceSpentPayload {\n agentId: string;\n modelType: string;\n modelName?: string;\n promptTokens: number;\n completionTokens: number;\n totalTokens: number;\n usd: number;\n costSource: \"gateway\" | \"estimate\";\n timestamp: string;\n idempotencyKey: string;\n source: \"elizacloud\";\n}\n\nexport function buildInferenceSpentPayload(\n config: WaifuMeteringConfig,\n event: ModelUsageEventPayload,\n now: Date = new Date()\n): InferenceSpentPayload | null {\n const promptTokens = Math.max(0, Math.round(Number(event.tokens?.prompt ?? 0)));\n const completionTokens = Math.max(0, Math.round(Number(event.tokens?.completion ?? 0)));\n const totalTokens = Math.max(\n 0,\n Math.round(Number(event.tokens?.total ?? promptTokens + completionTokens))\n );\n\n // Nothing was actually spent (e.g. a cached/short-circuited call with no\n // tokens). Skip so we never inflate the burn with empty events.\n if (totalTokens === 0 && promptTokens === 0 && completionTokens === 0) {\n return null;\n }\n\n const gatewayCost =\n typeof event.costUsd === \"number\" && Number.isFinite(event.costUsd) && event.costUsd >= 0\n ? event.costUsd\n : undefined;\n const usd = gatewayCost ?? estimateUsd(config, promptTokens, completionTokens);\n\n const timestamp = now.toISOString();\n return {\n agentId: config.agentId,\n modelType: String(event.type ?? \"unknown\"),\n ...(event.modelName ? { modelName: event.modelName } : {}),\n promptTokens,\n completionTokens,\n totalTokens,\n usd,\n costSource: gatewayCost !== undefined ? \"gateway\" : \"estimate\",\n timestamp,\n idempotencyKey: `inference:${config.agentId}:${crypto.randomUUID()}`,\n source: \"elizacloud\",\n };\n}\n\nconst POST_TIMEOUT_MS = 10000;\n\n/**\n * POST a signed `inference.spent` webhook to waifu. Best-effort: failures are\n * logged but never thrown, so metering never blocks or breaks an agent reply.\n * A 10s AbortSignal bounds the request so a stuck receiver can never leave a\n * background fetch hanging.\n */\nexport async function postInferenceSpent(\n config: WaifuMeteringConfig,\n payload: InferenceSpentPayload,\n fetchImpl: typeof fetch = fetch\n): Promise<{ ok: boolean; status?: number }> {\n const body = JSON.stringify(payload);\n const signature = signWaifuWebhook(body, payload.timestamp, config.secret);\n try {\n const res = await fetchImpl(config.webhookUrl, {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n \"X-Waifu-Webhook-Signature\": signature,\n },\n body,\n signal: AbortSignal.timeout(POST_TIMEOUT_MS),\n });\n if (!res.ok) {\n logger.warn(\n `[waifu-metering] inference.spent POST returned ${res.status} for agent ${config.agentId}`\n );\n return { ok: false, status: res.status };\n }\n logger.debug(\n `[waifu-metering] inference.spent posted (agent=${config.agentId} tokens=${payload.totalTokens} usd=${payload.usd.toFixed(6)} src=${payload.costSource})`\n );\n return { ok: true, status: res.status };\n } catch (err) {\n const aborted = err instanceof Error && err.name === \"TimeoutError\";\n const detail = aborted\n ? `timed out after ${POST_TIMEOUT_MS}ms`\n : err instanceof Error\n ? err.message\n : String(err);\n logger.warn(\n `[waifu-metering] inference.spent POST failed for agent ${config.agentId}: ${detail}`\n );\n return { ok: false };\n }\n}\n\n/**\n * Build the MODEL_USED event handler that forwards inference spend to waifu.\n * Resolves config lazily per-event so it stays inactive until the metering env\n * is present, and so config changes (rare) are picked up without a restart.\n */\nexport function createWaifuMeteringHandler(\n fetchImpl: typeof fetch = fetch\n): (payload: ModelUsageEventPayload) => Promise<void> {\n return async (payload: ModelUsageEventPayload): Promise<void> => {\n const runtime = payload?.runtime;\n if (!runtime) return;\n // ElizaOS dispatches MODEL_USED globally to every registered handler, so we\n // also receive events from other model providers (local-ai, openrouter,\n // etc.). Only cloud-metered inference debits real credits; meter only that\n // source so we never bill free/local inference as cloud burn.\n if (payload?.source !== CLOUD_INFERENCE_SOURCE) return;\n const config = resolveWaifuMeteringConfig(runtime);\n if (!config) return;\n const spent = buildInferenceSpentPayload(config, payload);\n if (!spent) return;\n await postInferenceSpent(config, spent, fetchImpl);\n };\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "17310B83242297D764756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|