@elizaos/plugin-elizacloud 2.0.0-beta.1 → 2.0.3-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (338) hide show
  1. package/README.md +20 -44
  2. package/auto-enable.ts +10 -5
  3. package/dist/browser/index.browser.js +2 -2
  4. package/dist/browser/index.browser.js.map +4 -4
  5. package/dist/cjs/index.node.cjs +2918 -5924
  6. package/dist/cjs/index.node.js.map +47 -116
  7. package/dist/cloud/auth-service-types.d.ts +8 -0
  8. package/dist/cloud/auth-service-types.d.ts.map +1 -0
  9. package/dist/cloud/auth-service-types.js +36 -0
  10. package/dist/cloud/auth-service-types.js.map +10 -0
  11. package/dist/cloud/auth.js +4 -51
  12. package/dist/cloud/auth.js.map +4 -4
  13. package/dist/cloud/backup.js +1 -1
  14. package/dist/cloud/backup.js.map +1 -1
  15. package/dist/cloud/base-url.d.ts +6 -2
  16. package/dist/cloud/base-url.d.ts.map +1 -1
  17. package/dist/cloud/base-url.js +3 -51
  18. package/dist/cloud/base-url.js.map +3 -3
  19. package/dist/cloud/bridge-client.d.ts +3 -3
  20. package/dist/cloud/bridge-client.d.ts.map +1 -1
  21. package/dist/cloud/bridge-client.js +3 -51
  22. package/dist/cloud/bridge-client.js.map +3 -3
  23. package/dist/cloud/clack-observer.d.ts +35 -0
  24. package/dist/cloud/clack-observer.d.ts.map +1 -0
  25. package/dist/cloud/clack-observer.js +143 -0
  26. package/dist/cloud/clack-observer.js.map +10 -0
  27. package/dist/cloud/cloud-api-key.js +1 -1
  28. package/dist/cloud/cloud-api-key.js.map +1 -1
  29. package/dist/cloud/cloud-manager.js +45 -92
  30. package/dist/cloud/cloud-manager.js.map +6 -6
  31. package/dist/cloud/cloud-proxy.js +1 -1
  32. package/dist/cloud/cloud-proxy.js.map +1 -1
  33. package/dist/cloud/cloud-wallet.js +2 -4835
  34. package/dist/cloud/cloud-wallet.js.map +3 -82
  35. package/dist/cloud/duffel-client.d.ts +181 -0
  36. package/dist/cloud/duffel-client.d.ts.map +1 -0
  37. package/dist/cloud/duffel-client.js +506 -0
  38. package/dist/cloud/duffel-client.js.map +11 -0
  39. package/dist/cloud/index.d.ts +6 -0
  40. package/dist/cloud/index.d.ts.map +1 -1
  41. package/dist/cloud/index.js +1782 -1
  42. package/dist/cloud/index.js.map +18 -3
  43. package/dist/cloud/lifeops-schedule-sync-client.d.ts +43 -0
  44. package/dist/cloud/lifeops-schedule-sync-client.d.ts.map +1 -0
  45. package/dist/cloud/lifeops-schedule-sync-client.js +180 -0
  46. package/dist/cloud/lifeops-schedule-sync-client.js.map +11 -0
  47. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts +89 -0
  48. package/dist/cloud/lifeops-schedule-sync-contracts.d.ts.map +1 -0
  49. package/dist/cloud/lifeops-schedule-sync-contracts.js +39 -0
  50. package/dist/cloud/lifeops-schedule-sync-contracts.js.map +10 -0
  51. package/dist/cloud/managed-payment-clients.d.ts +166 -0
  52. package/dist/cloud/managed-payment-clients.d.ts.map +1 -0
  53. package/dist/cloud/managed-payment-clients.js +238 -0
  54. package/dist/cloud/managed-payment-clients.js.map +11 -0
  55. package/dist/cloud/null-observer.d.ts +35 -0
  56. package/dist/cloud/null-observer.d.ts.map +1 -0
  57. package/dist/cloud/null-observer.js +45 -0
  58. package/dist/cloud/null-observer.js.map +10 -0
  59. package/dist/cloud/reconnect.js +1 -1
  60. package/dist/cloud/reconnect.js.map +1 -1
  61. package/dist/cloud/setup-observer.d.ts +98 -0
  62. package/dist/cloud/setup-observer.d.ts.map +1 -0
  63. package/dist/cloud/setup-observer.js +2 -0
  64. package/dist/cloud/setup-observer.js.map +9 -0
  65. package/dist/cloud/validate-url.d.ts.map +1 -1
  66. package/dist/cloud/validate-url.js +2 -1
  67. package/dist/cloud/validate-url.js.map +3 -3
  68. package/dist/cloud/x402-payment-handler.d.ts +85 -0
  69. package/dist/cloud/x402-payment-handler.d.ts.map +1 -0
  70. package/dist/cloud/x402-payment-handler.js +119 -0
  71. package/dist/cloud/x402-payment-handler.js.map +10 -0
  72. package/dist/cloud-providers/cloud-status.js +1 -1
  73. package/dist/cloud-providers/cloud-status.js.map +1 -1
  74. package/dist/cloud-providers/container-health.js +1 -1
  75. package/dist/cloud-providers/container-health.js.map +1 -1
  76. package/dist/cloud-providers/credit-balance.js +1 -1
  77. package/dist/cloud-providers/credit-balance.js.map +1 -1
  78. package/dist/cloud-providers/index.js +1 -1
  79. package/dist/cloud-providers/index.js.map +1 -1
  80. package/dist/cloud-providers/model-registry.js +1 -1
  81. package/dist/cloud-providers/model-registry.js.map +1 -1
  82. package/dist/cloud-setup.d.ts +36 -0
  83. package/dist/cloud-setup.d.ts.map +1 -0
  84. package/dist/{onboarding.js → cloud-setup.js} +139 -139
  85. package/dist/cloud-setup.js.map +14 -0
  86. package/dist/cloud-voice-catalog.d.ts +65 -0
  87. package/dist/cloud-voice-catalog.d.ts.map +1 -0
  88. package/dist/cloud-voice-catalog.js +278 -0
  89. package/dist/cloud-voice-catalog.js.map +12 -0
  90. package/dist/index.browser.d.ts +11 -0
  91. package/dist/index.browser.d.ts.map +1 -1
  92. package/dist/index.d.ts +7 -1
  93. package/dist/index.d.ts.map +1 -1
  94. package/dist/index.js +5458 -8412
  95. package/dist/index.js.map +48 -116
  96. package/dist/index.node.d.ts +8 -1
  97. package/dist/index.node.d.ts.map +1 -1
  98. package/dist/init.js +17 -4
  99. package/dist/init.js.map +4 -4
  100. package/dist/lib/cloud-connection.d.ts +0 -1
  101. package/dist/lib/cloud-connection.d.ts.map +1 -1
  102. package/dist/lib/cloud-connection.js +14 -91
  103. package/dist/lib/cloud-connection.js.map +7 -7
  104. package/dist/lib/cloud-secrets.d.ts +5 -18
  105. package/dist/lib/cloud-secrets.d.ts.map +1 -1
  106. package/dist/lib/cloud-secrets.js +8 -36
  107. package/dist/lib/cloud-secrets.js.map +3 -3
  108. package/dist/lib/config-env.js +1 -1
  109. package/dist/lib/config-env.js.map +1 -1
  110. package/dist/lib/config-like.d.ts +1 -1
  111. package/dist/lib/config-like.d.ts.map +1 -1
  112. package/dist/lib/config-like.js +3 -3
  113. package/dist/lib/config-like.js.map +3 -3
  114. package/dist/lib/credential-type-map.d.ts +1 -1
  115. package/dist/lib/credential-type-map.js +1 -1
  116. package/dist/lib/credential-type-map.js.map +2 -2
  117. package/dist/lib/feature-flags.js +1 -1
  118. package/dist/lib/feature-flags.js.map +1 -1
  119. package/dist/lib/http.d.ts +0 -11
  120. package/dist/lib/http.d.ts.map +1 -1
  121. package/dist/lib/http.js +1 -1
  122. package/dist/lib/http.js.map +3 -3
  123. package/dist/lib/server-cloud-tts.d.ts +12 -25
  124. package/dist/lib/server-cloud-tts.d.ts.map +1 -1
  125. package/dist/lib/server-cloud-tts.js +31 -329
  126. package/dist/lib/server-cloud-tts.js.map +4 -7
  127. package/dist/lib/state-paths.js +1 -1
  128. package/dist/lib/state-paths.js.map +1 -1
  129. package/dist/lib/tts-debug.d.ts +5 -3
  130. package/dist/lib/tts-debug.d.ts.map +1 -1
  131. package/dist/lib/tts-debug.js +1 -34
  132. package/dist/lib/tts-debug.js.map +3 -4
  133. package/dist/models/embeddings.d.ts +7 -0
  134. package/dist/models/embeddings.d.ts.map +1 -1
  135. package/dist/models/embeddings.js +98 -73
  136. package/dist/models/embeddings.js.map +6 -6
  137. package/dist/models/image.d.ts.map +1 -1
  138. package/dist/models/image.js +42 -15
  139. package/dist/models/image.js.map +6 -6
  140. package/dist/models/index.js +719 -175
  141. package/dist/models/index.js.map +11 -12
  142. package/dist/models/research.d.ts.map +1 -1
  143. package/dist/models/research.js +24 -7
  144. package/dist/models/research.js.map +6 -6
  145. package/dist/models/speech.d.ts +61 -3
  146. package/dist/models/speech.d.ts.map +1 -1
  147. package/dist/models/speech.js +173 -17
  148. package/dist/models/speech.js.map +5 -5
  149. package/dist/models/text.d.ts +114 -1
  150. package/dist/models/text.d.ts.map +1 -1
  151. package/dist/models/text.js +481 -88
  152. package/dist/models/text.js.map +7 -8
  153. package/dist/models/tokenization.d.ts.map +1 -1
  154. package/dist/models/tokenization.js +1 -1
  155. package/dist/models/tokenization.js.map +3 -3
  156. package/dist/models/transcription.d.ts.map +1 -1
  157. package/dist/models/transcription.js +20 -6
  158. package/dist/models/transcription.js.map +5 -5
  159. package/dist/node/index.node.js +2872 -5847
  160. package/dist/node/index.node.js.map +47 -116
  161. package/dist/plugin.d.ts.map +1 -1
  162. package/dist/plugin.js +376 -5050
  163. package/dist/plugin.js.map +16 -92
  164. package/dist/providers/openai.js +11 -2
  165. package/dist/providers/openai.js.map +3 -3
  166. package/dist/register-routes.js +376 -5050
  167. package/dist/register-routes.js.map +16 -92
  168. package/dist/routes/cloud-billing-routes.d.ts.map +1 -1
  169. package/dist/routes/cloud-billing-routes.js +17 -60
  170. package/dist/routes/cloud-billing-routes.js.map +8 -7
  171. package/dist/routes/cloud-coding-container-routes.d.ts +8 -0
  172. package/dist/routes/cloud-coding-container-routes.d.ts.map +1 -0
  173. package/dist/routes/cloud-coding-container-routes.js +214 -0
  174. package/dist/routes/cloud-coding-container-routes.js.map +11 -0
  175. package/dist/routes/cloud-compat-routes.d.ts.map +1 -1
  176. package/dist/routes/cloud-compat-routes.js +17 -60
  177. package/dist/routes/cloud-compat-routes.js.map +8 -7
  178. package/dist/routes/cloud-features-routes.js +2 -2
  179. package/dist/routes/cloud-features-routes.js.map +4 -4
  180. package/dist/routes/cloud-provisioning.js +1 -1
  181. package/dist/routes/cloud-provisioning.js.map +1 -1
  182. package/dist/routes/cloud-relay-routes.d.ts +2 -1
  183. package/dist/routes/cloud-relay-routes.d.ts.map +1 -1
  184. package/dist/routes/cloud-relay-routes.js +84 -2
  185. package/dist/routes/cloud-relay-routes.js.map +5 -4
  186. package/dist/routes/cloud-routes-autonomous.d.ts +3 -4
  187. package/dist/routes/cloud-routes-autonomous.d.ts.map +1 -1
  188. package/dist/routes/cloud-routes-autonomous.js +11 -4893
  189. package/dist/routes/cloud-routes-autonomous.js.map +8 -87
  190. package/dist/routes/cloud-routes.d.ts +2 -2
  191. package/dist/routes/cloud-routes.d.ts.map +1 -1
  192. package/dist/routes/cloud-routes.js +343 -5058
  193. package/dist/routes/cloud-routes.js.map +13 -90
  194. package/dist/routes/cloud-status-routes-autonomous.d.ts +1 -2
  195. package/dist/routes/cloud-status-routes-autonomous.d.ts.map +1 -1
  196. package/dist/routes/cloud-status-routes-autonomous.js +4 -51
  197. package/dist/routes/cloud-status-routes-autonomous.js.map +5 -5
  198. package/dist/routes/cloud-status-routes.js +14 -90
  199. package/dist/routes/cloud-status-routes.js.map +7 -7
  200. package/dist/routes/home-remote-runner-access-url.d.ts +16 -0
  201. package/dist/routes/home-remote-runner-access-url.d.ts.map +1 -0
  202. package/dist/routes/home-remote-runner-access-url.js +91 -0
  203. package/dist/routes/home-remote-runner-access-url.js.map +10 -0
  204. package/dist/routes/travel-provider-relay-routes.d.ts +9 -0
  205. package/dist/routes/travel-provider-relay-routes.d.ts.map +1 -0
  206. package/dist/routes/travel-provider-relay-routes.js +358 -0
  207. package/dist/routes/travel-provider-relay-routes.js.map +14 -0
  208. package/dist/services/cloud-auth.d.ts +1 -1
  209. package/dist/services/cloud-auth.d.ts.map +1 -1
  210. package/dist/services/cloud-auth.js +7 -2
  211. package/dist/services/cloud-auth.js.map +4 -4
  212. package/dist/services/cloud-backup.js +1 -1
  213. package/dist/services/cloud-backup.js.map +3 -3
  214. package/dist/services/cloud-bootstrap.d.ts.map +1 -1
  215. package/dist/services/cloud-bootstrap.js +1 -1
  216. package/dist/services/cloud-bootstrap.js.map +3 -3
  217. package/dist/services/cloud-bridge.js +1 -1
  218. package/dist/services/cloud-bridge.js.map +4 -4
  219. package/dist/services/cloud-container.d.ts +5 -1
  220. package/dist/services/cloud-container.d.ts.map +1 -1
  221. package/dist/services/cloud-container.js +52 -1
  222. package/dist/services/cloud-container.js.map +4 -4
  223. package/dist/services/cloud-credential-provider.js +1 -1
  224. package/dist/services/cloud-credential-provider.js.map +3 -3
  225. package/dist/services/cloud-managed-gateway-relay.js +1 -1
  226. package/dist/services/cloud-managed-gateway-relay.js.map +1 -1
  227. package/dist/services/cloud-model-registry.js +1 -1
  228. package/dist/services/cloud-model-registry.js.map +3 -3
  229. package/dist/services/index.js +1 -1
  230. package/dist/services/index.js.map +1 -1
  231. package/dist/types/cloud.d.ts +1 -0
  232. package/dist/types/cloud.d.ts.map +1 -1
  233. package/dist/types/cloud.js +1 -1
  234. package/dist/types/cloud.js.map +3 -3
  235. package/dist/types/index.d.ts +1 -1
  236. package/dist/types/index.d.ts.map +1 -1
  237. package/dist/types/index.js +1 -1
  238. package/dist/types/index.js.map +1 -1
  239. package/dist/utils/cloud-api.js +1 -1
  240. package/dist/utils/cloud-api.js.map +1 -1
  241. package/dist/utils/cloud-sdk/client.d.ts.map +1 -1
  242. package/dist/utils/cloud-sdk/client.js +136 -4
  243. package/dist/utils/cloud-sdk/client.js.map +5 -5
  244. package/dist/utils/cloud-sdk/http.js +1 -1
  245. package/dist/utils/cloud-sdk/http.js.map +2 -2
  246. package/dist/utils/cloud-sdk/index.js +1 -1
  247. package/dist/utils/cloud-sdk/index.js.map +1 -1
  248. package/dist/utils/cloud-sdk/public-routes.d.ts +186 -0
  249. package/dist/utils/cloud-sdk/public-routes.d.ts.map +1 -1
  250. package/dist/utils/cloud-sdk/public-routes.js +99 -1
  251. package/dist/utils/cloud-sdk/public-routes.js.map +3 -3
  252. package/dist/utils/cloud-sdk/types.d.ts +0 -2
  253. package/dist/utils/cloud-sdk/types.d.ts.map +1 -1
  254. package/dist/utils/cloud-sdk/types.js +1 -1
  255. package/dist/utils/cloud-sdk/types.js.map +2 -2
  256. package/dist/utils/config.d.ts +10 -1
  257. package/dist/utils/config.d.ts.map +1 -1
  258. package/dist/utils/config.js +12 -2
  259. package/dist/utils/config.js.map +3 -3
  260. package/dist/utils/events.d.ts +23 -2
  261. package/dist/utils/events.d.ts.map +1 -1
  262. package/dist/utils/events.js +5 -3
  263. package/dist/utils/events.js.map +3 -3
  264. package/dist/utils/helpers.js +1 -1
  265. package/dist/utils/helpers.js.map +1 -1
  266. package/dist/utils/responses-output.js +1 -1
  267. package/dist/utils/responses-output.js.map +1 -1
  268. package/dist/utils/sdk-client.d.ts.map +1 -1
  269. package/dist/utils/sdk-client.js +17 -4
  270. package/dist/utils/sdk-client.js.map +4 -4
  271. package/dist/utils/waifu-metering.d.ts +108 -0
  272. package/dist/utils/waifu-metering.d.ts.map +1 -0
  273. package/dist/utils/waifu-metering.js +166 -0
  274. package/dist/utils/waifu-metering.js.map +10 -0
  275. package/package.json +52 -22
  276. package/registry-entry.json +208 -0
  277. package/src/cloud/auth-service-types.ts +24 -0
  278. package/src/cloud/base-url.ts +6 -62
  279. package/src/cloud/clack-observer.ts +189 -0
  280. package/src/cloud/duffel-client.ts +847 -0
  281. package/src/cloud/index.ts +10 -0
  282. package/src/cloud/lifeops-schedule-sync-client.ts +245 -0
  283. package/src/cloud/lifeops-schedule-sync-contracts.ts +124 -0
  284. package/src/cloud/managed-payment-clients.ts +374 -0
  285. package/src/cloud/null-observer.ts +45 -0
  286. package/src/cloud/setup-observer.ts +125 -0
  287. package/src/cloud/validate-url.ts +7 -1
  288. package/src/cloud/x402-payment-handler.ts +215 -0
  289. package/src/cloud-setup.ts +531 -0
  290. package/src/cloud-voice-catalog.test.ts +254 -0
  291. package/src/cloud-voice-catalog.ts +246 -0
  292. package/src/index.browser.ts +29 -0
  293. package/src/index.node.ts +31 -1
  294. package/src/index.ts +81 -4
  295. package/src/lib/cloud-connection.ts +2 -4
  296. package/src/lib/cloud-secrets.ts +10 -54
  297. package/src/lib/config-like.ts +1 -1
  298. package/src/lib/credential-type-map.ts +2 -2
  299. package/src/lib/http.ts +0 -17
  300. package/src/lib/server-cloud-tts.ts +33 -341
  301. package/src/lib/tts-debug.ts +5 -34
  302. package/src/models/embeddings.ts +187 -78
  303. package/src/models/image.ts +29 -14
  304. package/src/models/research.ts +11 -1
  305. package/src/models/speech.ts +269 -23
  306. package/src/models/text.ts +756 -114
  307. package/src/models/tokenization.ts +2 -2
  308. package/src/models/transcription.ts +7 -3
  309. package/src/plugin.ts +38 -0
  310. package/src/routes/cloud-billing-routes.ts +4 -14
  311. package/src/routes/cloud-coding-container-routes.ts +198 -0
  312. package/src/routes/cloud-compat-routes.ts +4 -14
  313. package/src/routes/cloud-features-routes.ts +1 -1
  314. package/src/routes/cloud-relay-routes.ts +47 -1
  315. package/src/routes/cloud-routes-autonomous.ts +7 -10
  316. package/src/routes/cloud-routes.ts +68 -7
  317. package/src/routes/cloud-status-routes-autonomous.ts +6 -2
  318. package/src/routes/home-remote-runner-access-url.ts +83 -0
  319. package/src/routes/travel-provider-relay-routes.ts +193 -0
  320. package/src/services/cloud-auth.ts +9 -2
  321. package/src/services/cloud-bootstrap.ts +1 -3
  322. package/src/services/cloud-bridge.ts +1 -1
  323. package/src/services/cloud-container.ts +93 -0
  324. package/src/services/cloud-credential-provider.ts +1 -1
  325. package/src/services/cloud-model-registry.ts +1 -1
  326. package/src/types/cloud.ts +22 -0
  327. package/src/types/index.ts +19 -0
  328. package/src/utils/cloud-sdk/client.ts +42 -3
  329. package/src/utils/cloud-sdk/public-routes.ts +168 -0
  330. package/src/utils/cloud-sdk/types.ts +0 -2
  331. package/src/utils/config.ts +20 -1
  332. package/src/utils/events.ts +30 -2
  333. package/src/utils/sdk-client.ts +5 -1
  334. package/src/utils/waifu-metering.ts +302 -0
  335. package/dist/onboarding.d.ts +0 -35
  336. package/dist/onboarding.d.ts.map +0 -1
  337. package/dist/onboarding.js.map +0 -14
  338. package/src/onboarding.ts +0 -396
