@elizaos/plugin-training 2.0.3-beta.6 → 2.0.3-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.
Files changed (363) hide show
  1. package/dist/backends/native.d.ts +96 -0
  2. package/dist/backends/native.d.ts.map +1 -0
  3. package/dist/backends/native.js +308 -0
  4. package/dist/backends/native.js.map +1 -0
  5. package/dist/cli/train.d.ts +22 -0
  6. package/dist/cli/train.d.ts.map +1 -0
  7. package/dist/cli/train.js +219 -0
  8. package/dist/cli/train.js.map +1 -0
  9. package/dist/core/action-benchmark-runner.d.ts +55 -0
  10. package/dist/core/action-benchmark-runner.d.ts.map +1 -0
  11. package/dist/core/action-benchmark-runner.js +341 -0
  12. package/dist/core/action-benchmark-runner.js.map +1 -0
  13. package/dist/core/artifact-store.d.ts +72 -0
  14. package/dist/core/artifact-store.d.ts.map +1 -0
  15. package/dist/core/artifact-store.js +50 -0
  16. package/dist/core/artifact-store.js.map +1 -0
  17. package/dist/core/benchmark-matrix-artifact.d.ts +102 -0
  18. package/dist/core/benchmark-matrix-artifact.d.ts.map +1 -0
  19. package/dist/core/benchmark-matrix-artifact.js +381 -0
  20. package/dist/core/benchmark-matrix-artifact.js.map +1 -0
  21. package/dist/core/benchmark-vs-cerebras-runner.d.ts +37 -0
  22. package/dist/core/benchmark-vs-cerebras-runner.d.ts.map +1 -0
  23. package/dist/core/benchmark-vs-cerebras-runner.js +151 -0
  24. package/dist/core/benchmark-vs-cerebras-runner.js.map +1 -0
  25. package/dist/core/cerebras-eval-model.d.ts +54 -0
  26. package/dist/core/cerebras-eval-model.d.ts.map +1 -0
  27. package/dist/core/cerebras-eval-model.js +249 -0
  28. package/dist/core/cerebras-eval-model.js.map +1 -0
  29. package/dist/core/cli.d.ts +15 -0
  30. package/dist/core/cli.d.ts.map +1 -0
  31. package/dist/core/cli.js +1003 -0
  32. package/dist/core/cli.js.map +1 -0
  33. package/dist/core/context-audit.d.ts +51 -0
  34. package/dist/core/context-audit.d.ts.map +1 -0
  35. package/dist/core/context-audit.js +166 -0
  36. package/dist/core/context-audit.js.map +1 -0
  37. package/dist/core/context-catalog.d.ts +47 -0
  38. package/dist/core/context-catalog.d.ts.map +1 -0
  39. package/dist/core/context-catalog.js +269 -0
  40. package/dist/core/context-catalog.js.map +1 -0
  41. package/dist/core/context-types.d.ts +3 -0
  42. package/dist/core/context-types.d.ts.map +1 -0
  43. package/dist/core/context-types.js +18 -0
  44. package/dist/core/context-types.js.map +1 -0
  45. package/dist/core/dataset-generator.d.ts +135 -0
  46. package/dist/core/dataset-generator.d.ts.map +1 -0
  47. package/dist/core/dataset-generator.js +895 -0
  48. package/dist/core/dataset-generator.js.map +1 -0
  49. package/dist/core/eliza1-benchmark-recipe.d.ts +18 -0
  50. package/dist/core/eliza1-benchmark-recipe.d.ts.map +1 -0
  51. package/dist/core/eliza1-benchmark-recipe.js +64 -0
  52. package/dist/core/eliza1-benchmark-recipe.js.map +1 -0
  53. package/dist/core/eliza1-bundle-stager.d.ts +57 -0
  54. package/dist/core/eliza1-bundle-stager.d.ts.map +1 -0
  55. package/dist/core/eliza1-bundle-stager.js +149 -0
  56. package/dist/core/eliza1-bundle-stager.js.map +1 -0
  57. package/dist/core/ensure-cron-job.d.ts +53 -0
  58. package/dist/core/ensure-cron-job.d.ts.map +1 -0
  59. package/dist/core/ensure-cron-job.js +51 -0
  60. package/dist/core/ensure-cron-job.js.map +1 -0
  61. package/dist/core/eval-comparison-artifact.d.ts +72 -0
  62. package/dist/core/eval-comparison-artifact.d.ts.map +1 -0
  63. package/dist/core/eval-comparison-artifact.js +281 -0
  64. package/dist/core/eval-comparison-artifact.js.map +1 -0
  65. package/dist/core/feed-generation-runner.d.ts +37 -0
  66. package/dist/core/feed-generation-runner.d.ts.map +1 -0
  67. package/dist/core/feed-generation-runner.js +232 -0
  68. package/dist/core/feed-generation-runner.js.map +1 -0
  69. package/dist/core/html-escape.d.ts +5 -0
  70. package/dist/core/html-escape.d.ts.map +1 -0
  71. package/dist/core/html-escape.js +11 -0
  72. package/dist/core/html-escape.js.map +1 -0
  73. package/dist/core/huggingface-dataset-ingest.d.ts +52 -0
  74. package/dist/core/huggingface-dataset-ingest.d.ts.map +1 -0
  75. package/dist/core/huggingface-dataset-ingest.js +134 -0
  76. package/dist/core/huggingface-dataset-ingest.js.map +1 -0
  77. package/dist/core/index.d.ts +29 -0
  78. package/dist/core/index.d.ts.map +1 -0
  79. package/dist/core/index.js +204 -0
  80. package/dist/core/index.js.map +1 -0
  81. package/dist/core/privacy-filter.d.ts +95 -0
  82. package/dist/core/privacy-filter.d.ts.map +1 -0
  83. package/dist/core/privacy-filter.js +324 -0
  84. package/dist/core/privacy-filter.js.map +1 -0
  85. package/dist/core/promotion-gate.d.ts +117 -0
  86. package/dist/core/promotion-gate.d.ts.map +1 -0
  87. package/dist/core/promotion-gate.js +85 -0
  88. package/dist/core/promotion-gate.js.map +1 -0
  89. package/dist/core/promotion-persist.d.ts +116 -0
  90. package/dist/core/promotion-persist.d.ts.map +1 -0
  91. package/dist/core/promotion-persist.js +93 -0
  92. package/dist/core/promotion-persist.js.map +1 -0
  93. package/dist/core/prompt-compare.d.ts +99 -0
  94. package/dist/core/prompt-compare.d.ts.map +1 -0
  95. package/dist/core/prompt-compare.js +210 -0
  96. package/dist/core/prompt-compare.js.map +1 -0
  97. package/dist/core/replay-validator.d.ts +136 -0
  98. package/dist/core/replay-validator.d.ts.map +1 -0
  99. package/dist/core/replay-validator.js +312 -0
  100. package/dist/core/replay-validator.js.map +1 -0
  101. package/dist/core/roleplay-executor.d.ts +123 -0
  102. package/dist/core/roleplay-executor.d.ts.map +1 -0
  103. package/dist/core/roleplay-executor.js +675 -0
  104. package/dist/core/roleplay-executor.js.map +1 -0
  105. package/dist/core/roleplay-trajectories.d.ts +54 -0
  106. package/dist/core/roleplay-trajectories.d.ts.map +1 -0
  107. package/dist/core/roleplay-trajectories.js +88 -0
  108. package/dist/core/roleplay-trajectories.js.map +1 -0
  109. package/dist/core/scenario-blueprints.d.ts +62 -0
  110. package/dist/core/scenario-blueprints.d.ts.map +1 -0
  111. package/dist/core/scenario-blueprints.js +850 -0
  112. package/dist/core/scenario-blueprints.js.map +1 -0
  113. package/dist/core/scenario-runner.d.ts +36 -0
  114. package/dist/core/scenario-runner.d.ts.map +1 -0
  115. package/dist/core/scenario-runner.js +216 -0
  116. package/dist/core/scenario-runner.js.map +1 -0
  117. package/dist/core/skill-scoring-cron.d.ts +57 -0
  118. package/dist/core/skill-scoring-cron.d.ts.map +1 -0
  119. package/dist/core/skill-scoring-cron.js +180 -0
  120. package/dist/core/skill-scoring-cron.js.map +1 -0
  121. package/dist/core/test-trajectory-collector.d.ts +37 -0
  122. package/dist/core/test-trajectory-collector.d.ts.map +1 -0
  123. package/dist/core/test-trajectory-collector.js +225 -0
  124. package/dist/core/test-trajectory-collector.js.map +1 -0
  125. package/dist/core/track-c-queue-task.d.ts +37 -0
  126. package/dist/core/track-c-queue-task.d.ts.map +1 -0
  127. package/dist/core/track-c-queue-task.js +104 -0
  128. package/dist/core/track-c-queue-task.js.map +1 -0
  129. package/dist/core/training-analysis-index.d.ts +104 -0
  130. package/dist/core/training-analysis-index.d.ts.map +1 -0
  131. package/dist/core/training-analysis-index.js +3297 -0
  132. package/dist/core/training-analysis-index.js.map +1 -0
  133. package/dist/core/training-collection-runner.d.ts +508 -0
  134. package/dist/core/training-collection-runner.d.ts.map +1 -0
  135. package/dist/core/training-collection-runner.js +2299 -0
  136. package/dist/core/training-collection-runner.js.map +1 -0
  137. package/dist/core/training-config.d.ts +52 -0
  138. package/dist/core/training-config.d.ts.map +1 -0
  139. package/dist/core/training-config.js +117 -0
  140. package/dist/core/training-config.js.map +1 -0
  141. package/dist/core/training-orchestrator.d.ts +112 -0
  142. package/dist/core/training-orchestrator.d.ts.map +1 -0
  143. package/dist/core/training-orchestrator.js +729 -0
  144. package/dist/core/training-orchestrator.js.map +1 -0
  145. package/dist/core/training-readiness-report.d.ts +52 -0
  146. package/dist/core/training-readiness-report.d.ts.map +1 -0
  147. package/dist/core/training-readiness-report.js +765 -0
  148. package/dist/core/training-readiness-report.js.map +1 -0
  149. package/dist/core/trajectory-consumer.d.ts +15 -0
  150. package/dist/core/trajectory-consumer.d.ts.map +1 -0
  151. package/dist/core/trajectory-consumer.js +61 -0
  152. package/dist/core/trajectory-consumer.js.map +1 -0
  153. package/dist/core/trajectory-export-bundle.d.ts +95 -0
  154. package/dist/core/trajectory-export-bundle.d.ts.map +1 -0
  155. package/dist/core/trajectory-export-bundle.js +561 -0
  156. package/dist/core/trajectory-export-bundle.js.map +1 -0
  157. package/dist/core/trajectory-export-cron.d.ts +57 -0
  158. package/dist/core/trajectory-export-cron.d.ts.map +1 -0
  159. package/dist/core/trajectory-export-cron.js +170 -0
  160. package/dist/core/trajectory-export-cron.js.map +1 -0
  161. package/dist/core/trajectory-hf-upload.d.ts +50 -0
  162. package/dist/core/trajectory-hf-upload.d.ts.map +1 -0
  163. package/dist/core/trajectory-hf-upload.js +111 -0
  164. package/dist/core/trajectory-hf-upload.js.map +1 -0
  165. package/dist/core/trajectory-task-datasets.d.ts +62 -0
  166. package/dist/core/trajectory-task-datasets.d.ts.map +1 -0
  167. package/dist/core/trajectory-task-datasets.js +427 -0
  168. package/dist/core/trajectory-task-datasets.js.map +1 -0
  169. package/dist/core/wait-for-service.d.ts +25 -0
  170. package/dist/core/wait-for-service.d.ts.map +1 -0
  171. package/dist/core/wait-for-service.js +19 -0
  172. package/dist/core/wait-for-service.js.map +1 -0
  173. package/dist/core/workspace-runtime.d.ts +4 -0
  174. package/dist/core/workspace-runtime.d.ts.map +1 -0
  175. package/dist/core/workspace-runtime.js +25 -0
  176. package/dist/core/workspace-runtime.js.map +1 -0
  177. package/dist/dspy/artifact.d.ts +54 -0
  178. package/dist/dspy/artifact.d.ts.map +1 -0
  179. package/dist/dspy/artifact.js +61 -0
  180. package/dist/dspy/artifact.js.map +1 -0
  181. package/dist/dspy/chain-of-thought.d.ts +27 -0
  182. package/dist/dspy/chain-of-thought.d.ts.map +1 -0
  183. package/dist/dspy/chain-of-thought.js +43 -0
  184. package/dist/dspy/chain-of-thought.js.map +1 -0
  185. package/dist/dspy/examples.d.ts +72 -0
  186. package/dist/dspy/examples.d.ts.map +1 -0
  187. package/dist/dspy/examples.js +105 -0
  188. package/dist/dspy/examples.js.map +1 -0
  189. package/dist/dspy/index.d.ts +15 -0
  190. package/dist/dspy/index.d.ts.map +1 -0
  191. package/dist/dspy/index.js +40 -0
  192. package/dist/dspy/index.js.map +1 -0
  193. package/dist/dspy/lm-adapter.d.ts +100 -0
  194. package/dist/dspy/lm-adapter.d.ts.map +1 -0
  195. package/dist/dspy/lm-adapter.js +81 -0
  196. package/dist/dspy/lm-adapter.js.map +1 -0
  197. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts +23 -0
  198. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts.map +1 -0
  199. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js +85 -0
  200. package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js.map +1 -0
  201. package/dist/dspy/optimizers/dspy-copro.d.ts +29 -0
  202. package/dist/dspy/optimizers/dspy-copro.d.ts.map +1 -0
  203. package/dist/dspy/optimizers/dspy-copro.js +141 -0
  204. package/dist/dspy/optimizers/dspy-copro.js.map +1 -0
  205. package/dist/dspy/optimizers/dspy-mipro.d.ts +37 -0
  206. package/dist/dspy/optimizers/dspy-mipro.d.ts.map +1 -0
  207. package/dist/dspy/optimizers/dspy-mipro.js +194 -0
  208. package/dist/dspy/optimizers/dspy-mipro.js.map +1 -0
  209. package/dist/dspy/optimizers/index.d.ts +5 -0
  210. package/dist/dspy/optimizers/index.d.ts.map +1 -0
  211. package/dist/dspy/optimizers/index.js +11 -0
  212. package/dist/dspy/optimizers/index.js.map +1 -0
  213. package/dist/dspy/optimizers/types.d.ts +39 -0
  214. package/dist/dspy/optimizers/types.d.ts.map +1 -0
  215. package/dist/dspy/optimizers/types.js +1 -0
  216. package/dist/dspy/optimizers/types.js.map +1 -0
  217. package/dist/dspy/predict.d.ts +49 -0
  218. package/dist/dspy/predict.d.ts.map +1 -0
  219. package/dist/dspy/predict.js +73 -0
  220. package/dist/dspy/predict.js.map +1 -0
  221. package/dist/dspy/signature.d.ts +88 -0
  222. package/dist/dspy/signature.d.ts.map +1 -0
  223. package/dist/dspy/signature.js +205 -0
  224. package/dist/dspy/signature.js.map +1 -0
  225. package/dist/index.d.ts +15 -0
  226. package/dist/index.d.ts.map +1 -0
  227. package/dist/index.js +15 -0
  228. package/dist/index.js.map +1 -0
  229. package/dist/optimizers/bootstrap-fewshot.d.ts +42 -0
  230. package/dist/optimizers/bootstrap-fewshot.d.ts.map +1 -0
  231. package/dist/optimizers/bootstrap-fewshot.js +92 -0
  232. package/dist/optimizers/bootstrap-fewshot.js.map +1 -0
  233. package/dist/optimizers/gepa.d.ts +63 -0
  234. package/dist/optimizers/gepa.d.ts.map +1 -0
  235. package/dist/optimizers/gepa.js +232 -0
  236. package/dist/optimizers/gepa.js.map +1 -0
  237. package/dist/optimizers/index.d.ts +7 -0
  238. package/dist/optimizers/index.d.ts.map +1 -0
  239. package/dist/optimizers/index.js +51 -0
  240. package/dist/optimizers/index.js.map +1 -0
  241. package/dist/optimizers/instruction-search.d.ts +39 -0
  242. package/dist/optimizers/instruction-search.d.ts.map +1 -0
  243. package/dist/optimizers/instruction-search.js +108 -0
  244. package/dist/optimizers/instruction-search.js.map +1 -0
  245. package/dist/optimizers/prompt-evolution.d.ts +39 -0
  246. package/dist/optimizers/prompt-evolution.d.ts.map +1 -0
  247. package/dist/optimizers/prompt-evolution.js +101 -0
  248. package/dist/optimizers/prompt-evolution.js.map +1 -0
  249. package/dist/optimizers/scoring.d.ts +139 -0
  250. package/dist/optimizers/scoring.d.ts.map +1 -0
  251. package/dist/optimizers/scoring.js +299 -0
  252. package/dist/optimizers/scoring.js.map +1 -0
  253. package/dist/optimizers/types.d.ts +105 -0
  254. package/dist/optimizers/types.d.ts.map +1 -0
  255. package/dist/optimizers/types.js +1 -0
  256. package/dist/optimizers/types.js.map +1 -0
  257. package/dist/register-runtime.d.ts +3 -0
  258. package/dist/register-runtime.d.ts.map +1 -0
  259. package/dist/register-runtime.js +60 -0
  260. package/dist/register-runtime.js.map +1 -0
  261. package/dist/register-terminal-view.d.ts +15 -0
  262. package/dist/register-terminal-view.d.ts.map +1 -0
  263. package/dist/register-terminal-view.js +31 -0
  264. package/dist/register-terminal-view.js.map +1 -0
  265. package/dist/routes/experience-routes.d.ts +21 -0
  266. package/dist/routes/experience-routes.d.ts.map +1 -0
  267. package/dist/routes/experience-routes.js +513 -0
  268. package/dist/routes/experience-routes.js.map +1 -0
  269. package/dist/routes/index.d.ts +5 -0
  270. package/dist/routes/index.d.ts.map +1 -0
  271. package/dist/routes/index.js +17 -0
  272. package/dist/routes/index.js.map +1 -0
  273. package/dist/routes/training-routes.d.ts +10 -0
  274. package/dist/routes/training-routes.d.ts.map +1 -0
  275. package/dist/routes/training-routes.js +1239 -0
  276. package/dist/routes/training-routes.js.map +1 -0
  277. package/dist/routes/training-vast-routes.d.ts +35 -0
  278. package/dist/routes/training-vast-routes.d.ts.map +1 -0
  279. package/dist/routes/training-vast-routes.js +249 -0
  280. package/dist/routes/training-vast-routes.js.map +1 -0
  281. package/dist/routes/trajectory-routes.d.ts +19 -0
  282. package/dist/routes/trajectory-routes.d.ts.map +1 -0
  283. package/dist/routes/trajectory-routes.js +1122 -0
  284. package/dist/routes/trajectory-routes.js.map +1 -0
  285. package/dist/services/index.d.ts +9 -0
  286. package/dist/services/index.d.ts.map +1 -0
  287. package/dist/services/index.js +63 -0
  288. package/dist/services/index.js.map +1 -0
  289. package/dist/services/training-backend-check.d.ts +8 -0
  290. package/dist/services/training-backend-check.d.ts.map +1 -0
  291. package/dist/services/training-backend-check.js +31 -0
  292. package/dist/services/training-backend-check.js.map +1 -0
  293. package/dist/services/training-service-like.d.ts +40 -0
  294. package/dist/services/training-service-like.d.ts.map +1 -0
  295. package/dist/services/training-service-like.js +1 -0
  296. package/dist/services/training-service-like.js.map +1 -0
  297. package/dist/services/training-service-registry.d.ts +4 -0
  298. package/dist/services/training-service-registry.d.ts.map +1 -0
  299. package/dist/services/training-service-registry.js +12 -0
  300. package/dist/services/training-service-registry.js.map +1 -0
  301. package/dist/services/training-service.d.ts +59 -0
  302. package/dist/services/training-service.d.ts.map +1 -0
  303. package/dist/services/training-service.js +154 -0
  304. package/dist/services/training-service.js.map +1 -0
  305. package/dist/services/training-trigger.d.ts +177 -0
  306. package/dist/services/training-trigger.d.ts.map +1 -0
  307. package/dist/services/training-trigger.js +300 -0
  308. package/dist/services/training-trigger.js.map +1 -0
  309. package/dist/services/training-vast-service.d.ts +149 -0
  310. package/dist/services/training-vast-service.d.ts.map +1 -0
  311. package/dist/services/training-vast-service.js +648 -0
  312. package/dist/services/training-vast-service.js.map +1 -0
  313. package/dist/services/vast-inference-stats.d.ts +37 -0
  314. package/dist/services/vast-inference-stats.d.ts.map +1 -0
  315. package/dist/services/vast-inference-stats.js +81 -0
  316. package/dist/services/vast-inference-stats.js.map +1 -0
  317. package/dist/services/vast-job-store.d.ts +74 -0
  318. package/dist/services/vast-job-store.d.ts.map +1 -0
  319. package/dist/services/vast-job-store.js +194 -0
  320. package/dist/services/vast-job-store.js.map +1 -0
  321. package/dist/services/vast-subprocess.d.ts +27 -0
  322. package/dist/services/vast-subprocess.d.ts.map +1 -0
  323. package/dist/services/vast-subprocess.js +78 -0
  324. package/dist/services/vast-subprocess.js.map +1 -0
  325. package/dist/setup-routes.d.ts +17 -0
  326. package/dist/setup-routes.d.ts.map +1 -0
  327. package/dist/setup-routes.js +319 -0
  328. package/dist/setup-routes.js.map +1 -0
  329. package/dist/ui/FineTuningSpatialView.d.ts +49 -0
  330. package/dist/ui/FineTuningSpatialView.d.ts.map +1 -0
  331. package/dist/ui/FineTuningSpatialView.js +154 -0
  332. package/dist/ui/FineTuningSpatialView.js.map +1 -0
  333. package/dist/ui/FineTuningView.d.ts +7 -0
  334. package/dist/ui/FineTuningView.d.ts.map +1 -0
  335. package/dist/ui/FineTuningView.helpers.d.ts +17 -0
  336. package/dist/ui/FineTuningView.helpers.d.ts.map +1 -0
  337. package/dist/ui/FineTuningView.helpers.js +30 -0
  338. package/dist/ui/FineTuningView.helpers.js.map +1 -0
  339. package/dist/ui/FineTuningView.interact.d.ts +2 -0
  340. package/dist/ui/FineTuningView.interact.d.ts.map +1 -0
  341. package/dist/ui/FineTuningView.interact.js +300 -0
  342. package/dist/ui/FineTuningView.interact.js.map +1 -0
  343. package/dist/ui/FineTuningView.js +4653 -0
  344. package/dist/ui/FineTuningView.js.map +1 -0
  345. package/dist/ui/fine-tuning-panels.d.ts +100 -0
  346. package/dist/ui/fine-tuning-panels.d.ts.map +1 -0
  347. package/dist/ui/fine-tuning-panels.helpers.d.ts +19 -0
  348. package/dist/ui/fine-tuning-panels.helpers.d.ts.map +1 -0
  349. package/dist/ui/fine-tuning-panels.helpers.js +77 -0
  350. package/dist/ui/fine-tuning-panels.helpers.js.map +1 -0
  351. package/dist/ui/fine-tuning-panels.js +928 -0
  352. package/dist/ui/fine-tuning-panels.js.map +1 -0
  353. package/dist/ui/index.d.ts +5 -0
  354. package/dist/ui/index.d.ts.map +1 -0
  355. package/dist/ui/index.js +5 -0
  356. package/dist/ui/index.js.map +1 -0
  357. package/dist/ui/training-view-bundle.d.ts +3 -0
  358. package/dist/ui/training-view-bundle.d.ts.map +1 -0
  359. package/dist/ui/training-view-bundle.js +7 -0
  360. package/dist/ui/training-view-bundle.js.map +1 -0
  361. package/dist/views/bundle.js +5312 -0
  362. package/dist/views/bundle.js.map +1 -0
  363. package/package.json +7 -7
