@elizaos/plugin-training 2.0.3-beta.5 → 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,108 @@
1
+ import { subsample } from "./scoring.js";
2
+ const REWRITE_INSTRUCTIONS = `Rewrite the SYSTEM PROMPT to make a task planner work better. The planner sees a tool list, conversation context, and a user message; it returns one JSON object with toolCalls or messageToUser.
3
+
4
+ Hard constraints:
5
+ - Preserve every input/output requirement from the original (placeholders, JSON schema, terminal-message rules).
6
+ - Keep all literal placeholders like {{contextObject}}, {{trajectory}}, {{agentName}}, {{providers}} byte-identical and in the same locations.
7
+ - The planner must use only the tool names that appear in the runtime-injected tool list. Do NOT enumerate any specific tool names, action names, or connector names in the rewrite \u2014 those are dynamically scoped per turn and hardcoding them in the prompt teaches the model to invent or stick to a stale list.
8
+ - Output length must not exceed 1.3x the original prompt's character count. Aim for shorter than the original when possible.
9
+
10
+ Style rules (anti-meme):
11
+ - Imperative voice. No "You are X", no "Your job is", no role-playing framing.
12
+ - No markdown headers, no fenced code blocks, no decorative bullets, no emojis.
13
+ - No instructions to "still output the action with empty args" \u2014 actions need real arguments.
14
+ - No restriction to a single tool call when the original allows a queue.
15
+
16
+ Do:
17
+ - Add concise task-specific guardrails grounded in observed failure modes.
18
+ - Tighten phrasing of existing rules.
19
+ - Preserve plural tool-call behaviour when the original mentions a "queue" or multiple tools.
20
+
21
+ Output the rewritten prompt body only. No commentary, no preamble, no code fences.`;
22
+ async function runInstructionSearch(input) {
23
+ const variants = input.options?.variants ?? 8;
24
+ const rounds = input.options?.rounds ?? 3;
25
+ const temperature = input.options?.temperature ?? 0.7;
26
+ const maxTokens = input.options?.maxTokens ?? 1024;
27
+ const rng = input.options?.rng ?? Math.random;
28
+ const lineage = [];
29
+ const heldOut = typeof input.options?.scoringSubset === "number" ? subsample(input.dataset, input.options.scoringSubset, rng) : input.dataset;
30
+ const baselineScore = await input.scorer(input.baselinePrompt, heldOut);
31
+ lineage.push({
32
+ round: 0,
33
+ variant: 0,
34
+ score: baselineScore,
35
+ notes: "baseline"
36
+ });
37
+ let bestPrompt = input.baselinePrompt;
38
+ let bestScore = baselineScore;
39
+ let currentBaseline = input.baselinePrompt;
40
+ for (let round = 1; round <= rounds; round += 1) {
41
+ let roundBestPrompt = currentBaseline;
42
+ let roundBestScore = bestScore;
43
+ for (let variant = 1; variant <= variants; variant += 1) {
44
+ const candidate = await input.llm.complete({
45
+ system: REWRITE_INSTRUCTIONS,
46
+ user: currentBaseline,
47
+ temperature,
48
+ maxTokens
49
+ });
50
+ const cleaned = candidate.trim();
51
+ if (cleaned.length === 0) {
52
+ lineage.push({
53
+ round,
54
+ variant,
55
+ score: 0,
56
+ notes: "empty rewrite \u2014 skipped"
57
+ });
58
+ continue;
59
+ }
60
+ const memeViolations = [
61
+ /^\s*you are\b/i,
62
+ /^\s*your job is\b/i,
63
+ /^\s*you're\b/i
64
+ ];
65
+ const memeHit = memeViolations.find((re) => re.test(cleaned));
66
+ if (memeHit) {
67
+ lineage.push({
68
+ round,
69
+ variant,
70
+ score: 0,
71
+ notes: `rejected: role-play opener (${memeHit})`
72
+ });
73
+ continue;
74
+ }
75
+ const lengthCap = Math.ceil(currentBaseline.length * 1.3);
76
+ if (cleaned.length > lengthCap) {
77
+ lineage.push({
78
+ round,
79
+ variant,
80
+ score: 0,
81
+ notes: `rejected: length ${cleaned.length} > cap ${lengthCap}`
82
+ });
83
+ continue;
84
+ }
85
+ const score = await input.scorer(cleaned, heldOut);
86
+ lineage.push({ round, variant, score });
87
+ if (score > roundBestScore) {
88
+ roundBestScore = score;
89
+ roundBestPrompt = cleaned;
90
+ }
91
+ }
92
+ if (roundBestScore > bestScore) {
93
+ bestScore = roundBestScore;
94
+ bestPrompt = roundBestPrompt;
95
+ }
96
+ currentBaseline = roundBestPrompt;
97
+ }
98
+ return {
99
+ optimizedPrompt: bestPrompt,
100
+ score: bestScore,
101
+ baseline: baselineScore,
102
+ lineage
103
+ };
104
+ }
105
+ export {
106
+ runInstructionSearch
107
+ };
108
+ //# sourceMappingURL=instruction-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/optimizers/instruction-search.ts"],"sourcesContent":["/**\n * MIPRO-style instruction search optimizer.\n *\n * Iterative improvement loop:\n * 1. Ask the LLM to propose N rewrites of the current baseline prompt that\n * preserve the task contract but tighten language, add guardrails, or\n * reorder for clarity.\n * 2. Score each candidate (plus the current baseline) on a held-out subset\n * of the dataset.\n * 3. Keep the highest-scoring candidate as the next round's baseline.\n * 4. Repeat for `rounds` iterations.\n *\n * Returns the best prompt observed across all rounds along with full lineage\n * (every (round, variant) -> score), so the caller can render an audit trail.\n */\n\nimport { subsample } from \"./scoring.js\";\nimport type {\n LlmAdapter,\n OptimizationExample,\n OptimizerLineageEntry,\n OptimizerResult,\n PromptScorer,\n} from \"./types.js\";\n\nexport interface InstructionSearchOptions {\n /** Variants to propose per round. Defaults to 8. */\n variants?: number;\n /** Search rounds. Defaults to 3. */\n rounds?: number;\n /** Held-out examples scored per candidate. Defaults to all examples. */\n scoringSubset?: number;\n /** Sampling temperature for variant generation. Defaults to 0.7. */\n temperature?: number;\n /** Max tokens for the rewrite completion. Defaults to 1024. */\n maxTokens?: number;\n /** Deterministic RNG override (tests). Defaults to Math.random. */\n rng?: () => number;\n}\n\nexport interface InstructionSearchInput {\n baselinePrompt: string;\n dataset: OptimizationExample[];\n scorer: PromptScorer;\n llm: LlmAdapter;\n options?: InstructionSearchOptions;\n}\n\nconst REWRITE_INSTRUCTIONS = `Rewrite the SYSTEM PROMPT to make a task planner work better. The planner sees a tool list, conversation context, and a user message; it returns one JSON object with toolCalls or messageToUser.\n\nHard constraints:\n- Preserve every input/output requirement from the original (placeholders, JSON schema, terminal-message rules).\n- Keep all literal placeholders like {{contextObject}}, {{trajectory}}, {{agentName}}, {{providers}} byte-identical and in the same locations.\n- The planner must use only the tool names that appear in the runtime-injected tool list. Do NOT enumerate any specific tool names, action names, or connector names in the rewrite — those are dynamically scoped per turn and hardcoding them in the prompt teaches the model to invent or stick to a stale list.\n- Output length must not exceed 1.3x the original prompt's character count. Aim for shorter than the original when possible.\n\nStyle rules (anti-meme):\n- Imperative voice. No \"You are X\", no \"Your job is\", no role-playing framing.\n- No markdown headers, no fenced code blocks, no decorative bullets, no emojis.\n- No instructions to \"still output the action with empty args\" — actions need real arguments.\n- No restriction to a single tool call when the original allows a queue.\n\nDo:\n- Add concise task-specific guardrails grounded in observed failure modes.\n- Tighten phrasing of existing rules.\n- Preserve plural tool-call behaviour when the original mentions a \"queue\" or multiple tools.\n\nOutput the rewritten prompt body only. No commentary, no preamble, no code fences.`;\n\nexport async function runInstructionSearch(\n input: InstructionSearchInput,\n): Promise<OptimizerResult> {\n const variants = input.options?.variants ?? 8;\n const rounds = input.options?.rounds ?? 3;\n const temperature = input.options?.temperature ?? 0.7;\n const maxTokens = input.options?.maxTokens ?? 1024;\n const rng = input.options?.rng ?? Math.random;\n const lineage: OptimizerLineageEntry[] = [];\n\n const heldOut =\n typeof input.options?.scoringSubset === \"number\"\n ? subsample(input.dataset, input.options.scoringSubset, rng)\n : input.dataset;\n\n const baselineScore = await input.scorer(input.baselinePrompt, heldOut);\n lineage.push({\n round: 0,\n variant: 0,\n score: baselineScore,\n notes: \"baseline\",\n });\n\n let bestPrompt = input.baselinePrompt;\n let bestScore = baselineScore;\n let currentBaseline = input.baselinePrompt;\n\n for (let round = 1; round <= rounds; round += 1) {\n let roundBestPrompt = currentBaseline;\n let roundBestScore = bestScore;\n for (let variant = 1; variant <= variants; variant += 1) {\n const candidate = await input.llm.complete({\n system: REWRITE_INSTRUCTIONS,\n user: currentBaseline,\n temperature,\n maxTokens,\n });\n const cleaned = candidate.trim();\n if (cleaned.length === 0) {\n lineage.push({\n round,\n variant,\n score: 0,\n notes: \"empty rewrite — skipped\",\n });\n continue;\n }\n // Reject variants that violate the anti-meme rules. These patterns\n // have been shown to reduce planner accuracy on Anthropic Haiku/Opus\n // (role-play framing primes chat-completion behaviour over tool-use).\n const memeViolations = [\n /^\\s*you are\\b/i,\n /^\\s*your job is\\b/i,\n /^\\s*you're\\b/i,\n ];\n const memeHit = memeViolations.find((re) => re.test(cleaned));\n if (memeHit) {\n lineage.push({\n round,\n variant,\n score: 0,\n notes: `rejected: role-play opener (${memeHit})`,\n });\n continue;\n }\n const lengthCap = Math.ceil(currentBaseline.length * 1.3);\n if (cleaned.length > lengthCap) {\n lineage.push({\n round,\n variant,\n score: 0,\n notes: `rejected: length ${cleaned.length} > cap ${lengthCap}`,\n });\n continue;\n }\n const score = await input.scorer(cleaned, heldOut);\n lineage.push({ round, variant, score });\n if (score > roundBestScore) {\n roundBestScore = score;\n roundBestPrompt = cleaned;\n }\n }\n if (roundBestScore > bestScore) {\n bestScore = roundBestScore;\n bestPrompt = roundBestPrompt;\n }\n // Carry the round winner forward as the next round's seed; this is the\n // MIPRO greedy step. If no candidate improved, we still move forward to\n // give the next round a chance with the same seed.\n currentBaseline = roundBestPrompt;\n }\n\n return {\n optimizedPrompt: bestPrompt,\n score: bestScore,\n baseline: baselineScore,\n lineage,\n };\n}\n"],"mappings":"AAgBA,SAAS,iBAAiB;AAgC1B,MAAM,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAqB7B,eAAsB,qBACpB,OAC0B;AAC1B,QAAM,WAAW,MAAM,SAAS,YAAY;AAC5C,QAAM,SAAS,MAAM,SAAS,UAAU;AACxC,QAAM,cAAc,MAAM,SAAS,eAAe;AAClD,QAAM,YAAY,MAAM,SAAS,aAAa;AAC9C,QAAM,MAAM,MAAM,SAAS,OAAO,KAAK;AACvC,QAAM,UAAmC,CAAC;AAE1C,QAAM,UACJ,OAAO,MAAM,SAAS,kBAAkB,WACpC,UAAU,MAAM,SAAS,MAAM,QAAQ,eAAe,GAAG,IACzD,MAAM;AAEZ,QAAM,gBAAgB,MAAM,MAAM,OAAO,MAAM,gBAAgB,OAAO;AACtE,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAED,MAAI,aAAa,MAAM;AACvB,MAAI,YAAY;AAChB,MAAI,kBAAkB,MAAM;AAE5B,WAAS,QAAQ,GAAG,SAAS,QAAQ,SAAS,GAAG;AAC/C,QAAI,kBAAkB;AACtB,QAAI,iBAAiB;AACrB,aAAS,UAAU,GAAG,WAAW,UAAU,WAAW,GAAG;AACvD,YAAM,YAAY,MAAM,MAAM,IAAI,SAAS;AAAA,QACzC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF,CAAC;AACD,YAAM,UAAU,UAAU,KAAK;AAC/B,UAAI,QAAQ,WAAW,GAAG;AACxB,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,QACT,CAAC;AACD;AAAA,MACF;AAIA,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,YAAM,UAAU,eAAe,KAAK,CAAC,OAAO,GAAG,KAAK,OAAO,CAAC;AAC5D,UAAI,SAAS;AACX,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,OAAO,+BAA+B,OAAO;AAAA,QAC/C,CAAC;AACD;AAAA,MACF;AACA,YAAM,YAAY,KAAK,KAAK,gBAAgB,SAAS,GAAG;AACxD,UAAI,QAAQ,SAAS,WAAW;AAC9B,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA;AAAA,UACA,OAAO;AAAA,UACP,OAAO,oBAAoB,QAAQ,MAAM,UAAU,SAAS;AAAA,QAC9D,CAAC;AACD;AAAA,MACF;AACA,YAAM,QAAQ,MAAM,MAAM,OAAO,SAAS,OAAO;AACjD,cAAQ,KAAK,EAAE,OAAO,SAAS,MAAM,CAAC;AACtC,UAAI,QAAQ,gBAAgB;AAC1B,yBAAiB;AACjB,0BAAkB;AAAA,MACpB;AAAA,IACF;AACA,QAAI,iBAAiB,WAAW;AAC9B,kBAAY;AACZ,mBAAa;AAAA,IACf;AAIA,sBAAkB;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * GEPA-style genetic prompt evolution.
3
+ *
4
+ * Maintains a population of candidate prompts. Each generation:
5
+ * 1. Score every candidate on a held-out subset.
6
+ * 2. Select the top half as survivors.
7
+ * 3. For each survivor, with probability `mutationRate`, ask the LLM to
8
+ * rewrite a slice (intro/rules/example) to produce a child.
9
+ * 4. Re-fill the population with mutated children of the survivors.
10
+ *
11
+ * The optimizer always preserves the all-time best prompt so an unlucky
12
+ * generation cannot regress past the baseline.
13
+ */
14
+ import type { LlmAdapter, OptimizationExample, OptimizerResult, PromptScorer } from "./types.js";
15
+ export interface PromptEvolutionOptions {
16
+ /** Population size. Defaults to 8. */
17
+ population?: number;
18
+ /** Generations. Defaults to 4. */
19
+ generations?: number;
20
+ /** Probability of mutating a survivor each generation. Defaults to 0.5. */
21
+ mutationRate?: number;
22
+ /** Held-out examples scored per candidate. Defaults to all examples. */
23
+ scoringSubset?: number;
24
+ /** Sampling temperature for mutation generation. Defaults to 0.8. */
25
+ temperature?: number;
26
+ /** Max tokens for the mutation completion. Defaults to 1024. */
27
+ maxTokens?: number;
28
+ /** Deterministic RNG override (tests). Defaults to Math.random. */
29
+ rng?: () => number;
30
+ }
31
+ export interface PromptEvolutionInput {
32
+ baselinePrompt: string;
33
+ dataset: OptimizationExample[];
34
+ scorer: PromptScorer;
35
+ llm: LlmAdapter;
36
+ options?: PromptEvolutionOptions;
37
+ }
38
+ export declare function runPromptEvolution(input: PromptEvolutionInput): Promise<OptimizerResult>;
39
+ //# sourceMappingURL=prompt-evolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-evolution.d.ts","sourceRoot":"","sources":["../../src/optimizers/prompt-evolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EACV,UAAU,EACV,mBAAmB,EAEnB,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,sBAAsB;IACrC,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,mBAAmB,EAAE,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;IACrB,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,CAAC,EAAE,sBAAsB,CAAC;CAClC;AAgBD,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,eAAe,CAAC,CA2F1B"}
@@ -0,0 +1,101 @@
1
+ import { subsample } from "./scoring.js";
2
+ const MUTATION_INSTRUCTIONS = `Mutate the SYSTEM PROMPT below to explore a different phrasing.
3
+
4
+ Constraints:
5
+ - Preserve the original task contract (inputs, outputs, format).
6
+ - Keep all literal placeholders like {{agentName}} or {{providers}} intact.
7
+ - Pick ONE section (intro, rules, examples, output format) and rewrite it.
8
+ - Leave the other sections untouched, but reproduce them verbatim in the output.
9
+ - Output ONLY the mutated prompt. No commentary, no fenced code blocks.`;
10
+ async function runPromptEvolution(input) {
11
+ const population = Math.max(2, input.options?.population ?? 8);
12
+ const generations = input.options?.generations ?? 4;
13
+ const mutationRate = input.options?.mutationRate ?? 0.5;
14
+ const temperature = input.options?.temperature ?? 0.8;
15
+ const maxTokens = input.options?.maxTokens ?? 1024;
16
+ const rng = input.options?.rng ?? Math.random;
17
+ const lineage = [];
18
+ const heldOut = typeof input.options?.scoringSubset === "number" ? subsample(input.dataset, input.options.scoringSubset, rng) : input.dataset;
19
+ const baselineScore = await input.scorer(input.baselinePrompt, heldOut);
20
+ lineage.push({
21
+ round: 0,
22
+ variant: 0,
23
+ score: baselineScore,
24
+ notes: "baseline"
25
+ });
26
+ let pool = [
27
+ { prompt: input.baselinePrompt, score: baselineScore }
28
+ ];
29
+ for (let i = 1; i < population; i += 1) {
30
+ const seed = await mutate(input.llm, input.baselinePrompt, {
31
+ temperature,
32
+ maxTokens
33
+ });
34
+ const score = await input.scorer(seed, heldOut);
35
+ pool.push({ prompt: seed, score });
36
+ lineage.push({ round: 0, variant: i, score, notes: "seed mutation" });
37
+ }
38
+ let bestPrompt = input.baselinePrompt;
39
+ let bestScore = baselineScore;
40
+ for (const entry of pool) {
41
+ if (entry.score > bestScore) {
42
+ bestScore = entry.score;
43
+ bestPrompt = entry.prompt;
44
+ }
45
+ }
46
+ for (let gen = 1; gen <= generations; gen += 1) {
47
+ pool.sort((a, b) => b.score - a.score);
48
+ const cutoff = Math.max(1, Math.floor(pool.length / 2));
49
+ const survivors = pool.slice(0, cutoff);
50
+ const next = [...survivors];
51
+ let variantIdx = survivors.length;
52
+ while (next.length < population) {
53
+ const parent = survivors[next.length % survivors.length];
54
+ if (!parent) break;
55
+ const shouldMutate = rng() < mutationRate;
56
+ let childPrompt = parent.prompt;
57
+ if (shouldMutate) {
58
+ childPrompt = await mutate(input.llm, parent.prompt, {
59
+ temperature,
60
+ maxTokens
61
+ });
62
+ }
63
+ const score = await input.scorer(childPrompt, heldOut);
64
+ next.push({ prompt: childPrompt, score });
65
+ lineage.push({
66
+ round: gen,
67
+ variant: variantIdx,
68
+ score,
69
+ notes: shouldMutate ? "mutated child" : "carried forward"
70
+ });
71
+ variantIdx += 1;
72
+ }
73
+ pool = next;
74
+ for (const entry of pool) {
75
+ if (entry.score > bestScore) {
76
+ bestScore = entry.score;
77
+ bestPrompt = entry.prompt;
78
+ }
79
+ }
80
+ }
81
+ return {
82
+ optimizedPrompt: bestPrompt,
83
+ score: bestScore,
84
+ baseline: baselineScore,
85
+ lineage
86
+ };
87
+ }
88
+ async function mutate(llm, prompt, settings) {
89
+ const result = await llm.complete({
90
+ system: MUTATION_INSTRUCTIONS,
91
+ user: prompt,
92
+ temperature: settings.temperature,
93
+ maxTokens: settings.maxTokens
94
+ });
95
+ const cleaned = result.trim();
96
+ return cleaned.length > 0 ? cleaned : prompt;
97
+ }
98
+ export {
99
+ runPromptEvolution
100
+ };
101
+ //# sourceMappingURL=prompt-evolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/optimizers/prompt-evolution.ts"],"sourcesContent":["/**\n * GEPA-style genetic prompt evolution.\n *\n * Maintains a population of candidate prompts. Each generation:\n * 1. Score every candidate on a held-out subset.\n * 2. Select the top half as survivors.\n * 3. For each survivor, with probability `mutationRate`, ask the LLM to\n * rewrite a slice (intro/rules/example) to produce a child.\n * 4. Re-fill the population with mutated children of the survivors.\n *\n * The optimizer always preserves the all-time best prompt so an unlucky\n * generation cannot regress past the baseline.\n */\n\nimport { subsample } from \"./scoring.js\";\nimport type {\n LlmAdapter,\n OptimizationExample,\n OptimizerLineageEntry,\n OptimizerResult,\n PromptScorer,\n} from \"./types.js\";\n\nexport interface PromptEvolutionOptions {\n /** Population size. Defaults to 8. */\n population?: number;\n /** Generations. Defaults to 4. */\n generations?: number;\n /** Probability of mutating a survivor each generation. Defaults to 0.5. */\n mutationRate?: number;\n /** Held-out examples scored per candidate. Defaults to all examples. */\n scoringSubset?: number;\n /** Sampling temperature for mutation generation. Defaults to 0.8. */\n temperature?: number;\n /** Max tokens for the mutation completion. Defaults to 1024. */\n maxTokens?: number;\n /** Deterministic RNG override (tests). Defaults to Math.random. */\n rng?: () => number;\n}\n\nexport interface PromptEvolutionInput {\n baselinePrompt: string;\n dataset: OptimizationExample[];\n scorer: PromptScorer;\n llm: LlmAdapter;\n options?: PromptEvolutionOptions;\n}\n\nconst MUTATION_INSTRUCTIONS = `Mutate the SYSTEM PROMPT below to explore a different phrasing.\n\nConstraints:\n- Preserve the original task contract (inputs, outputs, format).\n- Keep all literal placeholders like {{agentName}} or {{providers}} intact.\n- Pick ONE section (intro, rules, examples, output format) and rewrite it.\n- Leave the other sections untouched, but reproduce them verbatim in the output.\n- Output ONLY the mutated prompt. No commentary, no fenced code blocks.`;\n\ninterface ScoredPrompt {\n prompt: string;\n score: number;\n}\n\nexport async function runPromptEvolution(\n input: PromptEvolutionInput,\n): Promise<OptimizerResult> {\n const population = Math.max(2, input.options?.population ?? 8);\n const generations = input.options?.generations ?? 4;\n const mutationRate = input.options?.mutationRate ?? 0.5;\n const temperature = input.options?.temperature ?? 0.8;\n const maxTokens = input.options?.maxTokens ?? 1024;\n const rng = input.options?.rng ?? Math.random;\n const lineage: OptimizerLineageEntry[] = [];\n\n const heldOut =\n typeof input.options?.scoringSubset === \"number\"\n ? subsample(input.dataset, input.options.scoringSubset, rng)\n : input.dataset;\n\n const baselineScore = await input.scorer(input.baselinePrompt, heldOut);\n lineage.push({\n round: 0,\n variant: 0,\n score: baselineScore,\n notes: \"baseline\",\n });\n\n // Seed the population with mutations of the baseline so generation 0 is\n // already diverse. The baseline itself stays at index 0 so the elite is\n // always preserved.\n let pool: ScoredPrompt[] = [\n { prompt: input.baselinePrompt, score: baselineScore },\n ];\n for (let i = 1; i < population; i += 1) {\n const seed = await mutate(input.llm, input.baselinePrompt, {\n temperature,\n maxTokens,\n });\n const score = await input.scorer(seed, heldOut);\n pool.push({ prompt: seed, score });\n lineage.push({ round: 0, variant: i, score, notes: \"seed mutation\" });\n }\n\n let bestPrompt = input.baselinePrompt;\n let bestScore = baselineScore;\n for (const entry of pool) {\n if (entry.score > bestScore) {\n bestScore = entry.score;\n bestPrompt = entry.prompt;\n }\n }\n\n for (let gen = 1; gen <= generations; gen += 1) {\n pool.sort((a, b) => b.score - a.score);\n const cutoff = Math.max(1, Math.floor(pool.length / 2));\n const survivors = pool.slice(0, cutoff);\n const next: ScoredPrompt[] = [...survivors];\n\n let variantIdx = survivors.length;\n while (next.length < population) {\n const parent = survivors[next.length % survivors.length];\n if (!parent) break;\n const shouldMutate = rng() < mutationRate;\n let childPrompt = parent.prompt;\n if (shouldMutate) {\n childPrompt = await mutate(input.llm, parent.prompt, {\n temperature,\n maxTokens,\n });\n }\n const score = await input.scorer(childPrompt, heldOut);\n next.push({ prompt: childPrompt, score });\n lineage.push({\n round: gen,\n variant: variantIdx,\n score,\n notes: shouldMutate ? \"mutated child\" : \"carried forward\",\n });\n variantIdx += 1;\n }\n\n pool = next;\n for (const entry of pool) {\n if (entry.score > bestScore) {\n bestScore = entry.score;\n bestPrompt = entry.prompt;\n }\n }\n }\n\n return {\n optimizedPrompt: bestPrompt,\n score: bestScore,\n baseline: baselineScore,\n lineage,\n };\n}\n\nasync function mutate(\n llm: LlmAdapter,\n prompt: string,\n settings: { temperature: number; maxTokens: number },\n): Promise<string> {\n const result = await llm.complete({\n system: MUTATION_INSTRUCTIONS,\n user: prompt,\n temperature: settings.temperature,\n maxTokens: settings.maxTokens,\n });\n const cleaned = result.trim();\n return cleaned.length > 0 ? cleaned : prompt;\n}\n"],"mappings":"AAcA,SAAS,iBAAiB;AAkC1B,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAc9B,eAAsB,mBACpB,OAC0B;AAC1B,QAAM,aAAa,KAAK,IAAI,GAAG,MAAM,SAAS,cAAc,CAAC;AAC7D,QAAM,cAAc,MAAM,SAAS,eAAe;AAClD,QAAM,eAAe,MAAM,SAAS,gBAAgB;AACpD,QAAM,cAAc,MAAM,SAAS,eAAe;AAClD,QAAM,YAAY,MAAM,SAAS,aAAa;AAC9C,QAAM,MAAM,MAAM,SAAS,OAAO,KAAK;AACvC,QAAM,UAAmC,CAAC;AAE1C,QAAM,UACJ,OAAO,MAAM,SAAS,kBAAkB,WACpC,UAAU,MAAM,SAAS,MAAM,QAAQ,eAAe,GAAG,IACzD,MAAM;AAEZ,QAAM,gBAAgB,MAAM,MAAM,OAAO,MAAM,gBAAgB,OAAO;AACtE,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAKD,MAAI,OAAuB;AAAA,IACzB,EAAE,QAAQ,MAAM,gBAAgB,OAAO,cAAc;AAAA,EACvD;AACA,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK,GAAG;AACtC,UAAM,OAAO,MAAM,OAAO,MAAM,KAAK,MAAM,gBAAgB;AAAA,MACzD;AAAA,MACA;AAAA,IACF,CAAC;AACD,UAAM,QAAQ,MAAM,MAAM,OAAO,MAAM,OAAO;AAC9C,SAAK,KAAK,EAAE,QAAQ,MAAM,MAAM,CAAC;AACjC,YAAQ,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,OAAO,gBAAgB,CAAC;AAAA,EACtE;AAEA,MAAI,aAAa,MAAM;AACvB,MAAI,YAAY;AAChB,aAAW,SAAS,MAAM;AACxB,QAAI,MAAM,QAAQ,WAAW;AAC3B,kBAAY,MAAM;AAClB,mBAAa,MAAM;AAAA,IACrB;AAAA,EACF;AAEA,WAAS,MAAM,GAAG,OAAO,aAAa,OAAO,GAAG;AAC9C,SAAK,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACrC,UAAM,SAAS,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,SAAS,CAAC,CAAC;AACtD,UAAM,YAAY,KAAK,MAAM,GAAG,MAAM;AACtC,UAAM,OAAuB,CAAC,GAAG,SAAS;AAE1C,QAAI,aAAa,UAAU;AAC3B,WAAO,KAAK,SAAS,YAAY;AAC/B,YAAM,SAAS,UAAU,KAAK,SAAS,UAAU,MAAM;AACvD,UAAI,CAAC,OAAQ;AACb,YAAM,eAAe,IAAI,IAAI;AAC7B,UAAI,cAAc,OAAO;AACzB,UAAI,cAAc;AAChB,sBAAc,MAAM,OAAO,MAAM,KAAK,OAAO,QAAQ;AAAA,UACnD;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AACA,YAAM,QAAQ,MAAM,MAAM,OAAO,aAAa,OAAO;AACrD,WAAK,KAAK,EAAE,QAAQ,aAAa,MAAM,CAAC;AACxC,cAAQ,KAAK;AAAA,QACX,OAAO;AAAA,QACP,SAAS;AAAA,QACT;AAAA,QACA,OAAO,eAAe,kBAAkB;AAAA,MAC1C,CAAC;AACD,oBAAc;AAAA,IAChB;AAEA,WAAO;AACP,eAAW,SAAS,MAAM;AACxB,UAAI,MAAM,QAAQ,WAAW;AAC3B,oBAAY,MAAM;AAClB,qBAAa,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,OAAO;AAAA,IACP,UAAU;AAAA,IACV;AAAA,EACF;AACF;AAEA,eAAe,OACb,KACA,QACA,UACiB;AACjB,QAAM,SAAS,MAAM,IAAI,SAAS;AAAA,IAChC,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,aAAa,SAAS;AAAA,IACtB,WAAW,SAAS;AAAA,EACtB,CAAC;AACD,QAAM,UAAU,OAAO,KAAK;AAC5B,SAAO,QAAQ,SAAS,IAAI,UAAU;AACxC;","names":[]}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Scoring utilities for native optimizers.
3
+ *
4
+ * The default scorer measures token-overlap agreement between the model's
5
+ * actual output and the expected output recorded in the trajectory dataset.
6
+ * It is deliberately cheap and deterministic — the optimizers run hundreds
7
+ * of completions per round, so we cannot afford a model-graded scorer.
8
+ *
9
+ * Token-overlap agreement (Jaccard over normalized tokens) is the same primitive
10
+ * that `replay-validator.ts` uses for `scoreSkill`-style success measurement,
11
+ * just lifted to the (output vs reference) comparison instead of (skill vs
12
+ * trajectory). When a richer signal becomes available, the scorer factory can
13
+ * be swapped without changing any optimizer code.
14
+ */
15
+ import type { LlmAdapter, PromptScorer } from "./types.js";
16
+ interface ScorerOptions {
17
+ /** Cap on examples scored per call. Defaults to all examples. */
18
+ maxExamples?: number;
19
+ /** Temperature passed to the adapter. Defaults to 0 for determinism. */
20
+ temperature?: number;
21
+ /** Max tokens for each completion. Defaults to 512. */
22
+ maxTokens?: number;
23
+ /**
24
+ * Per-example comparator. Defaults to Jaccard token overlap.
25
+ * Returning 1.0 means a perfect match, 0.0 means no credit.
26
+ */
27
+ compare?: (actual: string, expected: string) => number;
28
+ }
29
+ /**
30
+ * Build a `PromptScorer` backed by a real LLM adapter.
31
+ *
32
+ * For each example:
33
+ * 1. Run `prompt` (as system) + `example.input.user` through the adapter.
34
+ * 2. Compare the completion against `example.expectedOutput` via Jaccard
35
+ * similarity over normalized tokens.
36
+ * 3. Return the mean score.
37
+ *
38
+ * Reuses the same normalization heuristic as the trajectory-task-datasets
39
+ * exporter (lower-case, strip punctuation, drop empty tokens).
40
+ */
41
+ export declare function createPromptScorer(adapter: LlmAdapter, options?: ScorerOptions): PromptScorer;
42
+ /**
43
+ * Extract the first action name from planner output. JSON is preferred; a
44
+ * small line-based reader keeps older key/value rows comparable.
45
+ *
46
+ * Schemas understood (in priority order):
47
+ * 1. v5 planner: `{toolCalls:[{name:"OWNER_TODOS","args":{...}}]}` — handled directly.
48
+ * 2. Legacy structured: top-level `action`/`actionName`/`name`/`type`/`actions` field.
49
+ * 3. Legacy line-based: `action: OWNER_TODOS` or similar key:value rows.
50
+ * 4. Last-resort: any uppercase identifier in the text.
51
+ *
52
+ * The regex fallback is intentionally last — it matches identifiers like
53
+ * `OWNER`, `OPTIONAL`, `JSON`, etc. that show up in field names, so it can
54
+ * mislabel non-action text. Prefer the JSON paths when the runtime emits
55
+ * structured output (which is the common case post-v5).
56
+ */
57
+ export declare function extractPlannerAction(text: string): string | null;
58
+ /**
59
+ * Extract the target view id from planner output when the chosen action is a
60
+ * view navigation. Understands the same shapes as {@link extractPlannerAction}:
61
+ * 1. tool-call: `{toolCalls:[{name:"VIEWS", args/arguments/parameters:{view}}]}`
62
+ * 2. bare action: `{action:"VIEWS", parameters/args:{view}}`
63
+ * 3. top-level alias: `{view}` / `{viewId}`
64
+ * Returns the lower-cased view id, or `null` when none is present.
65
+ */
66
+ export declare function extractPlannerView(text: string): string | null;
67
+ /**
68
+ * Action-name comparator: returns 1.0 when both outputs resolve to the same
69
+ * planner action name, 0.0 otherwise. This is the right primitive for
70
+ * optimizing the `action_planner` task because token overlap under-credits
71
+ * correct choices when surrounding rationale varies stochastically.
72
+ *
73
+ * View-aware refinement: when the expected output pins a specific view (a VIEWS
74
+ * navigation target), a matching action alone is NOT full credit — the view has
75
+ * to match too. Without this the optimizer can never learn correct view
76
+ * selection, because every `VIEWS/<anything>` would score 1.0 against a
77
+ * `VIEWS/calendar` reference (the exact gap that made entry-tier wrong-view
78
+ * outputs look perfect). Partial credit (right action, wrong/missing view =
79
+ * 0.5) keeps a usable gradient for the optimizer. Expected outputs without a
80
+ * view (every non-navigation action) are scored action-only, unchanged.
81
+ */
82
+ export declare function scorePlannerAction(actual: string, expected: string): number;
83
+ /**
84
+ * View-selection comparator for the contextual view evaluator (`view_context`
85
+ * task). Both outputs are `{viewId, reason}` (or "none"); credit is 1.0 when the
86
+ * chosen view id matches the reference, 0.0 otherwise. Case-insensitive, and a
87
+ * matching "none" (correctly declining to navigate) scores 1.0 — so it rewards
88
+ * both opening the right surface AND staying put on non-navigational turns.
89
+ */
90
+ export declare function scoreViewSelection(actual: string, expected: string): number;
91
+ /**
92
+ * Jaccard similarity over normalized token sets, in `[0, 1]`. Empty inputs
93
+ * collapse to 0 (no overlap to measure).
94
+ */
95
+ export declare function scoreAgreement(actual: string, expected: string): number;
96
+ /** LifeOps tasks with per-capability scorers (#8795). */
97
+ export declare const LIFEOPS_SCORER_TASKS: readonly ["calendar_extract", "schedule_plan", "reminder_dispatch", "inbox_triage", "meeting_prep", "morning_brief", "health_checkin", "screentime_recap"];
98
+ /** LifeOps tasks whose output is a structured JSON object (exact-field match). */
99
+ export declare const LIFEOPS_STRUCTURED_SCORER_TASKS: readonly ["calendar_extract", "schedule_plan", "reminder_dispatch", "inbox_triage", "meeting_prep", "health_checkin", "screentime_recap"];
100
+ /**
101
+ * Structured-field exact-match score in `[0, 1]`: the fraction of expected
102
+ * fields whose value the actual output reproduced. Both inputs are parsed as
103
+ * JSON or line-based fields (tolerating fences/prose). When `fields` is supplied only those keys are
104
+ * scored; otherwise every key in `expected` is scored. Returns 0 when expected
105
+ * is unparseable (nothing to credit) and 1 when both parse to empty objects.
106
+ */
107
+ export declare function scoreStructuredFields(actual: string, expected: string, fields?: readonly string[]): number;
108
+ /**
109
+ * Action/label set-overlap (Jaccard) in `[0, 1]`. For tasks whose target is
110
+ * "did the agent pick the right action/category set" rather than exact text.
111
+ * Two empty sets score 1.0 (both correctly produced nothing actionable).
112
+ */
113
+ export declare function scoreActionSet(actual: string, expected: string): number;
114
+ /**
115
+ * Authoritative per-task comparator for the LifeOps optimization tasks (the
116
+ * GEPA Pareto scorer dispatches through here). Extraction tasks →
117
+ * structured-field exact-match; the chat-shaped morning brief → token
118
+ * agreement (proxy for the judge rubric); anything else → token agreement.
119
+ */
120
+ export declare function scoreLifeOpsTask(task: string, actual: string, expected: string): number;
121
+ /**
122
+ * Random-without-replacement subsample, used by optimizer rounds to keep
123
+ * scoring cheap on large datasets without sacrificing comparability across
124
+ * rounds (deterministic when `rng` is supplied).
125
+ */
126
+ export declare function subsample<T>(items: T[], count: number, rng?: () => number): T[];
127
+ /**
128
+ * Wraps `IAgentRuntime.useModel` into the `LlmAdapter` shape. We accept a
129
+ * loose runtime type so this module stays free of `@elizaos/core` import
130
+ * cycles — the native backend supplies the bound `useModel` directly.
131
+ */
132
+ export type UseModelHandler = (input: {
133
+ prompt: string;
134
+ temperature?: number;
135
+ maxTokens?: number;
136
+ }) => Promise<string | object | undefined>;
137
+ export declare function createRuntimeAdapter(useModel: UseModelHandler): LlmAdapter;
138
+ export {};
139
+ //# sourceMappingURL=scoring.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scoring.d.ts","sourceRoot":"","sources":["../../src/optimizers/scoring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE3D,UAAU,aAAa;IACrB,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;CACxD;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,UAAU,EACnB,OAAO,GAAE,aAAkB,GAC1B,YAAY,CAoBd;AAiDD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmChE;AAgBD;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAmB9D;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAW3E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK3E;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAYvE;AA2BD,yDAAyD;AACzD,eAAO,MAAM,oBAAoB,4JASvB,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,2IAQlC,CAAC;AAwDX;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GACzB,MAAM,CAgBR;AA2BD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAWvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,MAAM,CAKR;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,GAAG,GAAE,MAAM,MAAoB,GAC9B,CAAC,EAAE,CAYL;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAK,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC,CAAC;AAE3C,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,eAAe,GAAG,UAAU,CAgB1E"}