@@ -19,7 +19,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
19
19
  // src/utils/config.ts
20
20
  import { logger } from "@elizaos/core";
21
21
  import { DEFAULT_ELIZA_CLOUD_TEXT_MODEL } from "@elizaos/core";
22
- var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "deepseek/deepseek-v4-pro";
22
+ var DEFAULT_ELIZA_CLOUD_LARGE_MODEL = "zai-glm-4.7";
23
23
  function getEnvValue(key) {
24
24
  if (typeof process === "undefined") {
25
25
  return;
@@ -109,9 +109,18 @@ function getExperimentalTelemetry(runtime) {
109
109
  const setting = getSetting(runtime, "ELIZAOS_CLOUD_EXPERIMENTAL_TELEMETRY", "false");
110
110
  return String(setting).toLowerCase() === "true";
111
111
  }
112
+ function resolveCloudTimeoutMs(envKey, defaultMs) {
113
+ const raw = typeof process !== "undefined" ? process.env[envKey] : undefined;
114
+ if (raw === undefined || raw.trim() === "")
115
+ return defaultMs;
116
+ const parsed = Number.parseInt(raw, 10);
117
+ if (!Number.isFinite(parsed))
118
+ return defaultMs;
119
+ return parsed <= 0 ? undefined : parsed;
120
+ }
112
121
 
113
122
  // src/utils/sdk-client.ts
114
- import { CloudApiClient, ElizaCloudClient } from "@elizaos/cloud-sdk";
123
+ import { ElizaCloudClient } from "@elizaos/cloud-sdk";
115
124
  function trimTrailingSlash(value) {
116
125
  return value.replace(/\/+$/, "");
117
126
  }
@@ -126,7 +135,11 @@ function apiKeyForRuntime(runtime, embedding = false) {
126
135
  }
127
136
  function createCloudApiClient(runtime, embedding = false) {
128
137
  const baseUrl = embedding ? getEmbeddingBaseURL(runtime) : getBaseURL(runtime);
129
- return new CloudApiClient(trimTrailingSlash(baseUrl), apiKeyForRuntime(runtime, embedding));
138
+ return new ElizaCloudClient({
139
+ apiBaseUrl: trimTrailingSlash(baseUrl),
140
+ baseUrl: apiBaseToSiteBaseUrl(baseUrl),
141
+ apiKey: apiKeyForRuntime(runtime, embedding)
142
+ }).v1;
130
143
  }
131
144
  function createElizaCloudClient(runtime) {
132
145
  const apiBaseUrl = trimTrailingSlash(getBaseURL(runtime));
@@ -141,7 +154,7 @@ function createElizaCloudClient(runtime) {
141
154
  import {
142
155
  EventType
143
156
  } from "@elizaos/core";
144
- function emitModelUsageEvent(runtime, type, _prompt, usage) {
157
+ function emitModelUsageEvent(runtime, type, _prompt, usage, meta = {}) {
145
158
  const inputTokens = Number(usage.inputTokens || 0);
146
159
  const outputTokens = Number(usage.outputTokens || 0);
147
160
  const totalTokens = Number(usage.totalTokens != null ? usage.totalTokens : inputTokens + outputTokens);
@@ -153,22 +166,13 @@ function emitModelUsageEvent(runtime, type, _prompt, usage) {
153
166
  prompt: inputTokens,
154
167
  completion: outputTokens,
155
168
  total: totalTokens
156
- }
169
+ },
170
+ ...meta.modelName ? { modelName: meta.modelName } : {},
171
+ ...typeof meta.costUsd === "number" && Number.isFinite(meta.costUsd) ? { costUsd: meta.costUsd } : {}
157
172
  };
158
173
  runtime.emitEvent(EventType.MODEL_USED, payload);
159
174
  }
160
175
 
161
- // src/providers/openai.ts
162
- import { createOpenAI } from "@ai-sdk/openai";
163
- function createOpenAIClient(runtime) {
164
- const baseURL = getBaseURL(runtime);
165
- const apiKey = getApiKey(runtime) ?? (isProxyMode(runtime) ? "eliza-proxy" : undefined);
166
- return createOpenAI({
167
- apiKey: apiKey ?? "",
168
- baseURL
169
- });
170
- }
171
-
172
176
  // src/utils/responses-output.ts
173
177
  function asRecord(value) {
174
178
  if (!value || typeof value !== "object" || Array.isArray(value)) {
@@ -254,8 +258,11 @@ import {
254
258
  buildCanonicalSystemPrompt,
255
259
  logger as logger2,
256
260
  ModelType,
261
+ recordInferenceSpan,
257
262
  renderChatMessagesForPrompt,
258
- resolveEffectiveSystemPrompt
263
+ resolveEffectiveSystemPrompt,
264
+ Semaphore,
265
+ timeInferenceSpan
259
266
  } from "@elizaos/core";
260
267
  var TEXT_NANO_MODEL_TYPE = ModelType.TEXT_NANO ?? "TEXT_NANO";
261
268
  var TEXT_MEDIUM_MODEL_TYPE = ModelType.TEXT_MEDIUM ?? "TEXT_MEDIUM";
@@ -264,6 +271,61 @@ var TEXT_LARGE_MODEL_TYPE = ModelType.TEXT_LARGE;
264
271
  var TEXT_MEGA_MODEL_TYPE = ModelType.TEXT_MEGA ?? "TEXT_MEGA";
265
272
  var RESPONSE_HANDLER_MODEL_TYPE = ModelType.RESPONSE_HANDLER ?? "RESPONSE_HANDLER";
266
273
  var ACTION_PLANNER_MODEL_TYPE = ModelType.ACTION_PLANNER ?? "ACTION_PLANNER";
274
+ var NATIVE_CONCURRENCY_ENV = "ELIZAOS_CLOUD_NATIVE_CONCURRENCY";
275
+ var DEFAULT_NATIVE_CONCURRENCY = 8;
276
+ var TEXT_TIMEOUT_ENV = "ELIZAOS_CLOUD_TEXT_TIMEOUT_MS";
277
+ var DEFAULT_TEXT_TIMEOUT_MS = 120000;
278
+ function resolveTextTimeoutMs() {
279
+ const raw = typeof process !== "undefined" ? process.env[TEXT_TIMEOUT_ENV] : undefined;
280
+ if (raw === undefined || raw.trim() === "")
281
+ return DEFAULT_TEXT_TIMEOUT_MS;
282
+ const parsed = Number.parseInt(raw, 10);
283
+ if (!Number.isFinite(parsed))
284
+ return DEFAULT_TEXT_TIMEOUT_MS;
285
+ return parsed <= 0 ? undefined : parsed;
286
+ }
287
+ var STREAMING_ENV = "ELIZAOS_CLOUD_STREAMING";
288
+ function resolveStreamingEnabled() {
289
+ const raw = typeof process !== "undefined" ? process.env[STREAMING_ENV] : undefined;
290
+ if (raw === undefined)
291
+ return true;
292
+ const v = raw.trim().toLowerCase();
293
+ return v !== "0" && v !== "false" && v !== "off";
294
+ }
295
+ function buildStreamAbortSignal(abortSignal, timeoutMs) {
296
+ const timeoutSig = typeof timeoutMs === "number" && timeoutMs > 0 ? AbortSignal.timeout(timeoutMs) : undefined;
297
+ if (abortSignal && timeoutSig)
298
+ return AbortSignal.any([abortSignal, timeoutSig]);
299
+ return abortSignal ?? timeoutSig;
300
+ }
301
+ var nativeChatLimiter = null;
302
+ function resolveNativeConcurrency() {
303
+ const raw = typeof process !== "undefined" ? process.env[NATIVE_CONCURRENCY_ENV] : undefined;
304
+ const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;
305
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_NATIVE_CONCURRENCY;
306
+ }
307
+ function getNativeChatLimiter() {
308
+ if (!nativeChatLimiter) {
309
+ nativeChatLimiter = new Semaphore(resolveNativeConcurrency());
310
+ }
311
+ return nativeChatLimiter;
312
+ }
313
+ async function withNativeChatLimit(fn, label = "native") {
314
+ const limiter = getNativeChatLimiter();
315
+ const waitStartedAt = Date.now();
316
+ await limiter.acquire();
317
+ recordInferenceSpan("cloud.semaphore-wait", Date.now() - waitStartedAt, {
318
+ route: label
319
+ });
320
+ try {
321
+ return await timeInferenceSpan(`cloud.http:${label}`, fn, { route: label });
322
+ } finally {
323
+ limiter.release();
324
+ }
325
+ }
326
+ function __resetNativeChatLimiterForTests() {
327
+ nativeChatLimiter = null;
328
+ }
267
329
  var REASONING_MODEL_PATTERNS = [
268
330
  "o1",
269
331
  "o3",
@@ -274,26 +336,53 @@ var REASONING_MODEL_PATTERNS = [
274
336
  "claude-opus-4-7",
275
337
  "gpt-5"
276
338
  ];
277
- var RESPONSES_ROUTED_PREFIXES = ["openai/", "anthropic/"];
278
- function buildUserContent(params) {
279
- const content = [{ type: "text", text: params.prompt ?? "" }];
280
- for (const attachment of params.attachments ?? []) {
281
- content.push({
282
- type: "file",
283
- data: attachment.data,
284
- mediaType: attachment.mediaType,
285
- ...attachment.filename ? { filename: attachment.filename } : {}
286
- });
339
+ var SPAN_SAMPLER_HONORING_MODEL_PREFIXES = [
340
+ "vast/eliza-1-",
341
+ "elizaos/eliza-1-",
342
+ "eliza-1-"
343
+ ];
344
+ function isSpanSamplerHonoringModel(modelName) {
345
+ const lower = modelName.toLowerCase();
346
+ return SPAN_SAMPLER_HONORING_MODEL_PREFIXES.some((prefix) => lower.startsWith(prefix));
347
+ }
348
+ function buildSpanSamplerHeader(plan) {
349
+ if (!plan || plan.overrides.length === 0)
350
+ return;
351
+ const overrides = plan.overrides.map((o) => {
352
+ const wire = {
353
+ span_index: o.spanIndex,
354
+ temperature: o.temperature
355
+ };
356
+ if (typeof o.topK === "number")
357
+ wire.top_k = o.topK;
358
+ if (typeof o.topP === "number")
359
+ wire.top_p = o.topP;
360
+ return wire;
361
+ });
362
+ const body = { overrides };
363
+ if (plan.strict === true)
364
+ body.strict = true;
365
+ return JSON.stringify(body);
366
+ }
367
+ function extractCostUsd(usage, response) {
368
+ const fromBody = firstNumber(asRecord2(usage).cost_usd, asRecord2(usage).costUsd, asRecord2(usage).cost);
369
+ if (typeof fromBody === "number" && Number.isFinite(fromBody)) {
370
+ return fromBody;
371
+ }
372
+ const header = response?.headers?.get?.("X-Eliza-Cost-Usd");
373
+ if (header) {
374
+ const parsed = Number(header);
375
+ if (Number.isFinite(parsed))
376
+ return parsed;
287
377
  }
288
- return content;
378
+ return;
289
379
  }
290
380
  function isReasoningModel(modelName) {
291
381
  const lower = modelName.toLowerCase();
292
382
  return REASONING_MODEL_PATTERNS.some((pattern) => lower.includes(pattern));
293
383
  }
294
- function supportsStopSequences(modelName) {
295
- const lower = modelName.toLowerCase();
296
- return !RESPONSES_ROUTED_PREFIXES.some((prefix) => lower.startsWith(prefix));
384
+ function isCerebrasServedModel(modelName) {
385
+ return modelName.toLowerCase().includes("gpt-oss");
297
386
  }
298
387
  function isRecord(value) {
299
388
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -371,26 +460,39 @@ function unwrapJsonSchema(value) {
371
460
  const record = asRecord2(value);
372
461
  return record.schema ?? record.jsonSchema ?? value;
373
462
  }
463
+ function normalizeNativeToolEntry(rawTool, fallbackName) {
464
+ const tool = asRecord2(rawTool);
465
+ const nested = asRecord2(tool.function);
466
+ const name = firstString(nested.name, tool.name, fallbackName);
467
+ if (!name) {
468
+ return;
469
+ }
470
+ const description = firstString(nested.description, tool.description);
471
+ const inputSchema = unwrapJsonSchema(nested.parameters ?? tool.inputSchema ?? tool.parameters ?? tool.schema ?? { type: "object" });
472
+ return {
473
+ type: "function",
474
+ function: {
475
+ name,
476
+ ...description ? { description } : {},
477
+ parameters: inputSchema
478
+ }
479
+ };
480
+ }
374
481
  function normalizeNativeTools(tools) {
375
482
  if (!tools) {
376
483
  return;
377
484
  }
378
485
  if (Array.isArray(tools)) {
379
- return tools;
486
+ const normalized2 = tools.map((tool) => normalizeNativeToolEntry(tool)).filter((tool) => tool !== undefined);
487
+ return normalized2.length > 0 ? normalized2 : undefined;
380
488
  }
381
489
  const toolSet = asRecord2(tools);
382
490
  const normalized = [];
383
491
  for (const [name, rawTool] of Object.entries(toolSet)) {
384
- const tool = asRecord2(rawTool);
385
- const inputSchema = unwrapJsonSchema(tool.inputSchema ?? tool.parameters ?? tool.schema ?? { type: "object" });
386
- normalized.push({
387
- type: "function",
388
- function: {
389
- name,
390
- ...typeof tool.description === "string" ? { description: tool.description } : {},
391
- parameters: inputSchema
392
- }
393
- });
492
+ const entry = normalizeNativeToolEntry(rawTool, name);
493
+ if (entry) {
494
+ normalized.push(entry);
495
+ }
394
496
  }
395
497
  return normalized.length > 0 ? normalized : undefined;
396
498
  }
@@ -403,7 +505,15 @@ function normalizeNativeToolChoice(toolChoice) {
403
505
  }
404
506
  const choice = asRecord2(toolChoice);
405
507
  if (choice.type === "function") {
406
- return toolChoice;
508
+ const functionChoice2 = recordAt(choice, "function");
509
+ const toolName2 = firstString(functionChoice2.name, choice.name, choice.toolName);
510
+ return toolName2 ? {
511
+ type: "function",
512
+ function: {
513
+ ...functionChoice2,
514
+ name: toolName2
515
+ }
516
+ } : undefined;
407
517
  }
408
518
  if (choice.type === "tool") {
409
519
  const toolName2 = firstString(choice.toolName, choice.name);
@@ -413,10 +523,13 @@ function normalizeNativeToolChoice(toolChoice) {
413
523
  const toolName = firstString(choice.toolName, choice.name, functionChoice.name);
414
524
  return toolName ? { type: "function", function: { name: toolName } } : toolChoice;
415
525
  }
416
- function buildNativeResponseFormat(responseSchema) {
526
+ function buildNativeResponseFormat(responseSchema, modelName) {
417
527
  if (!responseSchema) {
418
528
  return;
419
529
  }
530
+ if (isCerebrasServedModel(modelName)) {
531
+ return { type: "json_object" };
532
+ }
420
533
  const schemaRecord = asRecord2(responseSchema);
421
534
  if (schemaRecord.responseFormat) {
422
535
  return schemaRecord.responseFormat;
@@ -494,15 +607,20 @@ function buildNativeRequestBody(params, modelName, promptText, systemPrompt) {
494
607
  const promptCacheKey = providerOptions ? resolvePromptCacheKey(providerOptions) : undefined;
495
608
  const tools = normalizeNativeTools(params.tools);
496
609
  const toolChoice = normalizeNativeToolChoice(params.toolChoice);
497
- const responseFormat = buildNativeResponseFormat(params.responseSchema);
610
+ const responseFormat = buildNativeResponseFormat(params.responseSchema, modelName);
498
611
  const requestBody = {
499
612
  model: modelName,
500
- messages: buildNativeMessages(params, promptText, systemPrompt),
501
- max_tokens: params.maxTokens ?? 8192
613
+ messages: buildNativeMessages(params, promptText, systemPrompt)
502
614
  };
615
+ if (!params.omitMaxTokens) {
616
+ requestBody.max_tokens = params.maxTokens ?? 8192;
617
+ }
503
618
  if (!isReasoningModel(modelName) && typeof params.temperature === "number") {
504
619
  requestBody.temperature = params.temperature;
505
620
  }
621
+ if (isCerebrasServedModel(modelName) && recordAt(asRecord2(params.providerOptions), "eliza").thinking === "off") {
622
+ requestBody.reasoning_effort = "low";
623
+ }
506
624
  if (tools) {
507
625
  requestBody.tools = tools;
508
626
  }
@@ -616,16 +734,8 @@ function getModelNameForType(runtime, modelType) {
616
734
  }
617
735
  }
618
736
  function buildGenerateParams(runtime, modelType, params) {
619
- const paramsWithAttachments = params;
620
737
  const prompt = params.prompt ?? "";
621
- const maxTokens = params.maxTokens ?? 8192;
622
- const openai = createOpenAIClient(runtime);
623
738
  const modelName = getModelNameForType(runtime, modelType);
624
- const experimentalTelemetry = getExperimentalTelemetry(runtime);
625
- const userContent = (paramsWithAttachments.attachments?.length ?? 0) > 0 ? buildUserContent(paramsWithAttachments) : undefined;
626
- const model = openai.chat(modelName);
627
- const reasoning = isReasoningModel(modelName);
628
- const stopSequences = !reasoning && supportsStopSequences(modelName) && Array.isArray(params.stopSequences) && params.stopSequences.length > 0 ? params.stopSequences : undefined;
629
739
  const systemPrompt = resolveEffectiveSystemPrompt({
630
740
  params,
631
741
  fallback: buildCanonicalSystemPrompt({ character: runtime.character })
@@ -633,28 +743,24 @@ function buildGenerateParams(runtime, modelType, params) {
633
743
  const promptText = renderChatMessagesForPrompt(params.messages, {
634
744
  omitDuplicateSystem: systemPrompt
635
745
  }) ?? prompt;
636
- const generateParams = {
637
- model,
638
- ...userContent ? { messages: [{ role: "user", content: userContent }] } : { prompt: promptText },
639
- system: systemPrompt,
640
- ...stopSequences ? { stopSequences } : {},
641
- maxOutputTokens: maxTokens,
642
- experimental_telemetry: {
643
- isEnabled: experimentalTelemetry
644
- }
645
- };
646
- return { generateParams, modelName, modelType, prompt: promptText, systemPrompt };
746
+ return { modelName, modelType, prompt: promptText, systemPrompt };
647
747
  }
648
748
  async function generateTextWithModel(runtime, modelType, params) {
649
749
  const { modelName, prompt, systemPrompt } = buildGenerateParams(runtime, modelType, params);
650
750
  const paramsWithNative = params;
651
751
  logger2.debug(`[ELIZAOS_CLOUD] Generating text with ${modelType} model: ${modelName}`);
652
- if (params.stream) {
653
- logger2.debug("[ELIZAOS_CLOUD] Streaming text disabled for responses compatibility; falling back to buffered response.");
654
- }
752
+ const paramsStreaming = params;
753
+ const wantsStream = Boolean(paramsStreaming.stream) && paramsStreaming.streamStructured === true && resolveStreamingEnabled();
655
754
  logger2.log(`[ELIZAOS_CLOUD] Using ${modelType} model: ${modelName}`);
656
755
  logger2.log(prompt);
657
756
  if (hasNativeTransportOptions(paramsWithNative)) {
757
+ if (wantsStream) {
758
+ return streamNativeChatCompletion(runtime, modelType, paramsWithNative, {
759
+ modelName,
760
+ prompt,
761
+ systemPrompt
762
+ });
763
+ }
658
764
  const nativeResult = await generateNativeChatCompletion(runtime, modelType, paramsWithNative, {
659
765
  modelName,
660
766
  prompt,
@@ -676,19 +782,29 @@ async function generateTextWithModel(runtime, modelType, params) {
676
782
  });
677
783
  const requestBody = {
678
784
  model: modelName,
679
- input,
680
- max_output_tokens: params.maxTokens ?? 8192
785
+ input
681
786
  };
787
+ if (!params.omitMaxTokens) {
788
+ requestBody.max_output_tokens = params.maxTokens ?? 8192;
789
+ }
682
790
  if (!reasoning && typeof params.temperature === "number") {
683
791
  requestBody.temperature = params.temperature;
684
792
  }
685
- const response = await createCloudApiClient(runtime).requestRaw("POST", "/responses", {
686
- headers: {
687
- "X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
688
- "X-Eliza-Model-Type": modelType
689
- },
690
- json: requestBody
691
- });
793
+ const responsesHeaders = {
794
+ "X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
795
+ "X-Eliza-Model-Type": modelType
796
+ };
797
+ if (isSpanSamplerHonoringModel(modelName)) {
798
+ const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
799
+ if (samplerHeader) {
800
+ responsesHeaders["x-eliza-span-samplers"] = samplerHeader;
801
+ }
802
+ }
803
+ const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/responses", {
804
+ headers: responsesHeaders,
805
+ json: requestBody,
806
+ timeoutMs: resolveTextTimeoutMs()
807
+ }), "responses");
692
808
  const responseText = await response.text();
693
809
  let data = {};
694
810
  if (responseText) {
@@ -713,6 +829,12 @@ async function generateTextWithModel(runtime, modelType, params) {
713
829
  inputTokens: data.usage.input_tokens ?? 0,
714
830
  outputTokens: data.usage.output_tokens ?? 0,
715
831
  totalTokens: data.usage.total_tokens ?? 0
832
+ }, {
833
+ modelName: getModelNameForType(runtime, modelType),
834
+ ...(() => {
835
+ const costUsd = extractCostUsd(data.usage, response);
836
+ return typeof costUsd === "number" ? { costUsd } : {};
837
+ })()
716
838
  });
717
839
  }
718
840
  const text = extractResponsesOutputText(data);
@@ -723,13 +845,21 @@ async function generateTextWithModel(runtime, modelType, params) {
723
845
  }
724
846
  async function generateNativeChatCompletion(runtime, modelType, params, context) {
725
847
  const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
726
- const response = await createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
727
- headers: {
728
- "X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
729
- "X-Eliza-Model-Type": modelType
730
- },
731
- json: requestBody
732
- });
848
+ const headers = {
849
+ "X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
850
+ "X-Eliza-Model-Type": modelType
851
+ };
852
+ if (isSpanSamplerHonoringModel(context.modelName)) {
853
+ const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
854
+ if (samplerHeader) {
855
+ headers["x-eliza-span-samplers"] = samplerHeader;
856
+ }
857
+ }
858
+ const response = await withNativeChatLimit(() => createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
859
+ headers,
860
+ json: requestBody,
861
+ timeoutMs: resolveTextTimeoutMs()
862
+ }), "chat/completions");
733
863
  const responseText = await response.text();
734
864
  let data = {};
735
865
  if (responseText) {
@@ -751,7 +881,13 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
751
881
  }
752
882
  const usage = convertNativeUsage(data.usage);
753
883
  if (usage) {
754
- emitModelUsageEvent(runtime, modelType, context.prompt, usage);
884
+ emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
885
+ modelName: context.modelName,
886
+ ...(() => {
887
+ const costUsd = extractCostUsd(data.usage, response);
888
+ return typeof costUsd === "number" ? { costUsd } : {};
889
+ })()
890
+ });
755
891
  }
756
892
  const text = extractChatCompletionText(data);
757
893
  const toolCalls = extractNativeToolCalls(data);
@@ -769,6 +905,251 @@ async function generateNativeChatCompletion(runtime, modelType, params, context)
769
905
  }
770
906
  };
771
907
  }
908
+ function deferred() {
909
+ let resolve;
910
+ const promise = new Promise((r) => {
911
+ resolve = r;
912
+ });
913
+ return { promise, resolve };
914
+ }
915
+ async function* parseOpenAiSseStream(body) {
916
+ const reader = body.getReader();
917
+ const decoder = new TextDecoder;
918
+ let buffer = "";
919
+ const handle = (line) => {
920
+ const trimmed = line.trimStart();
921
+ if (!trimmed.startsWith("data:"))
922
+ return null;
923
+ const payload = trimmed.slice(5).trim();
924
+ if (payload === "")
925
+ return null;
926
+ if (payload === "[DONE]")
927
+ return "DONE";
928
+ try {
929
+ return JSON.parse(payload);
930
+ } catch {
931
+ return null;
932
+ }
933
+ };
934
+ try {
935
+ for (;; ) {
936
+ const { value, done } = await reader.read();
937
+ if (done)
938
+ break;
939
+ buffer += decoder.decode(value, { stream: true });
940
+ let nl;
941
+ while ((nl = buffer.indexOf(`
942
+ `)) >= 0) {
943
+ const line = buffer.slice(0, nl);
944
+ buffer = buffer.slice(nl + 1);
945
+ const frame = handle(line);
946
+ if (frame === "DONE")
947
+ return;
948
+ if (frame)
949
+ yield frame;
950
+ }
951
+ }
952
+ const tail = handle(buffer);
953
+ if (tail && tail !== "DONE")
954
+ yield tail;
955
+ } finally {
956
+ try {
957
+ await reader.cancel();
958
+ } catch {}
959
+ }
960
+ }
961
+ function accumulateToolCallDeltas(acc, deltas) {
962
+ if (!Array.isArray(deltas))
963
+ return;
964
+ for (const raw of deltas) {
965
+ const d = asRecord2(raw);
966
+ const index = typeof d.index === "number" ? d.index : 0;
967
+ const cur = acc.get(index) ?? { args: "" };
968
+ const id = firstString(d.id);
969
+ if (id)
970
+ cur.id = id;
971
+ const fn = recordAt(d, "function");
972
+ const name = firstString(fn.name);
973
+ if (name)
974
+ cur.name = name;
975
+ if (typeof fn.arguments === "string")
976
+ cur.args += fn.arguments;
977
+ acc.set(index, cur);
978
+ }
979
+ }
980
+ function finalizeStreamedToolCalls(acc) {
981
+ const out = [];
982
+ for (const [index, c] of [...acc.entries()].sort((a, b) => a[0] - b[0])) {
983
+ if (!c.name)
984
+ continue;
985
+ out.push({
986
+ type: "tool-call",
987
+ toolCallId: c.id ?? `call_${c.name}_${index}`,
988
+ toolName: c.name,
989
+ input: parseJsonIfPossible(c.args.trim() === "" ? "{}" : c.args)
990
+ });
991
+ }
992
+ return out;
993
+ }
994
+ async function streamNativeChatCompletion(runtime, modelType, params, context) {
995
+ const requestBody = buildNativeRequestBody(params, context.modelName, context.prompt, context.systemPrompt);
996
+ requestBody.stream = true;
997
+ requestBody.stream_options = { include_usage: true };
998
+ const headers = {
999
+ "X-Eliza-Llm-Purpose": getPurposeForModelType(modelType),
1000
+ "X-Eliza-Model-Type": modelType
1001
+ };
1002
+ if (isSpanSamplerHonoringModel(context.modelName)) {
1003
+ const samplerHeader = buildSpanSamplerHeader(params.spanSamplerPlan);
1004
+ if (samplerHeader) {
1005
+ headers["x-eliza-span-samplers"] = samplerHeader;
1006
+ }
1007
+ }
1008
+ const abortSignal = params.signal;
1009
+ const signal = buildStreamAbortSignal(abortSignal, resolveTextTimeoutMs());
1010
+ const limiter = getNativeChatLimiter();
1011
+ const waitStartedAt = Date.now();
1012
+ await limiter.acquire();
1013
+ recordInferenceSpan("cloud.semaphore-wait", Date.now() - waitStartedAt, {
1014
+ route: "chat/completions:stream"
1015
+ });
1016
+ let permitReleased = false;
1017
+ const releasePermit = () => {
1018
+ if (!permitReleased) {
1019
+ permitReleased = true;
1020
+ limiter.release();
1021
+ }
1022
+ };
1023
+ let response;
1024
+ try {
1025
+ response = await createCloudApiClient(runtime).requestRaw("POST", "/chat/completions", {
1026
+ headers,
1027
+ json: requestBody,
1028
+ ...signal ? { signal } : {}
1029
+ });
1030
+ } catch (err) {
1031
+ releasePermit();
1032
+ throw err;
1033
+ }
1034
+ if (!response.ok) {
1035
+ let errorBody;
1036
+ try {
1037
+ const errText = await response.text();
1038
+ if (errText) {
1039
+ errorBody = JSON.parse(errText).error;
1040
+ }
1041
+ } catch {}
1042
+ releasePermit();
1043
+ const message = typeof errorBody?.message === "string" && errorBody.message.trim() ? errorBody.message.trim() : `elizaOS Cloud error ${response.status}`;
1044
+ const requestError = new Error(message);
1045
+ requestError.status = response.status;
1046
+ if (errorBody)
1047
+ requestError.error = errorBody;
1048
+ throw requestError;
1049
+ }
1050
+ const contentType = response.headers.get("content-type") ?? "";
1051
+ const isSse = contentType.includes("text/event-stream") && response.body !== null;
1052
+ if (!isSse) {
1053
+ const bufferedText = await response.text();
1054
+ releasePermit();
1055
+ let data = {};
1056
+ if (bufferedText) {
1057
+ try {
1058
+ data = JSON.parse(bufferedText);
1059
+ } catch (parseErr) {
1060
+ logger2.error(`[ELIZAOS_CLOUD] Failed to parse buffered chat completions JSON: ${parseErr instanceof Error ? parseErr.message : String(parseErr)}`);
1061
+ }
1062
+ }
1063
+ const text = extractChatCompletionText(data);
1064
+ const toolCalls = extractNativeToolCalls(data);
1065
+ const usage = convertNativeUsage(data.usage);
1066
+ if (usage) {
1067
+ emitModelUsageEvent(runtime, modelType, context.prompt, usage, {
1068
+ modelName: context.modelName,
1069
+ ...(() => {
1070
+ const costUsd = extractCostUsd(data.usage, response);
1071
+ return typeof costUsd === "number" ? { costUsd } : {};
1072
+ })()
1073
+ });
1074
+ }
1075
+ if (!text.trim() && toolCalls.length === 0) {
1076
+ throw new Error("elizaOS Cloud returned no text or tool calls");
1077
+ }
1078
+ async function* single() {
1079
+ if (text)
1080
+ yield text;
1081
+ }
1082
+ return {
1083
+ textStream: single(),
1084
+ text: Promise.resolve(text),
1085
+ usage: Promise.resolve(usage),
1086
+ finishReason: Promise.resolve(data.choices?.[0]?.finish_reason),
1087
+ toolCalls: Promise.resolve(toolCalls),
1088
+ providerMetadata: { modelName: context.modelName, usage: data.usage }
1089
+ };
1090
+ }
1091
+ const body = response.body;
1092
+ const toolAcc = new Map;
1093
+ let accumulated = "";
1094
+ let nativeUsage;
1095
+ let rawUsage;
1096
+ let finishReason;
1097
+ const textD = deferred();
1098
+ const usageD = deferred();
1099
+ const finishD = deferred();
1100
+ const toolCallsD = deferred();
1101
+ async function* generate() {
1102
+ try {
1103
+ for await (const frame of parseOpenAiSseStream(body)) {
1104
+ if (frame.error) {
1105
+ const message = asRecord2(frame.error).message;
1106
+ throw new Error(typeof message === "string" && message.trim() ? message.trim() : "elizaOS Cloud stream error");
1107
+ }
1108
+ const choices = Array.isArray(frame.choices) ? frame.choices : [];
1109
+ const choice = asRecord2(choices[0]);
1110
+ const delta = recordAt(choice, "delta");
1111
+ if (typeof delta.content === "string" && delta.content.length > 0) {
1112
+ accumulated += delta.content;
1113
+ yield delta.content;
1114
+ }
1115
+ if (delta.tool_calls) {
1116
+ accumulateToolCallDeltas(toolAcc, delta.tool_calls);
1117
+ }
1118
+ const fr = firstString(choice.finish_reason);
1119
+ if (fr)
1120
+ finishReason = fr;
1121
+ if (frame.usage) {
1122
+ rawUsage = frame.usage;
1123
+ nativeUsage = convertNativeUsage(frame.usage);
1124
+ }
1125
+ }
1126
+ } finally {
1127
+ releasePermit();
1128
+ const toolCalls = finalizeStreamedToolCalls(toolAcc);
1129
+ textD.resolve(accumulated);
1130
+ usageD.resolve(nativeUsage);
1131
+ finishD.resolve(finishReason);
1132
+ toolCallsD.resolve(toolCalls);
1133
+ if (nativeUsage) {
1134
+ emitModelUsageEvent(runtime, modelType, context.prompt, nativeUsage, {
1135
+ modelName: context.modelName,
1136
+ ...(() => {
1137
+ const costUsd = extractCostUsd(rawUsage, response);
1138
+ return typeof costUsd === "number" ? { costUsd } : {};
1139
+ })()
1140
+ });
1141
+ }
1142
+ }
1143
+ }
1144
+ return {
1145
+ textStream: generate(),
1146
+ text: textD.promise,
1147
+ usage: usageD.promise,
1148
+ finishReason: finishD.promise,
1149
+ toolCalls: toolCallsD.promise,
1150
+ providerMetadata: { modelName: context.modelName }
1151
+ };
1152
+ }
772
1153
  async function handleTextSmall(runtime, params) {
773
1154
  return generateTextWithModel(runtime, TEXT_SMALL_MODEL_TYPE, params);
774
1155
  }
@@ -791,13 +1172,25 @@ async function handleActionPlanner(runtime, params) {
791
1172
  return generateTextWithModel(runtime, ACTION_PLANNER_MODEL_TYPE, params);
792
1173
  }
793
1174
  export {
1175
+ withNativeChatLimit,
1176
+ streamNativeChatCompletion,
1177
+ resolveTextTimeoutMs,
1178
+ resolveStreamingEnabled,
1179
+ parseOpenAiSseStream,
1180
+ normalizeNativeTools,
1181
+ normalizeNativeToolChoice,
794
1182
  handleTextSmall,
795
1183
  handleTextNano,
796
1184
  handleTextMega,
797
1185
  handleTextMedium,
798
1186
  handleTextLarge,
799
1187
  handleResponseHandler,
800
- handleActionPlanner
1188
+ handleActionPlanner,
1189
+ generateNativeChatCompletion,
1190
+ finalizeStreamedToolCalls,
1191
+ buildStreamAbortSignal,
1192
+ accumulateToolCallDeltas,
1193
+ __resetNativeChatLimiterForTests
801
1194
  };
802
1195
 
803
- //# debugId=DF0E0E9E46BB9DE664756E2164756E21
1196
+ //# debugId=8C7301DC53E50E9164756E2164756E21