@elizaos/plugin-elizacloud 2.0.0-alpha.7 → 2.0.0-beta.1
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 +220 -0
- package/auto-enable.ts +17 -0
- package/dist/browser/index.browser.js +2 -21
- package/dist/browser/index.browser.js.map +5 -37
- package/dist/cjs/index.d.ts +2 -2
- package/dist/cjs/index.node.cjs +12173 -2271
- package/dist/cjs/index.node.js.map +135 -27
- package/dist/cloud/auth.d.ts +19 -0
- package/dist/cloud/auth.d.ts.map +1 -0
- package/dist/cloud/auth.js +330 -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 +3 -0
- package/dist/cloud/base-url.d.ts.map +1 -0
- package/dist/cloud/base-url.js +77 -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 +432 -0
- package/dist/cloud/bridge-client.js.map +11 -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 +853 -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 +5195 -0
- package/dist/cloud/cloud-wallet.js.map +92 -0
- package/dist/cloud/index.d.ts +9 -0
- package/dist/cloud/index.d.ts.map +1 -0
- package/dist/cloud/index.js +30 -0
- package/dist/cloud/index.js.map +9 -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/validate-url.d.ts +2 -0
- package/dist/cloud/validate-url.d.ts.map +1 -0
- package/dist/cloud/validate-url.js +174 -0
- package/dist/cloud/validate-url.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/index.browser.d.ts +4 -2
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12851 -0
- package/dist/index.js.map +145 -0
- package/dist/index.node.d.ts +15 -2
- package/dist/index.node.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +169 -0
- package/dist/init.js.map +12 -0
- package/dist/lib/cloud-connection.d.ts +78 -0
- package/dist/lib/cloud-connection.d.ts.map +1 -0
- package/dist/lib/cloud-connection.js +731 -0
- package/dist/lib/cloud-connection.js.map +14 -0
- package/dist/lib/cloud-secrets.d.ts +23 -0
- package/dist/lib/cloud-secrets.d.ts.map +1 -0
- package/dist/lib/cloud-secrets.js +64 -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 +22 -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 +34 -0
- package/dist/lib/server-cloud-tts.d.ts.map +1 -0
- package/dist/lib/server-cloud-tts.js +549 -0
- package/dist/lib/server-cloud-tts.js.map +13 -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 +4 -0
- package/dist/lib/tts-debug.d.ts.map +1 -0
- package/dist/lib/tts-debug.js +57 -0
- package/dist/lib/tts-debug.js.map +10 -0
- package/dist/models/embeddings.d.ts.map +1 -1
- package/dist/models/embeddings.js +319 -0
- package/dist/models/embeddings.js.map +13 -0
- package/dist/models/image.d.ts.map +1 -1
- package/dist/models/image.js +374 -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 +1386 -0
- package/dist/models/index.js.map +20 -0
- package/dist/models/research.d.ts.map +1 -1
- package/dist/models/research.js +324 -0
- package/dist/models/research.js.map +13 -0
- package/dist/models/speech.d.ts.map +1 -1
- package/dist/models/speech.js +273 -0
- package/dist/models/speech.js.map +13 -0
- package/dist/models/text.d.ts +5 -2
- package/dist/models/text.d.ts.map +1 -1
- package/dist/models/text.js +803 -0
- package/dist/models/text.js.map +15 -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 +283 -0
- package/dist/models/transcription.js.map +13 -0
- package/dist/node/index.d.ts +2 -2
- package/dist/node/index.node.js +12171 -2266
- package/dist/node/index.node.js.map +135 -27
- package/dist/onboarding.d.ts +35 -0
- package/dist/onboarding.d.ts.map +1 -0
- package/dist/onboarding.js +883 -0
- package/dist/onboarding.js.map +14 -0
- package/dist/plugin.d.ts +20 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +7611 -0
- package/dist/plugin.js.map +104 -0
- package/dist/providers/openai.d.ts.map +1 -1
- package/dist/providers/openai.js +127 -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 +7612 -0
- package/dist/register-routes.js.map +105 -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 +807 -0
- package/dist/routes/cloud-billing-routes.js.map +14 -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 +538 -0
- package/dist/routes/cloud-compat-routes.js.map +14 -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 +22 -0
- package/dist/routes/cloud-relay-routes.d.ts.map +1 -0
- package/dist/routes/cloud-relay-routes.js +60 -0
- package/dist/routes/cloud-relay-routes.js.map +10 -0
- package/dist/routes/cloud-routes-autonomous.d.ts +83 -0
- package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-routes-autonomous.js +6134 -0
- package/dist/routes/cloud-routes-autonomous.js.map +97 -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 +6888 -0
- package/dist/routes/cloud-routes.js.map +100 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts +15 -0
- package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -0
- package/dist/routes/cloud-status-routes-autonomous.js +396 -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 +771 -0
- package/dist/routes/cloud-status-routes.js.map +15 -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 +363 -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.map +1 -1
- package/dist/services/cloud-container.js +241 -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 +41 -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 +3561 -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 +5377 -0
- package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -0
- package/dist/utils/cloud-sdk/public-routes.js +2950 -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 +655 -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 +7 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +137 -0
- package/dist/utils/config.js.map +10 -0
- package/dist/utils/events.d.ts.map +1 -1
- package/dist/utils/events.js +43 -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 +144 -0
- package/dist/utils/sdk-client.js.map +11 -0
- package/package.json +108 -19
- package/src/cloud/auth.ts +175 -0
- package/src/cloud/backup.ts +46 -0
- package/src/cloud/base-url.ts +62 -0
- package/src/cloud/bridge-client.ts +602 -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/index.ts +28 -0
- package/src/cloud/reconnect.ts +111 -0
- package/src/cloud/validate-url.ts +181 -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/index.browser.ts +10 -0
- package/src/index.node.ts +39 -0
- package/src/index.ts +347 -0
- package/src/init.ts +39 -0
- package/src/lib/cloud-connection.ts +663 -0
- package/src/lib/cloud-secrets.ts +58 -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 +139 -0
- package/src/lib/server-cloud-tts.ts +609 -0
- package/src/lib/state-paths.ts +28 -0
- package/src/lib/tts-debug.ts +34 -0
- package/src/models/embeddings.ts +234 -0
- package/src/models/image.ts +219 -0
- package/src/models/index.ts +16 -0
- package/src/models/research.ts +265 -0
- package/src/models/speech.ts +78 -0
- package/src/models/text.ts +899 -0
- package/src/models/tokenization.ts +67 -0
- package/src/models/transcription.ts +97 -0
- package/src/onboarding.ts +396 -0
- package/src/plugin.ts +243 -0
- package/src/providers/openai.ts +16 -0
- package/src/register-routes.ts +6 -0
- package/src/routes/cloud-billing-routes.ts +754 -0
- package/src/routes/cloud-compat-routes.ts +314 -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 +89 -0
- package/src/routes/cloud-routes-autonomous.ts +996 -0
- package/src/routes/cloud-routes.ts +576 -0
- package/src/routes/cloud-status-routes-autonomous.ts +234 -0
- package/src/routes/cloud-status-routes.ts +73 -0
- package/src/services/cloud-auth.ts +567 -0
- package/src/services/cloud-backup.ts +208 -0
- package/src/services/cloud-bootstrap.ts +108 -0
- package/src/services/cloud-bridge.ts +386 -0
- package/src/services/cloud-container.ts +297 -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 +52 -29
- package/{types → src/types}/index.ts +6 -0
- package/src/utils/cloud-api.ts +10 -0
- package/src/utils/cloud-sdk/client.ts +735 -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 +5070 -0
- package/src/utils/cloud-sdk/types.cloud-api.ts +120 -0
- package/src/utils/cloud-sdk/types.ts +762 -0
- package/src/utils/config.ts +174 -0
- package/src/utils/events.ts +37 -0
- package/src/utils/helpers.ts +107 -0
- package/src/utils/responses-output.ts +115 -0
- package/src/utils/sdk-client.ts +37 -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,234 @@
|
|
|
1
|
+
import type { IAgentRuntime, TextEmbeddingParams } from "@elizaos/core";
|
|
2
|
+
import { logger, ModelType, VECTOR_DIMS } from "@elizaos/core";
|
|
3
|
+
import { getSetting } from "../utils/config";
|
|
4
|
+
import { emitModelUsageEvent } from "../utils/events";
|
|
5
|
+
import { createCloudApiClient } from "../utils/sdk-client";
|
|
6
|
+
|
|
7
|
+
const MAX_BATCH_SIZE = 100;
|
|
8
|
+
function extractRateLimitInfo(response: Response): {
|
|
9
|
+
remainingRequests?: number;
|
|
10
|
+
remainingTokens?: number;
|
|
11
|
+
limitRequests?: number;
|
|
12
|
+
limitTokens?: number;
|
|
13
|
+
resetRequests?: string;
|
|
14
|
+
resetTokens?: string;
|
|
15
|
+
retryAfter?: number;
|
|
16
|
+
} {
|
|
17
|
+
return {
|
|
18
|
+
remainingRequests:
|
|
19
|
+
parseInt(response.headers.get("x-ratelimit-remaining-requests") || "", 10) || undefined,
|
|
20
|
+
remainingTokens:
|
|
21
|
+
parseInt(response.headers.get("x-ratelimit-remaining-tokens") || "", 10) || undefined,
|
|
22
|
+
limitRequests:
|
|
23
|
+
parseInt(response.headers.get("x-ratelimit-limit-requests") || "", 10) || undefined,
|
|
24
|
+
limitTokens: parseInt(response.headers.get("x-ratelimit-limit-tokens") || "", 10) || undefined,
|
|
25
|
+
resetRequests: response.headers.get("x-ratelimit-reset-requests") || undefined,
|
|
26
|
+
resetTokens: response.headers.get("x-ratelimit-reset-tokens") || undefined,
|
|
27
|
+
retryAfter: parseInt(response.headers.get("retry-after") || "", 10) || undefined,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function getEmbeddingConfig(runtime: IAgentRuntime) {
|
|
32
|
+
const embeddingModelName = getSetting(
|
|
33
|
+
runtime,
|
|
34
|
+
"ELIZAOS_CLOUD_EMBEDDING_MODEL",
|
|
35
|
+
"text-embedding-3-small"
|
|
36
|
+
);
|
|
37
|
+
const embeddingDimension = Number.parseInt(
|
|
38
|
+
getSetting(runtime, "ELIZAOS_CLOUD_EMBEDDING_DIMENSIONS", "1536") || "1536",
|
|
39
|
+
10
|
|
40
|
+
) as (typeof VECTOR_DIMS)[keyof typeof VECTOR_DIMS];
|
|
41
|
+
|
|
42
|
+
if (!Object.values(VECTOR_DIMS).includes(embeddingDimension)) {
|
|
43
|
+
const errorMsg = `Invalid embedding dimension: ${embeddingDimension}. Must be one of: ${Object.values(VECTOR_DIMS).join(", ")}`;
|
|
44
|
+
logger.error(errorMsg);
|
|
45
|
+
throw new Error(errorMsg);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return { embeddingModelName, embeddingDimension };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function createErrorVector(dimension: number, marker: number): number[] {
|
|
52
|
+
const vector = Array(dimension).fill(0);
|
|
53
|
+
vector[0] = marker;
|
|
54
|
+
return vector;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface BatchEmbeddingParams {
|
|
58
|
+
texts: string[];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export async function handleTextEmbedding(
|
|
62
|
+
runtime: IAgentRuntime,
|
|
63
|
+
params: TextEmbeddingParams | string | null
|
|
64
|
+
): Promise<number[]> {
|
|
65
|
+
const { embeddingDimension } = getEmbeddingConfig(runtime);
|
|
66
|
+
|
|
67
|
+
if (params === null) {
|
|
68
|
+
logger.debug("Creating test embedding for initialization");
|
|
69
|
+
return createErrorVector(embeddingDimension, 0.1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let text: string;
|
|
73
|
+
if (typeof params === "string") {
|
|
74
|
+
text = params;
|
|
75
|
+
} else if (typeof params === "object" && params.text) {
|
|
76
|
+
text = params.text;
|
|
77
|
+
} else {
|
|
78
|
+
logger.warn("Invalid input format for embedding");
|
|
79
|
+
return createErrorVector(embeddingDimension, 0.2);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
if (!text.trim()) {
|
|
83
|
+
logger.warn("Empty text for embedding");
|
|
84
|
+
return createErrorVector(embeddingDimension, 0.3);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const results = await handleBatchTextEmbedding(runtime, [text]);
|
|
88
|
+
return results[0];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export interface BatchEmbeddingResult {
|
|
92
|
+
embedding: number[];
|
|
93
|
+
index: number;
|
|
94
|
+
success: boolean;
|
|
95
|
+
error?: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export async function handleBatchTextEmbedding(
|
|
99
|
+
runtime: IAgentRuntime,
|
|
100
|
+
texts: string[]
|
|
101
|
+
): Promise<number[][]> {
|
|
102
|
+
const { embeddingModelName, embeddingDimension } = getEmbeddingConfig(runtime);
|
|
103
|
+
const client = createCloudApiClient(runtime, true);
|
|
104
|
+
|
|
105
|
+
if (!texts || texts.length === 0) {
|
|
106
|
+
logger.warn("[BatchEmbeddings] Empty texts array");
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const validTexts: { text: string; originalIndex: number }[] = [];
|
|
111
|
+
const results: number[][] = new Array(texts.length);
|
|
112
|
+
|
|
113
|
+
for (let i = 0; i < texts.length; i++) {
|
|
114
|
+
const text = texts[i]?.trim();
|
|
115
|
+
if (text) {
|
|
116
|
+
validTexts.push({ text, originalIndex: i });
|
|
117
|
+
} else {
|
|
118
|
+
results[i] = createErrorVector(embeddingDimension, 0.3);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (validTexts.length === 0) {
|
|
123
|
+
logger.warn("[BatchEmbeddings] All texts were empty");
|
|
124
|
+
return results;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
for (let batchStart = 0; batchStart < validTexts.length; batchStart += MAX_BATCH_SIZE) {
|
|
128
|
+
const batchEnd = Math.min(batchStart + MAX_BATCH_SIZE, validTexts.length);
|
|
129
|
+
const batch = validTexts.slice(batchStart, batchEnd);
|
|
130
|
+
const batchTexts = batch.map((b) => b.text);
|
|
131
|
+
|
|
132
|
+
logger.info(
|
|
133
|
+
`[BatchEmbeddings] Processing batch ${Math.floor(batchStart / MAX_BATCH_SIZE) + 1}/${Math.ceil(validTexts.length / MAX_BATCH_SIZE)}: ${batch.length} texts`
|
|
134
|
+
);
|
|
135
|
+
|
|
136
|
+
try {
|
|
137
|
+
const response = await client.requestRaw("POST", "/embeddings", {
|
|
138
|
+
json: {
|
|
139
|
+
model: embeddingModelName,
|
|
140
|
+
input: batchTexts,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
const rateLimitInfo = extractRateLimitInfo(response);
|
|
145
|
+
|
|
146
|
+
if (rateLimitInfo.remainingRequests !== undefined && rateLimitInfo.remainingRequests < 50) {
|
|
147
|
+
logger.warn(
|
|
148
|
+
`[BatchEmbeddings] Rate limit: ${rateLimitInfo.remainingRequests}/${rateLimitInfo.limitRequests} requests remaining`
|
|
149
|
+
);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (response.status === 429) {
|
|
153
|
+
const retryAfter = rateLimitInfo.retryAfter || 30;
|
|
154
|
+
logger.warn(`[BatchEmbeddings] Rate limited, waiting ${retryAfter}s...`);
|
|
155
|
+
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
|
|
156
|
+
|
|
157
|
+
const retryResponse = await client.requestRaw("POST", "/embeddings", {
|
|
158
|
+
json: {
|
|
159
|
+
model: embeddingModelName,
|
|
160
|
+
input: batchTexts,
|
|
161
|
+
},
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
if (!retryResponse.ok) {
|
|
165
|
+
logger.error(`[BatchEmbeddings] Retry failed: ${retryResponse.status}`);
|
|
166
|
+
for (const item of batch) {
|
|
167
|
+
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.4);
|
|
168
|
+
}
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const retryData = (await retryResponse.json()) as {
|
|
173
|
+
data: Array<{ embedding: number[]; index: number }>;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
if (retryData?.data) {
|
|
177
|
+
for (const item of retryData.data) {
|
|
178
|
+
const originalIndex = batch[item.index].originalIndex;
|
|
179
|
+
results[originalIndex] = item.embedding;
|
|
180
|
+
}
|
|
181
|
+
logger.info(`[BatchEmbeddings] Retry successful for ${batch.length} embeddings`);
|
|
182
|
+
}
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (!response.ok) {
|
|
187
|
+
logger.error(`[BatchEmbeddings] API error: ${response.status} - ${response.statusText}`);
|
|
188
|
+
for (const item of batch) {
|
|
189
|
+
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.4);
|
|
190
|
+
}
|
|
191
|
+
continue;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const data = (await response.json()) as {
|
|
195
|
+
data: Array<{ embedding: number[]; index: number }>;
|
|
196
|
+
usage?: { prompt_tokens: number; total_tokens: number };
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
if (!data?.data || !Array.isArray(data.data)) {
|
|
200
|
+
logger.error("[BatchEmbeddings] API returned invalid structure");
|
|
201
|
+
for (const item of batch) {
|
|
202
|
+
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.5);
|
|
203
|
+
}
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
for (const item of data.data) {
|
|
208
|
+
const originalIndex = batch[item.index].originalIndex;
|
|
209
|
+
results[originalIndex] = item.embedding;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if (data.usage) {
|
|
213
|
+
const usage = {
|
|
214
|
+
inputTokens: data.usage.prompt_tokens,
|
|
215
|
+
outputTokens: 0,
|
|
216
|
+
totalTokens: data.usage.total_tokens,
|
|
217
|
+
};
|
|
218
|
+
emitModelUsageEvent(runtime, ModelType.TEXT_EMBEDDING, `batch:${batch.length}`, usage);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
logger.debug(
|
|
222
|
+
`[BatchEmbeddings] Got ${batch.length} embeddings (${embeddingDimension}d), remaining: ${rateLimitInfo.remainingRequests ?? "unknown"}`
|
|
223
|
+
);
|
|
224
|
+
} catch (error) {
|
|
225
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
226
|
+
logger.error(`[BatchEmbeddings] Error: ${message}`);
|
|
227
|
+
for (const item of batch) {
|
|
228
|
+
results[item.originalIndex] = createErrorVector(embeddingDimension, 0.6);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
return results;
|
|
234
|
+
}
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import type { IAgentRuntime, ImageDescriptionParams, ImageGenerationParams } from "@elizaos/core";
|
|
2
|
+
import { logger, ModelType } from "@elizaos/core";
|
|
3
|
+
import { getImageDescriptionModel, getImageGenerationModel, getSetting } from "../utils/config";
|
|
4
|
+
import { emitModelUsageEvent } from "../utils/events";
|
|
5
|
+
import { parseImageDescriptionResponse } from "../utils/helpers";
|
|
6
|
+
import { createElizaCloudClient } from "../utils/sdk-client";
|
|
7
|
+
|
|
8
|
+
export async function handleImageGeneration(
|
|
9
|
+
runtime: IAgentRuntime,
|
|
10
|
+
params: ImageGenerationParams
|
|
11
|
+
): Promise<{ url: string }[]> {
|
|
12
|
+
const numImages = params.count || 1;
|
|
13
|
+
const size = params.size || "1024x1024";
|
|
14
|
+
const prompt = params.prompt;
|
|
15
|
+
const modelName = getImageGenerationModel(runtime);
|
|
16
|
+
logger.log(`[ELIZAOS_CLOUD] Using IMAGE model: ${modelName}`);
|
|
17
|
+
|
|
18
|
+
const aspectRatioMap: Record<string, string> = {
|
|
19
|
+
"1024x1024": "1:1",
|
|
20
|
+
"1792x1024": "16:9",
|
|
21
|
+
"1024x1792": "9:16",
|
|
22
|
+
};
|
|
23
|
+
const aspectRatio = aspectRatioMap[size] || "1:1";
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const requestBody = {
|
|
27
|
+
prompt: prompt,
|
|
28
|
+
numImages: numImages,
|
|
29
|
+
aspectRatio: aspectRatio,
|
|
30
|
+
model: modelName,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const typedData = await createElizaCloudClient(runtime).generateImage(requestBody);
|
|
34
|
+
|
|
35
|
+
const result = typedData.images.map((img) => ({
|
|
36
|
+
url: img.url ?? img.image ?? "",
|
|
37
|
+
}));
|
|
38
|
+
return result;
|
|
39
|
+
} catch (error) {
|
|
40
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
41
|
+
logger.error(`[ELIZAOS_CLOUD] Image generation error: ${message}`);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export async function handleImageDescription(
|
|
47
|
+
runtime: IAgentRuntime,
|
|
48
|
+
params: ImageDescriptionParams | string
|
|
49
|
+
): Promise<{ title: string; description: string }> {
|
|
50
|
+
// Honour `DISABLE_IMAGE_DESCRIPTION` (set by the runtime when
|
|
51
|
+
// `features.vision === false`). The runtime exposes it via getSetting; some
|
|
52
|
+
// hosts only set it in process.env. Check both before burning a quota slot.
|
|
53
|
+
// The docs (`docs/runtime/core.md`) already promise this behaviour, but
|
|
54
|
+
// historically only `plugin-discord` honoured it at the call site, leaving
|
|
55
|
+
// every other caller (agent-orchestrator's task validator, vision, lifeops,
|
|
56
|
+
// farcaster, telegram) free to spend the rate-limit budget.
|
|
57
|
+
const disableSetting = getSetting(runtime, "DISABLE_IMAGE_DESCRIPTION", "");
|
|
58
|
+
const disabled =
|
|
59
|
+
disableSetting === "true" ||
|
|
60
|
+
disableSetting === "1" ||
|
|
61
|
+
process.env.DISABLE_IMAGE_DESCRIPTION === "true" ||
|
|
62
|
+
process.env.DISABLE_IMAGE_DESCRIPTION === "1";
|
|
63
|
+
if (disabled) {
|
|
64
|
+
logger.debug("[ELIZAOS_CLOUD] IMAGE_DESCRIPTION skipped — DISABLE_IMAGE_DESCRIPTION is set");
|
|
65
|
+
return {
|
|
66
|
+
title: "Image description disabled",
|
|
67
|
+
description: "Image description is disabled by configuration.",
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
let imageUrl: string;
|
|
72
|
+
let promptText: string | undefined;
|
|
73
|
+
const modelName = getImageDescriptionModel(runtime);
|
|
74
|
+
logger.log(`[ELIZAOS_CLOUD] Using IMAGE_DESCRIPTION model: ${modelName}`);
|
|
75
|
+
const maxTokens = Number.parseInt(
|
|
76
|
+
getSetting(runtime, "ELIZAOS_CLOUD_IMAGE_DESCRIPTION_MAX_TOKENS", "8192") || "8192",
|
|
77
|
+
10
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
if (typeof params === "string") {
|
|
81
|
+
imageUrl = params;
|
|
82
|
+
promptText = "Please analyze this image and provide a title and detailed description.";
|
|
83
|
+
} else {
|
|
84
|
+
imageUrl = params.imageUrl;
|
|
85
|
+
promptText =
|
|
86
|
+
params.prompt || "Please analyze this image and provide a title and detailed description.";
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const messages = [
|
|
90
|
+
{
|
|
91
|
+
role: "user",
|
|
92
|
+
content: [
|
|
93
|
+
{ type: "text", text: promptText },
|
|
94
|
+
{ type: "image_url", image_url: { url: imageUrl } },
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
];
|
|
98
|
+
|
|
99
|
+
const client = createElizaCloudClient(runtime);
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
const requestBody: Record<string, unknown> = {
|
|
103
|
+
model: modelName,
|
|
104
|
+
messages: messages,
|
|
105
|
+
max_tokens: maxTokens,
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// On 429, honour the upstream's `retryAfter` instead of retrying on a
|
|
109
|
+
// hardcoded backoff. Hardcoded retries inside the rate-limit window add
|
|
110
|
+
// wasted requests to the same bucket and make the problem worse — see
|
|
111
|
+
// #7374's billing render-loop fix and S33's dashboard 429-aware UX.
|
|
112
|
+
// Strategy: only retry once, only if the upstream signals a short wait
|
|
113
|
+
// (≤5s, i.e. transient burst). Anything longer, bail immediately and let
|
|
114
|
+
// the caller fail fast.
|
|
115
|
+
let response: Response | null = null;
|
|
116
|
+
let attemptedRetry = false;
|
|
117
|
+
for (let attempt = 0; attempt < 2; attempt++) {
|
|
118
|
+
response = await client.routes.postApiV1ChatCompletionsRaw({
|
|
119
|
+
json: requestBody,
|
|
120
|
+
});
|
|
121
|
+
if (response.status !== 429 || attemptedRetry) break;
|
|
122
|
+
|
|
123
|
+
// `Number(null) === 0`, so guard against a missing header before
|
|
124
|
+
// calling `Number(...)` — otherwise the header path always wins with a
|
|
125
|
+
// bogus `0` and the body fallback becomes unreachable.
|
|
126
|
+
const headerValue = response.headers.get("retry-after");
|
|
127
|
+
const headerRetryAfter =
|
|
128
|
+
headerValue !== null && Number.isFinite(Number(headerValue))
|
|
129
|
+
? Number(headerValue)
|
|
130
|
+
: undefined;
|
|
131
|
+
let bodyRetryAfter: number | undefined;
|
|
132
|
+
try {
|
|
133
|
+
const peek = (await response.clone().json()) as {
|
|
134
|
+
retryAfter?: unknown;
|
|
135
|
+
};
|
|
136
|
+
bodyRetryAfter =
|
|
137
|
+
typeof peek?.retryAfter === "number" && Number.isFinite(peek.retryAfter)
|
|
138
|
+
? peek.retryAfter
|
|
139
|
+
: undefined;
|
|
140
|
+
} catch {
|
|
141
|
+
// Body wasn't JSON — fall through to header value.
|
|
142
|
+
}
|
|
143
|
+
const retryAfter = headerRetryAfter ?? bodyRetryAfter ?? 0;
|
|
144
|
+
|
|
145
|
+
if (retryAfter > 0 && retryAfter <= 5) {
|
|
146
|
+
logger.warn(
|
|
147
|
+
`[ELIZAOS_CLOUD] Image analysis rate-limited (429), retrying once after ${retryAfter}s...`
|
|
148
|
+
);
|
|
149
|
+
await new Promise((r) => setTimeout(r, retryAfter * 1000));
|
|
150
|
+
attemptedRetry = true;
|
|
151
|
+
continue;
|
|
152
|
+
}
|
|
153
|
+
// Long rate-limit window: don't burn another bucket slot retrying inside it.
|
|
154
|
+
logger.warn(
|
|
155
|
+
`[ELIZAOS_CLOUD] Image analysis rate-limited (429); upstream retryAfter=${retryAfter || "unknown"}s — failing fast`
|
|
156
|
+
);
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (!response?.ok) {
|
|
161
|
+
const status = response?.status ?? 0;
|
|
162
|
+
if (status === 402) {
|
|
163
|
+
throw new Error(
|
|
164
|
+
"Eliza Cloud credits exhausted — top up at https://www.elizacloud.ai/dashboard/settings?tab=billing"
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
if (status === 429) {
|
|
168
|
+
throw new Error(
|
|
169
|
+
"Eliza Cloud rate limit exceeded for image description — try again in a minute"
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
throw new Error(`ElizaOS Cloud API error: ${status}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
type OpenAIResponseType = {
|
|
176
|
+
choices?: Array<{
|
|
177
|
+
message?: { content?: string };
|
|
178
|
+
finish_reason?: string;
|
|
179
|
+
}>;
|
|
180
|
+
usage?: {
|
|
181
|
+
prompt_tokens: number;
|
|
182
|
+
completion_tokens: number;
|
|
183
|
+
total_tokens: number;
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
const typedResult = (await response.json()) as OpenAIResponseType;
|
|
188
|
+
const content = typedResult.choices?.[0]?.message?.content;
|
|
189
|
+
|
|
190
|
+
if (typedResult.usage) {
|
|
191
|
+
emitModelUsageEvent(
|
|
192
|
+
runtime,
|
|
193
|
+
ModelType.IMAGE_DESCRIPTION,
|
|
194
|
+
typeof params === "string" ? params : params.prompt || "",
|
|
195
|
+
{
|
|
196
|
+
inputTokens: typedResult.usage.prompt_tokens,
|
|
197
|
+
outputTokens: typedResult.usage.completion_tokens,
|
|
198
|
+
totalTokens: typedResult.usage.total_tokens,
|
|
199
|
+
}
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (!content) {
|
|
204
|
+
return {
|
|
205
|
+
title: "Failed to analyze image",
|
|
206
|
+
description: "No response from API",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return parseImageDescriptionResponse(content);
|
|
211
|
+
} catch (error) {
|
|
212
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
213
|
+
logger.error(`Error analyzing image: ${message}`);
|
|
214
|
+
return {
|
|
215
|
+
title: "Failed to analyze image",
|
|
216
|
+
description: `Error: ${message}`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export type { BatchEmbeddingResult } from "./embeddings";
|
|
2
|
+
export { handleBatchTextEmbedding, handleTextEmbedding } from "./embeddings";
|
|
3
|
+
export { handleImageDescription, handleImageGeneration } from "./image";
|
|
4
|
+
export { handleResearch } from "./research";
|
|
5
|
+
export { fetchTextToSpeech, handleTextToSpeech } from "./speech";
|
|
6
|
+
export {
|
|
7
|
+
handleActionPlanner,
|
|
8
|
+
handleResponseHandler,
|
|
9
|
+
handleTextLarge,
|
|
10
|
+
handleTextMedium,
|
|
11
|
+
handleTextMega,
|
|
12
|
+
handleTextNano,
|
|
13
|
+
handleTextSmall,
|
|
14
|
+
} from "./text";
|
|
15
|
+
export { handleTokenizerDecode, handleTokenizerEncode } from "./tokenization";
|
|
16
|
+
export { handleTranscription } from "./transcription";
|