@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,61 @@
|
|
|
1
|
+
import { renderDemonstrationsBlock } from "./predict.js";
|
|
2
|
+
function buildDspyArtifact(opts) {
|
|
3
|
+
const { result } = opts;
|
|
4
|
+
const sigSpec = result.signature.spec;
|
|
5
|
+
const promptParts = [result.instructions.trim()];
|
|
6
|
+
if (result.demonstrations.length > 0) {
|
|
7
|
+
const demoBlock = renderDemonstrationsBlock(sigSpec, result.demonstrations);
|
|
8
|
+
if (demoBlock) promptParts.push(demoBlock);
|
|
9
|
+
}
|
|
10
|
+
const prompt = promptParts.join("\n\n");
|
|
11
|
+
return {
|
|
12
|
+
task: opts.task,
|
|
13
|
+
optimizer: result.optimizer,
|
|
14
|
+
baseline: opts.baseline,
|
|
15
|
+
prompt,
|
|
16
|
+
score: result.score,
|
|
17
|
+
baselineScore: result.baselineScore,
|
|
18
|
+
datasetId: opts.datasetId,
|
|
19
|
+
datasetSize: opts.datasetSize,
|
|
20
|
+
generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
21
|
+
fewShotExamples: result.demonstrations.length > 0 ? result.demonstrations.map(legacyDemoShape) : void 0,
|
|
22
|
+
lineage: result.lineage,
|
|
23
|
+
signatureSpec: {
|
|
24
|
+
name: sigSpec.name,
|
|
25
|
+
instructions: result.instructions,
|
|
26
|
+
inputs: sigSpec.inputs,
|
|
27
|
+
outputs: sigSpec.outputs
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function legacyDemoShape(demo) {
|
|
32
|
+
let system;
|
|
33
|
+
let user = "";
|
|
34
|
+
for (const [key, value] of Object.entries(demo.inputs)) {
|
|
35
|
+
if (key === "system" && typeof value === "string") {
|
|
36
|
+
system = value;
|
|
37
|
+
continue;
|
|
38
|
+
}
|
|
39
|
+
if (typeof value === "string" && user.length === 0) {
|
|
40
|
+
user = value;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
let expectedOutput = "";
|
|
44
|
+
for (const value of Object.values(demo.outputs)) {
|
|
45
|
+
if (typeof value === "string") {
|
|
46
|
+
expectedOutput = value;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
id: demo.source,
|
|
52
|
+
input: { user, system },
|
|
53
|
+
expectedOutput,
|
|
54
|
+
reward: demo.reward,
|
|
55
|
+
metadata: demo.metadata
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export {
|
|
59
|
+
buildDspyArtifact
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dspy/artifact.ts"],"sourcesContent":["/**\n * Translate a DSPy optimizer result into the eliza_native_v1\n * `OptimizedPromptArtifact` shape consumed by\n * `packages/core/src/services/optimized-prompt.ts`.\n *\n * The on-disk parser is strict (rejects unknown optimizer names), so we tag\n * each artifact with its DSPy optimizer name. We extend the OptimizerName\n * union there in a separate edit (see `optimized-prompt.ts`).\n */\n\nimport type { Example } from \"./examples.js\";\nimport type { DspyOptimizerResult } from \"./optimizers/types.js\";\nimport { renderDemonstrationsBlock } from \"./predict.js\";\n\n/** Subset of `TrajectoryTrainingTask` plus the new action-descriptions task. */\nexport type DspyArtifactTask =\n | \"should_respond\"\n | \"context_routing\"\n | \"action_planner\"\n | \"response\"\n | \"media_description\"\n | \"view_context\"\n | \"calendar_extract\"\n | \"schedule_plan\"\n | \"reminder_dispatch\"\n | \"inbox_triage\"\n | \"meeting_prep\"\n | \"morning_brief\"\n | \"health_checkin\"\n | \"screentime_recap\"\n | \"action_descriptions\"\n | \"autonomy\";\n\nexport interface DspyArtifact {\n task: DspyArtifactTask;\n optimizer: \"dspy-bootstrap-fewshot\" | \"dspy-copro\" | \"dspy-mipro\";\n baseline: string;\n prompt: string;\n score: number;\n baselineScore: number;\n datasetId: string;\n datasetSize: number;\n generatedAt: string;\n fewShotExamples?: Array<{\n id?: string;\n input: { system?: string; user: string };\n expectedOutput: string;\n reward?: number;\n metadata?: Record<string, unknown>;\n }>;\n lineage: Array<{\n round: number;\n variant: number;\n score: number;\n notes?: string;\n }>;\n signatureSpec: {\n name: string;\n instructions: string;\n inputs: ReadonlyArray<unknown>;\n outputs: ReadonlyArray<unknown>;\n };\n}\n\nexport interface BuildArtifactOptions {\n task: DspyArtifactTask;\n baseline: string;\n datasetId: string;\n datasetSize: number;\n result: DspyOptimizerResult;\n}\n\nexport function buildDspyArtifact(opts: BuildArtifactOptions): DspyArtifact {\n const { result } = opts;\n const sigSpec = result.signature.spec;\n // `prompt` is the fully composed system block: instructions + demonstrations.\n // This is what the runtime substitutes verbatim when it sees the artifact.\n const promptParts = [result.instructions.trim()];\n if (result.demonstrations.length > 0) {\n const demoBlock = renderDemonstrationsBlock(sigSpec, result.demonstrations);\n if (demoBlock) promptParts.push(demoBlock);\n }\n const prompt = promptParts.join(\"\\n\\n\");\n\n return {\n task: opts.task,\n optimizer: result.optimizer,\n baseline: opts.baseline,\n prompt,\n score: result.score,\n baselineScore: result.baselineScore,\n datasetId: opts.datasetId,\n datasetSize: opts.datasetSize,\n generatedAt: new Date().toISOString(),\n fewShotExamples:\n result.demonstrations.length > 0\n ? result.demonstrations.map(legacyDemoShape)\n : undefined,\n lineage: result.lineage,\n signatureSpec: {\n name: sigSpec.name,\n instructions: result.instructions,\n inputs: sigSpec.inputs,\n outputs: sigSpec.outputs,\n },\n };\n}\n\nfunction legacyDemoShape(demo: Example): {\n id?: string;\n input: { system?: string; user: string };\n expectedOutput: string;\n reward?: number;\n metadata?: Record<string, unknown>;\n} {\n // Collapse our typed input record back into the (system, user) shape the\n // legacy artifact parser expects. We pick the first string-typed input\n // field as the canonical `user` payload.\n let system: string | undefined;\n let user = \"\";\n for (const [key, value] of Object.entries(demo.inputs)) {\n if (key === \"system\" && typeof value === \"string\") {\n system = value;\n continue;\n }\n if (typeof value === \"string\" && user.length === 0) {\n user = value;\n }\n }\n let expectedOutput = \"\";\n for (const value of Object.values(demo.outputs)) {\n if (typeof value === \"string\") {\n expectedOutput = value;\n break;\n }\n }\n return {\n id: demo.source,\n input: { user, system },\n expectedOutput,\n reward: demo.reward,\n metadata: demo.metadata,\n };\n}\n"],"mappings":"AAYA,SAAS,iCAAiC;AA4DnC,SAAS,kBAAkB,MAA0C;AAC1E,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,UAAU,OAAO,UAAU;AAGjC,QAAM,cAAc,CAAC,OAAO,aAAa,KAAK,CAAC;AAC/C,MAAI,OAAO,eAAe,SAAS,GAAG;AACpC,UAAM,YAAY,0BAA0B,SAAS,OAAO,cAAc;AAC1E,QAAI,UAAW,aAAY,KAAK,SAAS;AAAA,EAC3C;AACA,QAAM,SAAS,YAAY,KAAK,MAAM;AAEtC,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,WAAW,OAAO;AAAA,IAClB,UAAU,KAAK;AAAA,IACf;AAAA,IACA,OAAO,OAAO;AAAA,IACd,eAAe,OAAO;AAAA,IACtB,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,IAClB,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC,iBACE,OAAO,eAAe,SAAS,IAC3B,OAAO,eAAe,IAAI,eAAe,IACzC;AAAA,IACN,SAAS,OAAO;AAAA,IAChB,eAAe;AAAA,MACb,MAAM,QAAQ;AAAA,MACd,cAAc,OAAO;AAAA,MACrB,QAAQ,QAAQ;AAAA,MAChB,SAAS,QAAQ;AAAA,IACnB;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,MAMvB;AAIA,MAAI;AACJ,MAAI,OAAO;AACX,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACtD,QAAI,QAAQ,YAAY,OAAO,UAAU,UAAU;AACjD,eAAS;AACT;AAAA,IACF;AACA,QAAI,OAAO,UAAU,YAAY,KAAK,WAAW,GAAG;AAClD,aAAO;AAAA,IACT;AAAA,EACF;AACA,MAAI,iBAAiB;AACrB,aAAW,SAAS,OAAO,OAAO,KAAK,OAAO,GAAG;AAC/C,QAAI,OAAO,UAAU,UAAU;AAC7B,uBAAiB;AACjB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,IAAI,KAAK;AAAA,IACT,OAAO,EAAE,MAAM,OAAO;AAAA,IACtB;AAAA,IACA,QAAQ,KAAK;AAAA,IACb,UAAU,KAAK;AAAA,EACjB;AACF;","names":[]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style ChainOfThought module (native TS).
|
|
3
|
+
*
|
|
4
|
+
* Wraps `Predict` and prepends a `reasoning: string` output field to the
|
|
5
|
+
* signature so the model thinks step-by-step before emitting the original
|
|
6
|
+
* outputs. The `reasoning` field is returned alongside `output` for
|
|
7
|
+
* inspection but is NOT part of the typed output record returned to callers
|
|
8
|
+
* who don't care about it.
|
|
9
|
+
*/
|
|
10
|
+
import type { UsageInfo } from "./lm-adapter.js";
|
|
11
|
+
import { type PredictOpts, type PredictTrace } from "./predict.js";
|
|
12
|
+
import { Signature } from "./signature.js";
|
|
13
|
+
export interface ChainOfThoughtResult<O extends Record<string, unknown> = Record<string, unknown>> {
|
|
14
|
+
output: O;
|
|
15
|
+
reasoning: string;
|
|
16
|
+
usage: UsageInfo;
|
|
17
|
+
trace: PredictTrace;
|
|
18
|
+
}
|
|
19
|
+
export declare class ChainOfThought<I extends Record<string, unknown> = Record<string, unknown>, O extends Record<string, unknown> = Record<string, unknown>> {
|
|
20
|
+
private readonly predict;
|
|
21
|
+
constructor(opts: PredictOpts<I, O>);
|
|
22
|
+
get signature(): Signature<I, O & {
|
|
23
|
+
reasoning: string;
|
|
24
|
+
}>;
|
|
25
|
+
forward(input: I): Promise<ChainOfThoughtResult<O>>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=chain-of-thought.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-of-thought.d.ts","sourceRoot":"","sources":["../../src/dspy/chain-of-thought.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAEL,KAAK,WAAW,EAEhB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,SAAS,EAAsB,MAAM,gBAAgB,CAAC;AAE/E,MAAM,WAAW,oBAAoB,CACnC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,MAAM,EAAE,CAAC,CAAC;IACV,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;CACrB;AASD,qBAAa,cAAc,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;gBAEpD,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC;IAQnC,IAAI,SAAS,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC,GAAG;QAAE,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC,CAEvD;IAEK,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;CAgB1D"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Predict
|
|
3
|
+
} from "./predict.js";
|
|
4
|
+
import { Signature } from "./signature.js";
|
|
5
|
+
const REASONING_FIELD = {
|
|
6
|
+
name: "reasoning",
|
|
7
|
+
description: "Step-by-step reasoning that leads to the answer. Be terse \u2014 list the salient facts and the deduction, not commentary.",
|
|
8
|
+
type: "string"
|
|
9
|
+
};
|
|
10
|
+
class ChainOfThought {
|
|
11
|
+
predict;
|
|
12
|
+
constructor(opts) {
|
|
13
|
+
const augmented = augmentSignatureWithReasoning(opts.signature.spec);
|
|
14
|
+
this.predict = new Predict({
|
|
15
|
+
...opts,
|
|
16
|
+
signature: new Signature(augmented)
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
get signature() {
|
|
20
|
+
return this.predict.signature;
|
|
21
|
+
}
|
|
22
|
+
async forward(input) {
|
|
23
|
+
const result = await this.predict.forward(input);
|
|
24
|
+
const { reasoning, ...rest } = result.output;
|
|
25
|
+
return {
|
|
26
|
+
output: rest,
|
|
27
|
+
reasoning: typeof reasoning === "string" ? reasoning : "",
|
|
28
|
+
usage: result.usage,
|
|
29
|
+
trace: result.trace
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function augmentSignatureWithReasoning(spec) {
|
|
34
|
+
const outputs = [REASONING_FIELD, ...spec.outputs];
|
|
35
|
+
return {
|
|
36
|
+
...spec,
|
|
37
|
+
outputs
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export {
|
|
41
|
+
ChainOfThought
|
|
42
|
+
};
|
|
43
|
+
//# sourceMappingURL=chain-of-thought.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dspy/chain-of-thought.ts"],"sourcesContent":["/**\n * DSPy-style ChainOfThought module (native TS).\n *\n * Wraps `Predict` and prepends a `reasoning: string` output field to the\n * signature so the model thinks step-by-step before emitting the original\n * outputs. The `reasoning` field is returned alongside `output` for\n * inspection but is NOT part of the typed output record returned to callers\n * who don't care about it.\n */\n\nimport type { UsageInfo } from \"./lm-adapter.js\";\nimport {\n Predict,\n type PredictOpts,\n type PredictResult,\n type PredictTrace,\n} from \"./predict.js\";\nimport { type FieldSpec, Signature, type SignatureSpec } from \"./signature.js\";\n\nexport interface ChainOfThoughtResult<\n O extends Record<string, unknown> = Record<string, unknown>,\n> {\n output: O;\n reasoning: string;\n usage: UsageInfo;\n trace: PredictTrace;\n}\n\nconst REASONING_FIELD: FieldSpec = {\n name: \"reasoning\",\n description:\n \"Step-by-step reasoning that leads to the answer. Be terse — list the salient facts and the deduction, not commentary.\",\n type: \"string\",\n};\n\nexport class ChainOfThought<\n I extends Record<string, unknown> = Record<string, unknown>,\n O extends Record<string, unknown> = Record<string, unknown>,\n> {\n private readonly predict: Predict<I, O & { reasoning: string }>;\n\n constructor(opts: PredictOpts<I, O>) {\n const augmented = augmentSignatureWithReasoning(opts.signature.spec);\n this.predict = new Predict<I, O & { reasoning: string }>({\n ...opts,\n signature: new Signature<I, O & { reasoning: string }>(augmented),\n });\n }\n\n get signature(): Signature<I, O & { reasoning: string }> {\n return this.predict.signature;\n }\n\n async forward(input: I): Promise<ChainOfThoughtResult<O>> {\n const result: PredictResult<O & { reasoning: string }> =\n await this.predict.forward(input);\n const { reasoning, ...rest } = result.output;\n // `rest` has type `Omit<O & { reasoning: string }, \"reasoning\">`, which\n // is structurally equal to `O` (we only added `reasoning` ourselves and\n // just removed it). TS cannot prove this through Omit-on-intersection,\n // so the double-cast is the minimal type assertion to bridge the\n // destructure to O.\n return {\n output: rest as unknown as O,\n reasoning: typeof reasoning === \"string\" ? reasoning : \"\",\n usage: result.usage,\n trace: result.trace,\n };\n }\n}\n\nfunction augmentSignatureWithReasoning(spec: SignatureSpec): SignatureSpec {\n // Reasoning is the first output field — DSPy's convention. The renderer\n // then asks the model to print `reasoning:` before any other field, which\n // is the literal \"think then answer\" effect.\n const outputs: FieldSpec[] = [REASONING_FIELD, ...spec.outputs];\n return {\n ...spec,\n outputs,\n };\n}\n"],"mappings":"AAWA;AAAA,EACE;AAAA,OAIK;AACP,SAAyB,iBAAqC;AAW9D,MAAM,kBAA6B;AAAA,EACjC,MAAM;AAAA,EACN,aACE;AAAA,EACF,MAAM;AACR;AAEO,MAAM,eAGX;AAAA,EACiB;AAAA,EAEjB,YAAY,MAAyB;AACnC,UAAM,YAAY,8BAA8B,KAAK,UAAU,IAAI;AACnE,SAAK,UAAU,IAAI,QAAsC;AAAA,MACvD,GAAG;AAAA,MACH,WAAW,IAAI,UAAwC,SAAS;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,YAAqD;AACvD,WAAO,KAAK,QAAQ;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,OAA4C;AACxD,UAAM,SACJ,MAAM,KAAK,QAAQ,QAAQ,KAAK;AAClC,UAAM,EAAE,WAAW,GAAG,KAAK,IAAI,OAAO;AAMtC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,WAAW,OAAO,cAAc,WAAW,YAAY;AAAA,MACvD,OAAO,OAAO;AAAA,MACd,OAAO,OAAO;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,8BAA8B,MAAoC;AAIzE,QAAM,UAAuB,CAAC,iBAAiB,GAAG,KAAK,OAAO;AAC9D,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;","names":[]}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style Example primitive + loader for the eliza_native_v1 JSONL shape.
|
|
3
|
+
*
|
|
4
|
+
* The loader walks each row, extracts `(system, user) → expected output`
|
|
5
|
+
* (mirroring the legacy `optimizations.OptimizationExample` flow), and runs
|
|
6
|
+
* the rows through the mandatory privacy filter from `core/privacy-filter.ts`.
|
|
7
|
+
* No file path is allowed to skip the filter — that's a CLAUDE.md hard rule.
|
|
8
|
+
*/
|
|
9
|
+
import { type FilterableTrajectory, type PrivacyFilterOptions } from "../core/privacy-filter.js";
|
|
10
|
+
export interface Example {
|
|
11
|
+
inputs: Record<string, unknown>;
|
|
12
|
+
outputs: Record<string, unknown>;
|
|
13
|
+
reward?: number;
|
|
14
|
+
source?: string;
|
|
15
|
+
metadata?: Record<string, unknown>;
|
|
16
|
+
}
|
|
17
|
+
interface JsonlMessage {
|
|
18
|
+
role: "system" | "developer" | "user" | "assistant" | "tool";
|
|
19
|
+
content: string;
|
|
20
|
+
}
|
|
21
|
+
interface JsonlRow {
|
|
22
|
+
format: "eliza_native_v1";
|
|
23
|
+
boundary?: string;
|
|
24
|
+
request?: {
|
|
25
|
+
system?: string;
|
|
26
|
+
prompt?: string;
|
|
27
|
+
messages?: JsonlMessage[];
|
|
28
|
+
};
|
|
29
|
+
response?: {
|
|
30
|
+
text?: string;
|
|
31
|
+
toolCalls?: unknown[];
|
|
32
|
+
};
|
|
33
|
+
metadata?: Record<string, unknown>;
|
|
34
|
+
}
|
|
35
|
+
export interface LoadExamplesOptions {
|
|
36
|
+
/**
|
|
37
|
+
* Input-field name used when collapsing the (system, user) pair into a
|
|
38
|
+
* single string for downstream signatures. Defaults to `"input"`.
|
|
39
|
+
*/
|
|
40
|
+
inputField?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Output-field name expected by the consuming Signature. Defaults to
|
|
43
|
+
* `"output"`.
|
|
44
|
+
*/
|
|
45
|
+
outputField?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Optional privacy-filter options forwarded to `applyPrivacyFilter`.
|
|
48
|
+
* Even when this is `undefined`, the filter still runs with defaults —
|
|
49
|
+
* see `runPrivacyFilter()` below.
|
|
50
|
+
*/
|
|
51
|
+
privacy?: PrivacyFilterOptions;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Load `eliza_native_v1` JSONL into Example[]. Privacy filter is mandatory.
|
|
55
|
+
*
|
|
56
|
+
* Returns the filtered examples plus the redaction/anonymization counts so
|
|
57
|
+
* callers can log them (or fail loud if a strict-mode flag is added later).
|
|
58
|
+
*/
|
|
59
|
+
export interface LoadExamplesResult {
|
|
60
|
+
examples: Example[];
|
|
61
|
+
redactionCount: number;
|
|
62
|
+
anonymizationCount: number;
|
|
63
|
+
droppedTrajectories: number;
|
|
64
|
+
}
|
|
65
|
+
export declare function loadExamplesFromElizaV1(path: string, options?: LoadExamplesOptions): LoadExamplesResult;
|
|
66
|
+
/**
|
|
67
|
+
* In-memory variant — for tests and callers that already have the parsed
|
|
68
|
+
* rows in hand. Goes through the same privacy filter as the file loader.
|
|
69
|
+
*/
|
|
70
|
+
export declare function buildExamplesFromRows(rows: JsonlRow[], options?: LoadExamplesOptions): LoadExamplesResult;
|
|
71
|
+
export type { FilterableTrajectory };
|
|
72
|
+
//# sourceMappingURL=examples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../../src/dspy/examples.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAEL,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,WAAW,OAAO;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,UAAU,YAAY;IACpB,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IAC7D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,QAAQ;IAChB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE;QACR,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;KAC3B,CAAC;IACF,QAAQ,CAAC,EAAE;QACT,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;KACvB,CAAC;IACF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,mBAAmB;IAClC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAmBpB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EAAE,EAChB,OAAO,GAAE,mBAAwB,GAChC,kBAAkB,CAEpB;AA2FD,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import {
|
|
3
|
+
applyPrivacyFilter
|
|
4
|
+
} from "../core/privacy-filter.js";
|
|
5
|
+
function loadExamplesFromElizaV1(path, options = {}) {
|
|
6
|
+
if (!existsSync(path)) {
|
|
7
|
+
throw new Error(`[dspy/examples] dataset not found at ${path}`);
|
|
8
|
+
}
|
|
9
|
+
const raw = readFileSync(path, "utf-8");
|
|
10
|
+
const lines = raw.split("\n").filter((line) => line.trim().length > 0);
|
|
11
|
+
const rows = [];
|
|
12
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
13
|
+
const line = lines[i];
|
|
14
|
+
if (!line) continue;
|
|
15
|
+
const parsed = JSON.parse(line);
|
|
16
|
+
if (!isJsonlRow(parsed)) {
|
|
17
|
+
throw new Error(
|
|
18
|
+
`[dspy/examples] dataset line ${i + 1} is not an eliza_native_v1 row`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
rows.push(parsed);
|
|
22
|
+
}
|
|
23
|
+
return rowsToExamples(rows, options);
|
|
24
|
+
}
|
|
25
|
+
function buildExamplesFromRows(rows, options = {}) {
|
|
26
|
+
return rowsToExamples(rows, options);
|
|
27
|
+
}
|
|
28
|
+
function rowsToExamples(rows, options) {
|
|
29
|
+
const inputField = options.inputField ?? "input";
|
|
30
|
+
const outputField = options.outputField ?? "output";
|
|
31
|
+
const trajectories = rows.map((row, idx) => ({
|
|
32
|
+
trajectoryId: `row-${idx}`,
|
|
33
|
+
steps: [
|
|
34
|
+
{
|
|
35
|
+
llmCalls: [
|
|
36
|
+
{
|
|
37
|
+
systemPrompt: row.request?.system ?? "",
|
|
38
|
+
userPrompt: extractUser(row),
|
|
39
|
+
response: extractExpected(row)
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
providerAccesses: []
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
metadata: row.metadata
|
|
46
|
+
}));
|
|
47
|
+
const filtered = applyPrivacyFilter(trajectories, options.privacy ?? {});
|
|
48
|
+
const examples = [];
|
|
49
|
+
for (let i = 0; i < filtered.trajectories.length; i += 1) {
|
|
50
|
+
const trajectory = filtered.trajectories[i];
|
|
51
|
+
if (!trajectory) continue;
|
|
52
|
+
const call = trajectory.steps?.[0]?.llmCalls?.[0];
|
|
53
|
+
const userPrompt = call?.userPrompt;
|
|
54
|
+
const expected = call?.response;
|
|
55
|
+
if (!userPrompt || !expected) continue;
|
|
56
|
+
const inputs = { [inputField]: userPrompt };
|
|
57
|
+
if (typeof call?.systemPrompt === "string" && call.systemPrompt.length > 0) {
|
|
58
|
+
inputs.system = call.systemPrompt;
|
|
59
|
+
}
|
|
60
|
+
examples.push({
|
|
61
|
+
inputs,
|
|
62
|
+
outputs: { [outputField]: expected },
|
|
63
|
+
source: trajectory.trajectoryId,
|
|
64
|
+
metadata: trajectory.metadata
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
return {
|
|
68
|
+
examples,
|
|
69
|
+
redactionCount: filtered.redactionCount,
|
|
70
|
+
anonymizationCount: filtered.anonymizationCount,
|
|
71
|
+
droppedTrajectories: filtered.dropped.length
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function isJsonlRow(value) {
|
|
75
|
+
if (typeof value !== "object" || value === null) return false;
|
|
76
|
+
const candidate = value;
|
|
77
|
+
return candidate.format === "eliza_native_v1";
|
|
78
|
+
}
|
|
79
|
+
function extractUser(row) {
|
|
80
|
+
const messages = row.request?.messages ?? [];
|
|
81
|
+
const userTurns = messages.filter((m) => m.role === "user" && typeof m.content === "string").map((m) => m.content);
|
|
82
|
+
if (userTurns.length > 0) return userTurns.join("\n");
|
|
83
|
+
return row.request?.prompt ?? "";
|
|
84
|
+
}
|
|
85
|
+
function extractExpected(row) {
|
|
86
|
+
if (row.response?.text && row.response.text.length > 0) {
|
|
87
|
+
return row.response.text;
|
|
88
|
+
}
|
|
89
|
+
if (Array.isArray(row.response?.toolCalls)) {
|
|
90
|
+
return JSON.stringify({ toolCalls: row.response.toolCalls });
|
|
91
|
+
}
|
|
92
|
+
const messages = row.request?.messages ?? [];
|
|
93
|
+
for (let i = messages.length - 1; i >= 0; i -= 1) {
|
|
94
|
+
const msg = messages[i];
|
|
95
|
+
if (msg?.role === "assistant" && typeof msg.content === "string") {
|
|
96
|
+
return msg.content;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return "";
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
buildExamplesFromRows,
|
|
103
|
+
loadExamplesFromElizaV1
|
|
104
|
+
};
|
|
105
|
+
//# sourceMappingURL=examples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dspy/examples.ts"],"sourcesContent":["/**\n * DSPy-style Example primitive + loader for the eliza_native_v1 JSONL shape.\n *\n * The loader walks each row, extracts `(system, user) → expected output`\n * (mirroring the legacy `optimizations.OptimizationExample` flow), and runs\n * the rows through the mandatory privacy filter from `core/privacy-filter.ts`.\n * No file path is allowed to skip the filter — that's a CLAUDE.md hard rule.\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport {\n applyPrivacyFilter,\n type FilterableTrajectory,\n type PrivacyFilterOptions,\n} from \"../core/privacy-filter.js\";\n\nexport interface Example {\n inputs: Record<string, unknown>;\n outputs: Record<string, unknown>;\n reward?: number;\n source?: string;\n metadata?: Record<string, unknown>;\n}\n\ninterface JsonlMessage {\n role: \"system\" | \"developer\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n}\n\ninterface JsonlRow {\n format: \"eliza_native_v1\";\n boundary?: string;\n request?: {\n system?: string;\n prompt?: string;\n messages?: JsonlMessage[];\n };\n response?: {\n text?: string;\n toolCalls?: unknown[];\n };\n metadata?: Record<string, unknown>;\n}\n\nexport interface LoadExamplesOptions {\n /**\n * Input-field name used when collapsing the (system, user) pair into a\n * single string for downstream signatures. Defaults to `\"input\"`.\n */\n inputField?: string;\n /**\n * Output-field name expected by the consuming Signature. Defaults to\n * `\"output\"`.\n */\n outputField?: string;\n /**\n * Optional privacy-filter options forwarded to `applyPrivacyFilter`.\n * Even when this is `undefined`, the filter still runs with defaults —\n * see `runPrivacyFilter()` below.\n */\n privacy?: PrivacyFilterOptions;\n}\n\n/**\n * Load `eliza_native_v1` JSONL into Example[]. Privacy filter is mandatory.\n *\n * Returns the filtered examples plus the redaction/anonymization counts so\n * callers can log them (or fail loud if a strict-mode flag is added later).\n */\nexport interface LoadExamplesResult {\n examples: Example[];\n redactionCount: number;\n anonymizationCount: number;\n droppedTrajectories: number;\n}\n\nexport function loadExamplesFromElizaV1(\n path: string,\n options: LoadExamplesOptions = {},\n): LoadExamplesResult {\n if (!existsSync(path)) {\n throw new Error(`[dspy/examples] dataset not found at ${path}`);\n }\n const raw = readFileSync(path, \"utf-8\");\n const lines = raw.split(\"\\n\").filter((line) => line.trim().length > 0);\n const rows: JsonlRow[] = [];\n for (let i = 0; i < lines.length; i += 1) {\n const line = lines[i];\n if (!line) continue;\n const parsed: unknown = JSON.parse(line);\n if (!isJsonlRow(parsed)) {\n throw new Error(\n `[dspy/examples] dataset line ${i + 1} is not an eliza_native_v1 row`,\n );\n }\n rows.push(parsed);\n }\n return rowsToExamples(rows, options);\n}\n\n/**\n * In-memory variant — for tests and callers that already have the parsed\n * rows in hand. Goes through the same privacy filter as the file loader.\n */\nexport function buildExamplesFromRows(\n rows: JsonlRow[],\n options: LoadExamplesOptions = {},\n): LoadExamplesResult {\n return rowsToExamples(rows, options);\n}\n\nfunction rowsToExamples(\n rows: JsonlRow[],\n options: LoadExamplesOptions,\n): LoadExamplesResult {\n const inputField = options.inputField ?? \"input\";\n const outputField = options.outputField ?? \"output\";\n\n // Run privacy filter BEFORE turning rows into Examples — the filter walks\n // the `steps[].llmCalls[]` shape, which is what we adapt the rows into.\n const trajectories: FilterableTrajectory[] = rows.map((row, idx) => ({\n trajectoryId: `row-${idx}`,\n steps: [\n {\n llmCalls: [\n {\n systemPrompt: row.request?.system ?? \"\",\n userPrompt: extractUser(row),\n response: extractExpected(row),\n },\n ],\n providerAccesses: [],\n },\n ],\n metadata: row.metadata,\n }));\n\n const filtered = applyPrivacyFilter(trajectories, options.privacy ?? {});\n const examples: Example[] = [];\n for (let i = 0; i < filtered.trajectories.length; i += 1) {\n const trajectory = filtered.trajectories[i];\n if (!trajectory) continue;\n const call = trajectory.steps?.[0]?.llmCalls?.[0];\n const userPrompt = call?.userPrompt;\n const expected = call?.response;\n if (!userPrompt || !expected) continue;\n const inputs: Record<string, unknown> = { [inputField]: userPrompt };\n if (\n typeof call?.systemPrompt === \"string\" &&\n call.systemPrompt.length > 0\n ) {\n inputs.system = call.systemPrompt;\n }\n examples.push({\n inputs,\n outputs: { [outputField]: expected },\n source: trajectory.trajectoryId,\n metadata: trajectory.metadata,\n });\n }\n return {\n examples,\n redactionCount: filtered.redactionCount,\n anonymizationCount: filtered.anonymizationCount,\n droppedTrajectories: filtered.dropped.length,\n };\n}\n\nfunction isJsonlRow(value: unknown): value is JsonlRow {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as JsonlRow;\n return candidate.format === \"eliza_native_v1\";\n}\n\nfunction extractUser(row: JsonlRow): string {\n const messages = row.request?.messages ?? [];\n const userTurns = messages\n .filter((m) => m.role === \"user\" && typeof m.content === \"string\")\n .map((m) => m.content);\n if (userTurns.length > 0) return userTurns.join(\"\\n\");\n return row.request?.prompt ?? \"\";\n}\n\nfunction extractExpected(row: JsonlRow): string {\n if (row.response?.text && row.response.text.length > 0) {\n return row.response.text;\n }\n if (Array.isArray(row.response?.toolCalls)) {\n return JSON.stringify({ toolCalls: row.response.toolCalls });\n }\n const messages = row.request?.messages ?? [];\n for (let i = messages.length - 1; i >= 0; i -= 1) {\n const msg = messages[i];\n if (msg?.role === \"assistant\" && typeof msg.content === \"string\") {\n return msg.content;\n }\n }\n return \"\";\n}\n\nexport type { FilterableTrajectory };\n"],"mappings":"AASA,SAAS,YAAY,oBAAoB;AACzC;AAAA,EACE;AAAA,OAGK;AA8DA,SAAS,wBACd,MACA,UAA+B,CAAC,GACZ;AACpB,MAAI,CAAC,WAAW,IAAI,GAAG;AACrB,UAAM,IAAI,MAAM,wCAAwC,IAAI,EAAE;AAAA,EAChE;AACA,QAAM,MAAM,aAAa,MAAM,OAAO;AACtC,QAAM,QAAQ,IAAI,MAAM,IAAI,EAAE,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE,SAAS,CAAC;AACrE,QAAM,OAAmB,CAAC;AAC1B,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK,GAAG;AACxC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,CAAC,KAAM;AACX,UAAM,SAAkB,KAAK,MAAM,IAAI;AACvC,QAAI,CAAC,WAAW,MAAM,GAAG;AACvB,YAAM,IAAI;AAAA,QACR,gCAAgC,IAAI,CAAC;AAAA,MACvC;AAAA,IACF;AACA,SAAK,KAAK,MAAM;AAAA,EAClB;AACA,SAAO,eAAe,MAAM,OAAO;AACrC;AAMO,SAAS,sBACd,MACA,UAA+B,CAAC,GACZ;AACpB,SAAO,eAAe,MAAM,OAAO;AACrC;AAEA,SAAS,eACP,MACA,SACoB;AACpB,QAAM,aAAa,QAAQ,cAAc;AACzC,QAAM,cAAc,QAAQ,eAAe;AAI3C,QAAM,eAAuC,KAAK,IAAI,CAAC,KAAK,SAAS;AAAA,IACnE,cAAc,OAAO,GAAG;AAAA,IACxB,OAAO;AAAA,MACL;AAAA,QACE,UAAU;AAAA,UACR;AAAA,YACE,cAAc,IAAI,SAAS,UAAU;AAAA,YACrC,YAAY,YAAY,GAAG;AAAA,YAC3B,UAAU,gBAAgB,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,QACA,kBAAkB,CAAC;AAAA,MACrB;AAAA,IACF;AAAA,IACA,UAAU,IAAI;AAAA,EAChB,EAAE;AAEF,QAAM,WAAW,mBAAmB,cAAc,QAAQ,WAAW,CAAC,CAAC;AACvE,QAAM,WAAsB,CAAC;AAC7B,WAAS,IAAI,GAAG,IAAI,SAAS,aAAa,QAAQ,KAAK,GAAG;AACxD,UAAM,aAAa,SAAS,aAAa,CAAC;AAC1C,QAAI,CAAC,WAAY;AACjB,UAAM,OAAO,WAAW,QAAQ,CAAC,GAAG,WAAW,CAAC;AAChD,UAAM,aAAa,MAAM;AACzB,UAAM,WAAW,MAAM;AACvB,QAAI,CAAC,cAAc,CAAC,SAAU;AAC9B,UAAM,SAAkC,EAAE,CAAC,UAAU,GAAG,WAAW;AACnE,QACE,OAAO,MAAM,iBAAiB,YAC9B,KAAK,aAAa,SAAS,GAC3B;AACA,aAAO,SAAS,KAAK;AAAA,IACvB;AACA,aAAS,KAAK;AAAA,MACZ;AAAA,MACA,SAAS,EAAE,CAAC,WAAW,GAAG,SAAS;AAAA,MACnC,QAAQ,WAAW;AAAA,MACnB,UAAU,WAAW;AAAA,IACvB,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,SAAS;AAAA,IACzB,oBAAoB,SAAS;AAAA,IAC7B,qBAAqB,SAAS,QAAQ;AAAA,EACxC;AACF;AAEA,SAAS,WAAW,OAAmC;AACrD,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,YAAY;AAClB,SAAO,UAAU,WAAW;AAC9B;AAEA,SAAS,YAAY,KAAuB;AAC1C,QAAM,WAAW,IAAI,SAAS,YAAY,CAAC;AAC3C,QAAM,YAAY,SACf,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,OAAO,EAAE,YAAY,QAAQ,EAChE,IAAI,CAAC,MAAM,EAAE,OAAO;AACvB,MAAI,UAAU,SAAS,EAAG,QAAO,UAAU,KAAK,IAAI;AACpD,SAAO,IAAI,SAAS,UAAU;AAChC;AAEA,SAAS,gBAAgB,KAAuB;AAC9C,MAAI,IAAI,UAAU,QAAQ,IAAI,SAAS,KAAK,SAAS,GAAG;AACtD,WAAO,IAAI,SAAS;AAAA,EACtB;AACA,MAAI,MAAM,QAAQ,IAAI,UAAU,SAAS,GAAG;AAC1C,WAAO,KAAK,UAAU,EAAE,WAAW,IAAI,SAAS,UAAU,CAAC;AAAA,EAC7D;AACA,QAAM,WAAW,IAAI,SAAS,YAAY,CAAC;AAC3C,WAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG;AAChD,UAAM,MAAM,SAAS,CAAC;AACtB,QAAI,KAAK,SAAS,eAAe,OAAO,IAAI,YAAY,UAAU;AAChE,aAAO,IAAI;AAAA,IACb;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style primitives (native TS).
|
|
3
|
+
*
|
|
4
|
+
* No `@ax-llm/ax`, `dspy`, or `ax` dependency — this is our own implementation
|
|
5
|
+
* of Signature, Predict, ChainOfThought, plus the BootstrapFewshot / COPRO /
|
|
6
|
+
* MIPROv2 optimizers and the eliza_native_v1-compatible artifact shape.
|
|
7
|
+
*/
|
|
8
|
+
export { type BuildArtifactOptions, buildDspyArtifact, type DspyArtifact, type DspyArtifactTask, } from "./artifact.js";
|
|
9
|
+
export { ChainOfThought, type ChainOfThoughtResult, } from "./chain-of-thought.js";
|
|
10
|
+
export { buildExamplesFromRows, type Example, type LoadExamplesOptions, type LoadExamplesResult, loadExamplesFromElizaV1, } from "./examples.js";
|
|
11
|
+
export { CerebrasAdapter, type ChatMessage, type GenerateArgs, type GenerateResult, type LanguageModelAdapter, legacyAdapterToLm, MockAdapter, type MockAdapterOptions, type MockRule, type UsageInfo, type UseModelLike, } from "./lm-adapter.js";
|
|
12
|
+
export * from "./optimizers/index.js";
|
|
13
|
+
export { Predict, type PredictOpts, type PredictResult, type PredictTrace, renderDemonstrationsBlock, } from "./predict.js";
|
|
14
|
+
export { defineSignature, type FieldSpec, type FieldType, type RenderedPrompt, Signature, SignatureParseError, type SignatureSpec, } from "./signature.js";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dspy/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,KAAK,YAAY,EACjB,KAAK,gBAAgB,GACtB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,GAC1B,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,KAAK,OAAO,EACZ,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,uBAAuB,GACxB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,iBAAiB,EACjB,WAAW,EACX,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,iBAAiB,CAAC;AACzB,cAAc,uBAAuB,CAAC;AACtC,OAAO,EACL,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,eAAe,EACf,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,SAAS,EACT,mBAAmB,EACnB,KAAK,aAAa,GACnB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildDspyArtifact
|
|
3
|
+
} from "./artifact.js";
|
|
4
|
+
import {
|
|
5
|
+
ChainOfThought
|
|
6
|
+
} from "./chain-of-thought.js";
|
|
7
|
+
import {
|
|
8
|
+
buildExamplesFromRows,
|
|
9
|
+
loadExamplesFromElizaV1
|
|
10
|
+
} from "./examples.js";
|
|
11
|
+
import {
|
|
12
|
+
CerebrasAdapter,
|
|
13
|
+
legacyAdapterToLm,
|
|
14
|
+
MockAdapter
|
|
15
|
+
} from "./lm-adapter.js";
|
|
16
|
+
export * from "./optimizers/index.js";
|
|
17
|
+
import {
|
|
18
|
+
Predict,
|
|
19
|
+
renderDemonstrationsBlock
|
|
20
|
+
} from "./predict.js";
|
|
21
|
+
import {
|
|
22
|
+
defineSignature,
|
|
23
|
+
Signature,
|
|
24
|
+
SignatureParseError
|
|
25
|
+
} from "./signature.js";
|
|
26
|
+
export {
|
|
27
|
+
CerebrasAdapter,
|
|
28
|
+
ChainOfThought,
|
|
29
|
+
MockAdapter,
|
|
30
|
+
Predict,
|
|
31
|
+
Signature,
|
|
32
|
+
SignatureParseError,
|
|
33
|
+
buildDspyArtifact,
|
|
34
|
+
buildExamplesFromRows,
|
|
35
|
+
defineSignature,
|
|
36
|
+
legacyAdapterToLm,
|
|
37
|
+
loadExamplesFromElizaV1,
|
|
38
|
+
renderDemonstrationsBlock
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dspy/index.ts"],"sourcesContent":["/**\n * DSPy-style primitives (native TS).\n *\n * No `@ax-llm/ax`, `dspy`, or `ax` dependency — this is our own implementation\n * of Signature, Predict, ChainOfThought, plus the BootstrapFewshot / COPRO /\n * MIPROv2 optimizers and the eliza_native_v1-compatible artifact shape.\n */\n\nexport {\n type BuildArtifactOptions,\n buildDspyArtifact,\n type DspyArtifact,\n type DspyArtifactTask,\n} from \"./artifact.js\";\nexport {\n ChainOfThought,\n type ChainOfThoughtResult,\n} from \"./chain-of-thought.js\";\nexport {\n buildExamplesFromRows,\n type Example,\n type LoadExamplesOptions,\n type LoadExamplesResult,\n loadExamplesFromElizaV1,\n} from \"./examples.js\";\nexport {\n CerebrasAdapter,\n type ChatMessage,\n type GenerateArgs,\n type GenerateResult,\n type LanguageModelAdapter,\n legacyAdapterToLm,\n MockAdapter,\n type MockAdapterOptions,\n type MockRule,\n type UsageInfo,\n type UseModelLike,\n} from \"./lm-adapter.js\";\nexport * from \"./optimizers/index.js\";\nexport {\n Predict,\n type PredictOpts,\n type PredictResult,\n type PredictTrace,\n renderDemonstrationsBlock,\n} from \"./predict.js\";\nexport {\n defineSignature,\n type FieldSpec,\n type FieldType,\n type RenderedPrompt,\n Signature,\n SignatureParseError,\n type SignatureSpec,\n} from \"./signature.js\";\n"],"mappings":"AAQA;AAAA,EAEE;AAAA,OAGK;AACP;AAAA,EACE;AAAA,OAEK;AACP;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAKA;AAAA,EACA;AAAA,OAKK;AACP,cAAc;AACd;AAAA,EACE;AAAA,EAIA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EAIA;AAAA,EACA;AAAA,OAEK;","names":[]}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DSPy-style LanguageModelAdapter — abstracts Cerebras / Anthropic / OpenAI /
|
|
3
|
+
* mock implementations behind one minimal interface so Predict/CoT/optimizers
|
|
4
|
+
* stay provider-agnostic.
|
|
5
|
+
*
|
|
6
|
+
* The existing `LlmAdapter` (in `optimizers/types.ts`) is intentionally narrow
|
|
7
|
+
* (`complete()` → string) for the legacy three optimizers. The DSPy modules
|
|
8
|
+
* need slightly richer semantics: a message-array interface plus usage
|
|
9
|
+
* telemetry. We bridge to the legacy adapter via `legacyAdapterToLm()` for
|
|
10
|
+
* call-sites that still hold an `LlmAdapter`.
|
|
11
|
+
*/
|
|
12
|
+
import type { LlmAdapter } from "../optimizers/types.js";
|
|
13
|
+
export interface UsageInfo {
|
|
14
|
+
promptTokens?: number;
|
|
15
|
+
completionTokens?: number;
|
|
16
|
+
totalTokens?: number;
|
|
17
|
+
/** Provider-specific cache fields are surfaced verbatim under `cache`. */
|
|
18
|
+
cache?: Record<string, number>;
|
|
19
|
+
}
|
|
20
|
+
export interface ChatMessage {
|
|
21
|
+
role: "system" | "user" | "assistant";
|
|
22
|
+
content: string;
|
|
23
|
+
}
|
|
24
|
+
export interface GenerateArgs {
|
|
25
|
+
system: string;
|
|
26
|
+
messages: ChatMessage[];
|
|
27
|
+
temperature?: number;
|
|
28
|
+
maxTokens?: number;
|
|
29
|
+
stop?: string[];
|
|
30
|
+
}
|
|
31
|
+
export interface GenerateResult {
|
|
32
|
+
text: string;
|
|
33
|
+
usage: UsageInfo;
|
|
34
|
+
}
|
|
35
|
+
export interface LanguageModelAdapter {
|
|
36
|
+
name: string;
|
|
37
|
+
generate(args: GenerateArgs): Promise<GenerateResult>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Lift a legacy `LlmAdapter` (which only exposes `complete({system,user})`)
|
|
41
|
+
* into the DSPy `LanguageModelAdapter` shape. We collapse the message array
|
|
42
|
+
* by concatenating non-system turns with role tags so the legacy adapter sees
|
|
43
|
+
* a single composed user prompt — adequate for our scoring loop, which uses
|
|
44
|
+
* single-turn signatures only.
|
|
45
|
+
*/
|
|
46
|
+
export declare function legacyAdapterToLm(legacy: LlmAdapter, name?: string): LanguageModelAdapter;
|
|
47
|
+
/**
|
|
48
|
+
* MockAdapter — deterministic, no-network LM for tests.
|
|
49
|
+
*
|
|
50
|
+
* The adapter accepts a list of `(systemContains, userContains) → text`
|
|
51
|
+
* rules and returns the first matching response. The default fallback echoes
|
|
52
|
+
* the user message so even unconfigured tests get a deterministic string.
|
|
53
|
+
*/
|
|
54
|
+
export interface MockRule {
|
|
55
|
+
system?: string | RegExp;
|
|
56
|
+
user?: string | RegExp;
|
|
57
|
+
response: string;
|
|
58
|
+
}
|
|
59
|
+
export interface MockAdapterOptions {
|
|
60
|
+
rules?: MockRule[];
|
|
61
|
+
defaultResponse?: string;
|
|
62
|
+
/** Optional usage fixture returned with every response. */
|
|
63
|
+
usage?: UsageInfo;
|
|
64
|
+
/** Records every call for assertion in tests. */
|
|
65
|
+
log?: GenerateArgs[];
|
|
66
|
+
}
|
|
67
|
+
export declare class MockAdapter implements LanguageModelAdapter {
|
|
68
|
+
readonly name = "mock";
|
|
69
|
+
private readonly rules;
|
|
70
|
+
private readonly defaultResponse;
|
|
71
|
+
private readonly usage;
|
|
72
|
+
private readonly log?;
|
|
73
|
+
private callCount;
|
|
74
|
+
constructor(options?: MockAdapterOptions);
|
|
75
|
+
get calls(): number;
|
|
76
|
+
generate(args: GenerateArgs): Promise<GenerateResult>;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Cerebras adapter that routes through the existing
|
|
80
|
+
* `getTrainingUseModelAdapter()` helper (`lifeops-eval-model.ts`). The helper
|
|
81
|
+
* already implements gpt-oss-120b auth, reasoning-effort hints, and retry
|
|
82
|
+
* logic, so we delegate rather than re-implementing the HTTP client.
|
|
83
|
+
*
|
|
84
|
+
* The constructor takes the `useModel` callable so this module stays free of
|
|
85
|
+
* a hard import on `app-lifeops` (it lives in a sibling plugin). Callers
|
|
86
|
+
* resolve the helper through a dynamic import and inject it here.
|
|
87
|
+
*/
|
|
88
|
+
export type UseModelLike = (input: {
|
|
89
|
+
prompt: string;
|
|
90
|
+
systemPrompt?: string;
|
|
91
|
+
temperature?: number;
|
|
92
|
+
maxTokens?: number;
|
|
93
|
+
}) => Promise<string>;
|
|
94
|
+
export declare class CerebrasAdapter implements LanguageModelAdapter {
|
|
95
|
+
private readonly useModel;
|
|
96
|
+
readonly name = "cerebras";
|
|
97
|
+
constructor(useModel: UseModelLike);
|
|
98
|
+
generate(args: GenerateArgs): Promise<GenerateResult>;
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=lm-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lm-adapter.d.ts","sourceRoot":"","sources":["../../src/dspy/lm-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,WAAW,SAAS;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;CACvD;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,IAAI,SAAW,GACd,oBAAoB,CAkBtB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,QAAQ;IACvB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,2DAA2D;IAC3D,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,iDAAiD;IACjD,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,qBAAa,WAAY,YAAW,oBAAoB;IACtD,QAAQ,CAAC,IAAI,UAAU;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAiB;IACtC,OAAO,CAAC,SAAS,CAAK;gBAEV,OAAO,GAAE,kBAAuB;IAW5C,IAAI,KAAK,IAAI,MAAM,CAElB;IAEK,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;CAiB5D;AAOD;;;;;;;;;GASG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtB,qBAAa,eAAgB,YAAW,oBAAoB;IAG9C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,QAAQ,CAAC,IAAI,cAAc;gBAEE,QAAQ,EAAE,YAAY;IAE7C,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC;CAgB5D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
function legacyAdapterToLm(legacy, name = "legacy") {
|
|
2
|
+
return {
|
|
3
|
+
name,
|
|
4
|
+
async generate(args) {
|
|
5
|
+
const composed = args.messages.map(
|
|
6
|
+
(m) => m.role === "user" ? m.content : `[${m.role}]
|
|
7
|
+
${m.content}`
|
|
8
|
+
).join("\n\n");
|
|
9
|
+
const text = await legacy.complete({
|
|
10
|
+
system: args.system,
|
|
11
|
+
user: composed,
|
|
12
|
+
temperature: args.temperature,
|
|
13
|
+
maxTokens: args.maxTokens
|
|
14
|
+
});
|
|
15
|
+
return { text, usage: {} };
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
class MockAdapter {
|
|
20
|
+
name = "mock";
|
|
21
|
+
rules;
|
|
22
|
+
defaultResponse;
|
|
23
|
+
usage;
|
|
24
|
+
log;
|
|
25
|
+
callCount = 0;
|
|
26
|
+
constructor(options = {}) {
|
|
27
|
+
this.rules = options.rules ?? [];
|
|
28
|
+
this.defaultResponse = options.defaultResponse ?? "";
|
|
29
|
+
this.usage = options.usage ?? {
|
|
30
|
+
promptTokens: 0,
|
|
31
|
+
completionTokens: 0,
|
|
32
|
+
totalTokens: 0
|
|
33
|
+
};
|
|
34
|
+
this.log = options.log;
|
|
35
|
+
}
|
|
36
|
+
get calls() {
|
|
37
|
+
return this.callCount;
|
|
38
|
+
}
|
|
39
|
+
async generate(args) {
|
|
40
|
+
this.callCount += 1;
|
|
41
|
+
this.log?.push(args);
|
|
42
|
+
const userContent = args.messages.filter((m) => m.role === "user").map((m) => m.content).join("\n");
|
|
43
|
+
for (const rule of this.rules) {
|
|
44
|
+
if (rule.system && !matches(rule.system, args.system)) continue;
|
|
45
|
+
if (rule.user && !matches(rule.user, userContent)) continue;
|
|
46
|
+
return { text: rule.response, usage: this.usage };
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
text: this.defaultResponse || userContent,
|
|
50
|
+
usage: this.usage
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function matches(needle, haystack) {
|
|
55
|
+
if (typeof needle === "string") return haystack.includes(needle);
|
|
56
|
+
return needle.test(haystack);
|
|
57
|
+
}
|
|
58
|
+
class CerebrasAdapter {
|
|
59
|
+
constructor(useModel) {
|
|
60
|
+
this.useModel = useModel;
|
|
61
|
+
}
|
|
62
|
+
useModel;
|
|
63
|
+
name = "cerebras";
|
|
64
|
+
async generate(args) {
|
|
65
|
+
const userContent = args.messages.filter((m) => m.role !== "system").map((m) => m.role === "user" ? m.content : `[${m.role}]
|
|
66
|
+
${m.content}`).join("\n\n");
|
|
67
|
+
const text = await this.useModel({
|
|
68
|
+
prompt: userContent,
|
|
69
|
+
systemPrompt: args.system,
|
|
70
|
+
temperature: args.temperature,
|
|
71
|
+
maxTokens: args.maxTokens
|
|
72
|
+
});
|
|
73
|
+
return { text, usage: {} };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
export {
|
|
77
|
+
CerebrasAdapter,
|
|
78
|
+
MockAdapter,
|
|
79
|
+
legacyAdapterToLm
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=lm-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/dspy/lm-adapter.ts"],"sourcesContent":["/**\n * DSPy-style LanguageModelAdapter — abstracts Cerebras / Anthropic / OpenAI /\n * mock implementations behind one minimal interface so Predict/CoT/optimizers\n * stay provider-agnostic.\n *\n * The existing `LlmAdapter` (in `optimizers/types.ts`) is intentionally narrow\n * (`complete()` → string) for the legacy three optimizers. The DSPy modules\n * need slightly richer semantics: a message-array interface plus usage\n * telemetry. We bridge to the legacy adapter via `legacyAdapterToLm()` for\n * call-sites that still hold an `LlmAdapter`.\n */\n\nimport type { LlmAdapter } from \"../optimizers/types.js\";\n\nexport interface UsageInfo {\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n /** Provider-specific cache fields are surfaced verbatim under `cache`. */\n cache?: Record<string, number>;\n}\n\nexport interface ChatMessage {\n role: \"system\" | \"user\" | \"assistant\";\n content: string;\n}\n\nexport interface GenerateArgs {\n system: string;\n messages: ChatMessage[];\n temperature?: number;\n maxTokens?: number;\n stop?: string[];\n}\n\nexport interface GenerateResult {\n text: string;\n usage: UsageInfo;\n}\n\nexport interface LanguageModelAdapter {\n name: string;\n generate(args: GenerateArgs): Promise<GenerateResult>;\n}\n\n/**\n * Lift a legacy `LlmAdapter` (which only exposes `complete({system,user})`)\n * into the DSPy `LanguageModelAdapter` shape. We collapse the message array\n * by concatenating non-system turns with role tags so the legacy adapter sees\n * a single composed user prompt — adequate for our scoring loop, which uses\n * single-turn signatures only.\n */\nexport function legacyAdapterToLm(\n legacy: LlmAdapter,\n name = \"legacy\",\n): LanguageModelAdapter {\n return {\n name,\n async generate(args) {\n const composed = args.messages\n .map((m) =>\n m.role === \"user\" ? m.content : `[${m.role}]\\n${m.content}`,\n )\n .join(\"\\n\\n\");\n const text = await legacy.complete({\n system: args.system,\n user: composed,\n temperature: args.temperature,\n maxTokens: args.maxTokens,\n });\n return { text, usage: {} };\n },\n };\n}\n\n/**\n * MockAdapter — deterministic, no-network LM for tests.\n *\n * The adapter accepts a list of `(systemContains, userContains) → text`\n * rules and returns the first matching response. The default fallback echoes\n * the user message so even unconfigured tests get a deterministic string.\n */\nexport interface MockRule {\n system?: string | RegExp;\n user?: string | RegExp;\n response: string;\n}\n\nexport interface MockAdapterOptions {\n rules?: MockRule[];\n defaultResponse?: string;\n /** Optional usage fixture returned with every response. */\n usage?: UsageInfo;\n /** Records every call for assertion in tests. */\n log?: GenerateArgs[];\n}\n\nexport class MockAdapter implements LanguageModelAdapter {\n readonly name = \"mock\";\n private readonly rules: MockRule[];\n private readonly defaultResponse: string;\n private readonly usage: UsageInfo;\n private readonly log?: GenerateArgs[];\n private callCount = 0;\n\n constructor(options: MockAdapterOptions = {}) {\n this.rules = options.rules ?? [];\n this.defaultResponse = options.defaultResponse ?? \"\";\n this.usage = options.usage ?? {\n promptTokens: 0,\n completionTokens: 0,\n totalTokens: 0,\n };\n this.log = options.log;\n }\n\n get calls(): number {\n return this.callCount;\n }\n\n async generate(args: GenerateArgs): Promise<GenerateResult> {\n this.callCount += 1;\n this.log?.push(args);\n const userContent = args.messages\n .filter((m) => m.role === \"user\")\n .map((m) => m.content)\n .join(\"\\n\");\n for (const rule of this.rules) {\n if (rule.system && !matches(rule.system, args.system)) continue;\n if (rule.user && !matches(rule.user, userContent)) continue;\n return { text: rule.response, usage: this.usage };\n }\n return {\n text: this.defaultResponse || userContent,\n usage: this.usage,\n };\n }\n}\n\nfunction matches(needle: string | RegExp, haystack: string): boolean {\n if (typeof needle === \"string\") return haystack.includes(needle);\n return needle.test(haystack);\n}\n\n/**\n * Cerebras adapter that routes through the existing\n * `getTrainingUseModelAdapter()` helper (`lifeops-eval-model.ts`). The helper\n * already implements gpt-oss-120b auth, reasoning-effort hints, and retry\n * logic, so we delegate rather than re-implementing the HTTP client.\n *\n * The constructor takes the `useModel` callable so this module stays free of\n * a hard import on `app-lifeops` (it lives in a sibling plugin). Callers\n * resolve the helper through a dynamic import and inject it here.\n */\nexport type UseModelLike = (input: {\n prompt: string;\n systemPrompt?: string;\n temperature?: number;\n maxTokens?: number;\n}) => Promise<string>;\n\nexport class CerebrasAdapter implements LanguageModelAdapter {\n readonly name = \"cerebras\";\n\n constructor(private readonly useModel: UseModelLike) {}\n\n async generate(args: GenerateArgs): Promise<GenerateResult> {\n const userContent = args.messages\n .filter((m) => m.role !== \"system\")\n .map((m) => (m.role === \"user\" ? m.content : `[${m.role}]\\n${m.content}`))\n .join(\"\\n\\n\");\n const text = await this.useModel({\n prompt: userContent,\n systemPrompt: args.system,\n temperature: args.temperature,\n maxTokens: args.maxTokens,\n });\n // gpt-oss-120b does not expose per-call cache fields through the existing\n // helper, so usage stays empty here. The helper-level cache hit-rate\n // counters live in `lifeops-eval-model.ts` and surface elsewhere.\n return { text, usage: {} };\n }\n}\n"],"mappings":"AAoDO,SAAS,kBACd,QACA,OAAO,UACe;AACtB,SAAO;AAAA,IACL;AAAA,IACA,MAAM,SAAS,MAAM;AACnB,YAAM,WAAW,KAAK,SACnB;AAAA,QAAI,CAAC,MACJ,EAAE,SAAS,SAAS,EAAE,UAAU,IAAI,EAAE,IAAI;AAAA,EAAM,EAAE,OAAO;AAAA,MAC3D,EACC,KAAK,MAAM;AACd,YAAM,OAAO,MAAM,OAAO,SAAS;AAAA,QACjC,QAAQ,KAAK;AAAA,QACb,MAAM;AAAA,QACN,aAAa,KAAK;AAAA,QAClB,WAAW,KAAK;AAAA,MAClB,CAAC;AACD,aAAO,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,IAC3B;AAAA,EACF;AACF;AAwBO,MAAM,YAA4C;AAAA,EAC9C,OAAO;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,YAAY;AAAA,EAEpB,YAAY,UAA8B,CAAC,GAAG;AAC5C,SAAK,QAAQ,QAAQ,SAAS,CAAC;AAC/B,SAAK,kBAAkB,QAAQ,mBAAmB;AAClD,SAAK,QAAQ,QAAQ,SAAS;AAAA,MAC5B,cAAc;AAAA,MACd,kBAAkB;AAAA,MAClB,aAAa;AAAA,IACf;AACA,SAAK,MAAM,QAAQ;AAAA,EACrB;AAAA,EAEA,IAAI,QAAgB;AAClB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,SAAS,MAA6C;AAC1D,SAAK,aAAa;AAClB,SAAK,KAAK,KAAK,IAAI;AACnB,UAAM,cAAc,KAAK,SACtB,OAAO,CAAC,MAAM,EAAE,SAAS,MAAM,EAC/B,IAAI,CAAC,MAAM,EAAE,OAAO,EACpB,KAAK,IAAI;AACZ,eAAW,QAAQ,KAAK,OAAO;AAC7B,UAAI,KAAK,UAAU,CAAC,QAAQ,KAAK,QAAQ,KAAK,MAAM,EAAG;AACvD,UAAI,KAAK,QAAQ,CAAC,QAAQ,KAAK,MAAM,WAAW,EAAG;AACnD,aAAO,EAAE,MAAM,KAAK,UAAU,OAAO,KAAK,MAAM;AAAA,IAClD;AACA,WAAO;AAAA,MACL,MAAM,KAAK,mBAAmB;AAAA,MAC9B,OAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;AAEA,SAAS,QAAQ,QAAyB,UAA2B;AACnE,MAAI,OAAO,WAAW,SAAU,QAAO,SAAS,SAAS,MAAM;AAC/D,SAAO,OAAO,KAAK,QAAQ;AAC7B;AAmBO,MAAM,gBAAgD;AAAA,EAG3D,YAA6B,UAAwB;AAAxB;AAAA,EAAyB;AAAA,EAAzB;AAAA,EAFpB,OAAO;AAAA,EAIhB,MAAM,SAAS,MAA6C;AAC1D,UAAM,cAAc,KAAK,SACtB,OAAO,CAAC,MAAM,EAAE,SAAS,QAAQ,EACjC,IAAI,CAAC,MAAO,EAAE,SAAS,SAAS,EAAE,UAAU,IAAI,EAAE,IAAI;AAAA,EAAM,EAAE,OAAO,EAAG,EACxE,KAAK,MAAM;AACd,UAAM,OAAO,MAAM,KAAK,SAAS;AAAA,MAC/B,QAAQ;AAAA,MACR,cAAc,KAAK;AAAA,MACnB,aAAa,KAAK;AAAA,MAClB,WAAW,KAAK;AAAA,IAClB,CAAC;AAID,WAAO,EAAE,MAAM,OAAO,CAAC,EAAE;AAAA,EAC3B;AACF;","names":[]}
|