@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,96 @@
1
+ /**
2
+ * Native local-inference training backend.
3
+ *
4
+ * Dispatches a per-task JSONL dataset (produced by `dataset-generator.ts` /
5
+ * `trajectory-task-datasets.ts`) through one of the native optimizers
6
+ * (`instruction-search`, `prompt-evolution`, `bootstrap-fewshot`) and writes
7
+ * the resulting artifact into the `<stateDir>/optimized-prompts/` store.
8
+ *
9
+ * Activation:
10
+ * bun run train -- --backend native --optimizer instruction-search \
11
+ * --dataset <path> --task <task>
12
+ *
13
+ * The backend is pure — it does not touch the network. It calls
14
+ * `runtime.useModel(ModelType.TEXT_LARGE, …)` for variant generation and the
15
+ * same model for scoring. Operators can swap the model via the optimizer
16
+ * options without changing this file.
17
+ */
18
+ import type { TrajectoryTrainingTask } from "../core/trajectory-task-datasets.js";
19
+ import { type LlmAdapter, type OptimizationExample, type OptimizerName, type OptimizerResult, type PromptScorer, type UseModelHandler } from "../optimizers/index.js";
20
+ export interface NativeBackendOptions {
21
+ /**
22
+ * JSONL dataset produced by exportTrajectoryTaskDatasets. Each line is an
23
+ * `eliza_native_v1` model-boundary row.
24
+ */
25
+ datasetPath: string;
26
+ task: TrajectoryTrainingTask;
27
+ optimizer: OptimizerName;
28
+ /** Used for the artifact baseline + datasetId. */
29
+ baselinePrompt: string;
30
+ datasetId?: string;
31
+ /** Loose runtime shape — only useModel is required. */
32
+ runtime: {
33
+ useModel: UseModelHandler;
34
+ };
35
+ /** Override adapter (tests). */
36
+ adapter?: LlmAdapter;
37
+ /**
38
+ * Fraction of the dataset reserved for the promotion gate's held-out
39
+ * comparison (0..1). The split is deterministic via FNV-1a over each row's
40
+ * stable id, so re-running the optimizer with the same dataset always
41
+ * yields the same train/holdout partition. Set to 0 to disable splitting
42
+ * (legacy behavior: optimizer and gate see the full dataset — vulnerable
43
+ * to train-on-test contamination). Default: 0.2.
44
+ */
45
+ holdoutFraction?: number;
46
+ }
47
+ export declare const DEFAULT_HOLDOUT_FRACTION = 0.2;
48
+ export interface NativeBackendResult {
49
+ invoked: boolean;
50
+ optimizer: OptimizerName;
51
+ task: TrajectoryTrainingTask;
52
+ datasetSize: number;
53
+ score: number;
54
+ baselineScore: number;
55
+ result: OptimizerResult;
56
+ notes: string[];
57
+ /**
58
+ * Parsed examples from the JSONL dataset. Surfaced so callers (the
59
+ * orchestrator's promotion gate) can re-score on the same data without
60
+ * re-parsing the file.
61
+ */
62
+ dataset: OptimizationExample[];
63
+ /**
64
+ * Training subset the optimizer actually consumed. When `holdoutFraction>0`
65
+ * this is a strict subset of `dataset`; when 0 it equals `dataset`.
66
+ */
67
+ trainSet: OptimizationExample[];
68
+ /**
69
+ * Held-out subset the optimizer never saw. The promotion gate scores
70
+ * incumbent vs candidate on this set to avoid train-on-test contamination.
71
+ * Empty when `holdoutFraction=0` or the deterministic split produced no
72
+ * holdout rows (small datasets); callers fall back to `dataset` in that
73
+ * case so the gate still has something to score against.
74
+ */
75
+ holdoutSet: OptimizationExample[];
76
+ /**
77
+ * Scorer instance used during optimization. Surfaced for the same reason as
78
+ * `dataset` — the promotion gate runs the candidate against the incumbent
79
+ * with the same scoring primitive (Jaccard or planner-action-match,
80
+ * depending on the task).
81
+ */
82
+ scorer: PromptScorer;
83
+ }
84
+ /**
85
+ * Split a dataset into train + holdout subsets deterministically by hashing
86
+ * each row's `id` (falling back to position when missing). The fraction is
87
+ * an upper bound — small datasets may produce 0 holdout rows, in which case
88
+ * the caller should reuse the full dataset for gating.
89
+ */
90
+ export declare function splitTrainHoldout(dataset: OptimizationExample[], holdoutFraction: number): {
91
+ trainSet: OptimizationExample[];
92
+ holdoutSet: OptimizationExample[];
93
+ };
94
+ export declare function runNativeBackend(options: NativeBackendOptions): Promise<NativeBackendResult>;
95
+ export declare const NATIVE_OPTIMIZERS: readonly OptimizerName[];
96
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../../src/backends/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAIH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAalF,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,EAQjB,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAC;AAUhC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uDAAuD;IACvD,OAAO,EAAE;QAAE,QAAQ,EAAE,eAAe,CAAA;KAAE,CAAC;IACvC,gCAAgC;IAChC,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,aAAa,CAAC;IACzB,IAAI,EAAE,sBAAsB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;;OAIG;IACH,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B;;;OAGG;IACH,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC;;;;;;OAMG;IACH,UAAU,EAAE,mBAAmB,EAAE,CAAC;IAClC;;;;;OAKG;IACH,MAAM,EAAE,YAAY,CAAC;CACtB;AAeD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,mBAAmB,EAAE,EAC9B,eAAe,EAAE,MAAM,GACtB;IAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAAC,UAAU,EAAE,mBAAmB,EAAE,CAAA;CAAE,CA2BxE;AAuQD,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA0E9B;AAED,eAAO,MAAM,iBAAiB,EAAE,SAAS,aAAa,EAQ5C,CAAC"}
@@ -0,0 +1,308 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { basename } from "node:path";
3
+ import {
4
+ buildDspyArtifact,
5
+ buildExamplesFromRows,
6
+ defineSignature,
7
+ legacyAdapterToLm,
8
+ runDspyBootstrapFewshot,
9
+ runDspyCopro,
10
+ runDspyMipro
11
+ } from "../dspy/index.js";
12
+ import {
13
+ createPromptScorer,
14
+ createRuntimeAdapter,
15
+ LIFEOPS_SCORER_TASKS,
16
+ runBootstrapFewshot,
17
+ runGepa,
18
+ runInstructionSearch,
19
+ runPromptEvolution,
20
+ scoreLifeOpsTask,
21
+ scorePlannerAction,
22
+ scoreViewSelection
23
+ } from "../optimizers/index.js";
24
+ const LIFEOPS_TASKS = /* @__PURE__ */ new Set([
25
+ ...LIFEOPS_SCORER_TASKS
26
+ ]);
27
+ const DEFAULT_HOLDOUT_FRACTION = 0.2;
28
+ function fnv1aHash(input) {
29
+ let hash = 2166136261;
30
+ for (let i = 0; i < input.length; i += 1) {
31
+ hash ^= input.charCodeAt(i);
32
+ hash = Math.imul(hash, 16777619) >>> 0;
33
+ }
34
+ return hash >>> 0;
35
+ }
36
+ function splitTrainHoldout(dataset, holdoutFraction) {
37
+ if (holdoutFraction <= 0 || dataset.length < 2) {
38
+ return { trainSet: dataset, holdoutSet: [] };
39
+ }
40
+ const fraction = Math.min(Math.max(holdoutFraction, 0), 0.5);
41
+ const trainSet = [];
42
+ const holdoutSet = [];
43
+ const threshold = Math.floor(fraction * 4294967295);
44
+ dataset.forEach((ex, index) => {
45
+ const key = ex.id ?? `row-${index}`;
46
+ const h = fnv1aHash(key);
47
+ if (h < threshold) {
48
+ holdoutSet.push(ex);
49
+ } else {
50
+ trainSet.push(ex);
51
+ }
52
+ });
53
+ if (trainSet.length === 0 && holdoutSet.length > 0) {
54
+ trainSet.push(holdoutSet.shift());
55
+ }
56
+ if (holdoutSet.length === 0 && dataset.length >= 5) {
57
+ holdoutSet.push(trainSet.pop());
58
+ }
59
+ return { trainSet, holdoutSet };
60
+ }
61
+ function parseJsonlDataset(path) {
62
+ if (!existsSync(path)) {
63
+ throw new Error(`[native-backend] dataset not found at ${path}`);
64
+ }
65
+ const raw = readFileSync(path, "utf-8");
66
+ const lines = raw.split("\n").filter((line) => line.trim().length > 0);
67
+ const examples = [];
68
+ let index = 0;
69
+ for (const line of lines) {
70
+ const parsedJson = JSON.parse(line);
71
+ if (!isJsonlRow(parsedJson)) {
72
+ throw new Error(
73
+ `[native-backend] dataset line ${index + 1} is not an eliza_native_v1 row`
74
+ );
75
+ }
76
+ const example = rowToExample(parsedJson, index);
77
+ if (example) examples.push(example);
78
+ index += 1;
79
+ }
80
+ return examples;
81
+ }
82
+ function isJsonlRow(value) {
83
+ if (typeof value !== "object" || value === null) return false;
84
+ const candidate = value;
85
+ return candidate.format === "eliza_native_v1" && (candidate.boundary === "vercel_ai_sdk.generateText" || candidate.boundary === "vercel_ai_sdk.streamText");
86
+ }
87
+ function rowToExample(row, index) {
88
+ let system;
89
+ let user;
90
+ let expected;
91
+ if (typeof row.request?.system === "string" && row.request.system.length > 0) {
92
+ system = row.request.system;
93
+ }
94
+ const messages = row.request?.messages ?? [];
95
+ for (const msg of messages) {
96
+ if (!system && msg.role === "system" && typeof msg.content === "string") {
97
+ system = msg.content;
98
+ }
99
+ if (msg.role === "user" && typeof msg.content === "string") {
100
+ user = user ? `${user}
101
+ ${msg.content}` : msg.content;
102
+ }
103
+ if (msg.role === "assistant" && typeof msg.content === "string") {
104
+ expected = msg.content;
105
+ }
106
+ }
107
+ if (!user && typeof row.request?.prompt === "string") {
108
+ user = row.request.prompt;
109
+ }
110
+ if (row.response) {
111
+ if (typeof row.response.text === "string" && row.response.text.length > 0) {
112
+ expected = row.response.text;
113
+ } else if (Array.isArray(row.response.toolCalls)) {
114
+ expected = JSON.stringify({ toolCalls: row.response.toolCalls });
115
+ }
116
+ }
117
+ if (!user || !expected) return null;
118
+ return {
119
+ id: `row-${index}`,
120
+ input: { system, user },
121
+ expectedOutput: expected
122
+ };
123
+ }
124
+ function dispatchOptimizer(optimizer, input) {
125
+ switch (optimizer) {
126
+ case "instruction-search":
127
+ return runInstructionSearch(input);
128
+ case "prompt-evolution":
129
+ return runPromptEvolution(input);
130
+ case "gepa":
131
+ return runGepa(input);
132
+ case "bootstrap-fewshot":
133
+ return runBootstrapFewshot(input);
134
+ case "dspy-bootstrap-fewshot":
135
+ case "dspy-copro":
136
+ case "dspy-mipro":
137
+ return runDspyOptimizer(optimizer, input);
138
+ }
139
+ }
140
+ async function runDspyOptimizer(optimizer, input) {
141
+ const filtered = buildExamplesFromRows(
142
+ input.dataset.map((ex) => ({
143
+ format: "eliza_native_v1",
144
+ request: {
145
+ system: ex.input.system,
146
+ messages: [
147
+ ...ex.input.system ? [{ role: "system", content: ex.input.system }] : [],
148
+ { role: "user", content: ex.input.user }
149
+ ]
150
+ },
151
+ response: { text: ex.expectedOutput }
152
+ }))
153
+ );
154
+ const examples = filtered.examples;
155
+ if (examples.length === 0) {
156
+ return {
157
+ optimizedPrompt: input.baselinePrompt,
158
+ score: 0,
159
+ baseline: 0,
160
+ lineage: []
161
+ };
162
+ }
163
+ const signature = defineSignature({
164
+ name: `task_${input.task}`,
165
+ instructions: input.baselinePrompt,
166
+ inputs: [
167
+ {
168
+ name: "input",
169
+ description: "User-turn text or planner input payload.",
170
+ type: "string"
171
+ }
172
+ ],
173
+ outputs: [
174
+ {
175
+ name: "output",
176
+ description: "Expected response text for this task.",
177
+ type: "string"
178
+ }
179
+ ]
180
+ });
181
+ const metric = (predicted, expected) => {
182
+ const p = String(predicted.output ?? "").trim();
183
+ const e = String(expected.output ?? "").trim();
184
+ if (p.length === 0 || e.length === 0) return 0;
185
+ return p === e ? 1 : 0;
186
+ };
187
+ const lm = legacyAdapterToLm(input.llm, "native-backend");
188
+ let result;
189
+ if (optimizer === "dspy-bootstrap-fewshot") {
190
+ result = await runDspyBootstrapFewshot({
191
+ signature,
192
+ dataset: examples,
193
+ lm,
194
+ metric
195
+ });
196
+ } else if (optimizer === "dspy-copro") {
197
+ result = await runDspyCopro({
198
+ signature,
199
+ dataset: examples,
200
+ lm,
201
+ metric
202
+ });
203
+ } else {
204
+ result = await runDspyMipro({
205
+ signature,
206
+ dataset: examples,
207
+ lm,
208
+ metric
209
+ });
210
+ }
211
+ const artifact = buildDspyArtifact({
212
+ task: input.task,
213
+ baseline: input.baselinePrompt,
214
+ datasetId: input.datasetPath,
215
+ datasetSize: examples.length,
216
+ result
217
+ });
218
+ return {
219
+ optimizedPrompt: artifact.prompt,
220
+ score: result.score,
221
+ baseline: result.baselineScore,
222
+ lineage: result.lineage,
223
+ fewShotExamples: result.demonstrations.length > 0 ? result.demonstrations.map((demo, idx) => ({
224
+ id: demo.source ?? `demo-${idx}`,
225
+ input: {
226
+ system: typeof demo.inputs.system === "string" ? demo.inputs.system : void 0,
227
+ user: String(demo.inputs.input ?? "")
228
+ },
229
+ expectedOutput: String(demo.outputs.output ?? ""),
230
+ reward: demo.reward,
231
+ metadata: demo.metadata
232
+ })) : void 0
233
+ };
234
+ }
235
+ async function runNativeBackend(options) {
236
+ const dataset = parseJsonlDataset(options.datasetPath);
237
+ const adapter = options.adapter ?? createRuntimeAdapter(options.runtime.useModel);
238
+ const scorer = createPromptScorer(adapter, {
239
+ compare: options.task === "action_planner" ? scorePlannerAction : options.task === "view_context" ? scoreViewSelection : LIFEOPS_TASKS.has(options.task) ? (actual, expected) => scoreLifeOpsTask(options.task, actual, expected) : void 0
240
+ });
241
+ if (dataset.length === 0) {
242
+ return {
243
+ invoked: false,
244
+ optimizer: options.optimizer,
245
+ task: options.task,
246
+ datasetSize: 0,
247
+ score: 0,
248
+ baselineScore: 0,
249
+ result: {
250
+ optimizedPrompt: options.baselinePrompt,
251
+ score: 0,
252
+ baseline: 0,
253
+ lineage: []
254
+ },
255
+ notes: [
256
+ `dataset at ${options.datasetPath} parsed to 0 usable rows; nothing to optimize`
257
+ ],
258
+ dataset,
259
+ trainSet: dataset,
260
+ holdoutSet: [],
261
+ scorer
262
+ };
263
+ }
264
+ const holdoutFraction = options.holdoutFraction ?? DEFAULT_HOLDOUT_FRACTION;
265
+ const { trainSet, holdoutSet } = splitTrainHoldout(dataset, holdoutFraction);
266
+ const result = await dispatchOptimizer(options.optimizer, {
267
+ baselinePrompt: options.baselinePrompt,
268
+ dataset: trainSet,
269
+ scorer,
270
+ llm: adapter,
271
+ task: options.task,
272
+ datasetPath: options.datasetPath
273
+ });
274
+ const splitNote = holdoutSet.length > 0 ? `split train=${trainSet.length} holdout=${holdoutSet.length} (fraction=${holdoutFraction})` : `split disabled (holdoutFraction=${holdoutFraction}, dataset=${dataset.length}); gate will re-use full dataset`;
275
+ return {
276
+ invoked: true,
277
+ optimizer: options.optimizer,
278
+ task: options.task,
279
+ datasetSize: dataset.length,
280
+ score: result.score,
281
+ baselineScore: result.baseline,
282
+ result,
283
+ notes: [
284
+ `optimizer=${options.optimizer} dataset=${basename(options.datasetPath)} size=${dataset.length} baseline=${result.baseline.toFixed(3)} optimized=${result.score.toFixed(3)}`,
285
+ splitNote
286
+ ],
287
+ dataset,
288
+ trainSet,
289
+ holdoutSet,
290
+ scorer
291
+ };
292
+ }
293
+ const NATIVE_OPTIMIZERS = [
294
+ "instruction-search",
295
+ "prompt-evolution",
296
+ "gepa",
297
+ "bootstrap-fewshot",
298
+ "dspy-bootstrap-fewshot",
299
+ "dspy-copro",
300
+ "dspy-mipro"
301
+ ];
302
+ export {
303
+ DEFAULT_HOLDOUT_FRACTION,
304
+ NATIVE_OPTIMIZERS,
305
+ runNativeBackend,
306
+ splitTrainHoldout
307
+ };
308
+ //# sourceMappingURL=native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/backends/native.ts"],"sourcesContent":["/**\n * Native local-inference training backend.\n *\n * Dispatches a per-task JSONL dataset (produced by `dataset-generator.ts` /\n * `trajectory-task-datasets.ts`) through one of the native optimizers\n * (`instruction-search`, `prompt-evolution`, `bootstrap-fewshot`) and writes\n * the resulting artifact into the `<stateDir>/optimized-prompts/` store.\n *\n * Activation:\n * bun run train -- --backend native --optimizer instruction-search \\\n * --dataset <path> --task <task>\n *\n * The backend is pure — it does not touch the network. It calls\n * `runtime.useModel(ModelType.TEXT_LARGE, …)` for variant generation and the\n * same model for scoring. Operators can swap the model via the optimizer\n * options without changing this file.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { basename } from \"node:path\";\nimport type { TrajectoryTrainingTask } from \"../core/trajectory-task-datasets.js\";\nimport {\n buildDspyArtifact,\n buildExamplesFromRows,\n type DspyArtifactTask,\n type DspyOptimizerResult,\n defineSignature,\n legacyAdapterToLm,\n type Metric,\n runDspyBootstrapFewshot,\n runDspyCopro,\n runDspyMipro,\n} from \"../dspy/index.js\";\nimport {\n createPromptScorer,\n createRuntimeAdapter,\n LIFEOPS_SCORER_TASKS,\n type LlmAdapter,\n type OptimizationExample,\n type OptimizerName,\n type OptimizerResult,\n type PromptScorer,\n runBootstrapFewshot,\n runGepa,\n runInstructionSearch,\n runPromptEvolution,\n scoreLifeOpsTask,\n scorePlannerAction,\n scoreViewSelection,\n type UseModelHandler,\n} from \"../optimizers/index.js\";\n\n/**\n * LifeOps tasks (#8795) routed to the per-capability {@link scoreLifeOpsTask}\n * scorer instead of the default token-overlap comparator.\n */\nconst LIFEOPS_TASKS = new Set<TrajectoryTrainingTask>([\n ...LIFEOPS_SCORER_TASKS,\n]);\n\nexport interface NativeBackendOptions {\n /**\n * JSONL dataset produced by exportTrajectoryTaskDatasets. Each line is an\n * `eliza_native_v1` model-boundary row.\n */\n datasetPath: string;\n task: TrajectoryTrainingTask;\n optimizer: OptimizerName;\n /** Used for the artifact baseline + datasetId. */\n baselinePrompt: string;\n datasetId?: string;\n /** Loose runtime shape — only useModel is required. */\n runtime: { useModel: UseModelHandler };\n /** Override adapter (tests). */\n adapter?: LlmAdapter;\n /**\n * Fraction of the dataset reserved for the promotion gate's held-out\n * comparison (0..1). The split is deterministic via FNV-1a over each row's\n * stable id, so re-running the optimizer with the same dataset always\n * yields the same train/holdout partition. Set to 0 to disable splitting\n * (legacy behavior: optimizer and gate see the full dataset — vulnerable\n * to train-on-test contamination). Default: 0.2.\n */\n holdoutFraction?: number;\n}\n\nexport const DEFAULT_HOLDOUT_FRACTION = 0.2;\n\nexport interface NativeBackendResult {\n invoked: boolean;\n optimizer: OptimizerName;\n task: TrajectoryTrainingTask;\n datasetSize: number;\n score: number;\n baselineScore: number;\n result: OptimizerResult;\n notes: string[];\n /**\n * Parsed examples from the JSONL dataset. Surfaced so callers (the\n * orchestrator's promotion gate) can re-score on the same data without\n * re-parsing the file.\n */\n dataset: OptimizationExample[];\n /**\n * Training subset the optimizer actually consumed. When `holdoutFraction>0`\n * this is a strict subset of `dataset`; when 0 it equals `dataset`.\n */\n trainSet: OptimizationExample[];\n /**\n * Held-out subset the optimizer never saw. The promotion gate scores\n * incumbent vs candidate on this set to avoid train-on-test contamination.\n * Empty when `holdoutFraction=0` or the deterministic split produced no\n * holdout rows (small datasets); callers fall back to `dataset` in that\n * case so the gate still has something to score against.\n */\n holdoutSet: OptimizationExample[];\n /**\n * Scorer instance used during optimization. Surfaced for the same reason as\n * `dataset` — the promotion gate runs the candidate against the incumbent\n * with the same scoring primitive (Jaccard or planner-action-match,\n * depending on the task).\n */\n scorer: PromptScorer;\n}\n\n/**\n * Deterministic 32-bit FNV-1a hash. Used to assign each example to\n * train/holdout in a reproducible way without keeping any state across runs.\n */\nfunction fnv1aHash(input: string): number {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i += 1) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n return hash >>> 0;\n}\n\n/**\n * Split a dataset into train + holdout subsets deterministically by hashing\n * each row's `id` (falling back to position when missing). The fraction is\n * an upper bound — small datasets may produce 0 holdout rows, in which case\n * the caller should reuse the full dataset for gating.\n */\nexport function splitTrainHoldout(\n dataset: OptimizationExample[],\n holdoutFraction: number,\n): { trainSet: OptimizationExample[]; holdoutSet: OptimizationExample[] } {\n if (holdoutFraction <= 0 || dataset.length < 2) {\n return { trainSet: dataset, holdoutSet: [] };\n }\n const fraction = Math.min(Math.max(holdoutFraction, 0), 0.5);\n const trainSet: OptimizationExample[] = [];\n const holdoutSet: OptimizationExample[] = [];\n const threshold = Math.floor(fraction * 0xffffffff);\n dataset.forEach((ex, index) => {\n const key = ex.id ?? `row-${index}`;\n const h = fnv1aHash(key);\n if (h < threshold) {\n holdoutSet.push(ex);\n } else {\n trainSet.push(ex);\n }\n });\n // Degenerate edge cases: ensure the optimizer always has at least one row,\n // and ensure the holdout has at least one row when the dataset is large\n // enough that the operator clearly expected a split.\n if (trainSet.length === 0 && holdoutSet.length > 0) {\n trainSet.push(holdoutSet.shift() as OptimizationExample);\n }\n if (holdoutSet.length === 0 && dataset.length >= 5) {\n holdoutSet.push(trainSet.pop() as OptimizationExample);\n }\n return { trainSet, holdoutSet };\n}\n\ninterface JsonlMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n}\n\ninterface JsonlRow {\n format: \"eliza_native_v1\";\n boundary?: string;\n request?: {\n system?: string;\n prompt?: string;\n messages?: JsonlMessage[];\n };\n response?: {\n text?: string;\n toolCalls?: unknown[];\n };\n}\n\nfunction parseJsonlDataset(path: string): OptimizationExample[] {\n if (!existsSync(path)) {\n throw new Error(`[native-backend] dataset not found at ${path}`);\n }\n const raw = readFileSync(path, \"utf-8\");\n const lines = raw.split(\"\\n\").filter((line) => line.trim().length > 0);\n const examples: OptimizationExample[] = [];\n let index = 0;\n for (const line of lines) {\n const parsedJson: unknown = JSON.parse(line);\n if (!isJsonlRow(parsedJson)) {\n throw new Error(\n `[native-backend] dataset line ${index + 1} is not an eliza_native_v1 row`,\n );\n }\n const example = rowToExample(parsedJson, index);\n if (example) examples.push(example);\n index += 1;\n }\n return examples;\n}\n\nfunction isJsonlRow(value: unknown): value is JsonlRow {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as JsonlRow;\n return (\n candidate.format === \"eliza_native_v1\" &&\n (candidate.boundary === \"vercel_ai_sdk.generateText\" ||\n candidate.boundary === \"vercel_ai_sdk.streamText\")\n );\n}\n\nfunction rowToExample(\n row: JsonlRow,\n index: number,\n): OptimizationExample | null {\n let system: string | undefined;\n let user: string | undefined;\n let expected: string | undefined;\n if (\n typeof row.request?.system === \"string\" &&\n row.request.system.length > 0\n ) {\n system = row.request.system;\n }\n const messages = row.request?.messages ?? [];\n for (const msg of messages) {\n if (!system && msg.role === \"system\" && typeof msg.content === \"string\") {\n system = msg.content;\n }\n if (msg.role === \"user\" && typeof msg.content === \"string\") {\n // Concatenate when multiple user turns appear; the trajectory\n // exporter already collapses these for single-turn tasks.\n user = user ? `${user}\\n${msg.content}` : msg.content;\n }\n if (msg.role === \"assistant\" && typeof msg.content === \"string\") {\n expected = msg.content;\n }\n }\n if (!user && typeof row.request?.prompt === \"string\") {\n user = row.request.prompt;\n }\n if (row.response) {\n if (typeof row.response.text === \"string\" && row.response.text.length > 0) {\n expected = row.response.text;\n } else if (Array.isArray(row.response.toolCalls)) {\n expected = JSON.stringify({ toolCalls: row.response.toolCalls });\n }\n }\n if (!user || !expected) return null;\n return {\n id: `row-${index}`,\n input: { system, user },\n expectedOutput: expected,\n };\n}\n\nfunction dispatchOptimizer(\n optimizer: OptimizerName,\n input: {\n baselinePrompt: string;\n dataset: OptimizationExample[];\n scorer: ReturnType<typeof createPromptScorer>;\n llm: LlmAdapter;\n task: TrajectoryTrainingTask;\n datasetPath: string;\n },\n): Promise<OptimizerResult> {\n switch (optimizer) {\n case \"instruction-search\":\n return runInstructionSearch(input);\n case \"prompt-evolution\":\n return runPromptEvolution(input);\n case \"gepa\":\n return runGepa(input);\n case \"bootstrap-fewshot\":\n return runBootstrapFewshot(input);\n case \"dspy-bootstrap-fewshot\":\n case \"dspy-copro\":\n case \"dspy-mipro\":\n return runDspyOptimizer(optimizer, input);\n }\n}\n\n/**\n * Bridge from the legacy (baselinePrompt + OptimizationExample[]) input shape\n * into the DSPy primitives: synthesize a Signature from the baseline + first\n * row, load examples through the privacy filter, and translate the resulting\n * DspyOptimizerResult back into the OptimizerResult contract used by the\n * native backend caller (and by `OptimizedPromptArtifact` consumers).\n */\nasync function runDspyOptimizer(\n optimizer: \"dspy-bootstrap-fewshot\" | \"dspy-copro\" | \"dspy-mipro\",\n input: {\n baselinePrompt: string;\n dataset: OptimizationExample[];\n scorer: ReturnType<typeof createPromptScorer>;\n llm: LlmAdapter;\n task: TrajectoryTrainingTask;\n datasetPath: string;\n },\n): Promise<OptimizerResult> {\n // Re-load through the dspy loader so the privacy filter runs (mandatory per\n // CLAUDE.md — no path may skip it). We round-trip through the on-disk file\n // so the filter sees the original strings, then the optimizer consumes the\n // filtered Example[] only.\n const filtered = buildExamplesFromRows(\n input.dataset.map((ex) => ({\n format: \"eliza_native_v1\" as const,\n request: {\n system: ex.input.system,\n messages: [\n ...(ex.input.system\n ? [{ role: \"system\" as const, content: ex.input.system }]\n : []),\n { role: \"user\" as const, content: ex.input.user },\n ],\n },\n response: { text: ex.expectedOutput },\n })),\n );\n const examples = filtered.examples;\n if (examples.length === 0) {\n return {\n optimizedPrompt: input.baselinePrompt,\n score: 0,\n baseline: 0,\n lineage: [],\n };\n }\n\n const signature = defineSignature({\n name: `task_${input.task}`,\n instructions: input.baselinePrompt,\n inputs: [\n {\n name: \"input\",\n description: \"User-turn text or planner input payload.\",\n type: \"string\",\n },\n ],\n outputs: [\n {\n name: \"output\",\n description: \"Expected response text for this task.\",\n type: \"string\",\n },\n ],\n });\n\n // Exact-match metric on the canonical `output` field. The legacy backend\n // uses a Jaccard / planner-action scorer; we cannot reuse those here because\n // they take a baseline-prompt + dataset pair, not a (predicted, expected)\n // pair. Exact-match is the strict floor — when the model emits the same\n // string, score 1.\n const metric: Metric = (predicted, expected) => {\n const p = String(predicted.output ?? \"\").trim();\n const e = String(expected.output ?? \"\").trim();\n if (p.length === 0 || e.length === 0) return 0;\n return p === e ? 1 : 0;\n };\n\n const lm = legacyAdapterToLm(input.llm, \"native-backend\");\n let result: DspyOptimizerResult;\n if (optimizer === \"dspy-bootstrap-fewshot\") {\n result = await runDspyBootstrapFewshot({\n signature,\n dataset: examples,\n lm,\n metric,\n });\n } else if (optimizer === \"dspy-copro\") {\n result = await runDspyCopro({\n signature,\n dataset: examples,\n lm,\n metric,\n });\n } else {\n result = await runDspyMipro({\n signature,\n dataset: examples,\n lm,\n metric,\n });\n }\n\n // Use the artifact builder to compose the prompt body (instructions +\n // demonstrations). This keeps the (eliza_native_v1)-compatible string\n // generation in one place.\n const artifact = buildDspyArtifact({\n task: input.task as DspyArtifactTask,\n baseline: input.baselinePrompt,\n datasetId: input.datasetPath,\n datasetSize: examples.length,\n result,\n });\n\n return {\n optimizedPrompt: artifact.prompt,\n score: result.score,\n baseline: result.baselineScore,\n lineage: result.lineage,\n fewShotExamples:\n result.demonstrations.length > 0\n ? result.demonstrations.map((demo, idx) => ({\n id: demo.source ?? `demo-${idx}`,\n input: {\n system:\n typeof demo.inputs.system === \"string\"\n ? demo.inputs.system\n : undefined,\n user: String(demo.inputs.input ?? \"\"),\n },\n expectedOutput: String(demo.outputs.output ?? \"\"),\n reward: demo.reward,\n metadata: demo.metadata,\n }))\n : undefined,\n };\n}\n\nexport async function runNativeBackend(\n options: NativeBackendOptions,\n): Promise<NativeBackendResult> {\n const dataset = parseJsonlDataset(options.datasetPath);\n const adapter =\n options.adapter ?? createRuntimeAdapter(options.runtime.useModel);\n const scorer = createPromptScorer(adapter, {\n compare:\n options.task === \"action_planner\"\n ? scorePlannerAction\n : options.task === \"view_context\"\n ? scoreViewSelection\n : LIFEOPS_TASKS.has(options.task)\n ? (actual: string, expected: string): number =>\n scoreLifeOpsTask(options.task, actual, expected)\n : undefined,\n });\n\n if (dataset.length === 0) {\n return {\n invoked: false,\n optimizer: options.optimizer,\n task: options.task,\n datasetSize: 0,\n score: 0,\n baselineScore: 0,\n result: {\n optimizedPrompt: options.baselinePrompt,\n score: 0,\n baseline: 0,\n lineage: [],\n },\n notes: [\n `dataset at ${options.datasetPath} parsed to 0 usable rows; nothing to optimize`,\n ],\n dataset,\n trainSet: dataset,\n holdoutSet: [],\n scorer,\n };\n }\n\n const holdoutFraction = options.holdoutFraction ?? DEFAULT_HOLDOUT_FRACTION;\n const { trainSet, holdoutSet } = splitTrainHoldout(dataset, holdoutFraction);\n\n const result = await dispatchOptimizer(options.optimizer, {\n baselinePrompt: options.baselinePrompt,\n dataset: trainSet,\n scorer,\n llm: adapter,\n task: options.task,\n datasetPath: options.datasetPath,\n });\n\n const splitNote =\n holdoutSet.length > 0\n ? `split train=${trainSet.length} holdout=${holdoutSet.length} (fraction=${holdoutFraction})`\n : `split disabled (holdoutFraction=${holdoutFraction}, dataset=${dataset.length}); gate will re-use full dataset`;\n\n return {\n invoked: true,\n optimizer: options.optimizer,\n task: options.task,\n datasetSize: dataset.length,\n score: result.score,\n baselineScore: result.baseline,\n result,\n notes: [\n `optimizer=${options.optimizer} dataset=${basename(options.datasetPath)} size=${dataset.length} baseline=${result.baseline.toFixed(3)} optimized=${result.score.toFixed(3)}`,\n splitNote,\n ],\n dataset,\n trainSet,\n holdoutSet,\n scorer,\n };\n}\n\nexport const NATIVE_OPTIMIZERS: readonly OptimizerName[] = [\n \"instruction-search\",\n \"prompt-evolution\",\n \"gepa\",\n \"bootstrap-fewshot\",\n \"dspy-bootstrap-fewshot\",\n \"dspy-copro\",\n \"dspy-mipro\",\n] as const;\n"],"mappings":"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","names":[]}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Training CLI for Eliza-native trajectory data.
3
+ *
4
+ * Usage:
5
+ * bun run train -- --backend native --dataset <path> \
6
+ * [--task {should_respond|context_routing|action_planner|response|media_description}]
7
+ *
8
+ * Consumes `eliza_native_v1` model-boundary JSONL rows.
9
+ */
10
+ import type { TrajectoryTrainingTask } from "../core/trajectory-task-datasets.js";
11
+ import type { OptimizerName } from "../optimizers/index.js";
12
+ interface ParsedTrainArgs {
13
+ backend: "native";
14
+ dataset: string;
15
+ task?: TrajectoryTrainingTask;
16
+ optimizer?: OptimizerName;
17
+ baseline?: string;
18
+ }
19
+ export declare function parseTrainArgs(argv: string[]): ParsedTrainArgs | "help";
20
+ export declare function runTrainCli(argv: string[]): Promise<number>;
21
+ export {};
22
+ //# sourceMappingURL=train.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"train.d.ts","sourceRoot":"","sources":["../../src/cli/train.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AA8B5D,UAAU,eAAe;IACvB,OAAO,EAAE,QAAQ,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,sBAAsB,CAAC;IAC9B,SAAS,CAAC,EAAE,aAAa,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,eAAe,GAAG,MAAM,CAsDvE;AAED,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA4IjE"}