@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/services/training-trigger.ts"],"sourcesContent":["/**\n * TrainingTriggerService — counts completed trajectories per task and fires\n * `triggerTraining` when the configured threshold is reached for a task whose\n * cooldown has elapsed.\n *\n * State is held in-memory and mirrored to disk at\n * `<state>/training/trigger-state.json` so a process restart does not lose\n * progress mid-bucket. The persisted shape is intentionally tiny and\n * forward-compatible: extra keys are ignored on read.\n *\n * Service identifier: `TRAINING_TRIGGER_SERVICE`.\n *\n * Trajectory storage calls `notifyTrajectoryCompleted(trajectoryId)` from\n * `eliza/packages/agent/src/runtime/trajectory-storage.ts` whenever a\n * trajectory transitions to `completed`. The service looks up the trajectory\n * detail, infers the tasks it touches, and increments those counters.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport {\n type IAgentRuntime,\n Service,\n type ServiceTypeName,\n} from \"@elizaos/core\";\nimport type {\n AnonymizerLookup,\n FilterableTrajectory,\n} from \"../core/privacy-filter.js\";\nimport {\n ALL_TRAINING_TASKS,\n loadTrainingConfig,\n resolveTaskPolicy,\n type TrainingBackend,\n type TrainingConfig,\n trainingStateRoot,\n} from \"../core/training-config.js\";\nimport {\n type TrainingRunRecord,\n triggerTraining,\n} from \"../core/training-orchestrator.js\";\nimport {\n buildTaskRecord,\n type TrajectoryTrainingTask,\n} from \"../core/trajectory-task-datasets.js\";\n\n// Extend the core ServiceTypeRegistry so TRAINING_TRIGGER_SERVICE is a known\n// service name. This avoids `as never` casts at the registration site and lets\n// `runtime.getService` return a typed value via ServiceInstance mapping.\ndeclare module \"@elizaos/core\" {\n interface ServiceTypeRegistry {\n TRAINING_TRIGGER_SERVICE: \"training_trigger_service\";\n }\n}\n\nexport const TRAINING_TRIGGER_SERVICE =\n \"training_trigger_service\" as ServiceTypeName;\n\ninterface MinimalLogger {\n info: (message: string) => void;\n warn: (message: string) => void;\n error: (message: string) => void;\n}\n\ninterface TrajectoryServiceLike {\n getTrajectoryDetail: (id: string) => Promise<TrajectoryDetailLike | null>;\n}\n\n/**\n * Minimal runtime shape the trigger service + bootstrap helpers depend on.\n * Structurally a subset of `IAgentRuntime`, so full runtimes satisfy it\n * without casts. Tests pass a small shim that matches this shape.\n */\ninterface RuntimeLike {\n getService: (name: string) => unknown;\n logger?: MinimalLogger;\n}\n\ninterface TrajectoryStepLike {\n llmCalls?: Array<{\n purpose?: string;\n metadata?: Record<string, unknown>;\n response?: string;\n }>;\n}\n\ninterface TrajectoryDetailLike extends FilterableTrajectory {\n steps?: TrajectoryStepLike[];\n}\n\nexport interface TriggerStatusSnapshot {\n autoTrainEnabled: boolean;\n triggerThreshold: number;\n cooldownHours: number;\n counters: Record<TrajectoryTrainingTask, number>;\n lastTrain: Partial<\n Record<\n TrajectoryTrainingTask,\n {\n runId: string;\n source: string;\n finishedAt: string;\n status: string;\n }\n >\n >;\n perTaskThresholds: Record<TrajectoryTrainingTask, number>;\n perTaskCooldownMs: Record<TrajectoryTrainingTask, number>;\n}\n\ninterface PersistedTriggerState {\n counters: Record<TrajectoryTrainingTask, number>;\n lastTrainAt: Partial<Record<TrajectoryTrainingTask, number>>;\n lastTrainRecord: Partial<\n Record<\n TrajectoryTrainingTask,\n {\n runId: string;\n source: string;\n finishedAt: string;\n status: string;\n }\n >\n >;\n}\n\nfunction emptyCounters(): Record<TrajectoryTrainingTask, number> {\n return buildTaskRecord<number>(() => 0);\n}\n\nfunction isStringRecord(v: unknown): v is Record<string, unknown> {\n return typeof v === \"object\" && v !== null && !Array.isArray(v);\n}\n\nfunction readPersisted(path: string): PersistedTriggerState {\n if (!existsSync(path)) {\n return {\n counters: emptyCounters(),\n lastTrainAt: {},\n lastTrainRecord: {},\n };\n }\n const raw = readFileSync(path, \"utf-8\");\n const parsed = JSON.parse(raw);\n const counters = emptyCounters();\n if (isStringRecord(parsed) && isStringRecord(parsed.counters)) {\n for (const task of ALL_TRAINING_TASKS) {\n const value = parsed.counters[task];\n if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n counters[task] = Math.floor(value);\n }\n }\n }\n const lastTrainAt: Partial<Record<TrajectoryTrainingTask, number>> = {};\n if (isStringRecord(parsed) && isStringRecord(parsed.lastTrainAt)) {\n for (const task of ALL_TRAINING_TASKS) {\n const value = parsed.lastTrainAt[task];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n lastTrainAt[task] = value;\n }\n }\n }\n const lastTrainRecord: PersistedTriggerState[\"lastTrainRecord\"] = {};\n if (isStringRecord(parsed) && isStringRecord(parsed.lastTrainRecord)) {\n for (const task of ALL_TRAINING_TASKS) {\n const value = parsed.lastTrainRecord[task];\n if (\n isStringRecord(value) &&\n typeof value.runId === \"string\" &&\n typeof value.source === \"string\" &&\n typeof value.finishedAt === \"string\" &&\n typeof value.status === \"string\"\n ) {\n lastTrainRecord[task] = {\n runId: value.runId,\n source: value.source,\n finishedAt: value.finishedAt,\n status: value.status,\n };\n }\n }\n }\n return { counters, lastTrainAt, lastTrainRecord };\n}\n\nfunction writePersisted(path: string, state: PersistedTriggerState): void {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(state, null, 2)}\\n`, \"utf-8\");\n}\n\nfunction tasksForTrajectory(\n detail: TrajectoryDetailLike,\n): TrajectoryTrainingTask[] {\n const tasks = new Set<TrajectoryTrainingTask>();\n for (const step of detail.steps ?? []) {\n for (const call of step.llmCalls ?? []) {\n const purpose = (call.purpose ?? \"\").toLowerCase();\n const callKind =\n typeof call.metadata?.callKind === \"string\"\n ? call.metadata.callKind.toLowerCase()\n : \"\";\n const hint = `${purpose} ${callKind}`;\n if (\n hint.includes(\"should_respond\") ||\n hint.includes(\"response_handler\") ||\n hint.includes(\"shouldrespond\")\n ) {\n tasks.add(\"should_respond\");\n }\n if (\n hint.includes(\"action_planner\") ||\n hint.includes(\"planner\") ||\n hint.includes(\"runtime_use_model\")\n ) {\n tasks.add(\"action_planner\");\n }\n if (\n hint.includes(\"media_description\") ||\n hint.includes(\"image_description\") ||\n hint.includes(\"describe_\")\n ) {\n tasks.add(\"media_description\");\n }\n if (\n hint.includes(\"response\") ||\n hint.includes(\"reply\") ||\n hint.includes(\"message_response\")\n ) {\n tasks.add(\"response\");\n }\n if (\n typeof call.response === \"string\" &&\n /context_routing/i.test(call.response)\n ) {\n tasks.add(\"context_routing\");\n }\n if (\n hint.includes(\"view_context\") ||\n hint.includes(\"view_selection\") ||\n (typeof call.response === \"string\" &&\n /\"viewId\"\\s*:/.test(call.response))\n ) {\n tasks.add(\"view_context\");\n }\n }\n }\n // Default: a trajectory with any LLM call counts toward `response`.\n if (tasks.size === 0 && (detail.steps?.length ?? 0) > 0) {\n tasks.add(\"response\");\n }\n return [...tasks];\n}\n\nexport interface TrainingTriggerServiceOptions {\n /** Defaults to <state>/training/trigger-state.json. */\n statePath?: string;\n /** Override config loader (tests). */\n configLoader?: () => TrainingConfig;\n /** Forward to the orchestrator (tests). */\n triggerImpl?: typeof triggerTraining;\n /** Anonymizer forwarded to the orchestrator. */\n anonymizer?: AnonymizerLookup;\n /** Clock injection (tests). */\n now?: () => number;\n}\n\n/**\n * Lightweight service registered directly into the runtime service map. It has\n * no `start()` lifecycle, but extends the core base class so the registration\n * stays assignable to the runtime's `Service[]` registry.\n */\nexport class TrainingTriggerService extends Service {\n readonly capabilityDescription =\n \"Tracks completed trajectories and fires training runs when per-task counters hit the configured threshold.\";\n readonly instance = this;\n\n private readonly runtimeRef: RuntimeLike;\n private readonly statePath: string;\n private readonly configLoader: () => TrainingConfig;\n private readonly triggerImpl: typeof triggerTraining;\n private readonly anonymizer?: AnonymizerLookup;\n private readonly now: () => number;\n private readonly inflight = new Set<TrajectoryTrainingTask>();\n private state: PersistedTriggerState;\n\n constructor(\n runtime: RuntimeLike,\n options: TrainingTriggerServiceOptions = {},\n ) {\n super();\n this.runtimeRef = runtime;\n this.statePath =\n options.statePath ?? join(trainingStateRoot(), \"trigger-state.json\");\n this.configLoader = options.configLoader ?? loadTrainingConfig;\n this.triggerImpl = options.triggerImpl ?? triggerTraining;\n this.anonymizer = options.anonymizer;\n this.now = options.now ?? (() => Date.now());\n this.state = readPersisted(this.statePath);\n }\n\n /** Idempotent stop hook for the service lifecycle. */\n async stop(): Promise<void> {}\n\n getStatus(): TriggerStatusSnapshot {\n const config = this.configLoader();\n const perTaskThresholds = buildTaskRecord<number>(() => 0);\n const perTaskCooldownMs = buildTaskRecord<number>(() => 0);\n for (const task of ALL_TRAINING_TASKS) {\n const policy = resolveTaskPolicy(config, task);\n perTaskThresholds[task] = policy.threshold;\n perTaskCooldownMs[task] = policy.cooldownMs;\n }\n return {\n autoTrainEnabled: config.autoTrain,\n triggerThreshold: config.triggerThreshold,\n cooldownHours: config.triggerCooldownHours,\n counters: { ...this.state.counters },\n lastTrain: { ...this.state.lastTrainRecord },\n perTaskThresholds,\n perTaskCooldownMs,\n };\n }\n\n /**\n * Called by trajectory storage when a trajectory transitions to\n * `completed`. Looks up the detail, increments the relevant counters, and\n * checks each touched task's threshold + cooldown.\n *\n * Errors propagate by design — the caller uses optional chaining so a missing\n * service skips training triggers, while a misconfigured service that throws\n * during increment is still surfaced.\n */\n async notifyTrajectoryCompleted(trajectoryId: string): Promise<void> {\n if (!trajectoryId.trim()) return;\n const config = this.configLoader();\n if (!config.autoTrain) return;\n\n const trajectoryService = this.runtimeRef.getService(\n \"trajectories\",\n ) as TrajectoryServiceLike | null;\n if (\n !trajectoryService ||\n typeof trajectoryService.getTrajectoryDetail !== \"function\"\n ) {\n return;\n }\n const detail = await trajectoryService.getTrajectoryDetail(trajectoryId);\n if (!detail) return;\n\n const tasks = tasksForTrajectory(detail);\n if (tasks.length === 0) return;\n\n let dirty = false;\n for (const task of tasks) {\n this.state.counters[task] = (this.state.counters[task] ?? 0) + 1;\n dirty = true;\n }\n if (dirty) writePersisted(this.statePath, this.state);\n\n for (const task of tasks) {\n await this.maybeFire(task, config);\n }\n }\n\n /** Manual fire — bypasses the autoTrain toggle (operator action). */\n async runManually(input: {\n task?: TrajectoryTrainingTask;\n backend?: TrainingBackend;\n dryRun?: boolean;\n }): Promise<TrainingRunRecord> {\n const record = await this.triggerImpl(this.runtimeRef, {\n task: input.task,\n backend: input.backend,\n source: \"manual\",\n dryRun: input.dryRun,\n anonymizer: this.anonymizer,\n });\n this.recordCompletion(record);\n return record;\n }\n\n /**\n * Reset counters — primarily for tests and operator recovery. The persisted\n * `lastTrainAt`/`lastTrainRecord` map is preserved so cooldowns still\n * apply after a reset.\n */\n resetCounters(task?: TrajectoryTrainingTask): void {\n if (task) {\n this.state.counters[task] = 0;\n } else {\n this.state.counters = emptyCounters();\n }\n writePersisted(this.statePath, this.state);\n }\n\n private async maybeFire(\n task: TrajectoryTrainingTask,\n config: TrainingConfig,\n ): Promise<void> {\n const policy = resolveTaskPolicy(config, task);\n const count = this.state.counters[task];\n if (count < policy.threshold) return;\n const lastAt = this.state.lastTrainAt[task];\n const now = this.now();\n if (typeof lastAt === \"number\" && now - lastAt < policy.cooldownMs) {\n return;\n }\n if (this.inflight.has(task)) return;\n this.inflight.add(task);\n const log: MinimalLogger = this.runtimeRef.logger ?? {\n info: () => {},\n warn: () => {},\n error: () => {},\n };\n log.info(\n `[TrainingTriggerService] firing task=${task} threshold=${policy.threshold} count=${count} backend=${policy.backend ?? \"<none>\"}`,\n );\n try {\n const record = await this.triggerImpl(this.runtimeRef, {\n task,\n source: \"threshold\",\n anonymizer: this.anonymizer,\n });\n this.recordCompletion(record);\n // Reset the counter for this task once the run completes (succeeded,\n // failed, or skipped). Skipped runs still consume the burst — operator\n // can lower threshold or change backend if they want immediate retries.\n this.state.counters[task] = 0;\n writePersisted(this.statePath, this.state);\n } finally {\n this.inflight.delete(task);\n }\n }\n\n private recordCompletion(record: TrainingRunRecord): void {\n if (!record.task) return;\n this.state.lastTrainAt[record.task] = this.now();\n this.state.lastTrainRecord[record.task] = {\n runId: record.runId,\n source: record.source,\n finishedAt: record.finishedAt,\n status: record.status,\n };\n writePersisted(this.statePath, this.state);\n }\n}\n\n/**\n * Registered entry shape — kept as a standalone interface so callers that\n * `getService(TRAINING_TRIGGER_SERVICE)` can type the result without\n * importing the concrete class.\n */\nexport interface RegisteredTrainingTriggerEntry extends Service {\n notifyTrajectoryCompleted: (trajectoryId: string) => Promise<void>;\n getStatus: () => TriggerStatusSnapshot;\n runManually: (input: {\n task?: TrajectoryTrainingTask;\n backend?: TrainingBackend;\n dryRun?: boolean;\n }) => Promise<TrainingRunRecord>;\n resetCounters: (task?: TrajectoryTrainingTask) => void;\n stop: () => Promise<void>;\n capabilityDescription: string;\n instance: TrainingTriggerService;\n}\n\n/**\n * Register the service against a runtime's services map. Mirrors the\n * workflow-dispatch pattern in `packages/app-core/src/runtime/eliza.ts`: we\n * insert a function-shaped service entry directly rather than going through\n * the `Service.start()` lifecycle, which expects a class.\n *\n * Safe to call multiple times — subsequent calls replace the entry.\n */\nexport function registerTrainingTriggerService(\n runtime: IAgentRuntime,\n options: TrainingTriggerServiceOptions = {},\n): TrainingTriggerService {\n const service = new TrainingTriggerService(runtime, options);\n runtime.services.set(TRAINING_TRIGGER_SERVICE, [service]);\n return service;\n}\n\nconst BOOTSTRAP_TASKS: readonly TrajectoryTrainingTask[] = [\n \"should_respond\",\n \"action_planner\",\n] as const;\n\ninterface OptimizedPromptServiceLike {\n hasOptimized: (task: TrajectoryTrainingTask) => boolean;\n}\n\nfunction hasOptimizedPromptService(\n service: Service | null,\n): service is Service & OptimizedPromptServiceLike {\n return (\n !!service &&\n typeof (service as { hasOptimized?: unknown }).hasOptimized === \"function\"\n );\n}\n\ninterface UserNotifier {\n notify: (message: string) => void;\n}\n\nexport interface BootstrapOptimizationOptions {\n configLoader?: () => TrainingConfig;\n notifier?: UserNotifier;\n /**\n * Override the service used to trigger the run. Tests pass a controlled\n * trigger; production looks up the registered TrainingTriggerService from\n * runtime.services.\n */\n triggerOverride?: (input: {\n task: TrajectoryTrainingTask;\n backend: TrainingBackend;\n }) => Promise<TrainingRunRecord>;\n}\n\n/**\n * One-shot bootstrap pass for default-on Hermes parity.\n *\n * Called immediately after `registerTrainingTriggerService` during runtime\n * boot. For each high-leverage task (should_respond + action_planner):\n * - If `ELIZA_DISABLE_AUTO_BOOTSTRAP=1`, do nothing.\n * - If the OptimizedPromptService already has an artifact for the task,\n * do nothing (the operator's previous run wins).\n * - If the per-task trajectory counter is below the threshold, do nothing\n * (we don't want to optimize against a thin dataset).\n * - Otherwise, fire `triggerTraining({ source: 'bootstrap', backend: 'native' })`\n * and notify the user that progress can be tracked in\n * Settings → Auto-Training.\n *\n * This is fire-and-forget on purpose: the runtime boot must not block on\n * an LLM-driven optimization round. Errors propagate so the boot logger\n * surfaces them rather than swallowing them silently.\n */\nexport async function bootstrapOptimizationFromAccumulatedTrajectories(\n runtime: IAgentRuntime,\n service: TrainingTriggerService,\n options: BootstrapOptimizationOptions = {},\n): Promise<TrajectoryTrainingTask[]> {\n if (process.env.ELIZA_DISABLE_AUTO_BOOTSTRAP === \"1\") {\n return [];\n }\n const config = (options.configLoader ?? loadTrainingConfig)();\n if (!config.autoTrain) return [];\n if (!config.backends.includes(\"native\")) return [];\n\n const optimizedPromptService = runtime.getService(\"optimized_prompt\");\n\n const status = service.getStatus();\n const fired: TrajectoryTrainingTask[] = [];\n for (const task of BOOTSTRAP_TASKS) {\n const threshold =\n status.perTaskThresholds[task] ?? Number.POSITIVE_INFINITY;\n const count = status.counters[task] ?? 0;\n if (count < threshold) continue;\n if (\n hasOptimizedPromptService(optimizedPromptService) &&\n optimizedPromptService.hasOptimized(task)\n ) {\n continue;\n }\n const trigger =\n options.triggerOverride ??\n (async (input) =>\n service.runManually({ task: input.task, backend: input.backend }));\n await trigger({ task, backend: \"native\" });\n fired.push(task);\n }\n\n if (fired.length > 0) {\n const message = `Bootstrapping prompt optimization from accumulated trajectories (${fired.join(\", \")}). Track progress in Settings → Auto-Training.`;\n options.notifier?.notify(message);\n runtime.logger.info(`[TrainingTriggerService] ${message}`);\n }\n return fired;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vast.ai training-job orchestration service.
|
|
3
|
+
*
|
|
4
|
+
* Owns:
|
|
5
|
+
* - Loading the model registry from `<trainingRoot>/scripts/dump_registry_json.py`
|
|
6
|
+
* (Python subprocess) and caching it in-memory with manual refresh.
|
|
7
|
+
* - Spawning `bash <trainingRoot>/scripts/train_vast.sh provision-and-train ...`
|
|
8
|
+
* for new jobs and recording state transitions in the JSONL job store.
|
|
9
|
+
* - Spawning `python <trainingRoot>/scripts/eval_checkpoint.py ...` for ad-hoc
|
|
10
|
+
* evals against an existing job's run directory.
|
|
11
|
+
* - Reading the inference-stats JSONL the inference side appends to
|
|
12
|
+
* (`~/.eliza/inference-stats.jsonl` by default).
|
|
13
|
+
*
|
|
14
|
+
* `trainingRoot` is the eliza-1 training package, resolved by default to
|
|
15
|
+
* `eliza/packages/training/` (relative to this file's compiled location).
|
|
16
|
+
*
|
|
17
|
+
* Subprocess invariants:
|
|
18
|
+
* - Every shell-out uses `spawn` with an arg array. User-supplied values
|
|
19
|
+
* (registry_key, label) are validated against an explicit whitelist
|
|
20
|
+
* before they ever reach `spawn`. We never interpolate user input into
|
|
21
|
+
* shell strings.
|
|
22
|
+
* - The training root is locked at construction time and is the cwd for
|
|
23
|
+
* every spawn. Resolved once via the absolute path of this file.
|
|
24
|
+
*/
|
|
25
|
+
import { spawn } from "node:child_process";
|
|
26
|
+
import { type InferenceStatRow, type InferenceStatsAggregate } from "./vast-inference-stats.js";
|
|
27
|
+
import { type InferenceEndpointRecord, type VastJobRecord, VastJobStore } from "./vast-job-store.js";
|
|
28
|
+
export { VastServiceError } from "./vast-subprocess.js";
|
|
29
|
+
export interface VastRegistryEntry {
|
|
30
|
+
eliza_short_name: string;
|
|
31
|
+
eliza_repo_id: string;
|
|
32
|
+
gguf_repo_id: string;
|
|
33
|
+
base_hf_id: string;
|
|
34
|
+
tier: string;
|
|
35
|
+
inference_max_context: number;
|
|
36
|
+
}
|
|
37
|
+
export type VastRegistry = Record<string, VastRegistryEntry>;
|
|
38
|
+
export interface CreateJobInput {
|
|
39
|
+
registry_key: string;
|
|
40
|
+
epochs: number;
|
|
41
|
+
run_name?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface EvalCheckpointInput {
|
|
44
|
+
registry_key: string;
|
|
45
|
+
checkpoint_dir: string;
|
|
46
|
+
val_jsonl?: string;
|
|
47
|
+
max_examples?: number;
|
|
48
|
+
}
|
|
49
|
+
export type { InferenceStatRow, InferenceStatsAggregate };
|
|
50
|
+
export interface RegistryListing {
|
|
51
|
+
short_name: string;
|
|
52
|
+
entry: VastRegistryEntry;
|
|
53
|
+
}
|
|
54
|
+
export interface CheckpointInfo {
|
|
55
|
+
name: string;
|
|
56
|
+
path: string;
|
|
57
|
+
step: number | null;
|
|
58
|
+
evaluated: boolean;
|
|
59
|
+
eval_summary: Record<string, unknown> | null;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Running cost snapshot for one Vast.ai job.
|
|
63
|
+
*
|
|
64
|
+
* Shape matches the JSON emitted by `scripts/lib/vast_budget.py snapshot
|
|
65
|
+
* --json`. Mapped 1:1 to the React panel field-set so we don't need a
|
|
66
|
+
* separate DTO.
|
|
67
|
+
*/
|
|
68
|
+
export interface VastJobBudget {
|
|
69
|
+
job_id: string;
|
|
70
|
+
instance_id: number | null;
|
|
71
|
+
pipeline: string;
|
|
72
|
+
run_name: string;
|
|
73
|
+
gpu_name: string;
|
|
74
|
+
num_gpus: number;
|
|
75
|
+
gpu_sku: string;
|
|
76
|
+
state: string;
|
|
77
|
+
uptime_seconds: number;
|
|
78
|
+
uptime_pretty: string;
|
|
79
|
+
dph_total: number;
|
|
80
|
+
total_so_far_usd: number;
|
|
81
|
+
soft_cap_usd: number | null;
|
|
82
|
+
hard_cap_usd: number | null;
|
|
83
|
+
over_soft: boolean;
|
|
84
|
+
over_hard: boolean;
|
|
85
|
+
fetched_at: number;
|
|
86
|
+
}
|
|
87
|
+
export interface VastTrainingServiceOptions {
|
|
88
|
+
/** Override the training package root used to locate `scripts/...`. */
|
|
89
|
+
trainingRoot?: string;
|
|
90
|
+
/** Override the python launcher used for the registry dump + eval. */
|
|
91
|
+
pythonLauncher?: {
|
|
92
|
+
command: string;
|
|
93
|
+
preArgs: string[];
|
|
94
|
+
};
|
|
95
|
+
/** Optional injected store for test isolation. */
|
|
96
|
+
store?: VastJobStore;
|
|
97
|
+
/** Override the spawn factory for tests. */
|
|
98
|
+
spawnImpl?: typeof spawn;
|
|
99
|
+
}
|
|
100
|
+
export declare class VastTrainingService {
|
|
101
|
+
private readonly store;
|
|
102
|
+
private readonly trainingRoot;
|
|
103
|
+
private readonly python;
|
|
104
|
+
private readonly spawnImpl;
|
|
105
|
+
private registryCache;
|
|
106
|
+
private registryLoadedAt;
|
|
107
|
+
constructor(options?: VastTrainingServiceOptions);
|
|
108
|
+
getRegistry(refresh?: boolean): Promise<VastRegistry>;
|
|
109
|
+
listRegistry(refresh?: boolean): Promise<{
|
|
110
|
+
loaded_at: string | null;
|
|
111
|
+
entries: RegistryListing[];
|
|
112
|
+
}>;
|
|
113
|
+
ensureRegistryKey(key: string): Promise<VastRegistryEntry>;
|
|
114
|
+
listJobs(): Promise<VastJobRecord[]>;
|
|
115
|
+
getJob(jobId: string): Promise<VastJobRecord | null>;
|
|
116
|
+
createJob(input: CreateJobInput): Promise<VastJobRecord>;
|
|
117
|
+
cancelJob(jobId: string): Promise<VastJobRecord>;
|
|
118
|
+
readJobLog(jobId: string, tailLines: number): Promise<string[]>;
|
|
119
|
+
runEval(jobId: string, input: Partial<EvalCheckpointInput>): Promise<{
|
|
120
|
+
job_id: string;
|
|
121
|
+
exit_code: number;
|
|
122
|
+
out_path: string;
|
|
123
|
+
summary: Record<string, unknown> | null;
|
|
124
|
+
}>;
|
|
125
|
+
listCheckpointsForRegistryKey(registryKey: string): Promise<CheckpointInfo[]>;
|
|
126
|
+
listInferenceEndpoints(): Promise<InferenceEndpointRecord[]>;
|
|
127
|
+
createInferenceEndpoint(input: {
|
|
128
|
+
label: string;
|
|
129
|
+
base_url: string;
|
|
130
|
+
registry_key: string;
|
|
131
|
+
}): Promise<InferenceEndpointRecord>;
|
|
132
|
+
deleteInferenceEndpoint(id: string): Promise<boolean>;
|
|
133
|
+
/**
|
|
134
|
+
* Read a per-job budget snapshot via `scripts.lib.vast_budget snapshot
|
|
135
|
+
* --json`. Returns `null` when the job has no provisioned instance
|
|
136
|
+
* yet (the UI shows a "not provisioned" state in that case).
|
|
137
|
+
*
|
|
138
|
+
* The python module is the single source of truth — it both renders
|
|
139
|
+
* the watcher's status line and answers this endpoint, so the UI and
|
|
140
|
+
* the watcher never disagree about the budget state.
|
|
141
|
+
*/
|
|
142
|
+
getJobBudget(jobId: string): Promise<VastJobBudget | null>;
|
|
143
|
+
getInferenceStats(label: string | null, lastMinutes: number): Promise<InferenceStatsAggregate>;
|
|
144
|
+
private dispatchJob;
|
|
145
|
+
private discoverInstanceIdForRun;
|
|
146
|
+
private runCapture;
|
|
147
|
+
private runDetachedToLog;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=training-vast-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"training-vast-service.d.ts","sourceRoot":"","sources":["../../src/services/training-vast-service.ts"],"names":[],"mappings":"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"}
|