@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,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nightly trajectory → training-dataset export cron.
|
|
3
|
+
*
|
|
4
|
+
* Pulls recent trajectories from the runtime's trajectory service, runs them
|
|
5
|
+
* through the privacy filter, then bucketizes them into per-task JSONL files
|
|
6
|
+
* under `<state>/training/datasets/<YYYY-MM-DD>/`.
|
|
7
|
+
*
|
|
8
|
+
* Privacy filter is REQUIRED and runs on every export — both for disk writes
|
|
9
|
+
* and any subsequent cloud upload.
|
|
10
|
+
*/
|
|
11
|
+
import { type AnonymizerLookup } from "./privacy-filter.js";
|
|
12
|
+
import { type HfUploadResult } from "./trajectory-hf-upload.js";
|
|
13
|
+
import { type TrajectoryTaskDatasetExport } from "./trajectory-task-datasets.js";
|
|
14
|
+
interface MinimalLogger {
|
|
15
|
+
info: (message: string) => void;
|
|
16
|
+
warn: (message: string) => void;
|
|
17
|
+
error: (message: string) => void;
|
|
18
|
+
debug: (message: string) => void;
|
|
19
|
+
}
|
|
20
|
+
interface RuntimeLike {
|
|
21
|
+
getService: (name: string) => unknown;
|
|
22
|
+
logger?: MinimalLogger;
|
|
23
|
+
registerEvent?: (name: string, handler: (payload: unknown) => Promise<void>) => void;
|
|
24
|
+
}
|
|
25
|
+
export interface RunNightlyExportOptions {
|
|
26
|
+
trajectoryLimit?: number;
|
|
27
|
+
outputRoot?: string;
|
|
28
|
+
anonymizer?: AnonymizerLookup;
|
|
29
|
+
now?: () => Date;
|
|
30
|
+
}
|
|
31
|
+
export interface NightlyExportReport {
|
|
32
|
+
outputDir: string;
|
|
33
|
+
pulledTrajectories: number;
|
|
34
|
+
keptTrajectories: number;
|
|
35
|
+
droppedTrajectories: number;
|
|
36
|
+
redactionCount: number;
|
|
37
|
+
anonymizationCount: number;
|
|
38
|
+
exportSummary: TrajectoryTaskDatasetExport["summary"];
|
|
39
|
+
exportPaths: TrajectoryTaskDatasetExport["paths"];
|
|
40
|
+
/** Path to the single sanitized sanitized JSONL written alongside the per-task files. */
|
|
41
|
+
sanitizedJsonlPath: string;
|
|
42
|
+
/** Outcome of the HuggingFace upload, when configured. `null` when HF is not configured. */
|
|
43
|
+
huggingFaceUpload: HfUploadResult | null;
|
|
44
|
+
}
|
|
45
|
+
export declare function runNightlyTrajectoryExport(runtime: RuntimeLike, options?: RunNightlyExportOptions): Promise<NightlyExportReport | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Register the nightly trajectory-export job against the agent runtime.
|
|
48
|
+
* Schedule defaults to "0 3 * * *" (03:00 local) so the skill-scoring cron
|
|
49
|
+
* registered at "5 3 * * *" runs after fresh data has landed.
|
|
50
|
+
*/
|
|
51
|
+
export declare function registerTrajectoryExportCron(runtime: RuntimeLike, options?: {
|
|
52
|
+
schedule?: string;
|
|
53
|
+
tz?: string;
|
|
54
|
+
anonymizer?: AnonymizerLookup;
|
|
55
|
+
}): Promise<void>;
|
|
56
|
+
export {};
|
|
57
|
+
//# sourceMappingURL=trajectory-export-cron.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-export-cron.d.ts","sourceRoot":"","sources":["../../src/core/trajectory-export-cron.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAWH,OAAO,EACL,KAAK,gBAAgB,EAItB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAEL,KAAK,2BAA2B,EACjC,MAAM,+BAA+B,CAAC;AAMvC,UAAU,aAAa;IACrB,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,UAAU,WAAW;IACnB,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,aAAa,CAAC,EAAE,CACd,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,KACzC,IAAI,CAAC;CACX;AAoBD,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,2BAA2B,CAAC,SAAS,CAAC,CAAC;IACtD,WAAW,EAAE,2BAA2B,CAAC,OAAO,CAAC,CAAC;IAClD,yFAAyF;IACzF,kBAAkB,EAAE,MAAM,CAAC;IAC3B,4FAA4F;IAC5F,iBAAiB,EAAE,cAAc,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,WAAW,EACpB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CA+HrC;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,gBAAgB,CAAA;CAAE,GAC1E,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { mkdir, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { resolveStateDir } from "@elizaos/core";
|
|
4
|
+
import {
|
|
5
|
+
ensureNamedCronJob,
|
|
6
|
+
registerRuntimeEventOnce
|
|
7
|
+
} from "./ensure-cron-job.js";
|
|
8
|
+
import {
|
|
9
|
+
applyPrivacyFilter,
|
|
10
|
+
createHashAnonymizer
|
|
11
|
+
} from "./privacy-filter.js";
|
|
12
|
+
import {
|
|
13
|
+
resolveHfUploadConfig,
|
|
14
|
+
uploadTrajectoryJsonlToHuggingFace
|
|
15
|
+
} from "./trajectory-hf-upload.js";
|
|
16
|
+
import {
|
|
17
|
+
exportTrajectoryTaskDatasets
|
|
18
|
+
} from "./trajectory-task-datasets.js";
|
|
19
|
+
import { waitForService } from "./wait-for-service.js";
|
|
20
|
+
const EXPORT_EVENT_NAME = "TRACK_C_TRAJECTORY_EXPORT";
|
|
21
|
+
const DEFAULT_TRAJECTORY_LIMIT = 500;
|
|
22
|
+
function todaySegment() {
|
|
23
|
+
const now = /* @__PURE__ */ new Date();
|
|
24
|
+
const y = now.getUTCFullYear();
|
|
25
|
+
const m = String(now.getUTCMonth() + 1).padStart(2, "0");
|
|
26
|
+
const d = String(now.getUTCDate()).padStart(2, "0");
|
|
27
|
+
return `${y}-${m}-${d}`;
|
|
28
|
+
}
|
|
29
|
+
async function runNightlyTrajectoryExport(runtime, options = {}) {
|
|
30
|
+
const log = runtime.logger ?? {
|
|
31
|
+
info: () => {
|
|
32
|
+
},
|
|
33
|
+
warn: () => {
|
|
34
|
+
},
|
|
35
|
+
error: () => {
|
|
36
|
+
},
|
|
37
|
+
debug: () => {
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
const trajectoryService = runtime.getService(
|
|
41
|
+
"trajectories"
|
|
42
|
+
);
|
|
43
|
+
if (!trajectoryService || typeof trajectoryService.listTrajectories !== "function" || typeof trajectoryService.getTrajectoryDetail !== "function") {
|
|
44
|
+
log.warn("[TrajectoryExportCron] trajectories service unavailable");
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const explicitCap = options.trajectoryLimit;
|
|
48
|
+
const items = [];
|
|
49
|
+
let offset = 0;
|
|
50
|
+
let dbTotal;
|
|
51
|
+
while (true) {
|
|
52
|
+
const remaining = explicitCap !== void 0 ? explicitCap - items.length : DEFAULT_TRAJECTORY_LIMIT;
|
|
53
|
+
if (explicitCap !== void 0 && remaining <= 0) break;
|
|
54
|
+
const pageLimit = Math.min(
|
|
55
|
+
DEFAULT_TRAJECTORY_LIMIT,
|
|
56
|
+
Math.max(1, remaining)
|
|
57
|
+
);
|
|
58
|
+
const page = await trajectoryService.listTrajectories({
|
|
59
|
+
limit: pageLimit,
|
|
60
|
+
offset
|
|
61
|
+
});
|
|
62
|
+
if (typeof page.total === "number") dbTotal = page.total;
|
|
63
|
+
const batch = page.trajectories;
|
|
64
|
+
items.push(...batch);
|
|
65
|
+
offset += batch.length;
|
|
66
|
+
if (batch.length < pageLimit || batch.length === 0) break;
|
|
67
|
+
}
|
|
68
|
+
if (explicitCap !== void 0 && typeof dbTotal === "number" && dbTotal > items.length) {
|
|
69
|
+
log.warn(
|
|
70
|
+
`[TrajectoryExportCron] trajectoryLimit=${explicitCap} truncated the export: ${dbTotal - items.length} of ${dbTotal} eligible trajectories were dropped`
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
const trajectories = [];
|
|
74
|
+
for (const item of items) {
|
|
75
|
+
const detail = await trajectoryService.getTrajectoryDetail(item.id);
|
|
76
|
+
if (detail) trajectories.push(detail);
|
|
77
|
+
}
|
|
78
|
+
const filtered = applyPrivacyFilter(trajectories, {
|
|
79
|
+
anonymizer: options.anonymizer ?? createHashAnonymizer()
|
|
80
|
+
});
|
|
81
|
+
const stateDir = options.outputRoot ?? resolveStateDir();
|
|
82
|
+
const outputDir = join(stateDir, "training", "datasets", todaySegment());
|
|
83
|
+
await mkdir(outputDir, { recursive: true });
|
|
84
|
+
const summary = await exportTrajectoryTaskDatasets(
|
|
85
|
+
filtered.trajectories,
|
|
86
|
+
outputDir
|
|
87
|
+
);
|
|
88
|
+
const sanitizedJsonlPath = join(outputDir, "trajectories.sanitized.jsonl");
|
|
89
|
+
const sanitizedJsonl = filtered.trajectories.length === 0 ? "" : `${filtered.trajectories.map((trajectory) => JSON.stringify(trajectory)).join("\n")}
|
|
90
|
+
`;
|
|
91
|
+
await writeFile(sanitizedJsonlPath, sanitizedJsonl);
|
|
92
|
+
let huggingFaceUpload = null;
|
|
93
|
+
const hfConfig = resolveHfUploadConfig();
|
|
94
|
+
if (hfConfig) {
|
|
95
|
+
const pathInRepo = `trajectories/${todaySegment()}.jsonl`;
|
|
96
|
+
huggingFaceUpload = await uploadTrajectoryJsonlToHuggingFace(
|
|
97
|
+
sanitizedJsonlPath,
|
|
98
|
+
pathInRepo,
|
|
99
|
+
hfConfig
|
|
100
|
+
);
|
|
101
|
+
log.info(
|
|
102
|
+
huggingFaceUpload.uploaded ? `[TrajectoryExportCron] uploaded sanitized trajectories to ${hfConfig.repo}/${pathInRepo}` : `[TrajectoryExportCron] HuggingFace upload skipped: ${huggingFaceUpload.error ?? "unknown"}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
log.info(
|
|
106
|
+
`[TrajectoryExportCron] exported ${filtered.trajectories.length} trajectories to ${outputDir} (dropped ${filtered.dropped.length}, redacted ${filtered.redactionCount}, anonymized ${filtered.anonymizationCount})`
|
|
107
|
+
);
|
|
108
|
+
return {
|
|
109
|
+
outputDir,
|
|
110
|
+
pulledTrajectories: trajectories.length,
|
|
111
|
+
keptTrajectories: filtered.trajectories.length,
|
|
112
|
+
droppedTrajectories: filtered.dropped.length,
|
|
113
|
+
redactionCount: filtered.redactionCount,
|
|
114
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
115
|
+
exportSummary: summary.summary,
|
|
116
|
+
exportPaths: summary.paths,
|
|
117
|
+
sanitizedJsonlPath,
|
|
118
|
+
huggingFaceUpload
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
async function registerTrajectoryExportCron(runtime, options) {
|
|
122
|
+
const log = runtime.logger ?? {
|
|
123
|
+
info: () => {
|
|
124
|
+
},
|
|
125
|
+
warn: () => {
|
|
126
|
+
},
|
|
127
|
+
error: () => {
|
|
128
|
+
},
|
|
129
|
+
debug: () => {
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
const cronService = await waitForService(runtime, "CRON", {
|
|
133
|
+
timeoutMs: 2e3
|
|
134
|
+
});
|
|
135
|
+
if (!cronService || typeof cronService.createJob !== "function") {
|
|
136
|
+
log.debug(
|
|
137
|
+
`[TrajectoryExportCron] CRON service not registered; cron not scheduled (run on-demand via ${EXPORT_EVENT_NAME} event)`
|
|
138
|
+
);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
registerRuntimeEventOnce(runtime, EXPORT_EVENT_NAME, async () => {
|
|
142
|
+
await runNightlyTrajectoryExport(runtime, {
|
|
143
|
+
anonymizer: options?.anonymizer
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
const registration = await ensureNamedCronJob(
|
|
147
|
+
cronService,
|
|
148
|
+
{
|
|
149
|
+
name: "track-c-trajectory-export-nightly",
|
|
150
|
+
description: "Nightly export of trajectories into per-task JSONL training datasets",
|
|
151
|
+
enabled: true,
|
|
152
|
+
schedule: {
|
|
153
|
+
kind: "cron",
|
|
154
|
+
expr: options?.schedule ?? "0 3 * * *",
|
|
155
|
+
tz: options?.tz
|
|
156
|
+
},
|
|
157
|
+
payload: { kind: "event", eventName: EXPORT_EVENT_NAME },
|
|
158
|
+
metadata: { trackC: true, kind: "trajectory-export" }
|
|
159
|
+
},
|
|
160
|
+
{ log, logPrefix: "[TrajectoryExportCron]" }
|
|
161
|
+
);
|
|
162
|
+
log.info(
|
|
163
|
+
registration === "created" ? "[TrajectoryExportCron] registered nightly trajectory-export cron" : "[TrajectoryExportCron] using existing nightly trajectory-export cron"
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
export {
|
|
167
|
+
registerTrajectoryExportCron,
|
|
168
|
+
runNightlyTrajectoryExport
|
|
169
|
+
};
|
|
170
|
+
//# sourceMappingURL=trajectory-export-cron.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/trajectory-export-cron.ts"],"sourcesContent":["/**\n * Nightly trajectory → training-dataset export cron.\n *\n * Pulls recent trajectories from the runtime's trajectory service, runs them\n * through the privacy filter, then bucketizes them into per-task JSONL files\n * under `<state>/training/datasets/<YYYY-MM-DD>/`.\n *\n * Privacy filter is REQUIRED and runs on every export — both for disk writes\n * and any subsequent cloud upload.\n */\n\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport type { Trajectory } from \"@elizaos/agent\";\nimport { resolveStateDir } from \"@elizaos/core\";\nimport {\n type CronServiceLike,\n ensureNamedCronJob,\n registerRuntimeEventOnce,\n} from \"./ensure-cron-job.js\";\nimport {\n type AnonymizerLookup,\n applyPrivacyFilter,\n createHashAnonymizer,\n type FilterableTrajectory,\n} from \"./privacy-filter.js\";\nimport {\n type HfUploadResult,\n resolveHfUploadConfig,\n uploadTrajectoryJsonlToHuggingFace,\n} from \"./trajectory-hf-upload.js\";\nimport {\n exportTrajectoryTaskDatasets,\n type TrajectoryTaskDatasetExport,\n} from \"./trajectory-task-datasets.js\";\nimport { waitForService } from \"./wait-for-service.js\";\n\nconst EXPORT_EVENT_NAME = \"TRACK_C_TRAJECTORY_EXPORT\";\nconst DEFAULT_TRAJECTORY_LIMIT = 500;\n\ninterface MinimalLogger {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n debug: (message: string) => void;\n}\n\ninterface RuntimeLike {\n getService: (name: string) => unknown;\n logger?: MinimalLogger;\n registerEvent?: (\n name: string,\n handler: (payload: unknown) => Promise<void>,\n ) => void;\n}\n\ninterface TrajectoryServiceLike {\n listTrajectories: (options: {\n limit?: number;\n offset?: number;\n }) => Promise<{ trajectories: Array<{ id: string }>; total?: number }>;\n getTrajectoryDetail: (id: string) => Promise<ExportableTrajectory | null>;\n}\n\ntype ExportableTrajectory = Trajectory & FilterableTrajectory;\n\nfunction todaySegment(): string {\n const now = new Date();\n const y = now.getUTCFullYear();\n const m = String(now.getUTCMonth() + 1).padStart(2, \"0\");\n const d = String(now.getUTCDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n}\n\nexport interface RunNightlyExportOptions {\n trajectoryLimit?: number;\n outputRoot?: string;\n anonymizer?: AnonymizerLookup;\n now?: () => Date;\n}\n\nexport interface NightlyExportReport {\n outputDir: string;\n pulledTrajectories: number;\n keptTrajectories: number;\n droppedTrajectories: number;\n redactionCount: number;\n anonymizationCount: number;\n exportSummary: TrajectoryTaskDatasetExport[\"summary\"];\n exportPaths: TrajectoryTaskDatasetExport[\"paths\"];\n /** Path to the single sanitized sanitized JSONL written alongside the per-task files. */\n sanitizedJsonlPath: string;\n /** Outcome of the HuggingFace upload, when configured. `null` when HF is not configured. */\n huggingFaceUpload: HfUploadResult | null;\n}\n\nexport async function runNightlyTrajectoryExport(\n runtime: RuntimeLike,\n options: RunNightlyExportOptions = {},\n): Promise<NightlyExportReport | null> {\n const log: MinimalLogger = runtime.logger ?? {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n };\n const trajectoryService = runtime.getService(\n \"trajectories\",\n ) as TrajectoryServiceLike | null;\n if (\n !trajectoryService ||\n typeof trajectoryService.listTrajectories !== \"function\" ||\n typeof trajectoryService.getTrajectoryDetail !== \"function\"\n ) {\n log.warn(\"[TrajectoryExportCron] trajectories service unavailable\");\n return null;\n }\n\n // The export's purpose is the FULL eligible dataset. By default we page\n // through every trajectory (the SQL reader caps each page at 500, so a\n // single call silently dropped everything beyond the most-recent 500).\n // An explicit `options.trajectoryLimit` acts as a hard cap; when it\n // truncates the available set we log what was dropped (no silent caps).\n const explicitCap = options.trajectoryLimit;\n const items: Array<{ id: string }> = [];\n let offset = 0;\n let dbTotal: number | undefined;\n while (true) {\n const remaining =\n explicitCap !== undefined\n ? explicitCap - items.length\n : DEFAULT_TRAJECTORY_LIMIT;\n if (explicitCap !== undefined && remaining <= 0) break;\n const pageLimit = Math.min(\n DEFAULT_TRAJECTORY_LIMIT,\n Math.max(1, remaining),\n );\n const page = await trajectoryService.listTrajectories({\n limit: pageLimit,\n offset,\n });\n if (typeof page.total === \"number\") dbTotal = page.total;\n const batch = page.trajectories;\n items.push(...batch);\n offset += batch.length;\n // Stop when the page came back short (no more rows) or the reader\n // returned nothing (defensive against a non-advancing offset).\n if (batch.length < pageLimit || batch.length === 0) break;\n }\n\n if (\n explicitCap !== undefined &&\n typeof dbTotal === \"number\" &&\n dbTotal > items.length\n ) {\n log.warn(\n `[TrajectoryExportCron] trajectoryLimit=${explicitCap} truncated the export: ${dbTotal - items.length} of ${dbTotal} eligible trajectories were dropped`,\n );\n }\n\n const trajectories: ExportableTrajectory[] = [];\n for (const item of items) {\n const detail = await trajectoryService.getTrajectoryDetail(item.id);\n if (detail) trajectories.push(detail);\n }\n\n // Privacy filter is REQUIRED here — the downstream export writes JSONL\n // datasets to disk (and may upload them), and they must not contain raw\n // user secrets or un-anonymized handles. The filter runs before any write\n // path below. The default anonymizer maps handles to stable opaque ids.\n const filtered = applyPrivacyFilter(trajectories, {\n anonymizer: options.anonymizer ?? createHashAnonymizer(),\n });\n\n const stateDir = options.outputRoot ?? resolveStateDir();\n const outputDir = join(stateDir, \"training\", \"datasets\", todaySegment());\n await mkdir(outputDir, { recursive: true });\n\n // privacy filter applied above\n const summary = await exportTrajectoryTaskDatasets(\n filtered.trajectories,\n outputDir,\n );\n\n // Single sanitized JSONL — the artifact uploaded to HuggingFace.\n const sanitizedJsonlPath = join(outputDir, \"trajectories.sanitized.jsonl\");\n const sanitizedJsonl =\n filtered.trajectories.length === 0\n ? \"\"\n : `${filtered.trajectories\n .map((trajectory) => JSON.stringify(trajectory))\n .join(\"\\n\")}\\n`;\n await writeFile(sanitizedJsonlPath, sanitizedJsonl);\n\n let huggingFaceUpload: HfUploadResult | null = null;\n const hfConfig = resolveHfUploadConfig();\n if (hfConfig) {\n const pathInRepo = `trajectories/${todaySegment()}.jsonl`;\n huggingFaceUpload = await uploadTrajectoryJsonlToHuggingFace(\n sanitizedJsonlPath,\n pathInRepo,\n hfConfig,\n );\n log.info(\n huggingFaceUpload.uploaded\n ? `[TrajectoryExportCron] uploaded sanitized trajectories to ${hfConfig.repo}/${pathInRepo}`\n : `[TrajectoryExportCron] HuggingFace upload skipped: ${huggingFaceUpload.error ?? \"unknown\"}`,\n );\n }\n\n log.info(\n `[TrajectoryExportCron] exported ${filtered.trajectories.length} trajectories to ${outputDir} (dropped ${filtered.dropped.length}, redacted ${filtered.redactionCount}, anonymized ${filtered.anonymizationCount})`,\n );\n\n return {\n outputDir,\n pulledTrajectories: trajectories.length,\n keptTrajectories: filtered.trajectories.length,\n droppedTrajectories: filtered.dropped.length,\n redactionCount: filtered.redactionCount,\n anonymizationCount: filtered.anonymizationCount,\n exportSummary: summary.summary,\n exportPaths: summary.paths,\n sanitizedJsonlPath,\n huggingFaceUpload,\n };\n}\n\n/**\n * Register the nightly trajectory-export job against the agent runtime.\n * Schedule defaults to \"0 3 * * *\" (03:00 local) so the skill-scoring cron\n * registered at \"5 3 * * *\" runs after fresh data has landed.\n */\nexport async function registerTrajectoryExportCron(\n runtime: RuntimeLike,\n options?: { schedule?: string; tz?: string; anonymizer?: AnonymizerLookup },\n): Promise<void> {\n const log: MinimalLogger = runtime.logger ?? {\n info: () => {},\n warn: () => {},\n error: () => {},\n debug: () => {},\n };\n const cronService = await waitForService<CronServiceLike>(runtime, \"CRON\", {\n timeoutMs: 2_000,\n });\n if (!cronService || typeof cronService.createJob !== \"function\") {\n log.debug(\n `[TrajectoryExportCron] CRON service not registered; cron not scheduled (run on-demand via ${EXPORT_EVENT_NAME} event)`,\n );\n return;\n }\n registerRuntimeEventOnce(runtime, EXPORT_EVENT_NAME, async () => {\n await runNightlyTrajectoryExport(runtime, {\n anonymizer: options?.anonymizer,\n });\n });\n const registration = await ensureNamedCronJob(\n cronService,\n {\n name: \"track-c-trajectory-export-nightly\",\n description:\n \"Nightly export of trajectories into per-task JSONL training datasets\",\n enabled: true,\n schedule: {\n kind: \"cron\",\n expr: options?.schedule ?? \"0 3 * * *\",\n tz: options?.tz,\n },\n payload: { kind: \"event\", eventName: EXPORT_EVENT_NAME },\n metadata: { trackC: true, kind: \"trajectory-export\" },\n },\n { log, logPrefix: \"[TrajectoryExportCron]\" },\n );\n log.info(\n registration === \"created\"\n ? \"[TrajectoryExportCron] registered nightly trajectory-export cron\"\n : \"[TrajectoryExportCron] using existing nightly trajectory-export cron\",\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime → HuggingFace trajectory upload.
|
|
3
|
+
*
|
|
4
|
+
* Uploads the *sanitized* JSONL produced by `buildTrajectoryExportBundle` (or
|
|
5
|
+
* the nightly export cron) to a HuggingFace dataset repo. The upload is
|
|
6
|
+
* opt-in: it only runs when `ELIZA_TRAJECTORY_HF_REPO` is set AND an HF token
|
|
7
|
+
* is available. Token env vars (in priority order): `HF_TOKEN` (canonical),
|
|
8
|
+
* `HUGGINGFACE_HUB_TOKEN` (Python convention), `HUGGING_FACE_HUB_TOKEN`
|
|
9
|
+
* (legacy TS alias).
|
|
10
|
+
*
|
|
11
|
+
* The privacy filter MUST have run before this — callers pass the already
|
|
12
|
+
* sanitized file path. This module never reads raw trajectory data.
|
|
13
|
+
*
|
|
14
|
+
* Transport: shells out to the HuggingFace CLI (`hf upload`, falling back to
|
|
15
|
+
* the legacy `huggingface-cli upload`). If neither is on PATH the upload is
|
|
16
|
+
* skipped with an actionable "install the HF CLI" message rather than failing
|
|
17
|
+
* the export.
|
|
18
|
+
*/
|
|
19
|
+
export interface HfUploadConfig {
|
|
20
|
+
/** `org/dataset` repo id. */
|
|
21
|
+
repo: string;
|
|
22
|
+
/** HF access token. */
|
|
23
|
+
token: string;
|
|
24
|
+
}
|
|
25
|
+
export interface HfUploadResult {
|
|
26
|
+
/** True only when the file was actually uploaded. */
|
|
27
|
+
uploaded: boolean;
|
|
28
|
+
/** Repo the file was uploaded to (or would have been). */
|
|
29
|
+
repo: string | null;
|
|
30
|
+
/** Path-in-repo the file landed at. */
|
|
31
|
+
pathInRepo: string | null;
|
|
32
|
+
/** Populated when `uploaded` is false and the reason is not "not configured". */
|
|
33
|
+
error: string | null;
|
|
34
|
+
/** True when the upload was skipped because the env is not configured. */
|
|
35
|
+
skippedNotConfigured: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the upload config from the environment. Returns `null` when the
|
|
39
|
+
* feature is not configured (no repo env, or no token).
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveHfUploadConfig(env?: NodeJS.ProcessEnv): HfUploadConfig | null;
|
|
42
|
+
/**
|
|
43
|
+
* Upload a sanitized JSONL file to the configured HF dataset repo.
|
|
44
|
+
*
|
|
45
|
+
* @param sanitizedJsonlPath - Path to the already-privacy-filtered JSONL.
|
|
46
|
+
* @param pathInRepo - Destination path inside the dataset repo.
|
|
47
|
+
* @param config - Resolved upload config; pass `null` (or omit) to read the env.
|
|
48
|
+
*/
|
|
49
|
+
export declare function uploadTrajectoryJsonlToHuggingFace(sanitizedJsonlPath: string, pathInRepo: string, config?: HfUploadConfig | null): Promise<HfUploadResult>;
|
|
50
|
+
//# sourceMappingURL=trajectory-hf-upload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-hf-upload.d.ts","sourceRoot":"","sources":["../../src/core/trajectory-hf-upload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAgBH,MAAM,WAAW,cAAc;IAC7B,6BAA6B;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,QAAQ,EAAE,OAAO,CAAC;IAClB,0DAA0D;IAC1D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,uCAAuC;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,iFAAiF;IACjF,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,0EAA0E;IAC1E,oBAAoB,EAAE,OAAO,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,cAAc,GAAG,IAAI,CAQvB;AA4DD;;;;;;GAMG;AACH,wBAAsB,kCAAkC,CACtD,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,cAAc,GAAG,IAA8B,GACtD,OAAO,CAAC,cAAc,CAAC,CA0CzB"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
const HF_REPO_ENV = "ELIZA_TRAJECTORY_HF_REPO";
|
|
4
|
+
const HF_TOKEN_ENVS = [
|
|
5
|
+
"HF_TOKEN",
|
|
6
|
+
"HUGGINGFACE_HUB_TOKEN",
|
|
7
|
+
"HUGGING_FACE_HUB_TOKEN"
|
|
8
|
+
];
|
|
9
|
+
function resolveHfUploadConfig(env = process.env) {
|
|
10
|
+
const repo = env[HF_REPO_ENV]?.trim();
|
|
11
|
+
if (!repo) return null;
|
|
12
|
+
for (const key of HF_TOKEN_ENVS) {
|
|
13
|
+
const token = env[key]?.trim();
|
|
14
|
+
if (token) return { repo, token };
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
function notConfigured() {
|
|
19
|
+
return {
|
|
20
|
+
uploaded: false,
|
|
21
|
+
repo: null,
|
|
22
|
+
pathInRepo: null,
|
|
23
|
+
error: null,
|
|
24
|
+
skippedNotConfigured: true
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
async function runHfCli(args, token) {
|
|
28
|
+
const candidates = ["hf", "huggingface-cli"];
|
|
29
|
+
let lastErr = "";
|
|
30
|
+
for (const bin of candidates) {
|
|
31
|
+
const attempt = await new Promise((resolve) => {
|
|
32
|
+
const child = spawn(bin, args, {
|
|
33
|
+
env: {
|
|
34
|
+
...process.env,
|
|
35
|
+
// Inject the token under every accepted name so whichever variant
|
|
36
|
+
// the HF CLI checks first picks it up.
|
|
37
|
+
HF_TOKEN: token,
|
|
38
|
+
HUGGINGFACE_HUB_TOKEN: token,
|
|
39
|
+
HUGGING_FACE_HUB_TOKEN: token
|
|
40
|
+
},
|
|
41
|
+
stdio: ["ignore", "ignore", "pipe"]
|
|
42
|
+
});
|
|
43
|
+
let stderr = "";
|
|
44
|
+
child.stderr.on("data", (chunk) => {
|
|
45
|
+
stderr += String(chunk);
|
|
46
|
+
});
|
|
47
|
+
child.on("error", (err) => {
|
|
48
|
+
resolve({
|
|
49
|
+
ok: false,
|
|
50
|
+
stderr: err.message,
|
|
51
|
+
missing: err.code === "ENOENT"
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
child.on("close", (code) => {
|
|
55
|
+
resolve({ ok: code === 0, stderr, missing: false });
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
if (!attempt.missing) return attempt;
|
|
59
|
+
lastErr = attempt.stderr;
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
ok: false,
|
|
63
|
+
stderr: lastErr || "HuggingFace CLI not found on PATH",
|
|
64
|
+
missing: true
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
async function uploadTrajectoryJsonlToHuggingFace(sanitizedJsonlPath, pathInRepo, config = resolveHfUploadConfig()) {
|
|
68
|
+
if (!config) return notConfigured();
|
|
69
|
+
if (!existsSync(sanitizedJsonlPath)) {
|
|
70
|
+
return {
|
|
71
|
+
uploaded: false,
|
|
72
|
+
repo: config.repo,
|
|
73
|
+
pathInRepo,
|
|
74
|
+
error: `sanitized JSONL not found at ${sanitizedJsonlPath}`,
|
|
75
|
+
skippedNotConfigured: false
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const result = await runHfCli(
|
|
79
|
+
[
|
|
80
|
+
"upload",
|
|
81
|
+
config.repo,
|
|
82
|
+
sanitizedJsonlPath,
|
|
83
|
+
pathInRepo,
|
|
84
|
+
"--repo-type",
|
|
85
|
+
"dataset"
|
|
86
|
+
],
|
|
87
|
+
config.token
|
|
88
|
+
);
|
|
89
|
+
if (result.ok) {
|
|
90
|
+
return {
|
|
91
|
+
uploaded: true,
|
|
92
|
+
repo: config.repo,
|
|
93
|
+
pathInRepo,
|
|
94
|
+
error: null,
|
|
95
|
+
skippedNotConfigured: false
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
const error = result.missing ? 'HuggingFace CLI not found. Install it with `pip install -U "huggingface_hub[cli]"` (provides `hf` / `huggingface-cli`) to enable trajectory uploads.' : `hf upload failed: ${result.stderr.trim().slice(0, 500)}`;
|
|
99
|
+
return {
|
|
100
|
+
uploaded: false,
|
|
101
|
+
repo: config.repo,
|
|
102
|
+
pathInRepo,
|
|
103
|
+
error,
|
|
104
|
+
skippedNotConfigured: false
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
resolveHfUploadConfig,
|
|
109
|
+
uploadTrajectoryJsonlToHuggingFace
|
|
110
|
+
};
|
|
111
|
+
//# sourceMappingURL=trajectory-hf-upload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/trajectory-hf-upload.ts"],"sourcesContent":["/**\n * Runtime → HuggingFace trajectory upload.\n *\n * Uploads the *sanitized* JSONL produced by `buildTrajectoryExportBundle` (or\n * the nightly export cron) to a HuggingFace dataset repo. The upload is\n * opt-in: it only runs when `ELIZA_TRAJECTORY_HF_REPO` is set AND an HF token\n * is available. Token env vars (in priority order): `HF_TOKEN` (canonical),\n * `HUGGINGFACE_HUB_TOKEN` (Python convention), `HUGGING_FACE_HUB_TOKEN`\n * (legacy TS alias).\n *\n * The privacy filter MUST have run before this — callers pass the already\n * sanitized file path. This module never reads raw trajectory data.\n *\n * Transport: shells out to the HuggingFace CLI (`hf upload`, falling back to\n * the legacy `huggingface-cli upload`). If neither is on PATH the upload is\n * skipped with an actionable \"install the HF CLI\" message rather than failing\n * the export.\n */\n\nimport { spawn } from \"node:child_process\";\nimport { existsSync } from \"node:fs\";\n\nconst HF_REPO_ENV = \"ELIZA_TRAJECTORY_HF_REPO\";\n// Canonical: HF_TOKEN. HUGGINGFACE_HUB_TOKEN is the Python convention\n// (matches huggingface_hub) and stays accepted as a fallback. The variant\n// with underscore between HUGGING and FACE (HUGGING_FACE_HUB_TOKEN) is the\n// legacy TS-side name and is also accepted for backward compatibility.\nconst HF_TOKEN_ENVS = [\n \"HF_TOKEN\",\n \"HUGGINGFACE_HUB_TOKEN\",\n \"HUGGING_FACE_HUB_TOKEN\",\n] as const;\n\nexport interface HfUploadConfig {\n /** `org/dataset` repo id. */\n repo: string;\n /** HF access token. */\n token: string;\n}\n\nexport interface HfUploadResult {\n /** True only when the file was actually uploaded. */\n uploaded: boolean;\n /** Repo the file was uploaded to (or would have been). */\n repo: string | null;\n /** Path-in-repo the file landed at. */\n pathInRepo: string | null;\n /** Populated when `uploaded` is false and the reason is not \"not configured\". */\n error: string | null;\n /** True when the upload was skipped because the env is not configured. */\n skippedNotConfigured: boolean;\n}\n\n/**\n * Resolve the upload config from the environment. Returns `null` when the\n * feature is not configured (no repo env, or no token).\n */\nexport function resolveHfUploadConfig(\n env: NodeJS.ProcessEnv = process.env,\n): HfUploadConfig | null {\n const repo = env[HF_REPO_ENV]?.trim();\n if (!repo) return null;\n for (const key of HF_TOKEN_ENVS) {\n const token = env[key]?.trim();\n if (token) return { repo, token };\n }\n return null;\n}\n\nfunction notConfigured(): HfUploadResult {\n return {\n uploaded: false,\n repo: null,\n pathInRepo: null,\n error: null,\n skippedNotConfigured: true,\n };\n}\n\nasync function runHfCli(\n args: string[],\n token: string,\n): Promise<{ ok: boolean; stderr: string; missing: boolean }> {\n const candidates = [\"hf\", \"huggingface-cli\"];\n let lastErr = \"\";\n for (const bin of candidates) {\n const attempt = await new Promise<{\n ok: boolean;\n stderr: string;\n missing: boolean;\n }>((resolve) => {\n const child = spawn(bin, args, {\n env: {\n ...process.env,\n // Inject the token under every accepted name so whichever variant\n // the HF CLI checks first picks it up.\n HF_TOKEN: token,\n HUGGINGFACE_HUB_TOKEN: token,\n HUGGING_FACE_HUB_TOKEN: token,\n },\n stdio: [\"ignore\", \"ignore\", \"pipe\"],\n });\n let stderr = \"\";\n child.stderr.on(\"data\", (chunk) => {\n stderr += String(chunk);\n });\n child.on(\"error\", (err: NodeJS.ErrnoException) => {\n resolve({\n ok: false,\n stderr: err.message,\n missing: err.code === \"ENOENT\",\n });\n });\n child.on(\"close\", (code) => {\n resolve({ ok: code === 0, stderr, missing: false });\n });\n });\n if (!attempt.missing) return attempt;\n lastErr = attempt.stderr;\n }\n return {\n ok: false,\n stderr: lastErr || \"HuggingFace CLI not found on PATH\",\n missing: true,\n };\n}\n\n/**\n * Upload a sanitized JSONL file to the configured HF dataset repo.\n *\n * @param sanitizedJsonlPath - Path to the already-privacy-filtered JSONL.\n * @param pathInRepo - Destination path inside the dataset repo.\n * @param config - Resolved upload config; pass `null` (or omit) to read the env.\n */\nexport async function uploadTrajectoryJsonlToHuggingFace(\n sanitizedJsonlPath: string,\n pathInRepo: string,\n config: HfUploadConfig | null = resolveHfUploadConfig(),\n): Promise<HfUploadResult> {\n if (!config) return notConfigured();\n if (!existsSync(sanitizedJsonlPath)) {\n return {\n uploaded: false,\n repo: config.repo,\n pathInRepo,\n error: `sanitized JSONL not found at ${sanitizedJsonlPath}`,\n skippedNotConfigured: false,\n };\n }\n\n const result = await runHfCli(\n [\n \"upload\",\n config.repo,\n sanitizedJsonlPath,\n pathInRepo,\n \"--repo-type\",\n \"dataset\",\n ],\n config.token,\n );\n if (result.ok) {\n return {\n uploaded: true,\n repo: config.repo,\n pathInRepo,\n error: null,\n skippedNotConfigured: false,\n };\n }\n const error = result.missing\n ? 'HuggingFace CLI not found. Install it with `pip install -U \"huggingface_hub[cli]\"` (provides `hf` / `huggingface-cli`) to enable trajectory uploads.'\n : `hf upload failed: ${result.stderr.trim().slice(0, 500)}`;\n return {\n uploaded: false,\n repo: config.repo,\n pathInRepo,\n error,\n skippedNotConfigured: false,\n };\n}\n"],"mappings":"AAmBA,SAAS,aAAa;AACtB,SAAS,kBAAkB;AAE3B,MAAM,cAAc;AAKpB,MAAM,gBAAgB;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF;AA0BO,SAAS,sBACd,MAAyB,QAAQ,KACV;AACvB,QAAM,OAAO,IAAI,WAAW,GAAG,KAAK;AACpC,MAAI,CAAC,KAAM,QAAO;AAClB,aAAW,OAAO,eAAe;AAC/B,UAAM,QAAQ,IAAI,GAAG,GAAG,KAAK;AAC7B,QAAI,MAAO,QAAO,EAAE,MAAM,MAAM;AAAA,EAClC;AACA,SAAO;AACT;AAEA,SAAS,gBAAgC;AACvC,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM;AAAA,IACN,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,sBAAsB;AAAA,EACxB;AACF;AAEA,eAAe,SACb,MACA,OAC4D;AAC5D,QAAM,aAAa,CAAC,MAAM,iBAAiB;AAC3C,MAAI,UAAU;AACd,aAAW,OAAO,YAAY;AAC5B,UAAM,UAAU,MAAM,IAAI,QAIvB,CAAC,YAAY;AACd,YAAM,QAAQ,MAAM,KAAK,MAAM;AAAA,QAC7B,KAAK;AAAA,UACH,GAAG,QAAQ;AAAA;AAAA;AAAA,UAGX,UAAU;AAAA,UACV,uBAAuB;AAAA,UACvB,wBAAwB;AAAA,QAC1B;AAAA,QACA,OAAO,CAAC,UAAU,UAAU,MAAM;AAAA,MACpC,CAAC;AACD,UAAI,SAAS;AACb,YAAM,OAAO,GAAG,QAAQ,CAAC,UAAU;AACjC,kBAAU,OAAO,KAAK;AAAA,MACxB,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,QAA+B;AAChD,gBAAQ;AAAA,UACN,IAAI;AAAA,UACJ,QAAQ,IAAI;AAAA,UACZ,SAAS,IAAI,SAAS;AAAA,QACxB,CAAC;AAAA,MACH,CAAC;AACD,YAAM,GAAG,SAAS,CAAC,SAAS;AAC1B,gBAAQ,EAAE,IAAI,SAAS,GAAG,QAAQ,SAAS,MAAM,CAAC;AAAA,MACpD,CAAC;AAAA,IACH,CAAC;AACD,QAAI,CAAC,QAAQ,QAAS,QAAO;AAC7B,cAAU,QAAQ;AAAA,EACpB;AACA,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ,WAAW;AAAA,IACnB,SAAS;AAAA,EACX;AACF;AASA,eAAsB,mCACpB,oBACA,YACA,SAAgC,sBAAsB,GAC7B;AACzB,MAAI,CAAC,OAAQ,QAAO,cAAc;AAClC,MAAI,CAAC,WAAW,kBAAkB,GAAG;AACnC,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,OAAO;AAAA,MACb;AAAA,MACA,OAAO,gCAAgC,kBAAkB;AAAA,MACzD,sBAAsB;AAAA,IACxB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AAAA,IACnB;AAAA,MACE;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,OAAO;AAAA,EACT;AACA,MAAI,OAAO,IAAI;AACb,WAAO;AAAA,MACL,UAAU;AAAA,MACV,MAAM,OAAO;AAAA,MACb;AAAA,MACA,OAAO;AAAA,MACP,sBAAsB;AAAA,IACxB;AAAA,EACF;AACA,QAAM,QAAQ,OAAO,UACjB,yJACA,qBAAqB,OAAO,OAAO,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;AAC3D,SAAO;AAAA,IACL,UAAU;AAAA,IACV,MAAM,OAAO;AAAA,IACb;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,EACxB;AACF;","names":[]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Trajectory } from "@elizaos/agent";
|
|
2
|
+
import { type ElizaNativeTrajectoryRow } from "@elizaos/core";
|
|
3
|
+
export type ElizaNativeTrainingExample = ElizaNativeTrajectoryRow;
|
|
4
|
+
/**
|
|
5
|
+
* Canonical, ordered list of trajectory training tasks. The union type and
|
|
6
|
+
* every per-task map/record in this module derive from this single list so
|
|
7
|
+
* adding a task (e.g. a LifeOps capability) is a one-line change that the
|
|
8
|
+
* compiler then forces to be handled everywhere a full record is required.
|
|
9
|
+
*
|
|
10
|
+
* The first six are the generic-runtime decision tasks; the rest are the
|
|
11
|
+
* LifeOps per-capability tasks introduced for the GEPA/trajectory optimization
|
|
12
|
+
* loop (issue #8795). They mirror `LIFEOPS_OPTIMIZED_PROMPT_TASKS` in
|
|
13
|
+
* `@elizaos/core` (kept in sync — core is the source of truth for the artifact
|
|
14
|
+
* store, this list is the source of truth for the trajectory dataset buckets).
|
|
15
|
+
*/
|
|
16
|
+
export declare const ALL_TRAJECTORY_TRAINING_TASKS: readonly ["should_respond", "context_routing", "action_planner", "response", "media_description", "view_context", "calendar_extract", "schedule_plan", "reminder_dispatch", "inbox_triage", "meeting_prep", "morning_brief", "health_checkin", "screentime_recap"];
|
|
17
|
+
export type TrajectoryTrainingTask = (typeof ALL_TRAJECTORY_TRAINING_TASKS)[number];
|
|
18
|
+
/** The LifeOps per-capability subset of {@link ALL_TRAJECTORY_TRAINING_TASKS}. */
|
|
19
|
+
export declare const LIFEOPS_TRAINING_TASKS: readonly TrajectoryTrainingTask[];
|
|
20
|
+
/** Build a full per-task record by deriving an entry for every training task. */
|
|
21
|
+
export declare function buildTaskRecord<T>(make: (task: TrajectoryTrainingTask) => T): Record<TrajectoryTrainingTask, T>;
|
|
22
|
+
export interface TrajectoryTaskDatasetPaths {
|
|
23
|
+
shouldRespondPath: string;
|
|
24
|
+
contextRoutingPath: string;
|
|
25
|
+
actionPlannerPath: string;
|
|
26
|
+
responsePath: string;
|
|
27
|
+
mediaDescriptionPath: string;
|
|
28
|
+
viewContextPath: string;
|
|
29
|
+
calendarExtractPath: string;
|
|
30
|
+
schedulePlanPath: string;
|
|
31
|
+
reminderDispatchPath: string;
|
|
32
|
+
inboxTriagePath: string;
|
|
33
|
+
meetingPrepPath: string;
|
|
34
|
+
morningBriefPath: string;
|
|
35
|
+
healthCheckinPath: string;
|
|
36
|
+
screentimeRecapPath: string;
|
|
37
|
+
summaryPath: string;
|
|
38
|
+
}
|
|
39
|
+
export interface TrajectoryTaskDatasetExport {
|
|
40
|
+
counts: Record<TrajectoryTrainingTask, number>;
|
|
41
|
+
paths: TrajectoryTaskDatasetPaths;
|
|
42
|
+
examples: Record<TrajectoryTrainingTask, ElizaNativeTrainingExample[]>;
|
|
43
|
+
summary: TrajectoryTaskDatasetSummary;
|
|
44
|
+
}
|
|
45
|
+
export interface TrajectoryTaskDatasetTaskSummary {
|
|
46
|
+
exampleCount: number;
|
|
47
|
+
sourceCallCount: number;
|
|
48
|
+
sourceTrajectoryCount: number;
|
|
49
|
+
}
|
|
50
|
+
export interface TrajectoryTaskDatasetSummary {
|
|
51
|
+
generatedAt: string;
|
|
52
|
+
trajectoryCount: number;
|
|
53
|
+
llmCallCount: number;
|
|
54
|
+
skippedNonNativeRows: number;
|
|
55
|
+
warnings: string[];
|
|
56
|
+
counts: Record<TrajectoryTrainingTask, number>;
|
|
57
|
+
tasks: TrajectoryTrainingTask[];
|
|
58
|
+
taskMetrics: Record<TrajectoryTrainingTask, TrajectoryTaskDatasetTaskSummary>;
|
|
59
|
+
}
|
|
60
|
+
export declare function extractTrajectoryExamplesByTask(trajectories: Trajectory[] | string, tasks?: readonly TrajectoryTrainingTask[]): Record<TrajectoryTrainingTask, ElizaNativeTrainingExample[]>;
|
|
61
|
+
export declare function exportTrajectoryTaskDatasets(trajectories: Trajectory[] | string, outputDir: string, tasks?: readonly TrajectoryTrainingTask[]): Promise<TrajectoryTaskDatasetExport>;
|
|
62
|
+
//# sourceMappingURL=trajectory-task-datasets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trajectory-task-datasets.d.ts","sourceRoot":"","sources":["../../src/core/trajectory-task-datasets.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAqB,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AAOvB,MAAM,MAAM,0BAA0B,GAAG,wBAAwB,CAAC;AAElE;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,6BAA6B,oQAgBhC,CAAC;AAEX,MAAM,MAAM,sBAAsB,GAChC,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjD,kFAAkF;AAClF,eAAO,MAAM,sBAAsB,EAAE,SAAS,sBAAsB,EASnE,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,CAAC,EAC/B,IAAI,EAAE,CAAC,IAAI,EAAE,sBAAsB,KAAK,CAAC,GACxC,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAMnC;AAED,MAAM,WAAW,0BAA0B;IACzC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC/C,KAAK,EAAE,0BAA0B,CAAC;IAClC,QAAQ,EAAE,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACvE,OAAO,EAAE,4BAA4B,CAAC;CACvC;AAED,MAAM,WAAW,gCAAgC;IAC/C,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,qBAAqB,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,4BAA4B;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAC/C,KAAK,EAAE,sBAAsB,EAAE,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC,sBAAsB,EAAE,gCAAgC,CAAC,CAAC;CAC/E;AAseD,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EACnC,KAAK,CAAC,EAAE,SAAS,sBAAsB,EAAE,GACxC,MAAM,CAAC,sBAAsB,EAAE,0BAA0B,EAAE,CAAC,CAE9D;AAED,wBAAsB,4BAA4B,CAChD,YAAY,EAAE,UAAU,EAAE,GAAG,MAAM,EACnC,SAAS,EAAE,MAAM,EACjB,KAAK,CAAC,EAAE,SAAS,sBAAsB,EAAE,GACxC,OAAO,CAAC,2BAA2B,CAAC,CAqEtC"}
|