@elizaos/plugin-training 2.0.3-beta.5 → 2.0.3-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style BootstrapFewshot optimizer.
|
|
3
|
+
*
|
|
4
|
+
* Selects top-K examples from the dataset (ranked by reward, then by metric
|
|
5
|
+
* score against the baseline) and emits them as the demonstration set
|
|
6
|
+
* attached to a Predict module. Unlike the legacy `bootstrap-fewshot.ts`
|
|
7
|
+
* which renders demos as text appended to a baseline prompt, this version
|
|
8
|
+
* keeps demonstrations as a typed `Example[]` so they round-trip through
|
|
9
|
+
* Signature.render() at run time.
|
|
10
|
+
*/
|
|
11
|
+
import type { DspyOptimizerInput, DspyOptimizerResult } from "./types.js";
|
|
12
|
+
export interface DspyBootstrapFewshotOptions {
|
|
13
|
+
/** Demonstrations to keep. Defaults to 5. */
|
|
14
|
+
k?: number;
|
|
15
|
+
/**
|
|
16
|
+
* When true, rank examples by their per-example metric score against the
|
|
17
|
+
* baseline signature instead of by the recorded `reward`. Slower (one LM
|
|
18
|
+
* call per example) but works when rewards are missing.
|
|
19
|
+
*/
|
|
20
|
+
rankByMetric?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function runDspyBootstrapFewshot(input: DspyOptimizerInput, options?: DspyBootstrapFewshotOptions): Promise<DspyOptimizerResult>;
|
|
23
|
+
//# sourceMappingURL=dspy-bootstrap-fewshot.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dspy-bootstrap-fewshot.d.ts","sourceRoot":"","sources":["../../../src/dspy/optimizers/dspy-bootstrap-fewshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAEpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,2BAA2B;IAC1C,6CAA6C;IAC7C,CAAC,CAAC,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,mBAAmB,CAAC,CAgC9B"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Predict } from "../predict.js";
|
|
2
|
+
async function runDspyBootstrapFewshot(input, options = {}) {
|
|
3
|
+
const k = Math.max(1, options.k ?? 5);
|
|
4
|
+
const lineage = [];
|
|
5
|
+
const baselineScore = await evaluate(input, []);
|
|
6
|
+
lineage.push({
|
|
7
|
+
round: 0,
|
|
8
|
+
variant: 0,
|
|
9
|
+
score: baselineScore,
|
|
10
|
+
notes: "baseline"
|
|
11
|
+
});
|
|
12
|
+
const ranked = await rankExamples(input, options);
|
|
13
|
+
const demos = ranked.slice(0, Math.min(k, ranked.length));
|
|
14
|
+
const optimizedScore = await evaluate(input, demos);
|
|
15
|
+
lineage.push({
|
|
16
|
+
round: 1,
|
|
17
|
+
variant: 1,
|
|
18
|
+
score: optimizedScore,
|
|
19
|
+
notes: `injected ${demos.length} demonstrations`
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
optimizer: "dspy-bootstrap-fewshot",
|
|
23
|
+
signature: input.signature,
|
|
24
|
+
instructions: input.signature.spec.instructions,
|
|
25
|
+
demonstrations: demos,
|
|
26
|
+
score: optimizedScore,
|
|
27
|
+
baselineScore,
|
|
28
|
+
lineage
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
async function evaluate(input, demonstrations) {
|
|
32
|
+
if (input.dataset.length === 0) return 0;
|
|
33
|
+
const predict = new Predict({
|
|
34
|
+
signature: input.signature,
|
|
35
|
+
lm: input.lm,
|
|
36
|
+
demonstrations
|
|
37
|
+
});
|
|
38
|
+
let total = 0;
|
|
39
|
+
let counted = 0;
|
|
40
|
+
for (const example of input.dataset) {
|
|
41
|
+
try {
|
|
42
|
+
const { output } = await predict.forward(example.inputs);
|
|
43
|
+
total += input.metric(output, example.outputs);
|
|
44
|
+
counted += 1;
|
|
45
|
+
} catch {
|
|
46
|
+
counted += 1;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return counted === 0 ? 0 : total / counted;
|
|
50
|
+
}
|
|
51
|
+
async function rankExamples(input, options) {
|
|
52
|
+
if (options.rankByMetric) {
|
|
53
|
+
const scored = [];
|
|
54
|
+
for (const example of input.dataset) {
|
|
55
|
+
const predict = new Predict({
|
|
56
|
+
signature: input.signature,
|
|
57
|
+
lm: input.lm,
|
|
58
|
+
demonstrations: []
|
|
59
|
+
});
|
|
60
|
+
let score = 0;
|
|
61
|
+
try {
|
|
62
|
+
const { output } = await predict.forward(example.inputs);
|
|
63
|
+
score = input.metric(output, example.outputs);
|
|
64
|
+
} catch {
|
|
65
|
+
score = 0;
|
|
66
|
+
}
|
|
67
|
+
scored.push({ example, score });
|
|
68
|
+
}
|
|
69
|
+
scored.sort(
|
|
70
|
+
(a, b) => b.score - a.score || (b.example.reward ?? 0) - (a.example.reward ?? 0)
|
|
71
|
+
);
|
|
72
|
+
return scored.map((s) => s.example);
|
|
73
|
+
}
|
|
74
|
+
const ordered = input.dataset.map((example, index) => ({
|
|
75
|
+
example,
|
|
76
|
+
index,
|
|
77
|
+
reward: example.reward ?? 0
|
|
78
|
+
}));
|
|
79
|
+
ordered.sort((a, b) => b.reward - a.reward || a.index - b.index);
|
|
80
|
+
return ordered.map((entry) => entry.example);
|
|
81
|
+
}
|
|
82
|
+
export {
|
|
83
|
+
runDspyBootstrapFewshot
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=dspy-bootstrap-fewshot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dspy/optimizers/dspy-bootstrap-fewshot.ts"],"sourcesContent":["/**\n * DSPy-style BootstrapFewshot optimizer.\n *\n * Selects top-K examples from the dataset (ranked by reward, then by metric\n * score against the baseline) and emits them as the demonstration set\n * attached to a Predict module. Unlike the legacy `bootstrap-fewshot.ts`\n * which renders demos as text appended to a baseline prompt, this version\n * keeps demonstrations as a typed `Example[]` so they round-trip through\n * Signature.render() at run time.\n */\n\nimport type { Example } from \"../examples.js\";\nimport { Predict } from \"../predict.js\";\nimport type {\n DspyOptimizerInput,\n DspyOptimizerResult,\n OptimizerLineageEntry,\n} from \"./types.js\";\n\nexport interface DspyBootstrapFewshotOptions {\n /** Demonstrations to keep. Defaults to 5. */\n k?: number;\n /**\n * When true, rank examples by their per-example metric score against the\n * baseline signature instead of by the recorded `reward`. Slower (one LM\n * call per example) but works when rewards are missing.\n */\n rankByMetric?: boolean;\n}\n\nexport async function runDspyBootstrapFewshot(\n input: DspyOptimizerInput,\n options: DspyBootstrapFewshotOptions = {},\n): Promise<DspyOptimizerResult> {\n const k = Math.max(1, options.k ?? 5);\n const lineage: OptimizerLineageEntry[] = [];\n\n const baselineScore = await evaluate(input, []);\n lineage.push({\n round: 0,\n variant: 0,\n score: baselineScore,\n notes: \"baseline\",\n });\n\n const ranked = await rankExamples(input, options);\n const demos = ranked.slice(0, Math.min(k, ranked.length));\n\n const optimizedScore = await evaluate(input, demos);\n lineage.push({\n round: 1,\n variant: 1,\n score: optimizedScore,\n notes: `injected ${demos.length} demonstrations`,\n });\n\n return {\n optimizer: \"dspy-bootstrap-fewshot\",\n signature: input.signature,\n instructions: input.signature.spec.instructions,\n demonstrations: demos,\n score: optimizedScore,\n baselineScore,\n lineage,\n };\n}\n\nasync function evaluate(\n input: DspyOptimizerInput,\n demonstrations: Example[],\n): Promise<number> {\n if (input.dataset.length === 0) return 0;\n const predict = new Predict({\n signature: input.signature,\n lm: input.lm,\n demonstrations,\n });\n let total = 0;\n let counted = 0;\n for (const example of input.dataset) {\n try {\n const { output } = await predict.forward(example.inputs);\n total += input.metric(output, example.outputs);\n counted += 1;\n } catch {\n // Parse failure scores 0 — the optimizer must learn to produce\n // signature-compatible output. Avoid burying the failure with `?? 0`\n // at the metric layer.\n counted += 1;\n }\n }\n return counted === 0 ? 0 : total / counted;\n}\n\nasync function rankExamples(\n input: DspyOptimizerInput,\n options: DspyBootstrapFewshotOptions,\n): Promise<Example[]> {\n if (options.rankByMetric) {\n const scored: Array<{ example: Example; score: number }> = [];\n for (const example of input.dataset) {\n const predict = new Predict({\n signature: input.signature,\n lm: input.lm,\n demonstrations: [],\n });\n let score = 0;\n try {\n const { output } = await predict.forward(example.inputs);\n score = input.metric(output, example.outputs);\n } catch {\n score = 0;\n }\n scored.push({ example, score });\n }\n scored.sort(\n (a, b) =>\n b.score - a.score || (b.example.reward ?? 0) - (a.example.reward ?? 0),\n );\n return scored.map((s) => s.example);\n }\n const ordered = input.dataset.map((example, index) => ({\n example,\n index,\n reward: example.reward ?? 0,\n }));\n ordered.sort((a, b) => b.reward - a.reward || a.index - b.index);\n return ordered.map((entry) => entry.example);\n}\n"],"mappings":"AAYA,SAAS,eAAe;AAkBxB,eAAsB,wBACpB,OACA,UAAuC,CAAC,GACV;AAC9B,QAAM,IAAI,KAAK,IAAI,GAAG,QAAQ,KAAK,CAAC;AACpC,QAAM,UAAmC,CAAC;AAE1C,QAAM,gBAAgB,MAAM,SAAS,OAAO,CAAC,CAAC;AAC9C,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO;AAAA,EACT,CAAC;AAED,QAAM,SAAS,MAAM,aAAa,OAAO,OAAO;AAChD,QAAM,QAAQ,OAAO,MAAM,GAAG,KAAK,IAAI,GAAG,OAAO,MAAM,CAAC;AAExD,QAAM,iBAAiB,MAAM,SAAS,OAAO,KAAK;AAClD,UAAQ,KAAK;AAAA,IACX,OAAO;AAAA,IACP,SAAS;AAAA,IACT,OAAO;AAAA,IACP,OAAO,YAAY,MAAM,MAAM;AAAA,EACjC,CAAC;AAED,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM,UAAU,KAAK;AAAA,IACnC,gBAAgB;AAAA,IAChB,OAAO;AAAA,IACP;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAe,SACb,OACA,gBACiB;AACjB,MAAI,MAAM,QAAQ,WAAW,EAAG,QAAO;AACvC,QAAM,UAAU,IAAI,QAAQ;AAAA,IAC1B,WAAW,MAAM;AAAA,IACjB,IAAI,MAAM;AAAA,IACV;AAAA,EACF,CAAC;AACD,MAAI,QAAQ;AACZ,MAAI,UAAU;AACd,aAAW,WAAW,MAAM,SAAS;AACnC,QAAI;AACF,YAAM,EAAE,OAAO,IAAI,MAAM,QAAQ,QAAQ,QAAQ,MAAM;AACvD,eAAS,MAAM,OAAO,QAAQ,QAAQ,OAAO;AAC7C,iBAAW;AAAA,IACb,QAAQ;AAIN,iBAAW;AAAA,IACb;AAAA,EACF;AACA,SAAO,YAAY,IAAI,IAAI,QAAQ;AACrC;AAEA,eAAe,aACb,OACA,SACoB;AACpB,MAAI,QAAQ,cAAc;AACxB,UAAM,SAAqD,CAAC;AAC5D,eAAW,WAAW,MAAM,SAAS;AACnC,YAAM,UAAU,IAAI,QAAQ;AAAA,QAC1B,WAAW,MAAM;AAAA,QACjB,IAAI,MAAM;AAAA,QACV,gBAAgB,CAAC;AAAA,MACnB,CAAC;AACD,UAAI,QAAQ;AACZ,UAAI;AACF,cAAM,EAAE,OAAO,IAAI,MAAM,QAAQ,QAAQ,QAAQ,MAAM;AACvD,gBAAQ,MAAM,OAAO,QAAQ,QAAQ,OAAO;AAAA,MAC9C,QAAQ;AACN,gBAAQ;AAAA,MACV;AACA,aAAO,KAAK,EAAE,SAAS,MAAM,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,MACL,CAAC,GAAG,MACF,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,UAAU,MAAM,EAAE,QAAQ,UAAU;AAAA,IACxE;AACA,WAAO,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EACpC;AACA,QAAM,UAAU,MAAM,QAAQ,IAAI,CAAC,SAAS,WAAW;AAAA,IACrD;AAAA,IACA;AAAA,IACA,QAAQ,QAAQ,UAAU;AAAA,EAC5B,EAAE;AACF,UAAQ,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK;AAC/D,SAAO,QAAQ,IAAI,CAAC,UAAU,MAAM,OAAO;AAC7C;","names":[]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style COPRO (Coordinate ascent over Prompt instructions) optimizer.
|
|
3
|
+
*
|
|
4
|
+
* Loop:
|
|
5
|
+
* for round in 1..depth:
|
|
6
|
+
* 1. Propose N instruction variants via the teacher LM.
|
|
7
|
+
* 2. Score each variant on a held-out subset of the dataset.
|
|
8
|
+
* 3. Keep the highest-scoring variant as the new baseline for the next
|
|
9
|
+
* round (greedy coordinate ascent).
|
|
10
|
+
*
|
|
11
|
+
* Returns the best (instructions, demonstrations=[]) pair observed. The
|
|
12
|
+
* caller can then re-train demonstrations on top of the winning instructions
|
|
13
|
+
* via BootstrapFewshot, which is what MIPRO does internally.
|
|
14
|
+
*/
|
|
15
|
+
import type { DspyOptimizerInput, DspyOptimizerResult } from "./types.js";
|
|
16
|
+
export interface DspyCoproOptions {
|
|
17
|
+
/** Variants to propose per round. Defaults to 6. */
|
|
18
|
+
variants?: number;
|
|
19
|
+
/** Rounds of coordinate ascent. Defaults to 3. */
|
|
20
|
+
depth?: number;
|
|
21
|
+
/** Eval-set size per variant. Defaults to all examples. */
|
|
22
|
+
evalSubset?: number;
|
|
23
|
+
/** Teacher temperature for instruction proposal. Defaults to 0.8. */
|
|
24
|
+
teacherTemperature?: number;
|
|
25
|
+
/** Deterministic RNG for evalSubset sampling. Defaults to Math.random. */
|
|
26
|
+
rng?: () => number;
|
|
27
|
+
}
|
|
28
|
+
export declare function runDspyCopro(input: DspyOptimizerInput, options?: DspyCoproOptions): Promise<DspyOptimizerResult>;
|
|
29
|
+
//# sourceMappingURL=dspy-copro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dspy-copro.d.ts","sourceRoot":"","sources":["../../../src/dspy/optimizers/dspy-copro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,oDAAoD;IACpD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AASD,wBAAsB,YAAY,CAChC,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CAmF9B"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { Predict } from "../predict.js";
|
|
2
|
+
import { Signature } from "../signature.js";
|
|
3
|
+
const PROPOSAL_SYSTEM = `You are rewriting the INSTRUCTIONS field of a task-prompt signature. The signature declares input fields, output fields, and a natural-language INSTRUCTIONS body. Your job is to produce a new INSTRUCTIONS body that makes a downstream language model perform the task more reliably.
|
|
4
|
+
|
|
5
|
+
Hard constraints:
|
|
6
|
+
- Preserve the semantic contract \u2014 the new instructions must still describe the same task and reference the same output fields.
|
|
7
|
+
- Keep the rewrite concise (no preamble, no markdown headers, no role-play framing).
|
|
8
|
+
- Output ONLY the rewritten instructions body \u2014 no fences, no commentary.`;
|
|
9
|
+
async function runDspyCopro(input, options = {}) {
|
|
10
|
+
const variants = Math.max(1, options.variants ?? 6);
|
|
11
|
+
const depth = Math.max(1, options.depth ?? 3);
|
|
12
|
+
const teacher = input.teacher ?? input.lm;
|
|
13
|
+
const teacherTemperature = options.teacherTemperature ?? 0.8;
|
|
14
|
+
const rng = options.rng ?? Math.random;
|
|
15
|
+
const lineage = [];
|
|
16
|
+
const heldOut = typeof options.evalSubset === "number" ? subsample(input.dataset, options.evalSubset, rng) : input.dataset;
|
|
17
|
+
const baselineInstructions = input.signature.spec.instructions;
|
|
18
|
+
const baselineScore = await scoreInstructions(
|
|
19
|
+
baselineInstructions,
|
|
20
|
+
input.signature,
|
|
21
|
+
heldOut,
|
|
22
|
+
input.lm,
|
|
23
|
+
input.metric
|
|
24
|
+
);
|
|
25
|
+
lineage.push({
|
|
26
|
+
round: 0,
|
|
27
|
+
variant: 0,
|
|
28
|
+
score: baselineScore,
|
|
29
|
+
notes: "baseline"
|
|
30
|
+
});
|
|
31
|
+
let bestInstructions = baselineInstructions;
|
|
32
|
+
let bestScore = baselineScore;
|
|
33
|
+
let currentInstructions = baselineInstructions;
|
|
34
|
+
for (let round = 1; round <= depth; round += 1) {
|
|
35
|
+
let roundBestInstructions = currentInstructions;
|
|
36
|
+
let roundBestScore = bestScore;
|
|
37
|
+
for (let variant = 1; variant <= variants; variant += 1) {
|
|
38
|
+
const candidate = await proposeInstructions(
|
|
39
|
+
teacher,
|
|
40
|
+
input.signature,
|
|
41
|
+
currentInstructions,
|
|
42
|
+
teacherTemperature
|
|
43
|
+
);
|
|
44
|
+
if (candidate.trim().length === 0) {
|
|
45
|
+
lineage.push({
|
|
46
|
+
round,
|
|
47
|
+
variant,
|
|
48
|
+
score: 0,
|
|
49
|
+
notes: "empty proposal \u2014 skipped"
|
|
50
|
+
});
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const score = await scoreInstructions(
|
|
54
|
+
candidate,
|
|
55
|
+
input.signature,
|
|
56
|
+
heldOut,
|
|
57
|
+
input.lm,
|
|
58
|
+
input.metric
|
|
59
|
+
);
|
|
60
|
+
lineage.push({ round, variant, score });
|
|
61
|
+
if (score > roundBestScore) {
|
|
62
|
+
roundBestScore = score;
|
|
63
|
+
roundBestInstructions = candidate;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (roundBestScore > bestScore) {
|
|
67
|
+
bestScore = roundBestScore;
|
|
68
|
+
bestInstructions = roundBestInstructions;
|
|
69
|
+
}
|
|
70
|
+
currentInstructions = roundBestInstructions;
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
optimizer: "dspy-copro",
|
|
74
|
+
signature: new Signature({
|
|
75
|
+
...input.signature.spec,
|
|
76
|
+
instructions: bestInstructions
|
|
77
|
+
}),
|
|
78
|
+
instructions: bestInstructions,
|
|
79
|
+
demonstrations: [],
|
|
80
|
+
score: bestScore,
|
|
81
|
+
baselineScore,
|
|
82
|
+
lineage
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
async function proposeInstructions(teacher, signature, current, temperature) {
|
|
86
|
+
const ioSummary = [
|
|
87
|
+
`signature name: ${signature.spec.name}`,
|
|
88
|
+
"input fields:",
|
|
89
|
+
...signature.spec.inputs.map(
|
|
90
|
+
(f) => `- ${f.name} (${f.type}): ${f.description}`
|
|
91
|
+
),
|
|
92
|
+
"output fields:",
|
|
93
|
+
...signature.spec.outputs.map(
|
|
94
|
+
(f) => `- ${f.name} (${f.type}): ${f.description}`
|
|
95
|
+
),
|
|
96
|
+
"",
|
|
97
|
+
"Current INSTRUCTIONS body:",
|
|
98
|
+
current
|
|
99
|
+
].join("\n");
|
|
100
|
+
const result = await teacher.generate({
|
|
101
|
+
system: PROPOSAL_SYSTEM,
|
|
102
|
+
messages: [{ role: "user", content: ioSummary }],
|
|
103
|
+
temperature,
|
|
104
|
+
maxTokens: 1024
|
|
105
|
+
});
|
|
106
|
+
return result.text.trim().replace(/^```[a-z0-9_-]*\s*/i, "").replace(/\s*```$/i, "").trim();
|
|
107
|
+
}
|
|
108
|
+
async function scoreInstructions(instructions, signature, dataset, lm, metric) {
|
|
109
|
+
if (dataset.length === 0) return 0;
|
|
110
|
+
const predict = new Predict({
|
|
111
|
+
signature,
|
|
112
|
+
lm,
|
|
113
|
+
instructionsOverride: instructions
|
|
114
|
+
});
|
|
115
|
+
let total = 0;
|
|
116
|
+
for (const example of dataset) {
|
|
117
|
+
try {
|
|
118
|
+
const { output } = await predict.forward(example.inputs);
|
|
119
|
+
total += metric(output, example.outputs);
|
|
120
|
+
} catch {
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return total / dataset.length;
|
|
124
|
+
}
|
|
125
|
+
function subsample(items, count, rng) {
|
|
126
|
+
if (count >= items.length) return [...items];
|
|
127
|
+
const indices = /* @__PURE__ */ new Set();
|
|
128
|
+
const out = [];
|
|
129
|
+
while (out.length < count) {
|
|
130
|
+
const idx = Math.floor(rng() * items.length);
|
|
131
|
+
if (indices.has(idx)) continue;
|
|
132
|
+
indices.add(idx);
|
|
133
|
+
const item = items[idx];
|
|
134
|
+
if (item !== void 0) out.push(item);
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
export {
|
|
139
|
+
runDspyCopro
|
|
140
|
+
};
|
|
141
|
+
//# sourceMappingURL=dspy-copro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dspy/optimizers/dspy-copro.ts"],"sourcesContent":["/**\n * DSPy-style COPRO (Coordinate ascent over Prompt instructions) optimizer.\n *\n * Loop:\n * for round in 1..depth:\n * 1. Propose N instruction variants via the teacher LM.\n * 2. Score each variant on a held-out subset of the dataset.\n * 3. Keep the highest-scoring variant as the new baseline for the next\n * round (greedy coordinate ascent).\n *\n * Returns the best (instructions, demonstrations=[]) pair observed. The\n * caller can then re-train demonstrations on top of the winning instructions\n * via BootstrapFewshot, which is what MIPRO does internally.\n */\n\nimport type { Example } from \"../examples.js\";\nimport type { LanguageModelAdapter } from \"../lm-adapter.js\";\nimport { Predict } from \"../predict.js\";\nimport { Signature } from \"../signature.js\";\nimport type {\n DspyOptimizerInput,\n DspyOptimizerResult,\n Metric,\n OptimizerLineageEntry,\n} from \"./types.js\";\n\nexport interface DspyCoproOptions {\n /** Variants to propose per round. Defaults to 6. */\n variants?: number;\n /** Rounds of coordinate ascent. Defaults to 3. */\n depth?: number;\n /** Eval-set size per variant. Defaults to all examples. */\n evalSubset?: number;\n /** Teacher temperature for instruction proposal. Defaults to 0.8. */\n teacherTemperature?: number;\n /** Deterministic RNG for evalSubset sampling. Defaults to Math.random. */\n rng?: () => number;\n}\n\nconst PROPOSAL_SYSTEM = `You are rewriting the INSTRUCTIONS field of a task-prompt signature. The signature declares input fields, output fields, and a natural-language INSTRUCTIONS body. Your job is to produce a new INSTRUCTIONS body that makes a downstream language model perform the task more reliably.\n\nHard constraints:\n- Preserve the semantic contract — the new instructions must still describe the same task and reference the same output fields.\n- Keep the rewrite concise (no preamble, no markdown headers, no role-play framing).\n- Output ONLY the rewritten instructions body — no fences, no commentary.`;\n\nexport async function runDspyCopro(\n input: DspyOptimizerInput,\n options: DspyCoproOptions = {},\n): Promise<DspyOptimizerResult> {\n const variants = Math.max(1, options.variants ?? 6);\n const depth = Math.max(1, options.depth ?? 3);\n const teacher = input.teacher ?? input.lm;\n const teacherTemperature = options.teacherTemperature ?? 0.8;\n const rng = options.rng ?? Math.random;\n const lineage: OptimizerLineageEntry[] = [];\n\n const heldOut =\n typeof options.evalSubset === \"number\"\n ? subsample(input.dataset, options.evalSubset, rng)\n : input.dataset;\n\n const baselineInstructions = input.signature.spec.instructions;\n const baselineScore = await scoreInstructions(\n baselineInstructions,\n input.signature,\n heldOut,\n input.lm,\n input.metric,\n );\n lineage.push({\n round: 0,\n variant: 0,\n score: baselineScore,\n notes: \"baseline\",\n });\n\n let bestInstructions = baselineInstructions;\n let bestScore = baselineScore;\n let currentInstructions = baselineInstructions;\n\n for (let round = 1; round <= depth; round += 1) {\n let roundBestInstructions = currentInstructions;\n let roundBestScore = bestScore;\n for (let variant = 1; variant <= variants; variant += 1) {\n const candidate = await proposeInstructions(\n teacher,\n input.signature,\n currentInstructions,\n teacherTemperature,\n );\n if (candidate.trim().length === 0) {\n lineage.push({\n round,\n variant,\n score: 0,\n notes: \"empty proposal — skipped\",\n });\n continue;\n }\n const score = await scoreInstructions(\n candidate,\n input.signature,\n heldOut,\n input.lm,\n input.metric,\n );\n lineage.push({ round, variant, score });\n if (score > roundBestScore) {\n roundBestScore = score;\n roundBestInstructions = candidate;\n }\n }\n if (roundBestScore > bestScore) {\n bestScore = roundBestScore;\n bestInstructions = roundBestInstructions;\n }\n currentInstructions = roundBestInstructions;\n }\n\n return {\n optimizer: \"dspy-copro\",\n signature: new Signature({\n ...input.signature.spec,\n instructions: bestInstructions,\n }),\n instructions: bestInstructions,\n demonstrations: [],\n score: bestScore,\n baselineScore,\n lineage,\n };\n}\n\nasync function proposeInstructions(\n teacher: LanguageModelAdapter,\n signature: import(\"../signature.js\").Signature,\n current: string,\n temperature: number,\n): Promise<string> {\n const ioSummary = [\n `signature name: ${signature.spec.name}`,\n \"input fields:\",\n ...signature.spec.inputs.map(\n (f) => `- ${f.name} (${f.type}): ${f.description}`,\n ),\n \"output fields:\",\n ...signature.spec.outputs.map(\n (f) => `- ${f.name} (${f.type}): ${f.description}`,\n ),\n \"\",\n \"Current INSTRUCTIONS body:\",\n current,\n ].join(\"\\n\");\n const result = await teacher.generate({\n system: PROPOSAL_SYSTEM,\n messages: [{ role: \"user\", content: ioSummary }],\n temperature,\n maxTokens: 1024,\n });\n return result.text\n .trim()\n .replace(/^```[a-z0-9_-]*\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n}\n\nasync function scoreInstructions(\n instructions: string,\n signature: import(\"../signature.js\").Signature,\n dataset: Example[],\n lm: LanguageModelAdapter,\n metric: Metric,\n): Promise<number> {\n if (dataset.length === 0) return 0;\n const predict = new Predict({\n signature,\n lm,\n instructionsOverride: instructions,\n });\n let total = 0;\n for (const example of dataset) {\n try {\n const { output } = await predict.forward(example.inputs);\n total += metric(output, example.outputs);\n } catch {\n // Parse failure is a real failure for scoring. No silent fallback.\n }\n }\n return total / dataset.length;\n}\n\nfunction subsample<T>(items: T[], count: number, rng: () => number): T[] {\n if (count >= items.length) return [...items];\n const indices = new Set<number>();\n const out: T[] = [];\n while (out.length < count) {\n const idx = Math.floor(rng() * items.length);\n if (indices.has(idx)) continue;\n indices.add(idx);\n const item = items[idx];\n if (item !== undefined) out.push(item);\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style MIPROv2 optimizer (joint instruction + demonstration search).
|
|
3
|
+
*
|
|
4
|
+
* MIPRO jointly optimizes the INSTRUCTIONS body and the DEMONSTRATIONS set:
|
|
5
|
+
* 1. Bootstrap a pool of candidate demonstration sets (subsets of the
|
|
6
|
+
* dataset sized 0..k, ranked by reward).
|
|
7
|
+
* 2. Propose a pool of candidate instruction variants via the teacher LM.
|
|
8
|
+
* 3. Evaluate each (instruction, demos) combination on a held-out subset.
|
|
9
|
+
* Use a UCB-style selection so we don't fully enumerate when the search
|
|
10
|
+
* space is large — the score budget is bounded by `evalBudget`.
|
|
11
|
+
* 4. Return the best combination observed.
|
|
12
|
+
*
|
|
13
|
+
* This is a simplified Bayesian-flavoured search: no Gaussian process, just
|
|
14
|
+
* UCB1 with empirical means + visit counts. It's enough to outperform random
|
|
15
|
+
* search on the budgets we run in CI (~50 evals).
|
|
16
|
+
*/
|
|
17
|
+
import type { DspyOptimizerInput, DspyOptimizerResult } from "./types.js";
|
|
18
|
+
export interface DspyMiproOptions {
|
|
19
|
+
/** Demonstrations per candidate set. Defaults to 4. */
|
|
20
|
+
k?: number;
|
|
21
|
+
/** Distinct instruction variants to propose. Defaults to 4. */
|
|
22
|
+
instructionVariants?: number;
|
|
23
|
+
/** Distinct demonstration sets to bootstrap. Defaults to 4. */
|
|
24
|
+
demoSets?: number;
|
|
25
|
+
/** Maximum (instruction, demos) evaluations. Defaults to 20. */
|
|
26
|
+
evalBudget?: number;
|
|
27
|
+
/** Held-out eval-set size per (instruction, demos) trial. Defaults to all examples. */
|
|
28
|
+
evalSubset?: number;
|
|
29
|
+
/** Teacher temperature for instruction proposal. Defaults to 0.8. */
|
|
30
|
+
teacherTemperature?: number;
|
|
31
|
+
/** UCB exploration coefficient. Defaults to 1.41 (=sqrt(2)). */
|
|
32
|
+
ucbC?: number;
|
|
33
|
+
/** Deterministic RNG. Defaults to Math.random. */
|
|
34
|
+
rng?: () => number;
|
|
35
|
+
}
|
|
36
|
+
export declare function runDspyMipro(input: DspyOptimizerInput, options?: DspyMiproOptions): Promise<DspyOptimizerResult>;
|
|
37
|
+
//# sourceMappingURL=dspy-mipro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dspy-mipro.d.ts","sourceRoot":"","sources":["../../../src/dspy/optimizers/dspy-mipro.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH,OAAO,KAAK,EACV,kBAAkB,EAClB,mBAAmB,EAGpB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,uDAAuD;IACvD,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAID,wBAAsB,YAAY,CAChC,KAAK,EAAE,kBAAkB,EACzB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,mBAAmB,CAAC,CA2H9B"}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { Predict } from "../predict.js";
|
|
2
|
+
import { Signature } from "../signature.js";
|
|
3
|
+
const PROPOSAL_SYSTEM = `Rewrite the INSTRUCTIONS body of a task-prompt signature to improve downstream accuracy. Preserve the task contract and the output field names. Output ONLY the rewritten body \u2014 no commentary, no fences.`;
|
|
4
|
+
async function runDspyMipro(input, options = {}) {
|
|
5
|
+
const k = Math.max(0, options.k ?? 4);
|
|
6
|
+
const instructionVariants = Math.max(1, options.instructionVariants ?? 4);
|
|
7
|
+
const demoSetCount = Math.max(1, options.demoSets ?? 4);
|
|
8
|
+
const budget = Math.max(1, options.evalBudget ?? 20);
|
|
9
|
+
const ucbC = options.ucbC ?? Math.SQRT2;
|
|
10
|
+
const rng = options.rng ?? Math.random;
|
|
11
|
+
const teacher = input.teacher ?? input.lm;
|
|
12
|
+
const teacherTemperature = options.teacherTemperature ?? 0.8;
|
|
13
|
+
const lineage = [];
|
|
14
|
+
const heldOut = typeof options.evalSubset === "number" ? subsample(input.dataset, options.evalSubset, rng) : input.dataset;
|
|
15
|
+
const baselineScore = await scoreCandidate(
|
|
16
|
+
input.signature,
|
|
17
|
+
input.signature.spec.instructions,
|
|
18
|
+
[],
|
|
19
|
+
heldOut,
|
|
20
|
+
input.lm,
|
|
21
|
+
input.metric
|
|
22
|
+
);
|
|
23
|
+
lineage.push({
|
|
24
|
+
round: 0,
|
|
25
|
+
variant: 0,
|
|
26
|
+
score: baselineScore,
|
|
27
|
+
notes: "baseline"
|
|
28
|
+
});
|
|
29
|
+
const instructionPool = [input.signature.spec.instructions];
|
|
30
|
+
for (let i = 1; i < instructionVariants; i += 1) {
|
|
31
|
+
const proposal = await proposeInstructions(
|
|
32
|
+
teacher,
|
|
33
|
+
input.signature,
|
|
34
|
+
input.signature.spec.instructions,
|
|
35
|
+
teacherTemperature
|
|
36
|
+
);
|
|
37
|
+
if (proposal.length > 0) instructionPool.push(proposal);
|
|
38
|
+
}
|
|
39
|
+
const demoPool = buildDemoSets(
|
|
40
|
+
input.dataset,
|
|
41
|
+
demoSetCount,
|
|
42
|
+
k,
|
|
43
|
+
rng
|
|
44
|
+
);
|
|
45
|
+
if (demoPool.length === 0 || demoPool[0]?.length !== 0) {
|
|
46
|
+
demoPool.unshift([]);
|
|
47
|
+
}
|
|
48
|
+
const arms = [];
|
|
49
|
+
for (let i = 0; i < instructionPool.length; i += 1) {
|
|
50
|
+
for (let j = 0; j < demoPool.length; j += 1) {
|
|
51
|
+
arms.push({
|
|
52
|
+
instructionIdx: i,
|
|
53
|
+
demoIdx: j,
|
|
54
|
+
visits: 0,
|
|
55
|
+
meanScore: 0,
|
|
56
|
+
lastScore: 0
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
let bestScore = baselineScore;
|
|
61
|
+
let bestInstructions = input.signature.spec.instructions;
|
|
62
|
+
let bestDemos = [];
|
|
63
|
+
let totalVisits = 0;
|
|
64
|
+
const evalCap = Math.min(budget, arms.length);
|
|
65
|
+
for (let step = 0; step < evalCap; step += 1) {
|
|
66
|
+
const arm = selectArm(arms, totalVisits, ucbC);
|
|
67
|
+
const instructions = instructionPool[arm.instructionIdx] ?? "";
|
|
68
|
+
const demos = demoPool[arm.demoIdx] ?? [];
|
|
69
|
+
const score = await scoreCandidate(
|
|
70
|
+
input.signature,
|
|
71
|
+
instructions,
|
|
72
|
+
demos,
|
|
73
|
+
heldOut,
|
|
74
|
+
input.lm,
|
|
75
|
+
input.metric
|
|
76
|
+
);
|
|
77
|
+
arm.visits += 1;
|
|
78
|
+
arm.meanScore = arm.meanScore + (score - arm.meanScore) / arm.visits;
|
|
79
|
+
arm.lastScore = score;
|
|
80
|
+
totalVisits += 1;
|
|
81
|
+
lineage.push({
|
|
82
|
+
round: 1,
|
|
83
|
+
variant: step + 1,
|
|
84
|
+
score,
|
|
85
|
+
notes: `instr=${arm.instructionIdx} demos=${arm.demoIdx} (k=${demos.length})`
|
|
86
|
+
});
|
|
87
|
+
if (score > bestScore) {
|
|
88
|
+
bestScore = score;
|
|
89
|
+
bestInstructions = instructions;
|
|
90
|
+
bestDemos = demos;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return {
|
|
94
|
+
optimizer: "dspy-mipro",
|
|
95
|
+
signature: new Signature({
|
|
96
|
+
...input.signature.spec,
|
|
97
|
+
instructions: bestInstructions
|
|
98
|
+
}),
|
|
99
|
+
instructions: bestInstructions,
|
|
100
|
+
demonstrations: bestDemos,
|
|
101
|
+
score: bestScore,
|
|
102
|
+
baselineScore,
|
|
103
|
+
lineage
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
async function proposeInstructions(teacher, signature, current, temperature) {
|
|
107
|
+
const summary = [
|
|
108
|
+
`signature name: ${signature.spec.name}`,
|
|
109
|
+
"input fields:",
|
|
110
|
+
...signature.spec.inputs.map(
|
|
111
|
+
(f) => `- ${f.name} (${f.type}): ${f.description}`
|
|
112
|
+
),
|
|
113
|
+
"output fields:",
|
|
114
|
+
...signature.spec.outputs.map(
|
|
115
|
+
(f) => `- ${f.name} (${f.type}): ${f.description}`
|
|
116
|
+
),
|
|
117
|
+
"",
|
|
118
|
+
"Current INSTRUCTIONS body:",
|
|
119
|
+
current
|
|
120
|
+
].join("\n");
|
|
121
|
+
const result = await teacher.generate({
|
|
122
|
+
system: PROPOSAL_SYSTEM,
|
|
123
|
+
messages: [{ role: "user", content: summary }],
|
|
124
|
+
temperature,
|
|
125
|
+
maxTokens: 1024
|
|
126
|
+
});
|
|
127
|
+
return result.text.trim().replace(/^```[a-z0-9_-]*\s*/i, "").replace(/\s*```$/i, "").trim();
|
|
128
|
+
}
|
|
129
|
+
function buildDemoSets(dataset, count, k, rng) {
|
|
130
|
+
if (k === 0) return [[]];
|
|
131
|
+
const sortedByReward = [...dataset].sort(
|
|
132
|
+
(a, b) => (b.reward ?? 0) - (a.reward ?? 0)
|
|
133
|
+
);
|
|
134
|
+
const sets = [];
|
|
135
|
+
if (sortedByReward.length > 0) {
|
|
136
|
+
sets.push(sortedByReward.slice(0, Math.min(k, sortedByReward.length)));
|
|
137
|
+
}
|
|
138
|
+
while (sets.length < count) {
|
|
139
|
+
sets.push(subsample(dataset, Math.min(k, dataset.length), rng));
|
|
140
|
+
}
|
|
141
|
+
return sets;
|
|
142
|
+
}
|
|
143
|
+
function selectArm(arms, totalVisits, ucbC) {
|
|
144
|
+
let best = arms[0];
|
|
145
|
+
if (!best) throw new Error("[dspy-mipro] empty arm list");
|
|
146
|
+
let bestUcb = -Infinity;
|
|
147
|
+
const lnT = Math.log(totalVisits + 1);
|
|
148
|
+
for (const arm of arms) {
|
|
149
|
+
const explore = arm.visits === 0 ? Infinity : ucbC * Math.sqrt(lnT / arm.visits);
|
|
150
|
+
const ucb = arm.meanScore + explore;
|
|
151
|
+
if (ucb > bestUcb) {
|
|
152
|
+
bestUcb = ucb;
|
|
153
|
+
best = arm;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return best;
|
|
157
|
+
}
|
|
158
|
+
async function scoreCandidate(signature, instructions, demonstrations, dataset, lm, metric) {
|
|
159
|
+
if (dataset.length === 0) return 0;
|
|
160
|
+
const predict = new Predict({
|
|
161
|
+
signature,
|
|
162
|
+
lm,
|
|
163
|
+
demonstrations,
|
|
164
|
+
instructionsOverride: instructions
|
|
165
|
+
});
|
|
166
|
+
let total = 0;
|
|
167
|
+
for (const example of dataset) {
|
|
168
|
+
try {
|
|
169
|
+
const { output } = await predict.forward(example.inputs);
|
|
170
|
+
total += metric(output, example.outputs);
|
|
171
|
+
} catch {
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return total / dataset.length;
|
|
175
|
+
}
|
|
176
|
+
function subsample(items, count, rng) {
|
|
177
|
+
if (count >= items.length) return [...items];
|
|
178
|
+
const indices = /* @__PURE__ */ new Set();
|
|
179
|
+
const out = [];
|
|
180
|
+
let safety = 0;
|
|
181
|
+
while (out.length < count && safety < count * 20) {
|
|
182
|
+
const idx = Math.floor(rng() * items.length);
|
|
183
|
+
safety += 1;
|
|
184
|
+
if (indices.has(idx)) continue;
|
|
185
|
+
indices.add(idx);
|
|
186
|
+
const item = items[idx];
|
|
187
|
+
if (item !== void 0) out.push(item);
|
|
188
|
+
}
|
|
189
|
+
return out;
|
|
190
|
+
}
|
|
191
|
+
export {
|
|
192
|
+
runDspyMipro
|
|
193
|
+
};
|
|
194
|
+
//# sourceMappingURL=dspy-mipro.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dspy/optimizers/dspy-mipro.ts"],"sourcesContent":["/**\n * DSPy-style MIPROv2 optimizer (joint instruction + demonstration search).\n *\n * MIPRO jointly optimizes the INSTRUCTIONS body and the DEMONSTRATIONS set:\n * 1. Bootstrap a pool of candidate demonstration sets (subsets of the\n * dataset sized 0..k, ranked by reward).\n * 2. Propose a pool of candidate instruction variants via the teacher LM.\n * 3. Evaluate each (instruction, demos) combination on a held-out subset.\n * Use a UCB-style selection so we don't fully enumerate when the search\n * space is large — the score budget is bounded by `evalBudget`.\n * 4. Return the best combination observed.\n *\n * This is a simplified Bayesian-flavoured search: no Gaussian process, just\n * UCB1 with empirical means + visit counts. It's enough to outperform random\n * search on the budgets we run in CI (~50 evals).\n */\n\nimport type { Example } from \"../examples.js\";\nimport type { LanguageModelAdapter } from \"../lm-adapter.js\";\nimport { Predict } from \"../predict.js\";\nimport { Signature } from \"../signature.js\";\nimport type {\n DspyOptimizerInput,\n DspyOptimizerResult,\n Metric,\n OptimizerLineageEntry,\n} from \"./types.js\";\n\nexport interface DspyMiproOptions {\n /** Demonstrations per candidate set. Defaults to 4. */\n k?: number;\n /** Distinct instruction variants to propose. Defaults to 4. */\n instructionVariants?: number;\n /** Distinct demonstration sets to bootstrap. Defaults to 4. */\n demoSets?: number;\n /** Maximum (instruction, demos) evaluations. Defaults to 20. */\n evalBudget?: number;\n /** Held-out eval-set size per (instruction, demos) trial. Defaults to all examples. */\n evalSubset?: number;\n /** Teacher temperature for instruction proposal. Defaults to 0.8. */\n teacherTemperature?: number;\n /** UCB exploration coefficient. Defaults to 1.41 (=sqrt(2)). */\n ucbC?: number;\n /** Deterministic RNG. Defaults to Math.random. */\n rng?: () => number;\n}\n\nconst PROPOSAL_SYSTEM = `Rewrite the INSTRUCTIONS body of a task-prompt signature to improve downstream accuracy. Preserve the task contract and the output field names. Output ONLY the rewritten body — no commentary, no fences.`;\n\nexport async function runDspyMipro(\n input: DspyOptimizerInput,\n options: DspyMiproOptions = {},\n): Promise<DspyOptimizerResult> {\n const k = Math.max(0, options.k ?? 4);\n const instructionVariants = Math.max(1, options.instructionVariants ?? 4);\n const demoSetCount = Math.max(1, options.demoSets ?? 4);\n const budget = Math.max(1, options.evalBudget ?? 20);\n const ucbC = options.ucbC ?? Math.SQRT2;\n const rng = options.rng ?? Math.random;\n const teacher = input.teacher ?? input.lm;\n const teacherTemperature = options.teacherTemperature ?? 0.8;\n const lineage: OptimizerLineageEntry[] = [];\n\n const heldOut =\n typeof options.evalSubset === \"number\"\n ? subsample(input.dataset, options.evalSubset, rng)\n : input.dataset;\n\n const baselineScore = await scoreCandidate(\n input.signature,\n input.signature.spec.instructions,\n [],\n heldOut,\n input.lm,\n input.metric,\n );\n lineage.push({\n round: 0,\n variant: 0,\n score: baselineScore,\n notes: \"baseline\",\n });\n\n // Build the search space: instructions × demonstrations.\n const instructionPool: string[] = [input.signature.spec.instructions];\n for (let i = 1; i < instructionVariants; i += 1) {\n const proposal = await proposeInstructions(\n teacher,\n input.signature,\n input.signature.spec.instructions,\n teacherTemperature,\n );\n if (proposal.length > 0) instructionPool.push(proposal);\n }\n const demoPool: Example[][] = buildDemoSets(\n input.dataset,\n demoSetCount,\n k,\n rng,\n );\n // Empty demo set is always included as the first arm.\n if (demoPool.length === 0 || demoPool[0]?.length !== 0) {\n demoPool.unshift([]);\n }\n\n interface Arm {\n instructionIdx: number;\n demoIdx: number;\n visits: number;\n meanScore: number;\n lastScore: number;\n }\n const arms: Arm[] = [];\n for (let i = 0; i < instructionPool.length; i += 1) {\n for (let j = 0; j < demoPool.length; j += 1) {\n arms.push({\n instructionIdx: i,\n demoIdx: j,\n visits: 0,\n meanScore: 0,\n lastScore: 0,\n });\n }\n }\n\n let bestScore = baselineScore;\n let bestInstructions = input.signature.spec.instructions;\n let bestDemos: Example[] = [];\n let totalVisits = 0;\n const evalCap = Math.min(budget, arms.length);\n\n // UCB1 loop: at each step, pick the arm maximizing\n // mean + ucbC * sqrt(ln(totalVisits + 1) / (visits + epsilon)).\n // Arms with 0 visits get priority via the +1 in the numerator.\n for (let step = 0; step < evalCap; step += 1) {\n const arm = selectArm(arms, totalVisits, ucbC);\n const instructions = instructionPool[arm.instructionIdx] ?? \"\";\n const demos = demoPool[arm.demoIdx] ?? [];\n const score = await scoreCandidate(\n input.signature,\n instructions,\n demos,\n heldOut,\n input.lm,\n input.metric,\n );\n arm.visits += 1;\n arm.meanScore = arm.meanScore + (score - arm.meanScore) / arm.visits;\n arm.lastScore = score;\n totalVisits += 1;\n lineage.push({\n round: 1,\n variant: step + 1,\n score,\n notes: `instr=${arm.instructionIdx} demos=${arm.demoIdx} (k=${demos.length})`,\n });\n if (score > bestScore) {\n bestScore = score;\n bestInstructions = instructions;\n bestDemos = demos;\n }\n }\n\n return {\n optimizer: \"dspy-mipro\",\n signature: new Signature({\n ...input.signature.spec,\n instructions: bestInstructions,\n }),\n instructions: bestInstructions,\n demonstrations: bestDemos,\n score: bestScore,\n baselineScore,\n lineage,\n };\n}\n\nasync function proposeInstructions(\n teacher: LanguageModelAdapter,\n signature: import(\"../signature.js\").Signature,\n current: string,\n temperature: number,\n): Promise<string> {\n const summary = [\n `signature name: ${signature.spec.name}`,\n \"input fields:\",\n ...signature.spec.inputs.map(\n (f) => `- ${f.name} (${f.type}): ${f.description}`,\n ),\n \"output fields:\",\n ...signature.spec.outputs.map(\n (f) => `- ${f.name} (${f.type}): ${f.description}`,\n ),\n \"\",\n \"Current INSTRUCTIONS body:\",\n current,\n ].join(\"\\n\");\n const result = await teacher.generate({\n system: PROPOSAL_SYSTEM,\n messages: [{ role: \"user\", content: summary }],\n temperature,\n maxTokens: 1024,\n });\n return result.text\n .trim()\n .replace(/^```[a-z0-9_-]*\\s*/i, \"\")\n .replace(/\\s*```$/i, \"\")\n .trim();\n}\n\nfunction buildDemoSets(\n dataset: Example[],\n count: number,\n k: number,\n rng: () => number,\n): Example[][] {\n if (k === 0) return [[]];\n const sortedByReward = [...dataset].sort(\n (a, b) => (b.reward ?? 0) - (a.reward ?? 0),\n );\n const sets: Example[][] = [];\n // First set: top-K by reward.\n if (sortedByReward.length > 0) {\n sets.push(sortedByReward.slice(0, Math.min(k, sortedByReward.length)));\n }\n // Remaining sets: random subsamples for diversity.\n while (sets.length < count) {\n sets.push(subsample(dataset, Math.min(k, dataset.length), rng));\n }\n return sets;\n}\n\nfunction selectArm<A extends { visits: number; meanScore: number }>(\n arms: A[],\n totalVisits: number,\n ucbC: number,\n): A {\n let best = arms[0];\n if (!best) throw new Error(\"[dspy-mipro] empty arm list\");\n let bestUcb = -Infinity;\n const lnT = Math.log(totalVisits + 1);\n for (const arm of arms) {\n const explore =\n arm.visits === 0 ? Infinity : ucbC * Math.sqrt(lnT / arm.visits);\n const ucb = arm.meanScore + explore;\n if (ucb > bestUcb) {\n bestUcb = ucb;\n best = arm;\n }\n }\n return best;\n}\n\nasync function scoreCandidate(\n signature: import(\"../signature.js\").Signature,\n instructions: string,\n demonstrations: Example[],\n dataset: Example[],\n lm: LanguageModelAdapter,\n metric: Metric,\n): Promise<number> {\n if (dataset.length === 0) return 0;\n const predict = new Predict({\n signature,\n lm,\n demonstrations,\n instructionsOverride: instructions,\n });\n let total = 0;\n for (const example of dataset) {\n try {\n const { output } = await predict.forward(example.inputs);\n total += metric(output, example.outputs);\n } catch {\n // Parse failure scores 0 — surfaced through the mean.\n }\n }\n return total / dataset.length;\n}\n\nfunction subsample<T>(items: T[], count: number, rng: () => number): T[] {\n if (count >= items.length) return [...items];\n const indices = new Set<number>();\n const out: T[] = [];\n let safety = 0;\n while (out.length < count && safety < count * 20) {\n const idx = Math.floor(rng() * items.length);\n safety += 1;\n if (indices.has(idx)) continue;\n indices.add(idx);\n const item = items[idx];\n if (item !== undefined) out.push(item);\n }\n return out;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { type DspyBootstrapFewshotOptions, runDspyBootstrapFewshot, } from "./dspy-bootstrap-fewshot.js";
|
|
2
|
+
export { type DspyCoproOptions, runDspyCopro } from "./dspy-copro.js";
|
|
3
|
+
export { type DspyMiproOptions, runDspyMipro } from "./dspy-mipro.js";
|
|
4
|
+
export type { DspyOptimizerInput, DspyOptimizerName, DspyOptimizerResult, Metric, OptimizerLineageEntry, } from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dspy/optimizers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,2BAA2B,EAChC,uBAAuB,GACxB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,gBAAgB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtE,YAAY,EACV,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,MAAM,EACN,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
runDspyBootstrapFewshot
|
|
3
|
+
} from "./dspy-bootstrap-fewshot.js";
|
|
4
|
+
import { runDspyCopro } from "./dspy-copro.js";
|
|
5
|
+
import { runDspyMipro } from "./dspy-mipro.js";
|
|
6
|
+
export {
|
|
7
|
+
runDspyBootstrapFewshot,
|
|
8
|
+
runDspyCopro,
|
|
9
|
+
runDspyMipro
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/dspy/optimizers/index.ts"],"sourcesContent":["export {\n type DspyBootstrapFewshotOptions,\n runDspyBootstrapFewshot,\n} from \"./dspy-bootstrap-fewshot.js\";\nexport { type DspyCoproOptions, runDspyCopro } from \"./dspy-copro.js\";\nexport { type DspyMiproOptions, runDspyMipro } from \"./dspy-mipro.js\";\nexport type {\n DspyOptimizerInput,\n DspyOptimizerName,\n DspyOptimizerResult,\n Metric,\n OptimizerLineageEntry,\n} from \"./types.js\";\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,OACK;AACP,SAAgC,oBAAoB;AACpD,SAAgC,oBAAoB;","names":[]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for the DSPy-style optimizers (BootstrapFewshot, COPRO,
|
|
3
|
+
* MIPROv2). These intentionally mirror the legacy `optimizers/types.ts`
|
|
4
|
+
* shape so artifacts written by either family round-trip with the same
|
|
5
|
+
* `eliza_native_v1` reader (`packages/core/src/services/optimized-prompt.ts`).
|
|
6
|
+
*/
|
|
7
|
+
import type { Example } from "../examples.js";
|
|
8
|
+
import type { LanguageModelAdapter } from "../lm-adapter.js";
|
|
9
|
+
import type { Signature } from "../signature.js";
|
|
10
|
+
export type DspyOptimizerName = "dspy-bootstrap-fewshot" | "dspy-copro" | "dspy-mipro";
|
|
11
|
+
/**
|
|
12
|
+
* Metric returns a value in `[0, 1]`. `1` = exact / perfect match,
|
|
13
|
+
* `0` = no credit. Optimizers average metric values across the eval set.
|
|
14
|
+
*/
|
|
15
|
+
export type Metric = (predicted: Record<string, unknown>, expected: Record<string, unknown>) => number;
|
|
16
|
+
export interface OptimizerLineageEntry {
|
|
17
|
+
round: number;
|
|
18
|
+
variant: number;
|
|
19
|
+
score: number;
|
|
20
|
+
notes?: string;
|
|
21
|
+
}
|
|
22
|
+
export interface DspyOptimizerResult {
|
|
23
|
+
optimizer: DspyOptimizerName;
|
|
24
|
+
signature: Signature;
|
|
25
|
+
instructions: string;
|
|
26
|
+
demonstrations: Example[];
|
|
27
|
+
score: number;
|
|
28
|
+
baselineScore: number;
|
|
29
|
+
lineage: OptimizerLineageEntry[];
|
|
30
|
+
}
|
|
31
|
+
export interface DspyOptimizerInput {
|
|
32
|
+
signature: Signature;
|
|
33
|
+
dataset: Example[];
|
|
34
|
+
lm: LanguageModelAdapter;
|
|
35
|
+
metric: Metric;
|
|
36
|
+
/** Optional teacher LM for proposing instruction variants. Defaults to `lm`. */
|
|
37
|
+
teacher?: LanguageModelAdapter;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.d.ts.map
|