@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.
- package/dist/backends/native.d.ts +96 -0
- package/dist/backends/native.d.ts.map +1 -0
- package/dist/backends/native.js +308 -0
- package/dist/backends/native.js.map +1 -0
- package/dist/cli/train.d.ts +22 -0
- package/dist/cli/train.d.ts.map +1 -0
- package/dist/cli/train.js +219 -0
- package/dist/cli/train.js.map +1 -0
- package/dist/core/action-benchmark-runner.d.ts +55 -0
- package/dist/core/action-benchmark-runner.d.ts.map +1 -0
- package/dist/core/action-benchmark-runner.js +341 -0
- package/dist/core/action-benchmark-runner.js.map +1 -0
- package/dist/core/artifact-store.d.ts +72 -0
- package/dist/core/artifact-store.d.ts.map +1 -0
- package/dist/core/artifact-store.js +50 -0
- package/dist/core/artifact-store.js.map +1 -0
- package/dist/core/benchmark-matrix-artifact.d.ts +102 -0
- package/dist/core/benchmark-matrix-artifact.d.ts.map +1 -0
- package/dist/core/benchmark-matrix-artifact.js +381 -0
- package/dist/core/benchmark-matrix-artifact.js.map +1 -0
- package/dist/core/benchmark-vs-cerebras-runner.d.ts +37 -0
- package/dist/core/benchmark-vs-cerebras-runner.d.ts.map +1 -0
- package/dist/core/benchmark-vs-cerebras-runner.js +151 -0
- package/dist/core/benchmark-vs-cerebras-runner.js.map +1 -0
- package/dist/core/cerebras-eval-model.d.ts +54 -0
- package/dist/core/cerebras-eval-model.d.ts.map +1 -0
- package/dist/core/cerebras-eval-model.js +249 -0
- package/dist/core/cerebras-eval-model.js.map +1 -0
- package/dist/core/cli.d.ts +15 -0
- package/dist/core/cli.d.ts.map +1 -0
- package/dist/core/cli.js +1003 -0
- package/dist/core/cli.js.map +1 -0
- package/dist/core/context-audit.d.ts +51 -0
- package/dist/core/context-audit.d.ts.map +1 -0
- package/dist/core/context-audit.js +166 -0
- package/dist/core/context-audit.js.map +1 -0
- package/dist/core/context-catalog.d.ts +47 -0
- package/dist/core/context-catalog.d.ts.map +1 -0
- package/dist/core/context-catalog.js +269 -0
- package/dist/core/context-catalog.js.map +1 -0
- package/dist/core/context-types.d.ts +3 -0
- package/dist/core/context-types.d.ts.map +1 -0
- package/dist/core/context-types.js +18 -0
- package/dist/core/context-types.js.map +1 -0
- package/dist/core/dataset-generator.d.ts +135 -0
- package/dist/core/dataset-generator.d.ts.map +1 -0
- package/dist/core/dataset-generator.js +895 -0
- package/dist/core/dataset-generator.js.map +1 -0
- package/dist/core/eliza1-benchmark-recipe.d.ts +18 -0
- package/dist/core/eliza1-benchmark-recipe.d.ts.map +1 -0
- package/dist/core/eliza1-benchmark-recipe.js +64 -0
- package/dist/core/eliza1-benchmark-recipe.js.map +1 -0
- package/dist/core/eliza1-bundle-stager.d.ts +57 -0
- package/dist/core/eliza1-bundle-stager.d.ts.map +1 -0
- package/dist/core/eliza1-bundle-stager.js +149 -0
- package/dist/core/eliza1-bundle-stager.js.map +1 -0
- package/dist/core/ensure-cron-job.d.ts +53 -0
- package/dist/core/ensure-cron-job.d.ts.map +1 -0
- package/dist/core/ensure-cron-job.js +51 -0
- package/dist/core/ensure-cron-job.js.map +1 -0
- package/dist/core/eval-comparison-artifact.d.ts +72 -0
- package/dist/core/eval-comparison-artifact.d.ts.map +1 -0
- package/dist/core/eval-comparison-artifact.js +281 -0
- package/dist/core/eval-comparison-artifact.js.map +1 -0
- package/dist/core/feed-generation-runner.d.ts +37 -0
- package/dist/core/feed-generation-runner.d.ts.map +1 -0
- package/dist/core/feed-generation-runner.js +232 -0
- package/dist/core/feed-generation-runner.js.map +1 -0
- package/dist/core/html-escape.d.ts +5 -0
- package/dist/core/html-escape.d.ts.map +1 -0
- package/dist/core/html-escape.js +11 -0
- package/dist/core/html-escape.js.map +1 -0
- package/dist/core/huggingface-dataset-ingest.d.ts +52 -0
- package/dist/core/huggingface-dataset-ingest.d.ts.map +1 -0
- package/dist/core/huggingface-dataset-ingest.js +134 -0
- package/dist/core/huggingface-dataset-ingest.js.map +1 -0
- package/dist/core/index.d.ts +29 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +204 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/privacy-filter.d.ts +95 -0
- package/dist/core/privacy-filter.d.ts.map +1 -0
- package/dist/core/privacy-filter.js +324 -0
- package/dist/core/privacy-filter.js.map +1 -0
- package/dist/core/promotion-gate.d.ts +117 -0
- package/dist/core/promotion-gate.d.ts.map +1 -0
- package/dist/core/promotion-gate.js +85 -0
- package/dist/core/promotion-gate.js.map +1 -0
- package/dist/core/promotion-persist.d.ts +116 -0
- package/dist/core/promotion-persist.d.ts.map +1 -0
- package/dist/core/promotion-persist.js +93 -0
- package/dist/core/promotion-persist.js.map +1 -0
- package/dist/core/prompt-compare.d.ts +99 -0
- package/dist/core/prompt-compare.d.ts.map +1 -0
- package/dist/core/prompt-compare.js +210 -0
- package/dist/core/prompt-compare.js.map +1 -0
- package/dist/core/replay-validator.d.ts +136 -0
- package/dist/core/replay-validator.d.ts.map +1 -0
- package/dist/core/replay-validator.js +312 -0
- package/dist/core/replay-validator.js.map +1 -0
- package/dist/core/roleplay-executor.d.ts +123 -0
- package/dist/core/roleplay-executor.d.ts.map +1 -0
- package/dist/core/roleplay-executor.js +675 -0
- package/dist/core/roleplay-executor.js.map +1 -0
- package/dist/core/roleplay-trajectories.d.ts +54 -0
- package/dist/core/roleplay-trajectories.d.ts.map +1 -0
- package/dist/core/roleplay-trajectories.js +88 -0
- package/dist/core/roleplay-trajectories.js.map +1 -0
- package/dist/core/scenario-blueprints.d.ts +62 -0
- package/dist/core/scenario-blueprints.d.ts.map +1 -0
- package/dist/core/scenario-blueprints.js +850 -0
- package/dist/core/scenario-blueprints.js.map +1 -0
- package/dist/core/scenario-runner.d.ts +36 -0
- package/dist/core/scenario-runner.d.ts.map +1 -0
- package/dist/core/scenario-runner.js +216 -0
- package/dist/core/scenario-runner.js.map +1 -0
- package/dist/core/skill-scoring-cron.d.ts +57 -0
- package/dist/core/skill-scoring-cron.d.ts.map +1 -0
- package/dist/core/skill-scoring-cron.js +180 -0
- package/dist/core/skill-scoring-cron.js.map +1 -0
- package/dist/core/test-trajectory-collector.d.ts +37 -0
- package/dist/core/test-trajectory-collector.d.ts.map +1 -0
- package/dist/core/test-trajectory-collector.js +225 -0
- package/dist/core/test-trajectory-collector.js.map +1 -0
- package/dist/core/track-c-queue-task.d.ts +37 -0
- package/dist/core/track-c-queue-task.d.ts.map +1 -0
- package/dist/core/track-c-queue-task.js +104 -0
- package/dist/core/track-c-queue-task.js.map +1 -0
- package/dist/core/training-analysis-index.d.ts +104 -0
- package/dist/core/training-analysis-index.d.ts.map +1 -0
- package/dist/core/training-analysis-index.js +3297 -0
- package/dist/core/training-analysis-index.js.map +1 -0
- package/dist/core/training-collection-runner.d.ts +508 -0
- package/dist/core/training-collection-runner.d.ts.map +1 -0
- package/dist/core/training-collection-runner.js +2299 -0
- package/dist/core/training-collection-runner.js.map +1 -0
- package/dist/core/training-config.d.ts +52 -0
- package/dist/core/training-config.d.ts.map +1 -0
- package/dist/core/training-config.js +117 -0
- package/dist/core/training-config.js.map +1 -0
- package/dist/core/training-orchestrator.d.ts +112 -0
- package/dist/core/training-orchestrator.d.ts.map +1 -0
- package/dist/core/training-orchestrator.js +729 -0
- package/dist/core/training-orchestrator.js.map +1 -0
- package/dist/core/training-readiness-report.d.ts +52 -0
- package/dist/core/training-readiness-report.d.ts.map +1 -0
- package/dist/core/training-readiness-report.js +765 -0
- package/dist/core/training-readiness-report.js.map +1 -0
- package/dist/core/trajectory-consumer.d.ts +15 -0
- package/dist/core/trajectory-consumer.d.ts.map +1 -0
- package/dist/core/trajectory-consumer.js +61 -0
- package/dist/core/trajectory-consumer.js.map +1 -0
- package/dist/core/trajectory-export-bundle.d.ts +95 -0
- package/dist/core/trajectory-export-bundle.d.ts.map +1 -0
- package/dist/core/trajectory-export-bundle.js +561 -0
- package/dist/core/trajectory-export-bundle.js.map +1 -0
- package/dist/core/trajectory-export-cron.d.ts +57 -0
- package/dist/core/trajectory-export-cron.d.ts.map +1 -0
- package/dist/core/trajectory-export-cron.js +170 -0
- package/dist/core/trajectory-export-cron.js.map +1 -0
- package/dist/core/trajectory-hf-upload.d.ts +50 -0
- package/dist/core/trajectory-hf-upload.d.ts.map +1 -0
- package/dist/core/trajectory-hf-upload.js +111 -0
- package/dist/core/trajectory-hf-upload.js.map +1 -0
- package/dist/core/trajectory-task-datasets.d.ts +62 -0
- package/dist/core/trajectory-task-datasets.d.ts.map +1 -0
- package/dist/core/trajectory-task-datasets.js +427 -0
- package/dist/core/trajectory-task-datasets.js.map +1 -0
- package/dist/core/wait-for-service.d.ts +25 -0
- package/dist/core/wait-for-service.d.ts.map +1 -0
- package/dist/core/wait-for-service.js +19 -0
- package/dist/core/wait-for-service.js.map +1 -0
- package/dist/core/workspace-runtime.d.ts +4 -0
- package/dist/core/workspace-runtime.d.ts.map +1 -0
- package/dist/core/workspace-runtime.js +25 -0
- package/dist/core/workspace-runtime.js.map +1 -0
- package/dist/dspy/artifact.d.ts +54 -0
- package/dist/dspy/artifact.d.ts.map +1 -0
- package/dist/dspy/artifact.js +61 -0
- package/dist/dspy/artifact.js.map +1 -0
- package/dist/dspy/chain-of-thought.d.ts +27 -0
- package/dist/dspy/chain-of-thought.d.ts.map +1 -0
- package/dist/dspy/chain-of-thought.js +43 -0
- package/dist/dspy/chain-of-thought.js.map +1 -0
- package/dist/dspy/examples.d.ts +72 -0
- package/dist/dspy/examples.d.ts.map +1 -0
- package/dist/dspy/examples.js +105 -0
- package/dist/dspy/examples.js.map +1 -0
- package/dist/dspy/index.d.ts +15 -0
- package/dist/dspy/index.d.ts.map +1 -0
- package/dist/dspy/index.js +40 -0
- package/dist/dspy/index.js.map +1 -0
- package/dist/dspy/lm-adapter.d.ts +100 -0
- package/dist/dspy/lm-adapter.d.ts.map +1 -0
- package/dist/dspy/lm-adapter.js +81 -0
- package/dist/dspy/lm-adapter.js.map +1 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts +23 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js +85 -0
- package/dist/dspy/optimizers/dspy-bootstrap-fewshot.js.map +1 -0
- package/dist/dspy/optimizers/dspy-copro.d.ts +29 -0
- package/dist/dspy/optimizers/dspy-copro.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-copro.js +141 -0
- package/dist/dspy/optimizers/dspy-copro.js.map +1 -0
- package/dist/dspy/optimizers/dspy-mipro.d.ts +37 -0
- package/dist/dspy/optimizers/dspy-mipro.d.ts.map +1 -0
- package/dist/dspy/optimizers/dspy-mipro.js +194 -0
- package/dist/dspy/optimizers/dspy-mipro.js.map +1 -0
- package/dist/dspy/optimizers/index.d.ts +5 -0
- package/dist/dspy/optimizers/index.d.ts.map +1 -0
- package/dist/dspy/optimizers/index.js +11 -0
- package/dist/dspy/optimizers/index.js.map +1 -0
- package/dist/dspy/optimizers/types.d.ts +39 -0
- package/dist/dspy/optimizers/types.d.ts.map +1 -0
- package/dist/dspy/optimizers/types.js +1 -0
- package/dist/dspy/optimizers/types.js.map +1 -0
- package/dist/dspy/predict.d.ts +49 -0
- package/dist/dspy/predict.d.ts.map +1 -0
- package/dist/dspy/predict.js +73 -0
- package/dist/dspy/predict.js.map +1 -0
- package/dist/dspy/signature.d.ts +88 -0
- package/dist/dspy/signature.d.ts.map +1 -0
- package/dist/dspy/signature.js +205 -0
- package/dist/dspy/signature.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/optimizers/bootstrap-fewshot.d.ts +42 -0
- package/dist/optimizers/bootstrap-fewshot.d.ts.map +1 -0
- package/dist/optimizers/bootstrap-fewshot.js +92 -0
- package/dist/optimizers/bootstrap-fewshot.js.map +1 -0
- package/dist/optimizers/gepa.d.ts +63 -0
- package/dist/optimizers/gepa.d.ts.map +1 -0
- package/dist/optimizers/gepa.js +232 -0
- package/dist/optimizers/gepa.js.map +1 -0
- package/dist/optimizers/index.d.ts +7 -0
- package/dist/optimizers/index.d.ts.map +1 -0
- package/dist/optimizers/index.js +51 -0
- package/dist/optimizers/index.js.map +1 -0
- package/dist/optimizers/instruction-search.d.ts +39 -0
- package/dist/optimizers/instruction-search.d.ts.map +1 -0
- package/dist/optimizers/instruction-search.js +108 -0
- package/dist/optimizers/instruction-search.js.map +1 -0
- package/dist/optimizers/prompt-evolution.d.ts +39 -0
- package/dist/optimizers/prompt-evolution.d.ts.map +1 -0
- package/dist/optimizers/prompt-evolution.js +101 -0
- package/dist/optimizers/prompt-evolution.js.map +1 -0
- package/dist/optimizers/scoring.d.ts +139 -0
- package/dist/optimizers/scoring.d.ts.map +1 -0
- package/dist/optimizers/scoring.js +299 -0
- package/dist/optimizers/scoring.js.map +1 -0
- package/dist/optimizers/types.d.ts +105 -0
- package/dist/optimizers/types.d.ts.map +1 -0
- package/dist/optimizers/types.js +1 -0
- package/dist/optimizers/types.js.map +1 -0
- package/dist/register-runtime.d.ts +3 -0
- package/dist/register-runtime.d.ts.map +1 -0
- package/dist/register-runtime.js +60 -0
- package/dist/register-runtime.js.map +1 -0
- package/dist/register-terminal-view.d.ts +15 -0
- package/dist/register-terminal-view.d.ts.map +1 -0
- package/dist/register-terminal-view.js +31 -0
- package/dist/register-terminal-view.js.map +1 -0
- package/dist/routes/experience-routes.d.ts +21 -0
- package/dist/routes/experience-routes.d.ts.map +1 -0
- package/dist/routes/experience-routes.js +513 -0
- package/dist/routes/experience-routes.js.map +1 -0
- package/dist/routes/index.d.ts +5 -0
- package/dist/routes/index.d.ts.map +1 -0
- package/dist/routes/index.js +17 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/training-routes.d.ts +10 -0
- package/dist/routes/training-routes.d.ts.map +1 -0
- package/dist/routes/training-routes.js +1239 -0
- package/dist/routes/training-routes.js.map +1 -0
- package/dist/routes/training-vast-routes.d.ts +35 -0
- package/dist/routes/training-vast-routes.d.ts.map +1 -0
- package/dist/routes/training-vast-routes.js +249 -0
- package/dist/routes/training-vast-routes.js.map +1 -0
- package/dist/routes/trajectory-routes.d.ts +19 -0
- package/dist/routes/trajectory-routes.d.ts.map +1 -0
- package/dist/routes/trajectory-routes.js +1122 -0
- package/dist/routes/trajectory-routes.js.map +1 -0
- package/dist/services/index.d.ts +9 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +63 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/training-backend-check.d.ts +8 -0
- package/dist/services/training-backend-check.d.ts.map +1 -0
- package/dist/services/training-backend-check.js +31 -0
- package/dist/services/training-backend-check.js.map +1 -0
- package/dist/services/training-service-like.d.ts +40 -0
- package/dist/services/training-service-like.d.ts.map +1 -0
- package/dist/services/training-service-like.js +1 -0
- package/dist/services/training-service-like.js.map +1 -0
- package/dist/services/training-service-registry.d.ts +4 -0
- package/dist/services/training-service-registry.d.ts.map +1 -0
- package/dist/services/training-service-registry.js +12 -0
- package/dist/services/training-service-registry.js.map +1 -0
- package/dist/services/training-service.d.ts +59 -0
- package/dist/services/training-service.d.ts.map +1 -0
- package/dist/services/training-service.js +154 -0
- package/dist/services/training-service.js.map +1 -0
- package/dist/services/training-trigger.d.ts +177 -0
- package/dist/services/training-trigger.d.ts.map +1 -0
- package/dist/services/training-trigger.js +300 -0
- package/dist/services/training-trigger.js.map +1 -0
- package/dist/services/training-vast-service.d.ts +149 -0
- package/dist/services/training-vast-service.d.ts.map +1 -0
- package/dist/services/training-vast-service.js +648 -0
- package/dist/services/training-vast-service.js.map +1 -0
- package/dist/services/vast-inference-stats.d.ts +37 -0
- package/dist/services/vast-inference-stats.d.ts.map +1 -0
- package/dist/services/vast-inference-stats.js +81 -0
- package/dist/services/vast-inference-stats.js.map +1 -0
- package/dist/services/vast-job-store.d.ts +74 -0
- package/dist/services/vast-job-store.d.ts.map +1 -0
- package/dist/services/vast-job-store.js +194 -0
- package/dist/services/vast-job-store.js.map +1 -0
- package/dist/services/vast-subprocess.d.ts +27 -0
- package/dist/services/vast-subprocess.d.ts.map +1 -0
- package/dist/services/vast-subprocess.js +78 -0
- package/dist/services/vast-subprocess.js.map +1 -0
- package/dist/setup-routes.d.ts +17 -0
- package/dist/setup-routes.d.ts.map +1 -0
- package/dist/setup-routes.js +319 -0
- package/dist/setup-routes.js.map +1 -0
- package/dist/ui/FineTuningSpatialView.d.ts +49 -0
- package/dist/ui/FineTuningSpatialView.d.ts.map +1 -0
- package/dist/ui/FineTuningSpatialView.js +154 -0
- package/dist/ui/FineTuningSpatialView.js.map +1 -0
- package/dist/ui/FineTuningView.d.ts +7 -0
- package/dist/ui/FineTuningView.d.ts.map +1 -0
- package/dist/ui/FineTuningView.helpers.d.ts +17 -0
- package/dist/ui/FineTuningView.helpers.d.ts.map +1 -0
- package/dist/ui/FineTuningView.helpers.js +30 -0
- package/dist/ui/FineTuningView.helpers.js.map +1 -0
- package/dist/ui/FineTuningView.interact.d.ts +2 -0
- package/dist/ui/FineTuningView.interact.d.ts.map +1 -0
- package/dist/ui/FineTuningView.interact.js +300 -0
- package/dist/ui/FineTuningView.interact.js.map +1 -0
- package/dist/ui/FineTuningView.js +4653 -0
- package/dist/ui/FineTuningView.js.map +1 -0
- package/dist/ui/fine-tuning-panels.d.ts +100 -0
- package/dist/ui/fine-tuning-panels.d.ts.map +1 -0
- package/dist/ui/fine-tuning-panels.helpers.d.ts +19 -0
- package/dist/ui/fine-tuning-panels.helpers.d.ts.map +1 -0
- package/dist/ui/fine-tuning-panels.helpers.js +77 -0
- package/dist/ui/fine-tuning-panels.helpers.js.map +1 -0
- package/dist/ui/fine-tuning-panels.js +928 -0
- package/dist/ui/fine-tuning-panels.js.map +1 -0
- package/dist/ui/index.d.ts +5 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/training-view-bundle.d.ts +3 -0
- package/dist/ui/training-view-bundle.d.ts.map +1 -0
- package/dist/ui/training-view-bundle.js +7 -0
- package/dist/ui/training-view-bundle.js.map +1 -0
- package/dist/views/bundle.js +5312 -0
- package/dist/views/bundle.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
function createPromptScorer(adapter, options = {}) {
|
|
2
|
+
const temperature = options.temperature ?? 0;
|
|
3
|
+
const maxTokens = options.maxTokens ?? 512;
|
|
4
|
+
const compare = options.compare ?? scoreAgreement;
|
|
5
|
+
return async (prompt, examples) => {
|
|
6
|
+
if (examples.length === 0) return 0;
|
|
7
|
+
const cap = options.maxExamples ?? examples.length;
|
|
8
|
+
const limited = examples.slice(0, Math.max(1, cap));
|
|
9
|
+
let total = 0;
|
|
10
|
+
for (const example of limited) {
|
|
11
|
+
const completion = await adapter.complete({
|
|
12
|
+
system: prompt,
|
|
13
|
+
user: example.input.user,
|
|
14
|
+
temperature,
|
|
15
|
+
maxTokens
|
|
16
|
+
});
|
|
17
|
+
total += compare(completion, example.expectedOutput);
|
|
18
|
+
}
|
|
19
|
+
return total / limited.length;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function stripOutputFences(text) {
|
|
23
|
+
return text.trim().replace(/^```[a-z0-9_-]*\s*/i, "").replace(/\s*```$/i, "").trim();
|
|
24
|
+
}
|
|
25
|
+
function parseJsonObject(text) {
|
|
26
|
+
const trimmed = stripOutputFences(text);
|
|
27
|
+
if (!trimmed.startsWith("{")) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
try {
|
|
31
|
+
const parsed = JSON.parse(trimmed);
|
|
32
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
function readLegacyField(text, fieldName) {
|
|
38
|
+
const lineMatch = new RegExp(`(^|\\n)${fieldName}:\\s*([^\\n]+)`, "i").exec(
|
|
39
|
+
text
|
|
40
|
+
);
|
|
41
|
+
const value = lineMatch?.[2]?.trim();
|
|
42
|
+
return value ? value : void 0;
|
|
43
|
+
}
|
|
44
|
+
function parsePlannerObject(text) {
|
|
45
|
+
const parsed = parseJsonObject(text);
|
|
46
|
+
if (parsed) {
|
|
47
|
+
return parsed;
|
|
48
|
+
}
|
|
49
|
+
const legacyFields = {};
|
|
50
|
+
for (const fieldName of ["action", "actionName", "name", "type", "actions"]) {
|
|
51
|
+
const value = readLegacyField(text, fieldName);
|
|
52
|
+
if (value) {
|
|
53
|
+
legacyFields[fieldName] = value;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
return legacyFields;
|
|
57
|
+
}
|
|
58
|
+
function extractPlannerAction(text) {
|
|
59
|
+
if (!text) return null;
|
|
60
|
+
const parsed = parsePlannerObject(text);
|
|
61
|
+
if (parsed && Array.isArray(parsed.toolCalls)) {
|
|
62
|
+
const first = parsed.toolCalls[0];
|
|
63
|
+
if (first && typeof first === "object") {
|
|
64
|
+
const record = first;
|
|
65
|
+
const name = record.name ?? record.action ?? record.actionName;
|
|
66
|
+
if (typeof name === "string" && name.trim().length > 0) {
|
|
67
|
+
return name.trim().toUpperCase();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const raw = parsed.action ?? parsed.actionName ?? parsed.name ?? parsed.type ?? parsed.actions;
|
|
72
|
+
if (typeof raw === "string" && raw.trim()) {
|
|
73
|
+
return raw.split(",")[0]?.trim().toUpperCase() ?? null;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(raw)) {
|
|
76
|
+
const first = raw[0];
|
|
77
|
+
if (typeof first === "string") return first.trim().toUpperCase();
|
|
78
|
+
if (first && typeof first === "object") {
|
|
79
|
+
const record = first;
|
|
80
|
+
const name = record.name ?? record.action ?? record.actionName ?? record.type;
|
|
81
|
+
if (typeof name === "string") return name.trim().toUpperCase();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
const nameMatch = text.match(/\b([A-Z][A-Z0-9_]{2,})\b/);
|
|
85
|
+
return nameMatch?.[1] ?? null;
|
|
86
|
+
}
|
|
87
|
+
function readViewFromArgs(obj) {
|
|
88
|
+
if (!obj || typeof obj !== "object") return null;
|
|
89
|
+
const r = obj;
|
|
90
|
+
const v = r.view ?? r.viewId ?? r.id ?? r.target;
|
|
91
|
+
return typeof v === "string" && v.trim() ? v.trim().toLowerCase() : null;
|
|
92
|
+
}
|
|
93
|
+
function extractPlannerView(text) {
|
|
94
|
+
if (!text) return null;
|
|
95
|
+
const parsed = parsePlannerObject(text);
|
|
96
|
+
if (!parsed) return null;
|
|
97
|
+
if (Array.isArray(parsed.toolCalls)) {
|
|
98
|
+
const first = parsed.toolCalls[0];
|
|
99
|
+
if (first && typeof first === "object") {
|
|
100
|
+
const record = first;
|
|
101
|
+
const fromCall = readViewFromArgs(
|
|
102
|
+
record.args ?? record.arguments ?? record.parameters
|
|
103
|
+
);
|
|
104
|
+
if (fromCall) return fromCall;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const fromParams = readViewFromArgs(
|
|
108
|
+
parsed.parameters ?? parsed.args ?? parsed.arguments
|
|
109
|
+
);
|
|
110
|
+
if (fromParams) return fromParams;
|
|
111
|
+
return readViewFromArgs(parsed);
|
|
112
|
+
}
|
|
113
|
+
function scorePlannerAction(actual, expected) {
|
|
114
|
+
const actualAction = extractPlannerAction(actual);
|
|
115
|
+
const expectedAction = extractPlannerAction(expected);
|
|
116
|
+
if (!expectedAction) return 0;
|
|
117
|
+
if (!actualAction) return 0;
|
|
118
|
+
if (actualAction !== expectedAction) return 0;
|
|
119
|
+
const expectedView = extractPlannerView(expected);
|
|
120
|
+
if (!expectedView) return 1;
|
|
121
|
+
const actualView = extractPlannerView(actual);
|
|
122
|
+
if (!actualView) return 0.5;
|
|
123
|
+
return actualView === expectedView ? 1 : 0.5;
|
|
124
|
+
}
|
|
125
|
+
function scoreViewSelection(actual, expected) {
|
|
126
|
+
const expectedView = extractPlannerView(expected);
|
|
127
|
+
const actualView = extractPlannerView(actual);
|
|
128
|
+
if (expectedView === null && actualView === null) return 1;
|
|
129
|
+
return expectedView === actualView ? 1 : 0;
|
|
130
|
+
}
|
|
131
|
+
function scoreAgreement(actual, expected) {
|
|
132
|
+
const actualTokens = tokenize(actual);
|
|
133
|
+
const expectedTokens = tokenize(expected);
|
|
134
|
+
if (expectedTokens.size === 0 && actualTokens.size === 0) return 1;
|
|
135
|
+
if (expectedTokens.size === 0 || actualTokens.size === 0) return 0;
|
|
136
|
+
let intersection = 0;
|
|
137
|
+
for (const token of actualTokens) {
|
|
138
|
+
if (expectedTokens.has(token)) intersection += 1;
|
|
139
|
+
}
|
|
140
|
+
const union = actualTokens.size + expectedTokens.size - intersection;
|
|
141
|
+
if (union === 0) return 0;
|
|
142
|
+
return intersection / union;
|
|
143
|
+
}
|
|
144
|
+
function tokenize(text) {
|
|
145
|
+
const tokens = text.toLowerCase().replace(/[^a-z0-9\s_-]+/g, " ").split(/\s+/).filter((token) => token.length > 0);
|
|
146
|
+
return new Set(tokens);
|
|
147
|
+
}
|
|
148
|
+
const LIFEOPS_SCORER_TASKS = [
|
|
149
|
+
"calendar_extract",
|
|
150
|
+
"schedule_plan",
|
|
151
|
+
"reminder_dispatch",
|
|
152
|
+
"inbox_triage",
|
|
153
|
+
"meeting_prep",
|
|
154
|
+
"morning_brief",
|
|
155
|
+
"health_checkin",
|
|
156
|
+
"screentime_recap"
|
|
157
|
+
];
|
|
158
|
+
const LIFEOPS_STRUCTURED_SCORER_TASKS = [
|
|
159
|
+
"calendar_extract",
|
|
160
|
+
"schedule_plan",
|
|
161
|
+
"reminder_dispatch",
|
|
162
|
+
"inbox_triage",
|
|
163
|
+
"meeting_prep",
|
|
164
|
+
"health_checkin",
|
|
165
|
+
"screentime_recap"
|
|
166
|
+
];
|
|
167
|
+
const LIFEOPS_EXTRACTION_TASKS = new Set(
|
|
168
|
+
LIFEOPS_STRUCTURED_SCORER_TASKS
|
|
169
|
+
);
|
|
170
|
+
function stripFence(text) {
|
|
171
|
+
return text.trim().replace(/^```(?:json)?\s*/i, "").replace(/\s*```$/i, "");
|
|
172
|
+
}
|
|
173
|
+
function parseJsonLoose(text) {
|
|
174
|
+
const trimmed = stripFence(text);
|
|
175
|
+
const start = trimmed.indexOf("{");
|
|
176
|
+
const end = trimmed.lastIndexOf("}");
|
|
177
|
+
if (start === -1 || end === -1 || end <= start) return null;
|
|
178
|
+
try {
|
|
179
|
+
const parsed = JSON.parse(trimmed.slice(start, end + 1));
|
|
180
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
|
|
181
|
+
} catch {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
function parseLineFieldsLoose(text) {
|
|
186
|
+
const fields = {};
|
|
187
|
+
let parsedLines = 0;
|
|
188
|
+
for (const line of stripFence(text).split(/\r?\n/u)) {
|
|
189
|
+
const match = /^([a-zA-Z_][a-zA-Z0-9_-]*)\s*:\s*(.*)$/u.exec(line.trim());
|
|
190
|
+
if (!match) continue;
|
|
191
|
+
const key = match[1]?.trim();
|
|
192
|
+
if (!key) continue;
|
|
193
|
+
fields[key] = match[2]?.trim() ?? "";
|
|
194
|
+
parsedLines += 1;
|
|
195
|
+
}
|
|
196
|
+
return parsedLines > 0 ? fields : null;
|
|
197
|
+
}
|
|
198
|
+
function parseStructuredFieldsLoose(text) {
|
|
199
|
+
return parseJsonLoose(text) ?? parseLineFieldsLoose(text);
|
|
200
|
+
}
|
|
201
|
+
function normalizeScalar(value) {
|
|
202
|
+
if (value === null || value === void 0) return "";
|
|
203
|
+
if (typeof value === "object") return JSON.stringify(value);
|
|
204
|
+
return String(value).trim().toLowerCase();
|
|
205
|
+
}
|
|
206
|
+
function scoreStructuredFields(actual, expected, fields) {
|
|
207
|
+
const expectedObj = parseStructuredFieldsLoose(expected);
|
|
208
|
+
if (!expectedObj) return 0;
|
|
209
|
+
const actualObj = parseStructuredFieldsLoose(actual) ?? {};
|
|
210
|
+
const keys = fields && fields.length > 0 ? [...fields] : Object.keys(expectedObj);
|
|
211
|
+
if (keys.length === 0) {
|
|
212
|
+
return Object.keys(actualObj).length === 0 ? 1 : 0;
|
|
213
|
+
}
|
|
214
|
+
let matched = 0;
|
|
215
|
+
for (const key of keys) {
|
|
216
|
+
if (normalizeScalar(actualObj[key]) === normalizeScalar(expectedObj[key])) {
|
|
217
|
+
matched += 1;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return matched / keys.length;
|
|
221
|
+
}
|
|
222
|
+
function actionTokens(text) {
|
|
223
|
+
const obj = parseStructuredFieldsLoose(text);
|
|
224
|
+
const source = obj ? [
|
|
225
|
+
obj.action,
|
|
226
|
+
obj.subaction,
|
|
227
|
+
obj.category,
|
|
228
|
+
obj.priority,
|
|
229
|
+
obj.channel,
|
|
230
|
+
obj.suggestion
|
|
231
|
+
].map(normalizeScalar).filter(Boolean).join(" ") : text;
|
|
232
|
+
return new Set(
|
|
233
|
+
source.toLowerCase().split(/[\s,|]+/).map((token) => token.trim()).filter(Boolean)
|
|
234
|
+
);
|
|
235
|
+
}
|
|
236
|
+
function scoreActionSet(actual, expected) {
|
|
237
|
+
const actualSet = actionTokens(actual);
|
|
238
|
+
const expectedSet = actionTokens(expected);
|
|
239
|
+
if (actualSet.size === 0 && expectedSet.size === 0) return 1;
|
|
240
|
+
if (actualSet.size === 0 || expectedSet.size === 0) return 0;
|
|
241
|
+
let intersection = 0;
|
|
242
|
+
for (const token of actualSet) {
|
|
243
|
+
if (expectedSet.has(token)) intersection += 1;
|
|
244
|
+
}
|
|
245
|
+
const union = actualSet.size + expectedSet.size - intersection;
|
|
246
|
+
return union === 0 ? 0 : intersection / union;
|
|
247
|
+
}
|
|
248
|
+
function scoreLifeOpsTask(task, actual, expected) {
|
|
249
|
+
if (LIFEOPS_EXTRACTION_TASKS.has(task)) {
|
|
250
|
+
return scoreStructuredFields(actual, expected);
|
|
251
|
+
}
|
|
252
|
+
return scoreAgreement(actual, expected);
|
|
253
|
+
}
|
|
254
|
+
function subsample(items, count, rng = Math.random) {
|
|
255
|
+
if (count >= items.length) return [...items];
|
|
256
|
+
const indices = /* @__PURE__ */ new Set();
|
|
257
|
+
const out = [];
|
|
258
|
+
while (out.length < count) {
|
|
259
|
+
const idx = Math.floor(rng() * items.length);
|
|
260
|
+
if (indices.has(idx)) continue;
|
|
261
|
+
indices.add(idx);
|
|
262
|
+
const item = items[idx];
|
|
263
|
+
if (item !== void 0) out.push(item);
|
|
264
|
+
}
|
|
265
|
+
return out;
|
|
266
|
+
}
|
|
267
|
+
function createRuntimeAdapter(useModel) {
|
|
268
|
+
return {
|
|
269
|
+
async complete(input) {
|
|
270
|
+
const composed = input.system ? `${input.system}
|
|
271
|
+
|
|
272
|
+
${input.user}` : input.user;
|
|
273
|
+
const response = await useModel({
|
|
274
|
+
prompt: composed,
|
|
275
|
+
temperature: input.temperature,
|
|
276
|
+
maxTokens: input.maxTokens
|
|
277
|
+
});
|
|
278
|
+
if (typeof response === "string") return response;
|
|
279
|
+
if (response === void 0 || response === null) return "";
|
|
280
|
+
return JSON.stringify(response);
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
export {
|
|
285
|
+
LIFEOPS_SCORER_TASKS,
|
|
286
|
+
LIFEOPS_STRUCTURED_SCORER_TASKS,
|
|
287
|
+
createPromptScorer,
|
|
288
|
+
createRuntimeAdapter,
|
|
289
|
+
extractPlannerAction,
|
|
290
|
+
extractPlannerView,
|
|
291
|
+
scoreActionSet,
|
|
292
|
+
scoreAgreement,
|
|
293
|
+
scoreLifeOpsTask,
|
|
294
|
+
scorePlannerAction,
|
|
295
|
+
scoreStructuredFields,
|
|
296
|
+
scoreViewSelection,
|
|
297
|
+
subsample
|
|
298
|
+
};
|
|
299
|
+
//# sourceMappingURL=scoring.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/optimizers/scoring.ts"],"sourcesContent":["/**\n * Scoring utilities for native optimizers.\n *\n * The default scorer measures token-overlap agreement between the model's\n * actual output and the expected output recorded in the trajectory dataset.\n * It is deliberately cheap and deterministic — the optimizers run hundreds\n * of completions per round, so we cannot afford a model-graded scorer.\n *\n * Token-overlap agreement (Jaccard over normalized tokens) is the same primitive\n * that `replay-validator.ts` uses for `scoreSkill`-style success measurement,\n * just lifted to the (output vs reference) comparison instead of (skill vs\n * trajectory). When a richer signal becomes available, the scorer factory can\n * be swapped without changing any optimizer code.\n */\n\nimport type { LlmAdapter, PromptScorer } from \"./types.js\";\n\ninterface ScorerOptions {\n /** Cap on examples scored per call. Defaults to all examples. */\n maxExamples?: number;\n /** Temperature passed to the adapter. Defaults to 0 for determinism. */\n temperature?: number;\n /** Max tokens for each completion. Defaults to 512. */\n maxTokens?: number;\n /**\n * Per-example comparator. Defaults to Jaccard token overlap.\n * Returning 1.0 means a perfect match, 0.0 means no credit.\n */\n compare?: (actual: string, expected: string) => number;\n}\n\n/**\n * Build a `PromptScorer` backed by a real LLM adapter.\n *\n * For each example:\n * 1. Run `prompt` (as system) + `example.input.user` through the adapter.\n * 2. Compare the completion against `example.expectedOutput` via Jaccard\n * similarity over normalized tokens.\n * 3. Return the mean score.\n *\n * Reuses the same normalization heuristic as the trajectory-task-datasets\n * exporter (lower-case, strip punctuation, drop empty tokens).\n */\nexport function createPromptScorer(\n adapter: LlmAdapter,\n options: ScorerOptions = {},\n): PromptScorer {\n const temperature = options.temperature ?? 0;\n const maxTokens = options.maxTokens ?? 512;\n const compare = options.compare ?? scoreAgreement;\n return async (prompt, examples) => {\n if (examples.length === 0) return 0;\n const cap = options.maxExamples ?? examples.length;\n const limited = examples.slice(0, Math.max(1, cap));\n let total = 0;\n for (const example of limited) {\n const completion = await adapter.complete({\n system: prompt,\n user: example.input.user,\n temperature,\n maxTokens,\n });\n total += compare(completion, example.expectedOutput);\n }\n return total / limited.length;\n };\n}\n\nfunction stripOutputFences(text: string): string {\n return text\n .trim()\n .replace(/^```[a-z0-9_-]*\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n}\n\nfunction parseJsonObject(text: string): Record<string, unknown> | null {\n const trimmed = stripOutputFences(text);\n if (!trimmed.startsWith(\"{\")) {\n return null;\n }\n try {\n const parsed = JSON.parse(trimmed) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\nfunction readLegacyField(text: string, fieldName: string): string | undefined {\n const lineMatch = new RegExp(`(^|\\\\n)${fieldName}:\\\\s*([^\\\\n]+)`, \"i\").exec(\n text,\n );\n const value = lineMatch?.[2]?.trim();\n return value ? value : undefined;\n}\n\nfunction parsePlannerObject(text: string): Record<string, unknown> {\n const parsed = parseJsonObject(text);\n if (parsed) {\n return parsed;\n }\n\n const legacyFields: Record<string, unknown> = {};\n for (const fieldName of [\"action\", \"actionName\", \"name\", \"type\", \"actions\"]) {\n const value = readLegacyField(text, fieldName);\n if (value) {\n legacyFields[fieldName] = value;\n }\n }\n return legacyFields;\n}\n\n/**\n * Extract the first action name from planner output. JSON is preferred; a\n * small line-based reader keeps older key/value rows comparable.\n *\n * Schemas understood (in priority order):\n * 1. v5 planner: `{toolCalls:[{name:\"OWNER_TODOS\",\"args\":{...}}]}` — handled directly.\n * 2. Legacy structured: top-level `action`/`actionName`/`name`/`type`/`actions` field.\n * 3. Legacy line-based: `action: OWNER_TODOS` or similar key:value rows.\n * 4. Last-resort: any uppercase identifier in the text.\n *\n * The regex fallback is intentionally last — it matches identifiers like\n * `OWNER`, `OPTIONAL`, `JSON`, etc. that show up in field names, so it can\n * mislabel non-action text. Prefer the JSON paths when the runtime emits\n * structured output (which is the common case post-v5).\n */\nexport function extractPlannerAction(text: string): string | null {\n if (!text) return null;\n const parsed = parsePlannerObject(text);\n // v5 toolCalls shape — most common in current trajectories\n if (parsed && Array.isArray(parsed.toolCalls)) {\n const first = parsed.toolCalls[0];\n if (first && typeof first === \"object\") {\n const record = first as Record<string, unknown>;\n const name = record.name ?? record.action ?? record.actionName;\n if (typeof name === \"string\" && name.trim().length > 0) {\n return name.trim().toUpperCase();\n }\n }\n }\n const raw =\n parsed.action ??\n parsed.actionName ??\n parsed.name ??\n parsed.type ??\n parsed.actions;\n if (typeof raw === \"string\" && raw.trim()) {\n return raw.split(\",\")[0]?.trim().toUpperCase() ?? null;\n }\n if (Array.isArray(raw)) {\n const first = raw[0];\n if (typeof first === \"string\") return first.trim().toUpperCase();\n if (first && typeof first === \"object\") {\n const record = first as Record<string, unknown>;\n const name =\n record.name ?? record.action ?? record.actionName ?? record.type;\n if (typeof name === \"string\") return name.trim().toUpperCase();\n }\n }\n const nameMatch = text.match(/\\b([A-Z][A-Z0-9_]{2,})\\b/);\n return nameMatch?.[1] ?? null;\n}\n\n/**\n * Pull a target-view id out of a planner argument object. View navigation\n * carries the surface in one of a few alias keys (`view`/`viewId`/`id`/`target`)\n * — the VIEWS action declares all of them. `name` is intentionally excluded: at\n * tool-call top level `name` is the ACTION name, so reading it as a view would\n * mislabel every call.\n */\nfunction readViewFromArgs(obj: unknown): string | null {\n if (!obj || typeof obj !== \"object\") return null;\n const r = obj as Record<string, unknown>;\n const v = r.view ?? r.viewId ?? r.id ?? r.target;\n return typeof v === \"string\" && v.trim() ? v.trim().toLowerCase() : null;\n}\n\n/**\n * Extract the target view id from planner output when the chosen action is a\n * view navigation. Understands the same shapes as {@link extractPlannerAction}:\n * 1. tool-call: `{toolCalls:[{name:\"VIEWS\", args/arguments/parameters:{view}}]}`\n * 2. bare action: `{action:\"VIEWS\", parameters/args:{view}}`\n * 3. top-level alias: `{view}` / `{viewId}`\n * Returns the lower-cased view id, or `null` when none is present.\n */\nexport function extractPlannerView(text: string): string | null {\n if (!text) return null;\n const parsed = parsePlannerObject(text);\n if (!parsed) return null;\n if (Array.isArray(parsed.toolCalls)) {\n const first = parsed.toolCalls[0];\n if (first && typeof first === \"object\") {\n const record = first as Record<string, unknown>;\n const fromCall = readViewFromArgs(\n record.args ?? record.arguments ?? record.parameters,\n );\n if (fromCall) return fromCall;\n }\n }\n const fromParams = readViewFromArgs(\n parsed.parameters ?? parsed.args ?? parsed.arguments,\n );\n if (fromParams) return fromParams;\n return readViewFromArgs(parsed);\n}\n\n/**\n * Action-name comparator: returns 1.0 when both outputs resolve to the same\n * planner action name, 0.0 otherwise. This is the right primitive for\n * optimizing the `action_planner` task because token overlap under-credits\n * correct choices when surrounding rationale varies stochastically.\n *\n * View-aware refinement: when the expected output pins a specific view (a VIEWS\n * navigation target), a matching action alone is NOT full credit — the view has\n * to match too. Without this the optimizer can never learn correct view\n * selection, because every `VIEWS/<anything>` would score 1.0 against a\n * `VIEWS/calendar` reference (the exact gap that made entry-tier wrong-view\n * outputs look perfect). Partial credit (right action, wrong/missing view =\n * 0.5) keeps a usable gradient for the optimizer. Expected outputs without a\n * view (every non-navigation action) are scored action-only, unchanged.\n */\nexport function scorePlannerAction(actual: string, expected: string): number {\n const actualAction = extractPlannerAction(actual);\n const expectedAction = extractPlannerAction(expected);\n if (!expectedAction) return 0;\n if (!actualAction) return 0;\n if (actualAction !== expectedAction) return 0;\n const expectedView = extractPlannerView(expected);\n if (!expectedView) return 1;\n const actualView = extractPlannerView(actual);\n if (!actualView) return 0.5;\n return actualView === expectedView ? 1 : 0.5;\n}\n\n/**\n * View-selection comparator for the contextual view evaluator (`view_context`\n * task). Both outputs are `{viewId, reason}` (or \"none\"); credit is 1.0 when the\n * chosen view id matches the reference, 0.0 otherwise. Case-insensitive, and a\n * matching \"none\" (correctly declining to navigate) scores 1.0 — so it rewards\n * both opening the right surface AND staying put on non-navigational turns.\n */\nexport function scoreViewSelection(actual: string, expected: string): number {\n const expectedView = extractPlannerView(expected);\n const actualView = extractPlannerView(actual);\n if (expectedView === null && actualView === null) return 1;\n return expectedView === actualView ? 1 : 0;\n}\n\n/**\n * Jaccard similarity over normalized token sets, in `[0, 1]`. Empty inputs\n * collapse to 0 (no overlap to measure).\n */\nexport function scoreAgreement(actual: string, expected: string): number {\n const actualTokens = tokenize(actual);\n const expectedTokens = tokenize(expected);\n if (expectedTokens.size === 0 && actualTokens.size === 0) return 1;\n if (expectedTokens.size === 0 || actualTokens.size === 0) return 0;\n let intersection = 0;\n for (const token of actualTokens) {\n if (expectedTokens.has(token)) intersection += 1;\n }\n const union = actualTokens.size + expectedTokens.size - intersection;\n if (union === 0) return 0;\n return intersection / union;\n}\n\nfunction tokenize(text: string): Set<string> {\n const tokens = text\n .toLowerCase()\n .replace(/[^a-z0-9\\s_-]+/g, \" \")\n .split(/\\s+/)\n .filter((token) => token.length > 0);\n return new Set(tokens);\n}\n\n// -----------------------------------------------------------------------------\n// LifeOps per-capability scorers (#8795 item 4).\n//\n// The LifeOps optimization tasks split into two scoring shapes:\n// - Extraction tasks emit structured fields (JSON objects for most tasks,\n// line-based `key: value` fields for a few legacy planners). These are\n// graded on structured-field exact-match — the fraction of expected fields\n// the model reproduced. Date/time/recurrence/recipient are exactly the\n// fields that must be right, so partial-credit-by-field is the right signal.\n// - Chat-shaped tasks emit free text (the morning brief). These fall back to\n// token agreement here; the real optimization loop gates them on the\n// `responseJudge` rubric instead of this cheap proxy.\n// Both shapes are deterministic and allocation-light, matching the optimizer's\n// hundreds-of-completions-per-round budget.\n// -----------------------------------------------------------------------------\n\n/** LifeOps tasks with per-capability scorers (#8795). */\nexport const LIFEOPS_SCORER_TASKS = [\n \"calendar_extract\",\n \"schedule_plan\",\n \"reminder_dispatch\",\n \"inbox_triage\",\n \"meeting_prep\",\n \"morning_brief\",\n \"health_checkin\",\n \"screentime_recap\",\n] as const;\n\n/** LifeOps tasks whose output is a structured JSON object (exact-field match). */\nexport const LIFEOPS_STRUCTURED_SCORER_TASKS = [\n \"calendar_extract\",\n \"schedule_plan\",\n \"reminder_dispatch\",\n \"inbox_triage\",\n \"meeting_prep\",\n \"health_checkin\",\n \"screentime_recap\",\n] as const;\n\nconst LIFEOPS_EXTRACTION_TASKS: ReadonlySet<string> = new Set(\n LIFEOPS_STRUCTURED_SCORER_TASKS,\n);\n\nfunction stripFence(text: string): string {\n return text\n .trim()\n .replace(/^```(?:json)?\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\");\n}\n\n/** Parse a JSON object out of a completion, tolerating ```json fences/prose. */\nfunction parseJsonLoose(text: string): Record<string, unknown> | null {\n const trimmed = stripFence(text);\n const start = trimmed.indexOf(\"{\");\n const end = trimmed.lastIndexOf(\"}\");\n if (start === -1 || end === -1 || end <= start) return null;\n try {\n const parsed = JSON.parse(trimmed.slice(start, end + 1)) as unknown;\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\n/** Parse legacy line-based planner output: `field: value` per line. */\nfunction parseLineFieldsLoose(text: string): Record<string, unknown> | null {\n const fields: Record<string, string> = {};\n let parsedLines = 0;\n for (const line of stripFence(text).split(/\\r?\\n/u)) {\n const match = /^([a-zA-Z_][a-zA-Z0-9_-]*)\\s*:\\s*(.*)$/u.exec(line.trim());\n if (!match) continue;\n const key = match[1]?.trim();\n if (!key) continue;\n fields[key] = match[2]?.trim() ?? \"\";\n parsedLines += 1;\n }\n return parsedLines > 0 ? fields : null;\n}\n\nfunction parseStructuredFieldsLoose(\n text: string,\n): Record<string, unknown> | null {\n return parseJsonLoose(text) ?? parseLineFieldsLoose(text);\n}\n\nfunction normalizeScalar(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (typeof value === \"object\") return JSON.stringify(value);\n return String(value).trim().toLowerCase();\n}\n\n/**\n * Structured-field exact-match score in `[0, 1]`: the fraction of expected\n * fields whose value the actual output reproduced. Both inputs are parsed as\n * JSON or line-based fields (tolerating fences/prose). When `fields` is supplied only those keys are\n * scored; otherwise every key in `expected` is scored. Returns 0 when expected\n * is unparseable (nothing to credit) and 1 when both parse to empty objects.\n */\nexport function scoreStructuredFields(\n actual: string,\n expected: string,\n fields?: readonly string[],\n): number {\n const expectedObj = parseStructuredFieldsLoose(expected);\n if (!expectedObj) return 0;\n const actualObj = parseStructuredFieldsLoose(actual) ?? {};\n const keys =\n fields && fields.length > 0 ? [...fields] : Object.keys(expectedObj);\n if (keys.length === 0) {\n return Object.keys(actualObj).length === 0 ? 1 : 0;\n }\n let matched = 0;\n for (const key of keys) {\n if (normalizeScalar(actualObj[key]) === normalizeScalar(expectedObj[key])) {\n matched += 1;\n }\n }\n return matched / keys.length;\n}\n\n/** Tokenize an output into an action/label set (JSON fields or raw words). */\nfunction actionTokens(text: string): Set<string> {\n const obj = parseStructuredFieldsLoose(text);\n const source = obj\n ? [\n obj.action,\n obj.subaction,\n obj.category,\n obj.priority,\n obj.channel,\n obj.suggestion,\n ]\n .map(normalizeScalar)\n .filter(Boolean)\n .join(\" \")\n : text;\n return new Set(\n source\n .toLowerCase()\n .split(/[\\s,|]+/)\n .map((token) => token.trim())\n .filter(Boolean),\n );\n}\n\n/**\n * Action/label set-overlap (Jaccard) in `[0, 1]`. For tasks whose target is\n * \"did the agent pick the right action/category set\" rather than exact text.\n * Two empty sets score 1.0 (both correctly produced nothing actionable).\n */\nexport function scoreActionSet(actual: string, expected: string): number {\n const actualSet = actionTokens(actual);\n const expectedSet = actionTokens(expected);\n if (actualSet.size === 0 && expectedSet.size === 0) return 1;\n if (actualSet.size === 0 || expectedSet.size === 0) return 0;\n let intersection = 0;\n for (const token of actualSet) {\n if (expectedSet.has(token)) intersection += 1;\n }\n const union = actualSet.size + expectedSet.size - intersection;\n return union === 0 ? 0 : intersection / union;\n}\n\n/**\n * Authoritative per-task comparator for the LifeOps optimization tasks (the\n * GEPA Pareto scorer dispatches through here). Extraction tasks →\n * structured-field exact-match; the chat-shaped morning brief → token\n * agreement (proxy for the judge rubric); anything else → token agreement.\n */\nexport function scoreLifeOpsTask(\n task: string,\n actual: string,\n expected: string,\n): number {\n if (LIFEOPS_EXTRACTION_TASKS.has(task)) {\n return scoreStructuredFields(actual, expected);\n }\n return scoreAgreement(actual, expected);\n}\n\n/**\n * Random-without-replacement subsample, used by optimizer rounds to keep\n * scoring cheap on large datasets without sacrificing comparability across\n * rounds (deterministic when `rng` is supplied).\n */\nexport function subsample<T>(\n items: T[],\n count: number,\n rng: () => number = Math.random,\n): T[] {\n if (count >= items.length) return [...items];\n const indices = new Set<number>();\n const out: T[] = [];\n while (out.length < count) {\n const idx = Math.floor(rng() * items.length);\n if (indices.has(idx)) continue;\n indices.add(idx);\n const item = items[idx];\n if (item !== undefined) out.push(item);\n }\n return out;\n}\n\n/**\n * Wraps `IAgentRuntime.useModel` into the `LlmAdapter` shape. We accept a\n * loose runtime type so this module stays free of `@elizaos/core` import\n * cycles — the native backend supplies the bound `useModel` directly.\n */\nexport type UseModelHandler = (input: {\n prompt: string;\n temperature?: number;\n maxTokens?: number;\n}) => Promise<string | object | undefined>;\n\nexport function createRuntimeAdapter(useModel: UseModelHandler): LlmAdapter {\n return {\n async complete(input) {\n const composed = input.system\n ? `${input.system}\\n\\n${input.user}`\n : input.user;\n const response = await useModel({\n prompt: composed,\n temperature: input.temperature,\n maxTokens: input.maxTokens,\n });\n if (typeof response === \"string\") return response;\n if (response === undefined || response === null) return \"\";\n return JSON.stringify(response);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native prompt-optimization primitives.
|
|
3
|
+
*
|
|
4
|
+
* The optimizers under `plugins/plugin-training/src/optimizers/` (instruction-search,
|
|
5
|
+
* prompt-evolution, bootstrap-fewshot) all operate on the same triple:
|
|
6
|
+
*
|
|
7
|
+
* - `OptimizationExample`: a labeled (input -> expected output) row, mirroring
|
|
8
|
+
* the JSONL shape produced by `trajectory-task-datasets.ts`.
|
|
9
|
+
* - `PromptScorer`: pluggable evaluator that returns a score in `[0, 1]` for
|
|
10
|
+
* a candidate prompt against a held-out subset of examples.
|
|
11
|
+
* - `LlmAdapter`: thin wrapper over `runtime.useModel()` so optimizer code
|
|
12
|
+
* never depends on a specific provider.
|
|
13
|
+
*
|
|
14
|
+
* Decoupling the LLM behind `LlmAdapter` makes the optimizer modules unit
|
|
15
|
+
* testable with a deterministic in-memory adapter — no HTTP, no fixtures.
|
|
16
|
+
*/
|
|
17
|
+
import type { TrajectoryTrainingTask } from "../core/trajectory-task-datasets.js";
|
|
18
|
+
/**
|
|
19
|
+
* One row in the optimization dataset.
|
|
20
|
+
*
|
|
21
|
+
* `input.system`/`input.user` mirror the `messages` arrays produced by the
|
|
22
|
+
* trajectory dataset exporter (`should_respond`, `response`, etc.). The
|
|
23
|
+
* exporter always wires those into the `system`/`user` slots, so this is the
|
|
24
|
+
* canonical shape for all native optimizer code.
|
|
25
|
+
*/
|
|
26
|
+
export interface OptimizationExample {
|
|
27
|
+
/** Stable identifier for traceability. Defaults to the row index. */
|
|
28
|
+
id?: string;
|
|
29
|
+
input: {
|
|
30
|
+
system?: string;
|
|
31
|
+
user: string;
|
|
32
|
+
};
|
|
33
|
+
/** Reference output the model should produce. Compared by the scorer. */
|
|
34
|
+
expectedOutput: string;
|
|
35
|
+
/**
|
|
36
|
+
* Optional reward signal recorded with the trajectory (e.g. successful
|
|
37
|
+
* completion = 1). Bootstrap-fewshot uses this to pick top-K demonstrations.
|
|
38
|
+
*/
|
|
39
|
+
reward?: number;
|
|
40
|
+
/** Optional per-row metadata (task name, source trajectory id, ...). */
|
|
41
|
+
metadata?: Record<string, unknown>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Scorer signature.
|
|
45
|
+
*
|
|
46
|
+
* Returns the mean score in `[0, 1]` across the supplied examples. A scorer
|
|
47
|
+
* MUST be deterministic given the same prompt + dataset + adapter, otherwise
|
|
48
|
+
* the optimizer cannot tell signal from noise across rounds.
|
|
49
|
+
*/
|
|
50
|
+
export type PromptScorer = (prompt: string, examples: OptimizationExample[]) => Promise<number>;
|
|
51
|
+
/**
|
|
52
|
+
* Minimal LLM interface the optimizers depend on. Implementations route to
|
|
53
|
+
* `runtime.useModel(ModelType.TEXT_LARGE, …)` in production and to a
|
|
54
|
+
* deterministic adapter in tests.
|
|
55
|
+
*/
|
|
56
|
+
export interface LlmAdapter {
|
|
57
|
+
/**
|
|
58
|
+
* Run a single completion. Returns plain text (no parsing).
|
|
59
|
+
*
|
|
60
|
+
* `temperature` is optional because some adapters (e.g. tests) ignore it,
|
|
61
|
+
* but optimizers should pass it explicitly when they want diverse samples.
|
|
62
|
+
*/
|
|
63
|
+
complete(input: {
|
|
64
|
+
system?: string;
|
|
65
|
+
user: string;
|
|
66
|
+
temperature?: number;
|
|
67
|
+
maxTokens?: number;
|
|
68
|
+
}): Promise<string>;
|
|
69
|
+
}
|
|
70
|
+
/** Per-round bookkeeping returned by every optimizer. */
|
|
71
|
+
export interface OptimizerLineageEntry {
|
|
72
|
+
round: number;
|
|
73
|
+
variant: number;
|
|
74
|
+
score: number;
|
|
75
|
+
notes?: string;
|
|
76
|
+
}
|
|
77
|
+
/** Common shape returned by all native optimizers. */
|
|
78
|
+
export interface OptimizerResult {
|
|
79
|
+
optimizedPrompt: string;
|
|
80
|
+
score: number;
|
|
81
|
+
baseline: number;
|
|
82
|
+
lineage: OptimizerLineageEntry[];
|
|
83
|
+
/** Demonstrations injected into the prompt (bootstrap-fewshot only). */
|
|
84
|
+
fewShotExamples?: OptimizationExample[];
|
|
85
|
+
}
|
|
86
|
+
export type OptimizerName = "instruction-search" | "prompt-evolution" | "gepa" | "bootstrap-fewshot" | "dspy-bootstrap-fewshot" | "dspy-copro" | "dspy-mipro";
|
|
87
|
+
/**
|
|
88
|
+
* Persisted artifact written by the native backend and consumed by
|
|
89
|
+
* `OptimizedPromptService`. The persisted-on-disk schema is checked field by
|
|
90
|
+
* field on read; required fields stay required (no `?? null` fallbacks).
|
|
91
|
+
*/
|
|
92
|
+
export interface OptimizedPromptArtifact {
|
|
93
|
+
task: TrajectoryTrainingTask;
|
|
94
|
+
optimizer: OptimizerName;
|
|
95
|
+
baseline: string;
|
|
96
|
+
prompt: string;
|
|
97
|
+
score: number;
|
|
98
|
+
baselineScore: number;
|
|
99
|
+
datasetId: string;
|
|
100
|
+
datasetSize: number;
|
|
101
|
+
generatedAt: string;
|
|
102
|
+
fewShotExamples?: OptimizationExample[];
|
|
103
|
+
lineage: OptimizerLineageEntry[];
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/optimizers/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAElF;;;;;;;GAOG;AACH,MAAM,WAAW,mBAAmB;IAClC,qEAAqE;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QACL,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;;;;;GAMG;AACH,MAAM,MAAM,YAAY,GAAG,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,mBAAmB,EAAE,KAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACzB;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACrB;AAED,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,sDAAsD;AACtD,MAAM,WAAW,eAAe;IAC9B,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,qBAAqB,EAAE,CAAC;IACjC,wEAAwE;IACxE,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;CACzC;AAED,MAAM,MAAM,aAAa,GACrB,oBAAoB,GACpB,kBAAkB,GAClB,MAAM,GACN,mBAAmB,GACnB,wBAAwB,GACxB,YAAY,GACZ,YAAY,CAAC;AAEjB;;;;GAIG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACxC,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAClC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-runtime.d.ts","sourceRoot":"","sources":["../src/register-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAW,MAAM,eAAe,CAAC;AAiB3D,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC,CAwDf"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { logger, OptimizedPromptService } from "@elizaos/core";
|
|
2
|
+
import { registerSkillScoringCron } from "./core/skill-scoring-cron.js";
|
|
3
|
+
import { registerTrajectoryExportCron } from "./core/trajectory-export-cron.js";
|
|
4
|
+
import {
|
|
5
|
+
bootstrapOptimizationFromAccumulatedTrajectories,
|
|
6
|
+
registerTrainingTriggerService
|
|
7
|
+
} from "./services/training-trigger.js";
|
|
8
|
+
function trainingCronRegistrationDisabled() {
|
|
9
|
+
const raw = process.env.ELIZA_DISABLE_TRAINING_CRONS;
|
|
10
|
+
if (!raw) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
return ["1", "true", "yes"].includes(raw.trim().toLowerCase());
|
|
14
|
+
}
|
|
15
|
+
async function registerTrainingRuntimeHooks(runtime) {
|
|
16
|
+
try {
|
|
17
|
+
let optimizedPromptService = await runtime.getServiceLoadPromise(OptimizedPromptService.serviceType).catch(() => null);
|
|
18
|
+
if (!optimizedPromptService) {
|
|
19
|
+
await runtime.registerService(
|
|
20
|
+
OptimizedPromptService
|
|
21
|
+
);
|
|
22
|
+
optimizedPromptService = await runtime.getServiceLoadPromise(
|
|
23
|
+
OptimizedPromptService.serviceType
|
|
24
|
+
);
|
|
25
|
+
}
|
|
26
|
+
logger.info(
|
|
27
|
+
"[eliza] Registered OptimizedPromptService (action_planner / media_description / etc. will pick up artifacts from <stateDir>/optimized-prompts/)"
|
|
28
|
+
);
|
|
29
|
+
} catch (err) {
|
|
30
|
+
logger.warn(
|
|
31
|
+
`[eliza] OptimizedPromptService registration failed: ${err instanceof Error ? err.message : String(err)}`
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
const skipCronRegistration = trainingCronRegistrationDisabled();
|
|
35
|
+
if (skipCronRegistration) {
|
|
36
|
+
logger.info("[eliza] Training cron registration skipped");
|
|
37
|
+
} else {
|
|
38
|
+
await registerTrajectoryExportCron(runtime);
|
|
39
|
+
await registerSkillScoringCron(runtime);
|
|
40
|
+
}
|
|
41
|
+
const triggerService = registerTrainingTriggerService(runtime);
|
|
42
|
+
logger.info(
|
|
43
|
+
skipCronRegistration ? "[eliza] Registered Track C auto-train trigger service" : "[eliza] Registered Track C training crons + auto-train trigger service"
|
|
44
|
+
);
|
|
45
|
+
void bootstrapOptimizationFromAccumulatedTrajectories(runtime, triggerService).then((fired) => {
|
|
46
|
+
if (fired.length > 0) {
|
|
47
|
+
logger.info(
|
|
48
|
+
`[eliza] Bootstrapped prompt optimization for ${fired.join(", ")}`
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
}).catch((err) => {
|
|
52
|
+
logger.error(
|
|
53
|
+
`[eliza] bootstrapOptimizationFromAccumulatedTrajectories failed: ${err instanceof Error ? err.stack ?? err.message : String(err)}`
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
export {
|
|
58
|
+
registerTrainingRuntimeHooks
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=register-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/register-runtime.ts"],"sourcesContent":["import type { AgentRuntime, Service } from \"@elizaos/core\";\nimport { logger, OptimizedPromptService } from \"@elizaos/core\";\nimport { registerSkillScoringCron } from \"./core/skill-scoring-cron.js\";\nimport { registerTrajectoryExportCron } from \"./core/trajectory-export-cron.js\";\nimport {\n bootstrapOptimizationFromAccumulatedTrajectories,\n registerTrainingTriggerService,\n} from \"./services/training-trigger.js\";\n\nfunction trainingCronRegistrationDisabled(): boolean {\n const raw = process.env.ELIZA_DISABLE_TRAINING_CRONS;\n if (!raw) {\n return false;\n }\n return [\"1\", \"true\", \"yes\"].includes(raw.trim().toLowerCase());\n}\n\nexport async function registerTrainingRuntimeHooks(\n runtime: AgentRuntime,\n): Promise<void> {\n // Register the OptimizedPromptService so the planner-loop + media handler\n // can pick up artifacts written by `bun run train -- --backend native`\n // (or by the in-runtime trigger service) without operator intervention.\n // Without this, runtime.getService(OPTIMIZED_PROMPT_SERVICE) always\n // returns null and the optimized prompt is never substituted in.\n try {\n let optimizedPromptService: Service | null = await runtime\n .getServiceLoadPromise(OptimizedPromptService.serviceType)\n .catch(() => null);\n if (!optimizedPromptService) {\n await runtime.registerService(\n OptimizedPromptService as Parameters<\n typeof runtime.registerService\n >[0],\n );\n optimizedPromptService = await runtime.getServiceLoadPromise(\n OptimizedPromptService.serviceType,\n );\n }\n logger.info(\n \"[eliza] Registered OptimizedPromptService (action_planner / media_description / etc. will pick up artifacts from <stateDir>/optimized-prompts/)\",\n );\n } catch (err) {\n logger.warn(\n `[eliza] OptimizedPromptService registration failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n const skipCronRegistration = trainingCronRegistrationDisabled();\n if (skipCronRegistration) {\n logger.info(\"[eliza] Training cron registration skipped\");\n } else {\n await registerTrajectoryExportCron(runtime);\n await registerSkillScoringCron(runtime);\n }\n const triggerService = registerTrainingTriggerService(runtime);\n logger.info(\n skipCronRegistration\n ? \"[eliza] Registered Track C auto-train trigger service\"\n : \"[eliza] Registered Track C training crons + auto-train trigger service\",\n );\n\n void bootstrapOptimizationFromAccumulatedTrajectories(runtime, triggerService)\n .then((fired) => {\n if (fired.length > 0) {\n logger.info(\n `[eliza] Bootstrapped prompt optimization for ${fired.join(\", \")}`,\n );\n }\n })\n .catch((err) => {\n logger.error(\n `[eliza] bootstrapOptimizationFromAccumulatedTrajectories failed: ${err instanceof Error ? (err.stack ?? err.message) : String(err)}`,\n );\n });\n}\n"],"mappings":"AACA,SAAS,QAAQ,8BAA8B;AAC/C,SAAS,gCAAgC;AACzC,SAAS,oCAAoC;AAC7C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAEP,SAAS,mCAA4C;AACnD,QAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,SAAO,CAAC,KAAK,QAAQ,KAAK,EAAE,SAAS,IAAI,KAAK,EAAE,YAAY,CAAC;AAC/D;AAEA,eAAsB,6BACpB,SACe;AAMf,MAAI;AACF,QAAI,yBAAyC,MAAM,QAChD,sBAAsB,uBAAuB,WAAW,EACxD,MAAM,MAAM,IAAI;AACnB,QAAI,CAAC,wBAAwB;AAC3B,YAAM,QAAQ;AAAA,QACZ;AAAA,MAGF;AACA,+BAAyB,MAAM,QAAQ;AAAA,QACrC,uBAAuB;AAAA,MACzB;AAAA,IACF;AACA,WAAO;AAAA,MACL;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,WAAO;AAAA,MACL,uDAAuD,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,IACzG;AAAA,EACF;AAEA,QAAM,uBAAuB,iCAAiC;AAC9D,MAAI,sBAAsB;AACxB,WAAO,KAAK,4CAA4C;AAAA,EAC1D,OAAO;AACL,UAAM,6BAA6B,OAAO;AAC1C,UAAM,yBAAyB,OAAO;AAAA,EACxC;AACA,QAAM,iBAAiB,+BAA+B,OAAO;AAC7D,SAAO;AAAA,IACL,uBACI,0DACA;AAAA,EACN;AAEA,OAAK,iDAAiD,SAAS,cAAc,EAC1E,KAAK,CAAC,UAAU;AACf,QAAI,MAAM,SAAS,GAAG;AACpB,aAAO;AAAA,QACL,gDAAgD,MAAM,KAAK,IAAI,CAAC;AAAA,MAClE;AAAA,IACF;AAAA,EACF,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,WAAO;AAAA,MACL,oEAAoE,eAAe,QAAS,IAAI,SAAS,IAAI,UAAW,OAAO,GAAG,CAAC;AAAA,IACrI;AAAA,EACF,CAAC;AACL;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register the training view for terminal rendering.
|
|
3
|
+
*
|
|
4
|
+
* The agent terminal mounts plugin views by id from the `@elizaos/tui` terminal
|
|
5
|
+
* registry. This makes the `training` view's `tui` modality render for real in
|
|
6
|
+
* the terminal (the unified {@link FineTuningSpatialView}) rather than only
|
|
7
|
+
* navigating a GUI shell. A module-level snapshot lets a host push the live
|
|
8
|
+
* training state; with no host it defaults to an empty snapshot.
|
|
9
|
+
*/
|
|
10
|
+
import { type FineTuningSnapshot } from "./ui/FineTuningSpatialView.tsx";
|
|
11
|
+
/** Update the snapshot the registered terminal view renders from. */
|
|
12
|
+
export declare function setFineTuningTerminalSnapshot(next: FineTuningSnapshot): void;
|
|
13
|
+
/** Register the training terminal view; returns an unregister function. */
|
|
14
|
+
export declare function registerFineTuningTerminalView(): () => void;
|
|
15
|
+
//# sourceMappingURL=register-terminal-view.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-terminal-view.d.ts","sourceRoot":"","sources":["../src/register-terminal-view.tsx"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EACL,KAAK,kBAAkB,EAExB,MAAM,gCAAgC,CAAC;AAexC,qEAAqE;AACrE,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,kBAAkB,GAAG,IAAI,CAE5E;AAED,2EAA2E;AAC3E,wBAAgB,8BAA8B,IAAI,MAAM,IAAI,CAI3D"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { registerSpatialTerminalView } from "@elizaos/ui/spatial/tui";
|
|
2
|
+
import { createElement } from "react";
|
|
3
|
+
import {
|
|
4
|
+
FineTuningSpatialView
|
|
5
|
+
} from "./ui/FineTuningSpatialView.js";
|
|
6
|
+
const EMPTY = {
|
|
7
|
+
runtimeAvailable: false,
|
|
8
|
+
runningJobs: 0,
|
|
9
|
+
queuedJobs: 0,
|
|
10
|
+
completedJobs: 0,
|
|
11
|
+
failedJobs: 0,
|
|
12
|
+
jobs: [],
|
|
13
|
+
models: 0,
|
|
14
|
+
datasets: 0,
|
|
15
|
+
trajectoryCount: 0
|
|
16
|
+
};
|
|
17
|
+
let current = EMPTY;
|
|
18
|
+
function setFineTuningTerminalSnapshot(next) {
|
|
19
|
+
current = next;
|
|
20
|
+
}
|
|
21
|
+
function registerFineTuningTerminalView() {
|
|
22
|
+
return registerSpatialTerminalView(
|
|
23
|
+
"training",
|
|
24
|
+
() => createElement(FineTuningSpatialView, { snapshot: current })
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
registerFineTuningTerminalView,
|
|
29
|
+
setFineTuningTerminalSnapshot
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=register-terminal-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/register-terminal-view.tsx"],"sourcesContent":["/**\n * Register the training view for terminal rendering.\n *\n * The agent terminal mounts plugin views by id from the `@elizaos/tui` terminal\n * registry. This makes the `training` view's `tui` modality render for real in\n * the terminal (the unified {@link FineTuningSpatialView}) rather than only\n * navigating a GUI shell. A module-level snapshot lets a host push the live\n * training state; with no host it defaults to an empty snapshot.\n */\n\nimport { registerSpatialTerminalView } from \"@elizaos/ui/spatial/tui\";\nimport { createElement } from \"react\";\nimport {\n type FineTuningSnapshot,\n FineTuningSpatialView,\n} from \"./ui/FineTuningSpatialView.js\";\n\nconst EMPTY: FineTuningSnapshot = {\n runtimeAvailable: false,\n runningJobs: 0,\n queuedJobs: 0,\n completedJobs: 0,\n failedJobs: 0,\n jobs: [],\n models: 0,\n datasets: 0,\n trajectoryCount: 0,\n};\nlet current: FineTuningSnapshot = EMPTY;\n\n/** Update the snapshot the registered terminal view renders from. */\nexport function setFineTuningTerminalSnapshot(next: FineTuningSnapshot): void {\n current = next;\n}\n\n/** Register the training terminal view; returns an unregister function. */\nexport function registerFineTuningTerminalView(): () => void {\n return registerSpatialTerminalView(\"training\", () =>\n createElement(FineTuningSpatialView, { snapshot: current }),\n );\n}\n"],"mappings":"AAUA,SAAS,mCAAmC;AAC5C,SAAS,qBAAqB;AAC9B;AAAA,EAEE;AAAA,OACK;AAEP,MAAM,QAA4B;AAAA,EAChC,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,MAAM,CAAC;AAAA,EACP,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AACnB;AACA,IAAI,UAA8B;AAG3B,SAAS,8BAA8B,MAAgC;AAC5E,YAAU;AACZ;AAGO,SAAS,iCAA6C;AAC3D,SAAO;AAAA,IAA4B;AAAA,IAAY,MAC7C,cAAc,uBAAuB,EAAE,UAAU,QAAQ,CAAC;AAAA,EAC5D;AACF;","names":[]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Experience HTTP routes.
|
|
3
|
+
*
|
|
4
|
+
* Migrated from `packages/agent/src/api/experience-routes.ts` so the experience
|
|
5
|
+
* service surface lives next to the rest of the training/trajectory plumbing.
|
|
6
|
+
*
|
|
7
|
+
* The runtime mounts these routes through the plugin route registry; see
|
|
8
|
+
* `setup-routes.ts` for the registered Plugin and the `rawPath: true` paths.
|
|
9
|
+
*/
|
|
10
|
+
import type { AgentRuntime } from "@elizaos/core";
|
|
11
|
+
import type { RouteRequestContext } from "@elizaos/shared";
|
|
12
|
+
export interface ExperienceRouteContext extends RouteRequestContext {
|
|
13
|
+
runtime: AgentRuntime | null;
|
|
14
|
+
url: URL;
|
|
15
|
+
}
|
|
16
|
+
export declare function handleExperienceRoutes(ctx: ExperienceRouteContext): Promise<boolean>;
|
|
17
|
+
export declare const EXPERIENCE_ROUTE_PATHS: Array<{
|
|
18
|
+
type: string;
|
|
19
|
+
path: string;
|
|
20
|
+
}>;
|
|
21
|
+
//# sourceMappingURL=experience-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"experience-routes.d.ts","sourceRoot":"","sources":["../../src/routes/experience-routes.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAQ,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AA0G3D,MAAM,WAAW,sBAAuB,SAAQ,mBAAmB;IACjE,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,GAAG,CAAC;CACV;AA8ZD,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,sBAAsB,GAC1B,OAAO,CAAC,OAAO,CAAC,CAoLlB;AAED,eAAO,MAAM,sBAAsB,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiBxE,CAAC"}
|