@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,729 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import {
|
|
5
|
+
applyPrivacyFilter
|
|
6
|
+
} from "./privacy-filter.js";
|
|
7
|
+
import {
|
|
8
|
+
gatedPersistNativeResult
|
|
9
|
+
} from "./promotion-persist.js";
|
|
10
|
+
import {
|
|
11
|
+
ALL_TRAINING_TASKS,
|
|
12
|
+
loadTrainingConfig,
|
|
13
|
+
resolveTaskPolicy,
|
|
14
|
+
trainingStateRoot
|
|
15
|
+
} from "./training-config.js";
|
|
16
|
+
import {
|
|
17
|
+
exportTrajectoryTaskDatasets
|
|
18
|
+
} from "./trajectory-task-datasets.js";
|
|
19
|
+
function runsDir() {
|
|
20
|
+
return join(trainingStateRoot(), "runs");
|
|
21
|
+
}
|
|
22
|
+
function newRunId() {
|
|
23
|
+
return `run-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
24
|
+
}
|
|
25
|
+
function nowIso() {
|
|
26
|
+
return (/* @__PURE__ */ new Date()).toISOString();
|
|
27
|
+
}
|
|
28
|
+
const PLANNER_BASELINE = `task: Plan the next native tool calls for the current ContextObject.
|
|
29
|
+
|
|
30
|
+
context_object:
|
|
31
|
+
{{contextObject}}
|
|
32
|
+
|
|
33
|
+
trajectory:
|
|
34
|
+
{{trajectory}}
|
|
35
|
+
|
|
36
|
+
rules:
|
|
37
|
+
- use only tools exposed in the current context object
|
|
38
|
+
- plan the smallest grounded queue of useful tool calls
|
|
39
|
+
- include arguments only when grounded in the user request or prior tool results
|
|
40
|
+
- if the task is complete or the only next step is speaking to the user, return no toolCalls and set messageToUser
|
|
41
|
+
- do not invent tool names, connector names, providers, ids, or benchmark ids
|
|
42
|
+
|
|
43
|
+
return:
|
|
44
|
+
JSON object only. No markdown, no prose, no XML, no legacy formats.`;
|
|
45
|
+
const SHOULD_RESPOND_BASELINE = `task: Decide whether the agent should respond to the current conversation turn.
|
|
46
|
+
|
|
47
|
+
context_object:
|
|
48
|
+
{{contextObject}}
|
|
49
|
+
|
|
50
|
+
trajectory:
|
|
51
|
+
{{trajectory}}
|
|
52
|
+
|
|
53
|
+
rules:
|
|
54
|
+
- choose respond when the user directly addresses the agent, asks for help, or the agent has a useful next action
|
|
55
|
+
- choose ignore for ambient chatter, messages clearly meant for someone else, or turns where responding would add noise
|
|
56
|
+
- choose stop when the conversation is complete or the user asks the agent to stop
|
|
57
|
+
- ground the decision in the provided context and trajectory only
|
|
58
|
+
|
|
59
|
+
return:
|
|
60
|
+
JSON object only with decision ("respond" | "ignore" | "stop") and concise reasoning.`;
|
|
61
|
+
const CONTEXT_ROUTING_BASELINE = `task: Route the current turn to the smallest useful execution context.
|
|
62
|
+
|
|
63
|
+
context_object:
|
|
64
|
+
{{contextObject}}
|
|
65
|
+
|
|
66
|
+
trajectory:
|
|
67
|
+
{{trajectory}}
|
|
68
|
+
|
|
69
|
+
rules:
|
|
70
|
+
- classify whether the turn needs ordinary reply generation, tool planning, memory/context lookup, media analysis, or no action
|
|
71
|
+
- prefer the narrowest context that can satisfy the user request
|
|
72
|
+
- do not invent capabilities that are absent from the context object
|
|
73
|
+
- if the current context is sufficient for a direct answer, keep routing simple
|
|
74
|
+
|
|
75
|
+
return:
|
|
76
|
+
JSON object only with context, requiresTool, candidateAction when grounded, and concise reasoning.`;
|
|
77
|
+
const RESPONSE_BASELINE = `task: Write the final user-facing response for the current turn.
|
|
78
|
+
|
|
79
|
+
context_object:
|
|
80
|
+
{{contextObject}}
|
|
81
|
+
|
|
82
|
+
trajectory:
|
|
83
|
+
{{trajectory}}
|
|
84
|
+
|
|
85
|
+
rules:
|
|
86
|
+
- answer directly using the available trajectory and context
|
|
87
|
+
- include relevant tool outputs or results instead of describing that tools were run
|
|
88
|
+
- be concise, concrete, and honest about any missing or failed evidence
|
|
89
|
+
- do not promise background work after this response
|
|
90
|
+
- do not include private chain-of-thought or implementation-only notes
|
|
91
|
+
|
|
92
|
+
return:
|
|
93
|
+
Natural language response text only.`;
|
|
94
|
+
const MEDIA_DESCRIPTION_BASELINE = `task: Describe the supplied media for downstream agent reasoning.
|
|
95
|
+
|
|
96
|
+
context_object:
|
|
97
|
+
{{contextObject}}
|
|
98
|
+
|
|
99
|
+
trajectory:
|
|
100
|
+
{{trajectory}}
|
|
101
|
+
|
|
102
|
+
rules:
|
|
103
|
+
- identify visible subjects, text, layout, actions, and notable details
|
|
104
|
+
- separate direct observations from uncertain inferences
|
|
105
|
+
- mention safety-relevant, UI-relevant, or task-relevant details when present
|
|
106
|
+
- avoid guessing identities or hidden intent without evidence
|
|
107
|
+
|
|
108
|
+
return:
|
|
109
|
+
JSON object only with summary, observations, text, uncertainty, and taskRelevantDetails.`;
|
|
110
|
+
const VIEW_CONTEXT_BASELINE = `task: Infer which app view fits the user's current situation when they did not name one.
|
|
111
|
+
|
|
112
|
+
context_object:
|
|
113
|
+
{{contextObject}}
|
|
114
|
+
|
|
115
|
+
trajectory:
|
|
116
|
+
{{trajectory}}
|
|
117
|
+
|
|
118
|
+
rules:
|
|
119
|
+
- only choose a view when the message clearly implies an activity that maps to one (e.g. coding work \u2192 task-coordinator, scheduling \u2192 calendar, spending \u2192 finances)
|
|
120
|
+
- return "none" when the message names a view directly (the navigation action handles those) or implies no specific surface
|
|
121
|
+
- never guess; ambiguous or chit-chat turns return "none"
|
|
122
|
+
|
|
123
|
+
return:
|
|
124
|
+
JSON object only with viewId (a registered view id or "none") and an optional reason.`;
|
|
125
|
+
const CALENDAR_EXTRACT_BASELINE = `task: Extract a structured calendar event from a natural-language request.
|
|
126
|
+
|
|
127
|
+
request:
|
|
128
|
+
{{request}}
|
|
129
|
+
|
|
130
|
+
rules:
|
|
131
|
+
- resolve relative dates/times against the owner's current local time
|
|
132
|
+
- infer end time from a stated duration; default to a 30-minute event when none is given
|
|
133
|
+
- only include attendees explicitly named in the request
|
|
134
|
+
|
|
135
|
+
return:
|
|
136
|
+
JSON object only: { title, start (ISO 8601), end (ISO 8601), recurrence (RRULE or null), attendees (array), location (string or null) }.`;
|
|
137
|
+
const SCHEDULE_PLAN_BASELINE = `task: Order the owner's pending commitments into a concrete plan for the available time.
|
|
138
|
+
|
|
139
|
+
commitments:
|
|
140
|
+
{{commitments}}
|
|
141
|
+
|
|
142
|
+
free_slots:
|
|
143
|
+
{{freeSlots}}
|
|
144
|
+
|
|
145
|
+
rules:
|
|
146
|
+
- never double-book a slot; respect hard deadlines and fixed-time events first
|
|
147
|
+
- keep travel/buffer time between location-bound items
|
|
148
|
+
- surface anything that does not fit rather than silently dropping it
|
|
149
|
+
|
|
150
|
+
return:
|
|
151
|
+
JSON object only: { schedule: [{ itemId, start, end }], unplaced: [itemId], notes }.`;
|
|
152
|
+
const REMINDER_DISPATCH_BASELINE = `task: Decide whether to fire a reminder now and compose its message.
|
|
153
|
+
|
|
154
|
+
reminder:
|
|
155
|
+
{{reminder}}
|
|
156
|
+
|
|
157
|
+
context:
|
|
158
|
+
{{context}}
|
|
159
|
+
|
|
160
|
+
rules:
|
|
161
|
+
- only fire when the trigger condition is met; otherwise return shouldFire false
|
|
162
|
+
- write a short, specific message in the owner's voice; no filler
|
|
163
|
+
- escalate channel only when the reminder is overdue or marked urgent
|
|
164
|
+
|
|
165
|
+
return:
|
|
166
|
+
JSON object only: { shouldFire (boolean), channel, message }.`;
|
|
167
|
+
const INBOX_TRIAGE_BASELINE = `task: Classify one inbox message for the owner.
|
|
168
|
+
|
|
169
|
+
message:
|
|
170
|
+
{{message}}
|
|
171
|
+
|
|
172
|
+
rules:
|
|
173
|
+
- category must be one of ignore, info, notify, needs_reply, urgent
|
|
174
|
+
- urgency must be low, medium, or high
|
|
175
|
+
- use needs_reply when someone asks a question or expects a response
|
|
176
|
+
- use urgent only for time-sensitive or critical owner attention
|
|
177
|
+
|
|
178
|
+
return:
|
|
179
|
+
JSON object only: { category, urgency, confidence, reasoning, suggestedResponse }.`;
|
|
180
|
+
const MEETING_PREP_BASELINE = `task: Produce a concise prebrief for an upcoming meeting.
|
|
181
|
+
|
|
182
|
+
meeting:
|
|
183
|
+
{{meeting}}
|
|
184
|
+
|
|
185
|
+
context:
|
|
186
|
+
{{context}}
|
|
187
|
+
|
|
188
|
+
rules:
|
|
189
|
+
- lead with the meeting's purpose and the owner's desired outcome
|
|
190
|
+
- include only attendees and prior-thread facts that matter for this meeting
|
|
191
|
+
- keep talking points actionable; no generic advice
|
|
192
|
+
|
|
193
|
+
return:
|
|
194
|
+
JSON object only: { purpose, attendees: [{ name, note }], agenda: [string], talkingPoints: [string] }.`;
|
|
195
|
+
const MORNING_BRIEF_BASELINE = `task: Compose the owner's morning brief.
|
|
196
|
+
|
|
197
|
+
calendar:
|
|
198
|
+
{{calendar}}
|
|
199
|
+
|
|
200
|
+
tasks:
|
|
201
|
+
{{tasks}}
|
|
202
|
+
|
|
203
|
+
inbox:
|
|
204
|
+
{{inbox}}
|
|
205
|
+
|
|
206
|
+
rules:
|
|
207
|
+
- lead with the single most important thing for the day
|
|
208
|
+
- group by calendar, then must-do tasks, then inbox items needing a reply
|
|
209
|
+
- be brief and scannable; no greetings or filler
|
|
210
|
+
|
|
211
|
+
return:
|
|
212
|
+
Markdown brief only.`;
|
|
213
|
+
const HEALTH_CHECKIN_BASELINE = `task: Generate a health/sleep check-in for the owner.
|
|
214
|
+
|
|
215
|
+
signals:
|
|
216
|
+
{{signals}}
|
|
217
|
+
|
|
218
|
+
rules:
|
|
219
|
+
- ground every observation in a provided signal; never fabricate metrics
|
|
220
|
+
- ask at most one follow-up question, and only when a signal is missing or anomalous
|
|
221
|
+
- keep an encouraging, non-clinical tone
|
|
222
|
+
|
|
223
|
+
return:
|
|
224
|
+
JSON object only: { observation, question (string or null), suggestion }.`;
|
|
225
|
+
const SCREENTIME_RECAP_BASELINE = `task: Summarize the owner's screen-time and propose a focus adjustment.
|
|
226
|
+
|
|
227
|
+
usage:
|
|
228
|
+
{{usage}}
|
|
229
|
+
|
|
230
|
+
rules:
|
|
231
|
+
- highlight the largest changes vs. the prior period, not raw totals alone
|
|
232
|
+
- tie any suggestion to an actual usage pattern in the data
|
|
233
|
+
- propose at most one concrete blocker/focus change
|
|
234
|
+
|
|
235
|
+
return:
|
|
236
|
+
JSON object only: { recap, topApps: [{ app, minutes }], suggestion }.`;
|
|
237
|
+
function defaultBaselineForTask(task) {
|
|
238
|
+
switch (task) {
|
|
239
|
+
case "should_respond":
|
|
240
|
+
return SHOULD_RESPOND_BASELINE;
|
|
241
|
+
case "context_routing":
|
|
242
|
+
return CONTEXT_ROUTING_BASELINE;
|
|
243
|
+
case "action_planner":
|
|
244
|
+
return PLANNER_BASELINE;
|
|
245
|
+
case "response":
|
|
246
|
+
return RESPONSE_BASELINE;
|
|
247
|
+
case "media_description":
|
|
248
|
+
return MEDIA_DESCRIPTION_BASELINE;
|
|
249
|
+
case "view_context":
|
|
250
|
+
return VIEW_CONTEXT_BASELINE;
|
|
251
|
+
case "calendar_extract":
|
|
252
|
+
return CALENDAR_EXTRACT_BASELINE;
|
|
253
|
+
case "schedule_plan":
|
|
254
|
+
return SCHEDULE_PLAN_BASELINE;
|
|
255
|
+
case "reminder_dispatch":
|
|
256
|
+
return REMINDER_DISPATCH_BASELINE;
|
|
257
|
+
case "inbox_triage":
|
|
258
|
+
return INBOX_TRIAGE_BASELINE;
|
|
259
|
+
case "meeting_prep":
|
|
260
|
+
return MEETING_PREP_BASELINE;
|
|
261
|
+
case "morning_brief":
|
|
262
|
+
return MORNING_BRIEF_BASELINE;
|
|
263
|
+
case "health_checkin":
|
|
264
|
+
return HEALTH_CHECKIN_BASELINE;
|
|
265
|
+
case "screentime_recap":
|
|
266
|
+
return SCREENTIME_RECAP_BASELINE;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
function firstStringExport(promptModule, names) {
|
|
270
|
+
for (const name of names) {
|
|
271
|
+
const value = promptModule[name];
|
|
272
|
+
if (typeof value === "string" && value.trim().length > 0) {
|
|
273
|
+
return value;
|
|
274
|
+
}
|
|
275
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) {
|
|
276
|
+
const joined = value.join("\n").trim();
|
|
277
|
+
if (joined.length > 0) {
|
|
278
|
+
return joined;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
return null;
|
|
283
|
+
}
|
|
284
|
+
async function importOptionalModule(specifier) {
|
|
285
|
+
try {
|
|
286
|
+
const imported = await import(specifier);
|
|
287
|
+
return imported;
|
|
288
|
+
} catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
async function loadFirstStringExport(specifier, names, sourceSpecifier) {
|
|
293
|
+
if (sourceSpecifier) {
|
|
294
|
+
const sourceUrl = new URL(sourceSpecifier, import.meta.url);
|
|
295
|
+
const sourceModule = await importOptionalModule(sourceUrl.href);
|
|
296
|
+
const sourceExported = sourceModule ? firstStringExport(sourceModule, names) : null;
|
|
297
|
+
if (sourceExported) {
|
|
298
|
+
return sourceExported;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
const promptModule = await importOptionalModule(specifier);
|
|
302
|
+
return promptModule ? firstStringExport(promptModule, names) : null;
|
|
303
|
+
}
|
|
304
|
+
async function loadLiveLifeOpsBaseline(task) {
|
|
305
|
+
switch (task) {
|
|
306
|
+
case "calendar_extract":
|
|
307
|
+
return loadFirstStringExport(
|
|
308
|
+
"@elizaos/plugin-calendar/actions/optimized-prompt-instructions",
|
|
309
|
+
["CALENDAR_PLAN_INSTRUCTIONS"],
|
|
310
|
+
"../../../plugin-calendar/src/actions/optimized-prompt-instructions.ts"
|
|
311
|
+
);
|
|
312
|
+
case "schedule_plan":
|
|
313
|
+
return loadFirstStringExport(
|
|
314
|
+
"@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
|
|
315
|
+
["SCHEDULE_PLAN_INSTRUCTIONS"],
|
|
316
|
+
"../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
|
|
317
|
+
);
|
|
318
|
+
case "reminder_dispatch":
|
|
319
|
+
return loadFirstStringExport(
|
|
320
|
+
"@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
|
|
321
|
+
["REMINDER_DISPATCH_INSTRUCTIONS"],
|
|
322
|
+
"../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
|
|
323
|
+
);
|
|
324
|
+
case "inbox_triage":
|
|
325
|
+
return loadFirstStringExport(
|
|
326
|
+
"@elizaos/plugin-inbox/inbox/triage-classifier",
|
|
327
|
+
["INBOX_TRIAGE_INSTRUCTIONS"],
|
|
328
|
+
"../../../plugin-inbox/src/inbox/triage-classifier.ts"
|
|
329
|
+
);
|
|
330
|
+
case "meeting_prep":
|
|
331
|
+
return loadFirstStringExport(
|
|
332
|
+
"@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
|
|
333
|
+
["MEETING_PREP_INSTRUCTIONS"],
|
|
334
|
+
"../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
|
|
335
|
+
);
|
|
336
|
+
case "morning_brief":
|
|
337
|
+
return loadFirstStringExport(
|
|
338
|
+
"@elizaos/plugin-personal-assistant/lifeops/optimized-prompt-instructions",
|
|
339
|
+
["BRIEF_NARRATIVE_INSTRUCTIONS"],
|
|
340
|
+
"../../../plugin-personal-assistant/src/lifeops/optimized-prompt-instructions.ts"
|
|
341
|
+
);
|
|
342
|
+
case "health_checkin":
|
|
343
|
+
return loadFirstStringExport(
|
|
344
|
+
"@elizaos/plugin-health/actions/optimized-prompt-instructions",
|
|
345
|
+
["HEALTH_PLAN_INSTRUCTIONS"],
|
|
346
|
+
"../../../plugin-health/src/actions/optimized-prompt-instructions.ts"
|
|
347
|
+
);
|
|
348
|
+
case "screentime_recap":
|
|
349
|
+
return loadFirstStringExport(
|
|
350
|
+
"@elizaos/plugin-health/actions/optimized-prompt-instructions",
|
|
351
|
+
["SCREENTIME_RECAP_INSTRUCTIONS"],
|
|
352
|
+
"../../../plugin-health/src/actions/optimized-prompt-instructions.ts"
|
|
353
|
+
);
|
|
354
|
+
default:
|
|
355
|
+
return null;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
function pathForTask(paths, task) {
|
|
359
|
+
switch (task) {
|
|
360
|
+
case "should_respond":
|
|
361
|
+
return paths.shouldRespondPath;
|
|
362
|
+
case "context_routing":
|
|
363
|
+
return paths.contextRoutingPath;
|
|
364
|
+
case "action_planner":
|
|
365
|
+
return paths.actionPlannerPath;
|
|
366
|
+
case "response":
|
|
367
|
+
return paths.responsePath;
|
|
368
|
+
case "media_description":
|
|
369
|
+
return paths.mediaDescriptionPath;
|
|
370
|
+
case "view_context":
|
|
371
|
+
return paths.viewContextPath;
|
|
372
|
+
case "calendar_extract":
|
|
373
|
+
return paths.calendarExtractPath;
|
|
374
|
+
case "schedule_plan":
|
|
375
|
+
return paths.schedulePlanPath;
|
|
376
|
+
case "reminder_dispatch":
|
|
377
|
+
return paths.reminderDispatchPath;
|
|
378
|
+
case "inbox_triage":
|
|
379
|
+
return paths.inboxTriagePath;
|
|
380
|
+
case "meeting_prep":
|
|
381
|
+
return paths.meetingPrepPath;
|
|
382
|
+
case "morning_brief":
|
|
383
|
+
return paths.morningBriefPath;
|
|
384
|
+
case "health_checkin":
|
|
385
|
+
return paths.healthCheckinPath;
|
|
386
|
+
case "screentime_recap":
|
|
387
|
+
return paths.screentimeRecapPath;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
function selectTask(config, explicit, counts) {
|
|
391
|
+
if (explicit) return explicit;
|
|
392
|
+
let bestTask = null;
|
|
393
|
+
let bestCount = 0;
|
|
394
|
+
for (const task of ALL_TRAINING_TASKS) {
|
|
395
|
+
const policy = resolveTaskPolicy(config, task);
|
|
396
|
+
const count = counts[task];
|
|
397
|
+
if (count > bestCount && count >= policy.threshold) {
|
|
398
|
+
bestCount = count;
|
|
399
|
+
bestTask = task;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
return bestTask;
|
|
403
|
+
}
|
|
404
|
+
async function defaultDispatcher(input) {
|
|
405
|
+
switch (input.backend) {
|
|
406
|
+
case "native": {
|
|
407
|
+
const { runNativeBackend } = await import("../backends/native.js");
|
|
408
|
+
const useModelHandler = await extractUseModel(input.runtime);
|
|
409
|
+
if (!useModelHandler) {
|
|
410
|
+
return {
|
|
411
|
+
invoked: false,
|
|
412
|
+
notes: [
|
|
413
|
+
"native backend requires a runtime exposing useModel; skipped"
|
|
414
|
+
]
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
const baselinePrompt = await loadBaselineForTask(input.task);
|
|
418
|
+
const optimizerName = process.env.TRAIN_OPTIMIZER?.trim() ?? "gepa";
|
|
419
|
+
const result = await runNativeBackend({
|
|
420
|
+
datasetPath: input.datasetPath,
|
|
421
|
+
task: input.task,
|
|
422
|
+
optimizer: optimizerName,
|
|
423
|
+
baselinePrompt,
|
|
424
|
+
runtime: { useModel: useModelHandler }
|
|
425
|
+
});
|
|
426
|
+
const notes = [...result.notes];
|
|
427
|
+
if (!result.invoked) {
|
|
428
|
+
return { invoked: false, notes };
|
|
429
|
+
}
|
|
430
|
+
const service = getOptimizedPromptService(input.runtime);
|
|
431
|
+
if (!service) {
|
|
432
|
+
notes.push(
|
|
433
|
+
"OptimizedPromptService unavailable; artifact not persisted"
|
|
434
|
+
);
|
|
435
|
+
return { invoked: true, notes };
|
|
436
|
+
}
|
|
437
|
+
return await gatedPersistNativeResult({
|
|
438
|
+
task: input.task,
|
|
439
|
+
datasetPath: input.datasetPath,
|
|
440
|
+
runId: input.runId,
|
|
441
|
+
baselinePrompt,
|
|
442
|
+
result,
|
|
443
|
+
service,
|
|
444
|
+
notesPrefix: notes
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
async function extractUseModel(runtime) {
|
|
450
|
+
const trainProvider = process.env.TRAIN_MODEL_PROVIDER?.trim() ?? process.env.TRAINING_PROVIDER?.trim();
|
|
451
|
+
if (trainProvider === "cerebras") {
|
|
452
|
+
const { getTrainingUseModelAdapter } = await import("./cerebras-eval-model.js");
|
|
453
|
+
return getTrainingUseModelAdapter();
|
|
454
|
+
}
|
|
455
|
+
const candidate = runtime;
|
|
456
|
+
if (typeof candidate.useModel !== "function") return null;
|
|
457
|
+
return async (input) => {
|
|
458
|
+
return await candidate.useModel?.("TEXT_LARGE", input);
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
function getOptimizedPromptService(runtime) {
|
|
462
|
+
const service = runtime.getService(
|
|
463
|
+
"optimized_prompt"
|
|
464
|
+
);
|
|
465
|
+
if (!service || typeof service.setPrompt !== "function") return null;
|
|
466
|
+
return service;
|
|
467
|
+
}
|
|
468
|
+
async function loadBaselineForTask(task) {
|
|
469
|
+
const prompts = await import("@elizaos/core").catch(() => null);
|
|
470
|
+
if (!prompts) {
|
|
471
|
+
return defaultBaselineForTask(task);
|
|
472
|
+
}
|
|
473
|
+
const promptModule = prompts;
|
|
474
|
+
switch (task) {
|
|
475
|
+
case "should_respond":
|
|
476
|
+
return firstStringExport(promptModule, [
|
|
477
|
+
"shouldRespondTemplate",
|
|
478
|
+
"messageHandlerTemplate"
|
|
479
|
+
]) ?? defaultBaselineForTask(task);
|
|
480
|
+
case "context_routing":
|
|
481
|
+
return firstStringExport(promptModule, [
|
|
482
|
+
"messageHandlerTemplate",
|
|
483
|
+
"shouldRespondTemplate"
|
|
484
|
+
]) ?? defaultBaselineForTask(task);
|
|
485
|
+
case "response":
|
|
486
|
+
return firstStringExport(promptModule, [
|
|
487
|
+
"messageHandlerTemplate",
|
|
488
|
+
"replyTemplate"
|
|
489
|
+
]) ?? defaultBaselineForTask(task);
|
|
490
|
+
case "action_planner":
|
|
491
|
+
return firstStringExport(promptModule, [
|
|
492
|
+
"plannerTemplate",
|
|
493
|
+
"PLANNER_TEMPLATE"
|
|
494
|
+
]) ?? PLANNER_BASELINE;
|
|
495
|
+
case "media_description":
|
|
496
|
+
return firstStringExport(promptModule, [
|
|
497
|
+
"imageDescriptionTemplate",
|
|
498
|
+
"IMAGE_DESCRIPTION_TEMPLATE"
|
|
499
|
+
]) ?? defaultBaselineForTask(task);
|
|
500
|
+
case "view_context":
|
|
501
|
+
return defaultBaselineForTask(task);
|
|
502
|
+
case "calendar_extract":
|
|
503
|
+
case "schedule_plan":
|
|
504
|
+
case "reminder_dispatch":
|
|
505
|
+
case "inbox_triage":
|
|
506
|
+
case "meeting_prep":
|
|
507
|
+
case "morning_brief":
|
|
508
|
+
case "health_checkin":
|
|
509
|
+
case "screentime_recap": {
|
|
510
|
+
const liveBaseline = await loadLiveLifeOpsBaseline(task);
|
|
511
|
+
return liveBaseline ?? defaultBaselineForTask(task);
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
async function recordRun(record) {
|
|
516
|
+
const dir = runsDir();
|
|
517
|
+
await mkdir(dir, { recursive: true });
|
|
518
|
+
const path = join(dir, `${record.runId}.json`);
|
|
519
|
+
await writeFile(path, `${JSON.stringify(record, null, 2)}
|
|
520
|
+
`, "utf-8");
|
|
521
|
+
return path;
|
|
522
|
+
}
|
|
523
|
+
async function loadRun(runId) {
|
|
524
|
+
const path = join(runsDir(), `${runId}.json`);
|
|
525
|
+
if (!existsSync(path)) return null;
|
|
526
|
+
const raw = await readFile(path, "utf-8");
|
|
527
|
+
return JSON.parse(raw);
|
|
528
|
+
}
|
|
529
|
+
async function listRuns(limit = 20) {
|
|
530
|
+
const dir = runsDir();
|
|
531
|
+
if (!existsSync(dir)) return [];
|
|
532
|
+
const entries = await readdir(dir);
|
|
533
|
+
const runFiles = entries.filter((name) => name.endsWith(".json"));
|
|
534
|
+
runFiles.sort((a, b) => a < b ? 1 : -1);
|
|
535
|
+
const sliced = runFiles.slice(0, Math.max(0, limit));
|
|
536
|
+
const records = [];
|
|
537
|
+
for (const file of sliced) {
|
|
538
|
+
const raw = await readFile(join(dir, file), "utf-8");
|
|
539
|
+
records.push(JSON.parse(raw));
|
|
540
|
+
}
|
|
541
|
+
return records;
|
|
542
|
+
}
|
|
543
|
+
async function triggerTraining(runtime, options) {
|
|
544
|
+
const runId = newRunId();
|
|
545
|
+
const startedAt = nowIso();
|
|
546
|
+
const log = runtime.logger ?? {
|
|
547
|
+
info: () => {
|
|
548
|
+
},
|
|
549
|
+
warn: () => {
|
|
550
|
+
},
|
|
551
|
+
error: () => {
|
|
552
|
+
}
|
|
553
|
+
};
|
|
554
|
+
const config = options.config ?? loadTrainingConfig();
|
|
555
|
+
const trajectoryService = runtime.getService(
|
|
556
|
+
"trajectories"
|
|
557
|
+
);
|
|
558
|
+
if (!trajectoryService || typeof trajectoryService.listTrajectories !== "function" || typeof trajectoryService.getTrajectoryDetail !== "function") {
|
|
559
|
+
const finishedAt2 = nowIso();
|
|
560
|
+
const record2 = {
|
|
561
|
+
runId,
|
|
562
|
+
status: "skipped",
|
|
563
|
+
reason: "trajectories service unavailable",
|
|
564
|
+
task: options.task ?? null,
|
|
565
|
+
backend: options.backend ?? null,
|
|
566
|
+
source: options.source,
|
|
567
|
+
datasetSize: 0,
|
|
568
|
+
startedAt,
|
|
569
|
+
finishedAt: finishedAt2,
|
|
570
|
+
pulledTrajectories: 0,
|
|
571
|
+
filteredTrajectories: 0,
|
|
572
|
+
redactionCount: 0,
|
|
573
|
+
anonymizationCount: 0,
|
|
574
|
+
dryRun: options.dryRun ?? false
|
|
575
|
+
};
|
|
576
|
+
await recordRun(record2);
|
|
577
|
+
log.warn(
|
|
578
|
+
`[TrainingOrchestrator] ${runId} skipped: trajectories service unavailable`
|
|
579
|
+
);
|
|
580
|
+
return record2;
|
|
581
|
+
}
|
|
582
|
+
const limit = options.trajectoryLimit ?? 500;
|
|
583
|
+
const list = await trajectoryService.listTrajectories({ limit });
|
|
584
|
+
const trajectories = [];
|
|
585
|
+
for (const item of list.trajectories) {
|
|
586
|
+
const detail = await trajectoryService.getTrajectoryDetail(item.id);
|
|
587
|
+
if (detail) trajectories.push(detail);
|
|
588
|
+
}
|
|
589
|
+
const filtered = applyPrivacyFilter(trajectories, {
|
|
590
|
+
anonymizer: options.anonymizer
|
|
591
|
+
});
|
|
592
|
+
const outputDir = join(trainingStateRoot(), "runs", runId, "datasets");
|
|
593
|
+
await mkdir(outputDir, { recursive: true });
|
|
594
|
+
const dataset = await exportTrajectoryTaskDatasets(
|
|
595
|
+
filtered.trajectories,
|
|
596
|
+
outputDir
|
|
597
|
+
);
|
|
598
|
+
const task = selectTask(config, options.task, dataset.counts);
|
|
599
|
+
if (!task) {
|
|
600
|
+
const finishedAt2 = nowIso();
|
|
601
|
+
const record2 = {
|
|
602
|
+
runId,
|
|
603
|
+
status: "skipped",
|
|
604
|
+
reason: "no task reached its trigger threshold and none was specified explicitly",
|
|
605
|
+
task: null,
|
|
606
|
+
backend: options.backend ?? null,
|
|
607
|
+
source: options.source,
|
|
608
|
+
datasetSize: 0,
|
|
609
|
+
startedAt,
|
|
610
|
+
finishedAt: finishedAt2,
|
|
611
|
+
pulledTrajectories: trajectories.length,
|
|
612
|
+
filteredTrajectories: filtered.trajectories.length,
|
|
613
|
+
redactionCount: filtered.redactionCount,
|
|
614
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
615
|
+
datasetPaths: dataset.paths,
|
|
616
|
+
perTaskCounts: dataset.counts,
|
|
617
|
+
dryRun: options.dryRun ?? false
|
|
618
|
+
};
|
|
619
|
+
await recordRun(record2);
|
|
620
|
+
log.info(
|
|
621
|
+
`[TrainingOrchestrator] ${runId} skipped: no task selected (counts=${JSON.stringify(dataset.counts)})`
|
|
622
|
+
);
|
|
623
|
+
return record2;
|
|
624
|
+
}
|
|
625
|
+
const policy = resolveTaskPolicy(config, task);
|
|
626
|
+
const backend = options.backend ?? policy.backend;
|
|
627
|
+
const datasetPath = pathForTask(dataset.paths, task);
|
|
628
|
+
const datasetSize = dataset.counts[task];
|
|
629
|
+
if (!backend) {
|
|
630
|
+
const finishedAt2 = nowIso();
|
|
631
|
+
const record2 = {
|
|
632
|
+
runId,
|
|
633
|
+
status: "skipped",
|
|
634
|
+
reason: "no backend configured",
|
|
635
|
+
task,
|
|
636
|
+
backend: null,
|
|
637
|
+
source: options.source,
|
|
638
|
+
datasetSize,
|
|
639
|
+
startedAt,
|
|
640
|
+
finishedAt: finishedAt2,
|
|
641
|
+
pulledTrajectories: trajectories.length,
|
|
642
|
+
filteredTrajectories: filtered.trajectories.length,
|
|
643
|
+
redactionCount: filtered.redactionCount,
|
|
644
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
645
|
+
datasetPaths: dataset.paths,
|
|
646
|
+
perTaskCounts: dataset.counts,
|
|
647
|
+
dryRun: options.dryRun ?? false,
|
|
648
|
+
notes: [
|
|
649
|
+
"Set training.backends in <state>/training/config.json to enable dispatch."
|
|
650
|
+
]
|
|
651
|
+
};
|
|
652
|
+
await recordRun(record2);
|
|
653
|
+
log.info(
|
|
654
|
+
`[TrainingOrchestrator] ${runId} skipped: no backend configured for task=${task}`
|
|
655
|
+
);
|
|
656
|
+
return record2;
|
|
657
|
+
}
|
|
658
|
+
if (options.dryRun) {
|
|
659
|
+
const finishedAt2 = nowIso();
|
|
660
|
+
const record2 = {
|
|
661
|
+
runId,
|
|
662
|
+
status: "succeeded",
|
|
663
|
+
reason: "dry run",
|
|
664
|
+
task,
|
|
665
|
+
backend,
|
|
666
|
+
source: options.source,
|
|
667
|
+
datasetSize,
|
|
668
|
+
startedAt,
|
|
669
|
+
finishedAt: finishedAt2,
|
|
670
|
+
pulledTrajectories: trajectories.length,
|
|
671
|
+
filteredTrajectories: filtered.trajectories.length,
|
|
672
|
+
redactionCount: filtered.redactionCount,
|
|
673
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
674
|
+
datasetPaths: dataset.paths,
|
|
675
|
+
perTaskCounts: dataset.counts,
|
|
676
|
+
dryRun: true,
|
|
677
|
+
notes: [`dry run; would dispatch ${datasetPath} to backend=${backend}`]
|
|
678
|
+
};
|
|
679
|
+
await recordRun(record2);
|
|
680
|
+
log.info(
|
|
681
|
+
`[TrainingOrchestrator] ${runId} dry-run task=${task} backend=${backend} datasetSize=${datasetSize}`
|
|
682
|
+
);
|
|
683
|
+
return record2;
|
|
684
|
+
}
|
|
685
|
+
const dispatcher = options.dispatcher ?? defaultDispatcher;
|
|
686
|
+
const dispatchResult = await dispatcher({
|
|
687
|
+
task,
|
|
688
|
+
backend,
|
|
689
|
+
datasetPath,
|
|
690
|
+
runId,
|
|
691
|
+
outputDir,
|
|
692
|
+
runtime
|
|
693
|
+
});
|
|
694
|
+
const finishedAt = nowIso();
|
|
695
|
+
const status = dispatchResult.invoked ? "succeeded" : "skipped";
|
|
696
|
+
const record = {
|
|
697
|
+
runId,
|
|
698
|
+
status,
|
|
699
|
+
reason: dispatchResult.invoked ? void 0 : "backend declined to invoke",
|
|
700
|
+
task,
|
|
701
|
+
backend,
|
|
702
|
+
source: options.source,
|
|
703
|
+
datasetSize,
|
|
704
|
+
startedAt,
|
|
705
|
+
finishedAt,
|
|
706
|
+
pulledTrajectories: trajectories.length,
|
|
707
|
+
filteredTrajectories: filtered.trajectories.length,
|
|
708
|
+
redactionCount: filtered.redactionCount,
|
|
709
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
710
|
+
datasetPaths: dataset.paths,
|
|
711
|
+
perTaskCounts: dataset.counts,
|
|
712
|
+
artifactPath: dispatchResult.artifactPath,
|
|
713
|
+
dryRun: false,
|
|
714
|
+
notes: dispatchResult.notes
|
|
715
|
+
};
|
|
716
|
+
await recordRun(record);
|
|
717
|
+
log.info(
|
|
718
|
+
`[TrainingOrchestrator] ${runId} ${status} task=${task} backend=${backend} datasetSize=${datasetSize}`
|
|
719
|
+
);
|
|
720
|
+
return record;
|
|
721
|
+
}
|
|
722
|
+
export {
|
|
723
|
+
listRuns,
|
|
724
|
+
loadBaselineForTask,
|
|
725
|
+
loadRun,
|
|
726
|
+
recordRun,
|
|
727
|
+
triggerTraining
|
|
728
|
+
};
|
|
729
|
+
//# sourceMappingURL=training-orchestrator.js.map
|