@@ -0,0 +1,154 @@
1
+ import { createHashAnonymizer } from "../core/privacy-filter.js";
2
+ import { buildTrajectoryExportBundle } from "../core/trajectory-export-bundle.js";
3
+ class NotImplementedError extends Error {
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = "NotImplementedError";
7
+ }
8
+ }
9
+ function isNotImplementedError(err) {
10
+ return err instanceof NotImplementedError;
11
+ }
12
+ class TrainingService {
13
+ constructor(options) {
14
+ this.options = options;
15
+ }
16
+ options;
17
+ listeners = /* @__PURE__ */ new Set();
18
+ async initialize() {
19
+ }
20
+ subscribe(listener) {
21
+ this.listeners.add(listener);
22
+ return () => this.listeners.delete(listener);
23
+ }
24
+ emit(event) {
25
+ for (const listener of this.listeners) {
26
+ listener(event);
27
+ }
28
+ }
29
+ trajectoryService() {
30
+ const runtime = this.options.getRuntime();
31
+ const service = runtime?.getService("trajectories");
32
+ if (!service || typeof service.listTrajectories !== "function" || typeof service.getTrajectoryDetail !== "function") {
33
+ throw new NotImplementedError(
34
+ "The trajectories service is not available on the current runtime."
35
+ );
36
+ }
37
+ return service;
38
+ }
39
+ getStatus() {
40
+ return {
41
+ runtimeAvailable: this.options.getRuntime() !== null
42
+ };
43
+ }
44
+ async listTrajectories(options) {
45
+ return await this.trajectoryService().listTrajectories(options);
46
+ }
47
+ async getTrajectoryById(trajectoryId) {
48
+ return await this.trajectoryService().getTrajectoryDetail(trajectoryId);
49
+ }
50
+ /** Datasets are produced as export bundles on disk; there is no persisted list. */
51
+ listDatasets() {
52
+ return [];
53
+ }
54
+ async buildDataset(options) {
55
+ const service = this.trajectoryService();
56
+ const PAGE_SIZE = 500;
57
+ const items = [];
58
+ let offset = 0;
59
+ while (true) {
60
+ const remaining = options.limit !== void 0 ? options.limit - items.length : PAGE_SIZE;
61
+ if (options.limit !== void 0 && remaining <= 0) break;
62
+ const pageLimit = Math.min(PAGE_SIZE, Math.max(1, remaining));
63
+ const page = await service.listTrajectories({ limit: pageLimit, offset });
64
+ items.push(...page.trajectories);
65
+ offset += page.trajectories.length;
66
+ if (page.trajectories.length < pageLimit || page.trajectories.length === 0)
67
+ break;
68
+ }
69
+ const DETAIL_CHUNK = 100;
70
+ const hydrated = [];
71
+ for (let i = 0; i < items.length; i += DETAIL_CHUNK) {
72
+ const chunk = items.slice(i, i + DETAIL_CHUNK);
73
+ hydrated.push(
74
+ ...await Promise.all(
75
+ chunk.map((item) => service.getTrajectoryDetail(item.id))
76
+ )
77
+ );
78
+ }
79
+ const trajectories = hydrated.filter((t) => t !== null);
80
+ const minCalls = options.minLlmCallsPerTrajectory ?? 0;
81
+ const eligible = minCalls > 0 ? trajectories.filter(
82
+ (t) => (t.steps ?? []).reduce(
83
+ (sum, step) => sum + (step.llmCalls?.length ?? 0),
84
+ 0
85
+ ) >= minCalls
86
+ ) : trajectories;
87
+ const bundle = await buildTrajectoryExportBundle({
88
+ trajectories: eligible,
89
+ outputDir: `.tmp/training-dataset-${Date.now()}`,
90
+ privacy: {
91
+ apply: true,
92
+ options: { anonymizer: createHashAnonymizer() }
93
+ },
94
+ source: {
95
+ kind: "training-build-dataset",
96
+ metadata: {
97
+ // null = no cap (full dataset); a number is the explicit hard cap.
98
+ requestedLimit: options.limit ?? null,
99
+ minLlmCallsPerTrajectory: minCalls,
100
+ consideredTrajectories: trajectories.length,
101
+ eligibleTrajectories: eligible.length
102
+ }
103
+ }
104
+ });
105
+ this.emit({ kind: "dataset_built", manifestPath: bundle.manifestPath });
106
+ return {
107
+ outputDir: bundle.outputDir,
108
+ manifestPath: bundle.manifestPath,
109
+ manifest: bundle.manifest
110
+ };
111
+ }
112
+ /** GPU fine-tune jobs live under `/api/training/vast/jobs`. */
113
+ listJobs() {
114
+ return [];
115
+ }
116
+ async startTrainingJob() {
117
+ throw new NotImplementedError(
118
+ "GPU fine-tune jobs are managed via /api/training/vast/jobs; prompt optimization runs via /api/training/auto/trigger."
119
+ );
120
+ }
121
+ getJob() {
122
+ return null;
123
+ }
124
+ async cancelJob() {
125
+ throw new NotImplementedError(
126
+ "GPU fine-tune jobs are managed via /api/training/vast/jobs."
127
+ );
128
+ }
129
+ /** Trained models are tracked by the Vast registry under `/api/training/vast/models`. */
130
+ listModels() {
131
+ return [];
132
+ }
133
+ async importModelToOllama() {
134
+ throw new NotImplementedError(
135
+ "Importing trained checkpoints into Ollama is not wired through this API. Use the GGUF \u2192 catalog flow."
136
+ );
137
+ }
138
+ async activateModel() {
139
+ throw new NotImplementedError(
140
+ "Activating a trained model is not wired through this API. Configure the model provider directly."
141
+ );
142
+ }
143
+ async benchmarkModel() {
144
+ throw new NotImplementedError(
145
+ "Model benchmarking runs via /api/training/vast/jobs/:id/eval."
146
+ );
147
+ }
148
+ }
149
+ export {
150
+ NotImplementedError,
151
+ TrainingService,
152
+ isNotImplementedError
153
+ };
154
+ //# sourceMappingURL=training-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/services/training-service.ts"],"sourcesContent":["import type { Trajectory, TrajectoryListResult } from \"@elizaos/agent\";\nimport type { AgentRuntime } from \"@elizaos/core\";\nimport { createHashAnonymizer } from \"../core/privacy-filter.js\";\nimport { buildTrajectoryExportBundle } from \"../core/trajectory-export-bundle.js\";\nimport type { TrainingServiceWithRuntime } from \"./training-service-like.js\";\n\n/**\n * Thrown for endpoints whose real implementation lives on another surface\n * (GPU fine-tunes on `/api/training/vast/jobs`, prompt optimization on\n * `/api/training/auto/trigger`). The route layer maps this to a 501 with the\n * message verbatim — we do not fabricate success responses for unwired flows.\n */\nexport class NotImplementedError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"NotImplementedError\";\n }\n}\n\nexport function isNotImplementedError(\n err: unknown,\n): err is NotImplementedError {\n return err instanceof NotImplementedError;\n}\n\ninterface TrainingServiceOptions {\n getRuntime: () => AgentRuntime | null;\n getConfig: () => unknown;\n setConfig: (nextConfig: unknown) => void;\n}\n\ninterface TrajectoryServiceLike {\n listTrajectories: (options: {\n limit?: number;\n offset?: number;\n runId?: string;\n }) => Promise<TrajectoryListResult>;\n getTrajectoryDetail: (id: string) => Promise<Trajectory | null>;\n}\n\n/**\n * Public training API service. Reads trajectories from the runtime\n * `trajectories` DB service and builds privacy-filtered export bundles via\n * `buildTrajectoryExportBundle`. GPU fine-tunes, Ollama import, model\n * activation, and benchmarking are handled by other surfaces — this service\n * does not emulate them.\n */\nexport class TrainingService implements TrainingServiceWithRuntime {\n private readonly listeners = new Set<(event: unknown) => void>();\n\n constructor(private readonly options: TrainingServiceOptions) {}\n\n async initialize(): Promise<void> {}\n\n subscribe(listener: (event: unknown) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private emit(event: unknown): void {\n for (const listener of this.listeners) {\n listener(event);\n }\n }\n\n private trajectoryService(): TrajectoryServiceLike {\n const runtime = this.options.getRuntime();\n const service = runtime?.getService(\"trajectories\") as unknown as\n | TrajectoryServiceLike\n | null\n | undefined;\n if (\n !service ||\n typeof service.listTrajectories !== \"function\" ||\n typeof service.getTrajectoryDetail !== \"function\"\n ) {\n throw new NotImplementedError(\n \"The trajectories service is not available on the current runtime.\",\n );\n }\n return service;\n }\n\n getStatus(): Record<string, unknown> {\n return {\n runtimeAvailable: this.options.getRuntime() !== null,\n };\n }\n\n async listTrajectories(options: {\n limit?: number;\n offset?: number;\n runId?: string;\n }): Promise<TrajectoryListResult> {\n return await this.trajectoryService().listTrajectories(options);\n }\n\n async getTrajectoryById(trajectoryId: string): Promise<Trajectory | null> {\n return await this.trajectoryService().getTrajectoryDetail(trajectoryId);\n }\n\n /** Datasets are produced as export bundles on disk; there is no persisted list. */\n listDatasets(): Record<string, unknown>[] {\n return [];\n }\n\n async buildDataset(options: {\n limit?: number;\n minLlmCallsPerTrajectory?: number;\n }): Promise<Record<string, unknown>> {\n const service = this.trajectoryService();\n\n // When no explicit limit is given, the dataset covers the FULL set: the\n // reader caps each page at 500, so a single call silently dropped every\n // trajectory beyond the most-recent 500. Page through with an offset loop\n // until the set is drained. An explicit `options.limit` is honored as a\n // hard cap (the prior behavior).\n const PAGE_SIZE = 500;\n const items: TrajectoryListResult[\"trajectories\"] = [];\n let offset = 0;\n while (true) {\n const remaining =\n options.limit !== undefined ? options.limit - items.length : PAGE_SIZE;\n if (options.limit !== undefined && remaining <= 0) break;\n const pageLimit = Math.min(PAGE_SIZE, Math.max(1, remaining));\n const page = await service.listTrajectories({ limit: pageLimit, offset });\n items.push(...page.trajectories);\n offset += page.trajectories.length;\n if (\n page.trajectories.length < pageLimit ||\n page.trajectories.length === 0\n )\n break;\n }\n\n // Bound the detail fan-out: hydrate in chunks instead of one unbounded\n // Promise.all over a potentially very large set.\n const DETAIL_CHUNK = 100;\n const hydrated: (Trajectory | null)[] = [];\n for (let i = 0; i < items.length; i += DETAIL_CHUNK) {\n const chunk = items.slice(i, i + DETAIL_CHUNK);\n hydrated.push(\n ...(await Promise.all(\n chunk.map((item) => service.getTrajectoryDetail(item.id)),\n )),\n );\n }\n const trajectories = hydrated.filter((t): t is Trajectory => t !== null);\n const minCalls = options.minLlmCallsPerTrajectory ?? 0;\n const eligible =\n minCalls > 0\n ? trajectories.filter(\n (t) =>\n (t.steps ?? []).reduce(\n (sum, step) => sum + (step.llmCalls?.length ?? 0),\n 0,\n ) >= minCalls,\n )\n : trajectories;\n const bundle = await buildTrajectoryExportBundle({\n trajectories: eligible,\n outputDir: `.tmp/training-dataset-${Date.now()}`,\n privacy: {\n apply: true,\n options: { anonymizer: createHashAnonymizer() },\n },\n source: {\n kind: \"training-build-dataset\",\n metadata: {\n // null = no cap (full dataset); a number is the explicit hard cap.\n requestedLimit: options.limit ?? null,\n minLlmCallsPerTrajectory: minCalls,\n consideredTrajectories: trajectories.length,\n eligibleTrajectories: eligible.length,\n },\n },\n });\n this.emit({ kind: \"dataset_built\", manifestPath: bundle.manifestPath });\n return {\n outputDir: bundle.outputDir,\n manifestPath: bundle.manifestPath,\n manifest: bundle.manifest,\n };\n }\n\n /** GPU fine-tune jobs live under `/api/training/vast/jobs`. */\n listJobs(): Record<string, unknown>[] {\n return [];\n }\n\n async startTrainingJob(): Promise<Record<string, unknown>> {\n throw new NotImplementedError(\n \"GPU fine-tune jobs are managed via /api/training/vast/jobs; prompt optimization runs via /api/training/auto/trigger.\",\n );\n }\n\n getJob(): Record<string, unknown> | null {\n return null;\n }\n\n async cancelJob(): Promise<Record<string, unknown>> {\n throw new NotImplementedError(\n \"GPU fine-tune jobs are managed via /api/training/vast/jobs.\",\n );\n }\n\n /** Trained models are tracked by the Vast registry under `/api/training/vast/models`. */\n listModels(): Record<string, unknown>[] {\n return [];\n }\n\n async importModelToOllama(): Promise<Record<string, unknown>> {\n throw new NotImplementedError(\n \"Importing trained checkpoints into Ollama is not wired through this API. Use the GGUF → catalog flow.\",\n );\n }\n\n async activateModel(): Promise<Record<string, unknown>> {\n throw new NotImplementedError(\n \"Activating a trained model is not wired through this API. Configure the model provider directly.\",\n );\n }\n\n async benchmarkModel(): Promise<Record<string, unknown>> {\n throw new NotImplementedError(\n \"Model benchmarking runs via /api/training/vast/jobs/:id/eval.\",\n );\n }\n}\n"],"mappings":"AAEA,SAAS,4BAA4B;AACrC,SAAS,mCAAmC;AASrC,MAAM,4BAA4B,MAAM;AAAA,EAC7C,YAAY,SAAiB;AAC3B,UAAM,OAAO;AACb,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,sBACd,KAC4B;AAC5B,SAAO,eAAe;AACxB;AAwBO,MAAM,gBAAsD;AAAA,EAGjE,YAA6B,SAAiC;AAAjC;AAAA,EAAkC;AAAA,EAAlC;AAAA,EAFZ,YAAY,oBAAI,IAA8B;AAAA,EAI/D,MAAM,aAA4B;AAAA,EAAC;AAAA,EAEnC,UAAU,UAAgD;AACxD,SAAK,UAAU,IAAI,QAAQ;AAC3B,WAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,EAC7C;AAAA,EAEQ,KAAK,OAAsB;AACjC,eAAW,YAAY,KAAK,WAAW;AACrC,eAAS,KAAK;AAAA,IAChB;AAAA,EACF;AAAA,EAEQ,oBAA2C;AACjD,UAAM,UAAU,KAAK,QAAQ,WAAW;AACxC,UAAM,UAAU,SAAS,WAAW,cAAc;AAIlD,QACE,CAAC,WACD,OAAO,QAAQ,qBAAqB,cACpC,OAAO,QAAQ,wBAAwB,YACvC;AACA,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,YAAqC;AACnC,WAAO;AAAA,MACL,kBAAkB,KAAK,QAAQ,WAAW,MAAM;AAAA,IAClD;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,SAIW;AAChC,WAAO,MAAM,KAAK,kBAAkB,EAAE,iBAAiB,OAAO;AAAA,EAChE;AAAA,EAEA,MAAM,kBAAkB,cAAkD;AACxE,WAAO,MAAM,KAAK,kBAAkB,EAAE,oBAAoB,YAAY;AAAA,EACxE;AAAA;AAAA,EAGA,eAA0C;AACxC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,aAAa,SAGkB;AACnC,UAAM,UAAU,KAAK,kBAAkB;AAOvC,UAAM,YAAY;AAClB,UAAM,QAA8C,CAAC;AACrD,QAAI,SAAS;AACb,WAAO,MAAM;AACX,YAAM,YACJ,QAAQ,UAAU,SAAY,QAAQ,QAAQ,MAAM,SAAS;AAC/D,UAAI,QAAQ,UAAU,UAAa,aAAa,EAAG;AACnD,YAAM,YAAY,KAAK,IAAI,WAAW,KAAK,IAAI,GAAG,SAAS,CAAC;AAC5D,YAAM,OAAO,MAAM,QAAQ,iBAAiB,EAAE,OAAO,WAAW,OAAO,CAAC;AACxE,YAAM,KAAK,GAAG,KAAK,YAAY;AAC/B,gBAAU,KAAK,aAAa;AAC5B,UACE,KAAK,aAAa,SAAS,aAC3B,KAAK,aAAa,WAAW;AAE7B;AAAA,IACJ;AAIA,UAAM,eAAe;AACrB,UAAM,WAAkC,CAAC;AACzC,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,cAAc;AACnD,YAAM,QAAQ,MAAM,MAAM,GAAG,IAAI,YAAY;AAC7C,eAAS;AAAA,QACP,GAAI,MAAM,QAAQ;AAAA,UAChB,MAAM,IAAI,CAAC,SAAS,QAAQ,oBAAoB,KAAK,EAAE,CAAC;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,UAAM,eAAe,SAAS,OAAO,CAAC,MAAuB,MAAM,IAAI;AACvE,UAAM,WAAW,QAAQ,4BAA4B;AACrD,UAAM,WACJ,WAAW,IACP,aAAa;AAAA,MACX,CAAC,OACE,EAAE,SAAS,CAAC,GAAG;AAAA,QACd,CAAC,KAAK,SAAS,OAAO,KAAK,UAAU,UAAU;AAAA,QAC/C;AAAA,MACF,KAAK;AAAA,IACT,IACA;AACN,UAAM,SAAS,MAAM,4BAA4B;AAAA,MAC/C,cAAc;AAAA,MACd,WAAW,yBAAyB,KAAK,IAAI,CAAC;AAAA,MAC9C,SAAS;AAAA,QACP,OAAO;AAAA,QACP,SAAS,EAAE,YAAY,qBAAqB,EAAE;AAAA,MAChD;AAAA,MACA,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,UAAU;AAAA;AAAA,UAER,gBAAgB,QAAQ,SAAS;AAAA,UACjC,0BAA0B;AAAA,UAC1B,wBAAwB,aAAa;AAAA,UACrC,sBAAsB,SAAS;AAAA,QACjC;AAAA,MACF;AAAA,IACF,CAAC;AACD,SAAK,KAAK,EAAE,MAAM,iBAAiB,cAAc,OAAO,aAAa,CAAC;AACtE,WAAO;AAAA,MACL,WAAW,OAAO;AAAA,MAClB,cAAc,OAAO;AAAA,MACrB,UAAU,OAAO;AAAA,IACnB;AAAA,EACF;AAAA;AAAA,EAGA,WAAsC;AACpC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,mBAAqD;AACzD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAyC;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAA8C;AAClD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,aAAwC;AACtC,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,sBAAwD;AAC5D,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAkD;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAmD;AACvD,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * TrainingTriggerService — counts completed trajectories per task and fires
3
+ * `triggerTraining` when the configured threshold is reached for a task whose
4
+ * cooldown has elapsed.
5
+ *
6
+ * State is held in-memory and mirrored to disk at
7
+ * `<state>/training/trigger-state.json` so a process restart does not lose
8
+ * progress mid-bucket. The persisted shape is intentionally tiny and
9
+ * forward-compatible: extra keys are ignored on read.
10
+ *
11
+ * Service identifier: `TRAINING_TRIGGER_SERVICE`.
12
+ *
13
+ * Trajectory storage calls `notifyTrajectoryCompleted(trajectoryId)` from
14
+ * `eliza/packages/agent/src/runtime/trajectory-storage.ts` whenever a
15
+ * trajectory transitions to `completed`. The service looks up the trajectory
16
+ * detail, infers the tasks it touches, and increments those counters.
17
+ */
18
+ import { type IAgentRuntime, Service, type ServiceTypeName } from "@elizaos/core";
19
+ import type { AnonymizerLookup } from "../core/privacy-filter.js";
20
+ import { type TrainingBackend, type TrainingConfig } from "../core/training-config.js";
21
+ import { type TrainingRunRecord, triggerTraining } from "../core/training-orchestrator.js";
22
+ import { type TrajectoryTrainingTask } from "../core/trajectory-task-datasets.js";
23
+ declare module "@elizaos/core" {
24
+ interface ServiceTypeRegistry {
25
+ TRAINING_TRIGGER_SERVICE: "training_trigger_service";
26
+ }
27
+ }
28
+ export declare const TRAINING_TRIGGER_SERVICE: ServiceTypeName;
29
+ interface MinimalLogger {
30
+ info: (message: string) => void;
31
+ warn: (message: string) => void;
32
+ error: (message: string) => void;
33
+ }
34
+ /**
35
+ * Minimal runtime shape the trigger service + bootstrap helpers depend on.
36
+ * Structurally a subset of `IAgentRuntime`, so full runtimes satisfy it
37
+ * without casts. Tests pass a small shim that matches this shape.
38
+ */
39
+ interface RuntimeLike {
40
+ getService: (name: string) => unknown;
41
+ logger?: MinimalLogger;
42
+ }
43
+ export interface TriggerStatusSnapshot {
44
+ autoTrainEnabled: boolean;
45
+ triggerThreshold: number;
46
+ cooldownHours: number;
47
+ counters: Record<TrajectoryTrainingTask, number>;
48
+ lastTrain: Partial<Record<TrajectoryTrainingTask, {
49
+ runId: string;
50
+ source: string;
51
+ finishedAt: string;
52
+ status: string;
53
+ }>>;
54
+ perTaskThresholds: Record<TrajectoryTrainingTask, number>;
55
+ perTaskCooldownMs: Record<TrajectoryTrainingTask, number>;
56
+ }
57
+ export interface TrainingTriggerServiceOptions {
58
+ /** Defaults to <state>/training/trigger-state.json. */
59
+ statePath?: string;
60
+ /** Override config loader (tests). */
61
+ configLoader?: () => TrainingConfig;
62
+ /** Forward to the orchestrator (tests). */
63
+ triggerImpl?: typeof triggerTraining;
64
+ /** Anonymizer forwarded to the orchestrator. */
65
+ anonymizer?: AnonymizerLookup;
66
+ /** Clock injection (tests). */
67
+ now?: () => number;
68
+ }
69
+ /**
70
+ * Lightweight service registered directly into the runtime service map. It has
71
+ * no `start()` lifecycle, but extends the core base class so the registration
72
+ * stays assignable to the runtime's `Service[]` registry.
73
+ */
74
+ export declare class TrainingTriggerService extends Service {
75
+ readonly capabilityDescription = "Tracks completed trajectories and fires training runs when per-task counters hit the configured threshold.";
76
+ readonly instance: this;
77
+ private readonly runtimeRef;
78
+ private readonly statePath;
79
+ private readonly configLoader;
80
+ private readonly triggerImpl;
81
+ private readonly anonymizer?;
82
+ private readonly now;
83
+ private readonly inflight;
84
+ private state;
85
+ constructor(runtime: RuntimeLike, options?: TrainingTriggerServiceOptions);
86
+ /** Idempotent stop hook for the service lifecycle. */
87
+ stop(): Promise<void>;
88
+ getStatus(): TriggerStatusSnapshot;
89
+ /**
90
+ * Called by trajectory storage when a trajectory transitions to
91
+ * `completed`. Looks up the detail, increments the relevant counters, and
92
+ * checks each touched task's threshold + cooldown.
93
+ *
94
+ * Errors propagate by design — the caller uses optional chaining so a missing
95
+ * service skips training triggers, while a misconfigured service that throws
96
+ * during increment is still surfaced.
97
+ */
98
+ notifyTrajectoryCompleted(trajectoryId: string): Promise<void>;
99
+ /** Manual fire — bypasses the autoTrain toggle (operator action). */
100
+ runManually(input: {
101
+ task?: TrajectoryTrainingTask;
102
+ backend?: TrainingBackend;
103
+ dryRun?: boolean;
104
+ }): Promise<TrainingRunRecord>;
105
+ /**
106
+ * Reset counters — primarily for tests and operator recovery. The persisted
107
+ * `lastTrainAt`/`lastTrainRecord` map is preserved so cooldowns still
108
+ * apply after a reset.
109
+ */
110
+ resetCounters(task?: TrajectoryTrainingTask): void;
111
+ private maybeFire;
112
+ private recordCompletion;
113
+ }
114
+ /**
115
+ * Registered entry shape — kept as a standalone interface so callers that
116
+ * `getService(TRAINING_TRIGGER_SERVICE)` can type the result without
117
+ * importing the concrete class.
118
+ */
119
+ export interface RegisteredTrainingTriggerEntry extends Service {
120
+ notifyTrajectoryCompleted: (trajectoryId: string) => Promise<void>;
121
+ getStatus: () => TriggerStatusSnapshot;
122
+ runManually: (input: {
123
+ task?: TrajectoryTrainingTask;
124
+ backend?: TrainingBackend;
125
+ dryRun?: boolean;
126
+ }) => Promise<TrainingRunRecord>;
127
+ resetCounters: (task?: TrajectoryTrainingTask) => void;
128
+ stop: () => Promise<void>;
129
+ capabilityDescription: string;
130
+ instance: TrainingTriggerService;
131
+ }
132
+ /**
133
+ * Register the service against a runtime's services map. Mirrors the
134
+ * workflow-dispatch pattern in `packages/app-core/src/runtime/eliza.ts`: we
135
+ * insert a function-shaped service entry directly rather than going through
136
+ * the `Service.start()` lifecycle, which expects a class.
137
+ *
138
+ * Safe to call multiple times — subsequent calls replace the entry.
139
+ */
140
+ export declare function registerTrainingTriggerService(runtime: IAgentRuntime, options?: TrainingTriggerServiceOptions): TrainingTriggerService;
141
+ interface UserNotifier {
142
+ notify: (message: string) => void;
143
+ }
144
+ export interface BootstrapOptimizationOptions {
145
+ configLoader?: () => TrainingConfig;
146
+ notifier?: UserNotifier;
147
+ /**
148
+ * Override the service used to trigger the run. Tests pass a controlled
149
+ * trigger; production looks up the registered TrainingTriggerService from
150
+ * runtime.services.
151
+ */
152
+ triggerOverride?: (input: {
153
+ task: TrajectoryTrainingTask;
154
+ backend: TrainingBackend;
155
+ }) => Promise<TrainingRunRecord>;
156
+ }
157
+ /**
158
+ * One-shot bootstrap pass for default-on Hermes parity.
159
+ *
160
+ * Called immediately after `registerTrainingTriggerService` during runtime
161
+ * boot. For each high-leverage task (should_respond + action_planner):
162
+ * - If `ELIZA_DISABLE_AUTO_BOOTSTRAP=1`, do nothing.
163
+ * - If the OptimizedPromptService already has an artifact for the task,
164
+ * do nothing (the operator's previous run wins).
165
+ * - If the per-task trajectory counter is below the threshold, do nothing
166
+ * (we don't want to optimize against a thin dataset).
167
+ * - Otherwise, fire `triggerTraining({ source: 'bootstrap', backend: 'native' })`
168
+ * and notify the user that progress can be tracked in
169
+ * Settings → Auto-Training.
170
+ *
171
+ * This is fire-and-forget on purpose: the runtime boot must not block on
172
+ * an LLM-driven optimization round. Errors propagate so the boot logger
173
+ * surfaces them rather than swallowing them silently.
174
+ */
175
+ export declare function bootstrapOptimizationFromAccumulatedTrajectories(runtime: IAgentRuntime, service: TrainingTriggerService, options?: BootstrapOptimizationOptions): Promise<TrajectoryTrainingTask[]>;
176
+ export {};
177
+ //# sourceMappingURL=training-trigger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"training-trigger.d.ts","sourceRoot":"","sources":["../../src/services/training-trigger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,300 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import {
4
+ Service
5
+ } from "@elizaos/core";
6
+ import {
7
+ ALL_TRAINING_TASKS,
8
+ loadTrainingConfig,
9
+ resolveTaskPolicy,
10
+ trainingStateRoot
11
+ } from "../core/training-config.js";
12
+ import {
13
+ triggerTraining
14
+ } from "../core/training-orchestrator.js";
15
+ import {
16
+ buildTaskRecord
17
+ } from "../core/trajectory-task-datasets.js";
18
+ const TRAINING_TRIGGER_SERVICE = "training_trigger_service";
19
+ function emptyCounters() {
20
+ return buildTaskRecord(() => 0);
21
+ }
22
+ function isStringRecord(v) {
23
+ return typeof v === "object" && v !== null && !Array.isArray(v);
24
+ }
25
+ function readPersisted(path) {
26
+ if (!existsSync(path)) {
27
+ return {
28
+ counters: emptyCounters(),
29
+ lastTrainAt: {},
30
+ lastTrainRecord: {}
31
+ };
32
+ }
33
+ const raw = readFileSync(path, "utf-8");
34
+ const parsed = JSON.parse(raw);
35
+ const counters = emptyCounters();
36
+ if (isStringRecord(parsed) && isStringRecord(parsed.counters)) {
37
+ for (const task of ALL_TRAINING_TASKS) {
38
+ const value = parsed.counters[task];
39
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
40
+ counters[task] = Math.floor(value);
41
+ }
42
+ }
43
+ }
44
+ const lastTrainAt = {};
45
+ if (isStringRecord(parsed) && isStringRecord(parsed.lastTrainAt)) {
46
+ for (const task of ALL_TRAINING_TASKS) {
47
+ const value = parsed.lastTrainAt[task];
48
+ if (typeof value === "number" && Number.isFinite(value)) {
49
+ lastTrainAt[task] = value;
50
+ }
51
+ }
52
+ }
53
+ const lastTrainRecord = {};
54
+ if (isStringRecord(parsed) && isStringRecord(parsed.lastTrainRecord)) {
55
+ for (const task of ALL_TRAINING_TASKS) {
56
+ const value = parsed.lastTrainRecord[task];
57
+ if (isStringRecord(value) && typeof value.runId === "string" && typeof value.source === "string" && typeof value.finishedAt === "string" && typeof value.status === "string") {
58
+ lastTrainRecord[task] = {
59
+ runId: value.runId,
60
+ source: value.source,
61
+ finishedAt: value.finishedAt,
62
+ status: value.status
63
+ };
64
+ }
65
+ }
66
+ }
67
+ return { counters, lastTrainAt, lastTrainRecord };
68
+ }
69
+ function writePersisted(path, state) {
70
+ mkdirSync(dirname(path), { recursive: true });
71
+ writeFileSync(path, `${JSON.stringify(state, null, 2)}
72
+ `, "utf-8");
73
+ }
74
+ function tasksForTrajectory(detail) {
75
+ const tasks = /* @__PURE__ */ new Set();
76
+ for (const step of detail.steps ?? []) {
77
+ for (const call of step.llmCalls ?? []) {
78
+ const purpose = (call.purpose ?? "").toLowerCase();
79
+ const callKind = typeof call.metadata?.callKind === "string" ? call.metadata.callKind.toLowerCase() : "";
80
+ const hint = `${purpose} ${callKind}`;
81
+ if (hint.includes("should_respond") || hint.includes("response_handler") || hint.includes("shouldrespond")) {
82
+ tasks.add("should_respond");
83
+ }
84
+ if (hint.includes("action_planner") || hint.includes("planner") || hint.includes("runtime_use_model")) {
85
+ tasks.add("action_planner");
86
+ }
87
+ if (hint.includes("media_description") || hint.includes("image_description") || hint.includes("describe_")) {
88
+ tasks.add("media_description");
89
+ }
90
+ if (hint.includes("response") || hint.includes("reply") || hint.includes("message_response")) {
91
+ tasks.add("response");
92
+ }
93
+ if (typeof call.response === "string" && /context_routing/i.test(call.response)) {
94
+ tasks.add("context_routing");
95
+ }
96
+ if (hint.includes("view_context") || hint.includes("view_selection") || typeof call.response === "string" && /"viewId"\s*:/.test(call.response)) {
97
+ tasks.add("view_context");
98
+ }
99
+ }
100
+ }
101
+ if (tasks.size === 0 && (detail.steps?.length ?? 0) > 0) {
102
+ tasks.add("response");
103
+ }
104
+ return [...tasks];
105
+ }
106
+ class TrainingTriggerService extends Service {
107
+ capabilityDescription = "Tracks completed trajectories and fires training runs when per-task counters hit the configured threshold.";
108
+ instance = this;
109
+ runtimeRef;
110
+ statePath;
111
+ configLoader;
112
+ triggerImpl;
113
+ anonymizer;
114
+ now;
115
+ inflight = /* @__PURE__ */ new Set();
116
+ state;
117
+ constructor(runtime, options = {}) {
118
+ super();
119
+ this.runtimeRef = runtime;
120
+ this.statePath = options.statePath ?? join(trainingStateRoot(), "trigger-state.json");
121
+ this.configLoader = options.configLoader ?? loadTrainingConfig;
122
+ this.triggerImpl = options.triggerImpl ?? triggerTraining;
123
+ this.anonymizer = options.anonymizer;
124
+ this.now = options.now ?? (() => Date.now());
125
+ this.state = readPersisted(this.statePath);
126
+ }
127
+ /** Idempotent stop hook for the service lifecycle. */
128
+ async stop() {
129
+ }
130
+ getStatus() {
131
+ const config = this.configLoader();
132
+ const perTaskThresholds = buildTaskRecord(() => 0);
133
+ const perTaskCooldownMs = buildTaskRecord(() => 0);
134
+ for (const task of ALL_TRAINING_TASKS) {
135
+ const policy = resolveTaskPolicy(config, task);
136
+ perTaskThresholds[task] = policy.threshold;
137
+ perTaskCooldownMs[task] = policy.cooldownMs;
138
+ }
139
+ return {
140
+ autoTrainEnabled: config.autoTrain,
141
+ triggerThreshold: config.triggerThreshold,
142
+ cooldownHours: config.triggerCooldownHours,
143
+ counters: { ...this.state.counters },
144
+ lastTrain: { ...this.state.lastTrainRecord },
145
+ perTaskThresholds,
146
+ perTaskCooldownMs
147
+ };
148
+ }
149
+ /**
150
+ * Called by trajectory storage when a trajectory transitions to
151
+ * `completed`. Looks up the detail, increments the relevant counters, and
152
+ * checks each touched task's threshold + cooldown.
153
+ *
154
+ * Errors propagate by design — the caller uses optional chaining so a missing
155
+ * service skips training triggers, while a misconfigured service that throws
156
+ * during increment is still surfaced.
157
+ */
158
+ async notifyTrajectoryCompleted(trajectoryId) {
159
+ if (!trajectoryId.trim()) return;
160
+ const config = this.configLoader();
161
+ if (!config.autoTrain) return;
162
+ const trajectoryService = this.runtimeRef.getService(
163
+ "trajectories"
164
+ );
165
+ if (!trajectoryService || typeof trajectoryService.getTrajectoryDetail !== "function") {
166
+ return;
167
+ }
168
+ const detail = await trajectoryService.getTrajectoryDetail(trajectoryId);
169
+ if (!detail) return;
170
+ const tasks = tasksForTrajectory(detail);
171
+ if (tasks.length === 0) return;
172
+ let dirty = false;
173
+ for (const task of tasks) {
174
+ this.state.counters[task] = (this.state.counters[task] ?? 0) + 1;
175
+ dirty = true;
176
+ }
177
+ if (dirty) writePersisted(this.statePath, this.state);
178
+ for (const task of tasks) {
179
+ await this.maybeFire(task, config);
180
+ }
181
+ }
182
+ /** Manual fire — bypasses the autoTrain toggle (operator action). */
183
+ async runManually(input) {
184
+ const record = await this.triggerImpl(this.runtimeRef, {
185
+ task: input.task,
186
+ backend: input.backend,
187
+ source: "manual",
188
+ dryRun: input.dryRun,
189
+ anonymizer: this.anonymizer
190
+ });
191
+ this.recordCompletion(record);
192
+ return record;
193
+ }
194
+ /**
195
+ * Reset counters — primarily for tests and operator recovery. The persisted
196
+ * `lastTrainAt`/`lastTrainRecord` map is preserved so cooldowns still
197
+ * apply after a reset.
198
+ */
199
+ resetCounters(task) {
200
+ if (task) {
201
+ this.state.counters[task] = 0;
202
+ } else {
203
+ this.state.counters = emptyCounters();
204
+ }
205
+ writePersisted(this.statePath, this.state);
206
+ }
207
+ async maybeFire(task, config) {
208
+ const policy = resolveTaskPolicy(config, task);
209
+ const count = this.state.counters[task];
210
+ if (count < policy.threshold) return;
211
+ const lastAt = this.state.lastTrainAt[task];
212
+ const now = this.now();
213
+ if (typeof lastAt === "number" && now - lastAt < policy.cooldownMs) {
214
+ return;
215
+ }
216
+ if (this.inflight.has(task)) return;
217
+ this.inflight.add(task);
218
+ const log = this.runtimeRef.logger ?? {
219
+ info: () => {
220
+ },
221
+ warn: () => {
222
+ },
223
+ error: () => {
224
+ }
225
+ };
226
+ log.info(
227
+ `[TrainingTriggerService] firing task=${task} threshold=${policy.threshold} count=${count} backend=${policy.backend ?? "<none>"}`
228
+ );
229
+ try {
230
+ const record = await this.triggerImpl(this.runtimeRef, {
231
+ task,
232
+ source: "threshold",
233
+ anonymizer: this.anonymizer
234
+ });
235
+ this.recordCompletion(record);
236
+ this.state.counters[task] = 0;
237
+ writePersisted(this.statePath, this.state);
238
+ } finally {
239
+ this.inflight.delete(task);
240
+ }
241
+ }
242
+ recordCompletion(record) {
243
+ if (!record.task) return;
244
+ this.state.lastTrainAt[record.task] = this.now();
245
+ this.state.lastTrainRecord[record.task] = {
246
+ runId: record.runId,
247
+ source: record.source,
248
+ finishedAt: record.finishedAt,
249
+ status: record.status
250
+ };
251
+ writePersisted(this.statePath, this.state);
252
+ }
253
+ }
254
+ function registerTrainingTriggerService(runtime, options = {}) {
255
+ const service = new TrainingTriggerService(runtime, options);
256
+ runtime.services.set(TRAINING_TRIGGER_SERVICE, [service]);
257
+ return service;
258
+ }
259
+ const BOOTSTRAP_TASKS = [
260
+ "should_respond",
261
+ "action_planner"
262
+ ];
263
+ function hasOptimizedPromptService(service) {
264
+ return !!service && typeof service.hasOptimized === "function";
265
+ }
266
+ async function bootstrapOptimizationFromAccumulatedTrajectories(runtime, service, options = {}) {
267
+ if (process.env.ELIZA_DISABLE_AUTO_BOOTSTRAP === "1") {
268
+ return [];
269
+ }
270
+ const config = (options.configLoader ?? loadTrainingConfig)();
271
+ if (!config.autoTrain) return [];
272
+ if (!config.backends.includes("native")) return [];
273
+ const optimizedPromptService = runtime.getService("optimized_prompt");
274
+ const status = service.getStatus();
275
+ const fired = [];
276
+ for (const task of BOOTSTRAP_TASKS) {
277
+ const threshold = status.perTaskThresholds[task] ?? Number.POSITIVE_INFINITY;
278
+ const count = status.counters[task] ?? 0;
279
+ if (count < threshold) continue;
280
+ if (hasOptimizedPromptService(optimizedPromptService) && optimizedPromptService.hasOptimized(task)) {
281
+ continue;
282
+ }
283
+ const trigger = options.triggerOverride ?? (async (input) => service.runManually({ task: input.task, backend: input.backend }));
284
+ await trigger({ task, backend: "native" });
285
+ fired.push(task);
286
+ }
287
+ if (fired.length > 0) {
288
+ const message = `Bootstrapping prompt optimization from accumulated trajectories (${fired.join(", ")}). Track progress in Settings \u2192 Auto-Training.`;
289
+ options.notifier?.notify(message);
290
+ runtime.logger.info(`[TrainingTriggerService] ${message}`);
291
+ }
292
+ return fired;
293
+ }
294
+ export {
295
+ TRAINING_TRIGGER_SERVICE,
296
+ TrainingTriggerService,
297
+ bootstrapOptimizationFromAccumulatedTrajectories,
298
+ registerTrainingTriggerService
299
+ };
300
+ //# sourceMappingURL=training-trigger.js.map