pi-para 0.5.2
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/CHANGELOG.md +214 -0
- package/README.md +305 -0
- package/SETUP.md +171 -0
- package/dist/capture.d.ts +34 -0
- package/dist/capture.d.ts.map +1 -0
- package/dist/capture.js +461 -0
- package/dist/capture.js.map +1 -0
- package/dist/cli.d.ts +15 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +405 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands.d.ts +15 -0
- package/dist/commands.d.ts.map +1 -0
- package/dist/commands.js +786 -0
- package/dist/commands.js.map +1 -0
- package/dist/context.d.ts +61 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +289 -0
- package/dist/context.js.map +1 -0
- package/dist/daemon.d.ts +49 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +226 -0
- package/dist/daemon.js.map +1 -0
- package/dist/frontmatter.d.ts +59 -0
- package/dist/frontmatter.d.ts.map +1 -0
- package/dist/frontmatter.js +170 -0
- package/dist/frontmatter.js.map +1 -0
- package/dist/gepa/dataset.d.ts +36 -0
- package/dist/gepa/dataset.d.ts.map +1 -0
- package/dist/gepa/dataset.js +148 -0
- package/dist/gepa/dataset.js.map +1 -0
- package/dist/gepa/evaluator.d.ts +51 -0
- package/dist/gepa/evaluator.d.ts.map +1 -0
- package/dist/gepa/evaluator.js +317 -0
- package/dist/gepa/evaluator.js.map +1 -0
- package/dist/gepa/index.d.ts +66 -0
- package/dist/gepa/index.d.ts.map +1 -0
- package/dist/gepa/index.js +240 -0
- package/dist/gepa/index.js.map +1 -0
- package/dist/gepa/llm.d.ts +35 -0
- package/dist/gepa/llm.d.ts.map +1 -0
- package/dist/gepa/llm.js +268 -0
- package/dist/gepa/llm.js.map +1 -0
- package/dist/gepa/optimized/capture-prompt.txt +65 -0
- package/dist/gepa/optimizer.d.ts +29 -0
- package/dist/gepa/optimizer.d.ts.map +1 -0
- package/dist/gepa/optimizer.js +249 -0
- package/dist/gepa/optimizer.js.map +1 -0
- package/dist/gepa/targets.d.ts +39 -0
- package/dist/gepa/targets.d.ts.map +1 -0
- package/dist/gepa/targets.js +326 -0
- package/dist/gepa/targets.js.map +1 -0
- package/dist/gepa/types.d.ts +168 -0
- package/dist/gepa/types.d.ts.map +1 -0
- package/dist/gepa/types.js +124 -0
- package/dist/gepa/types.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +294 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest.d.ts +88 -0
- package/dist/ingest.d.ts.map +1 -0
- package/dist/ingest.js +105 -0
- package/dist/ingest.js.map +1 -0
- package/dist/link-discovery.d.ts +40 -0
- package/dist/link-discovery.d.ts.map +1 -0
- package/dist/link-discovery.js +122 -0
- package/dist/link-discovery.js.map +1 -0
- package/dist/link-utils.d.ts +30 -0
- package/dist/link-utils.d.ts.map +1 -0
- package/dist/link-utils.js +145 -0
- package/dist/link-utils.js.map +1 -0
- package/dist/lint.d.ts +39 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +827 -0
- package/dist/lint.js.map +1 -0
- package/dist/maintainer.d.ts +24 -0
- package/dist/maintainer.d.ts.map +1 -0
- package/dist/maintainer.js +358 -0
- package/dist/maintainer.js.map +1 -0
- package/dist/processor.d.ts +14 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +361 -0
- package/dist/processor.js.map +1 -0
- package/dist/query.d.ts +69 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +107 -0
- package/dist/query.js.map +1 -0
- package/dist/raw.d.ts +57 -0
- package/dist/raw.d.ts.map +1 -0
- package/dist/raw.js +219 -0
- package/dist/raw.js.map +1 -0
- package/dist/redact.d.ts +21 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +143 -0
- package/dist/redact.js.map +1 -0
- package/dist/scope.d.ts +54 -0
- package/dist/scope.d.ts.map +1 -0
- package/dist/scope.js +161 -0
- package/dist/scope.js.map +1 -0
- package/dist/scripts/bulk-link-fix.d.ts +9 -0
- package/dist/scripts/bulk-link-fix.d.ts.map +1 -0
- package/dist/scripts/bulk-link-fix.js +106 -0
- package/dist/scripts/bulk-link-fix.js.map +1 -0
- package/dist/session-tools.d.ts +33 -0
- package/dist/session-tools.d.ts.map +1 -0
- package/dist/session-tools.js +211 -0
- package/dist/session-tools.js.map +1 -0
- package/dist/state.d.ts +54 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +176 -0
- package/dist/state.js.map +1 -0
- package/dist/store.d.ts +56 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +227 -0
- package/dist/store.js.map +1 -0
- package/dist/summarize.d.ts +56 -0
- package/dist/summarize.d.ts.map +1 -0
- package/dist/summarize.js +231 -0
- package/dist/summarize.js.map +1 -0
- package/dist/tag-registry.d.ts +56 -0
- package/dist/tag-registry.d.ts.map +1 -0
- package/dist/tag-registry.js +146 -0
- package/dist/tag-registry.js.map +1 -0
- package/dist/templates/prompts.d.ts +63 -0
- package/dist/templates/prompts.d.ts.map +1 -0
- package/dist/templates/prompts.js +260 -0
- package/dist/templates/prompts.js.map +1 -0
- package/dist/tools.d.ts +26 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +1033 -0
- package/dist/tools.js.map +1 -0
- package/dist/watcher.d.ts +25 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +84 -0
- package/dist/watcher.js.map +1 -0
- package/dist/webui/client/dist/index.html +1885 -0
- package/dist/webui/server.d.ts +31 -0
- package/dist/webui/server.d.ts.map +1 -0
- package/dist/webui/server.js +566 -0
- package/dist/webui/server.js.map +1 -0
- package/dist/wiki.d.ts +103 -0
- package/dist/wiki.d.ts.map +1 -0
- package/dist/wiki.js +428 -0
- package/dist/wiki.js.map +1 -0
- package/package.json +142 -0
- package/scripts/gepa/__pycache__/dataset.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/lm_providers.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/metric.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/program.cpython-313.pyc +0 -0
- package/scripts/gepa/__pycache__/wiki_reader.cpython-313.pyc +0 -0
- package/scripts/gepa/dataset.py +192 -0
- package/scripts/gepa/lm_providers.py +472 -0
- package/scripts/gepa/metric.py +279 -0
- package/scripts/gepa/optimize.py +367 -0
- package/scripts/gepa/program.py +99 -0
- package/scripts/gepa/pyproject.toml +19 -0
- package/scripts/gepa/run-all.sh +53 -0
- package/scripts/gepa/uv.lock +2241 -0
- package/scripts/gepa/wiki_reader.py +113 -0
- package/skills/para/SKILL.md +77 -0
- package/skills/setup/SKILL.md +20 -0
- package/src/capture.ts +563 -0
- package/src/cli.ts +416 -0
- package/src/commands.ts +878 -0
- package/src/context.ts +390 -0
- package/src/daemon.ts +288 -0
- package/src/frontmatter.ts +219 -0
- package/src/gepa/index.ts +287 -0
- package/src/gepa/optimized/capture-prompt.txt +65 -0
- package/src/index.ts +384 -0
- package/src/ingest.ts +177 -0
- package/src/link-discovery.ts +170 -0
- package/src/link-utils.ts +169 -0
- package/src/lint.ts +1018 -0
- package/src/maintainer.ts +404 -0
- package/src/processor.ts +415 -0
- package/src/python/__pycache__/minimax_lm.cpython-312.pyc +0 -0
- package/src/python/minimax_lm.py +198 -0
- package/src/python/rlm_capture.py +215 -0
- package/src/query.ts +148 -0
- package/src/raw.ts +276 -0
- package/src/redact.ts +159 -0
- package/src/scope.ts +214 -0
- package/src/scripts/bulk-link-fix.ts +126 -0
- package/src/session-tools.ts +260 -0
- package/src/state.ts +271 -0
- package/src/store.ts +288 -0
- package/src/summarize.ts +273 -0
- package/src/tag-registry.ts +157 -0
- package/src/templates/index.md +17 -0
- package/src/templates/prompts.ts +274 -0
- package/src/templates/schema.md +116 -0
- package/src/tools.ts +1293 -0
- package/src/watcher.ts +101 -0
- package/src/webui/client/dist/index.html +1885 -0
- package/src/webui/server.ts +765 -0
- package/src/wiki.ts +550 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""DSPy Module proxy for prompt optimization.
|
|
2
|
+
|
|
3
|
+
Each optimization target is wrapped in a lightweight proxy module.
|
|
4
|
+
The Signature's docstring (instruction) IS the prompt being optimized.
|
|
5
|
+
GEPA evolves the instruction to maximize the metric.
|
|
6
|
+
|
|
7
|
+
One LLM call per eval (not 10-50 like the full agent loop).
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import dspy
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class WikiTaskOutput(dspy.Signature):
|
|
16
|
+
"""You are a wiki knowledge management agent for a PARA-structured knowledge base."""
|
|
17
|
+
|
|
18
|
+
task_context: str = dspy.InputField(
|
|
19
|
+
desc="Context describing the wiki task to perform"
|
|
20
|
+
)
|
|
21
|
+
output: str = dspy.OutputField(
|
|
22
|
+
desc="Structured wiki output following PARA conventions: "
|
|
23
|
+
"Topic, Key Facts, Insights, Connections with [[wikilinks]], Sources"
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class PromptProxy(dspy.Module):
|
|
28
|
+
"""Lightweight proxy for prompt/instruction optimization.
|
|
29
|
+
|
|
30
|
+
The Signature's instruction text is what GEPA evolves.
|
|
31
|
+
forward() runs a single dspy.Predict call (1 LLM call).
|
|
32
|
+
|
|
33
|
+
Usage:
|
|
34
|
+
proxy = PromptProxy.from_instruction(current_prompt_text)
|
|
35
|
+
# GEPA optimizes proxy → evolved instruction = optimized prompt
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def __init__(self, instruction: str | None = None):
|
|
39
|
+
super().__init__()
|
|
40
|
+
|
|
41
|
+
if instruction:
|
|
42
|
+
# Create a signature class with the instruction as docstring
|
|
43
|
+
class CustomSig(WikiTaskOutput):
|
|
44
|
+
pass
|
|
45
|
+
CustomSig.__doc__ = instruction
|
|
46
|
+
self.predict = dspy.Predict(CustomSig)
|
|
47
|
+
else:
|
|
48
|
+
self.predict = dspy.Predict(WikiTaskOutput)
|
|
49
|
+
|
|
50
|
+
def forward(self, task_context: str) -> dspy.Prediction:
|
|
51
|
+
return self.predict(task_context=task_context)
|
|
52
|
+
|
|
53
|
+
@classmethod
|
|
54
|
+
def from_instruction(cls, instruction: str) -> "PromptProxy":
|
|
55
|
+
"""Create a proxy from a prompt/instruction string."""
|
|
56
|
+
return cls(instruction=instruction)
|
|
57
|
+
|
|
58
|
+
def get_instruction(self) -> str | None:
|
|
59
|
+
"""Get the current instruction text."""
|
|
60
|
+
sig = getattr(self.predict, "signature", None)
|
|
61
|
+
if sig:
|
|
62
|
+
inst = getattr(sig, "instructions", None)
|
|
63
|
+
if inst and not inst.startswith("str(object"):
|
|
64
|
+
return inst
|
|
65
|
+
doc = getattr(sig, "__doc__", None)
|
|
66
|
+
if doc and not doc.startswith("str(object"):
|
|
67
|
+
return doc
|
|
68
|
+
return None
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def extract_evolved_instruction(optimized_proxy: PromptProxy) -> str | None:
|
|
72
|
+
"""Extract the GEPA-evolved instruction from an optimized proxy.
|
|
73
|
+
|
|
74
|
+
After GEPA optimization, the proxy's Predict signature contains
|
|
75
|
+
the evolved instruction text. This extracts it.
|
|
76
|
+
"""
|
|
77
|
+
# Check predict.signature first
|
|
78
|
+
if hasattr(optimized_proxy, "predict"):
|
|
79
|
+
pred = optimized_proxy.predict
|
|
80
|
+
for attr_name in ("extended_signature", "signature"):
|
|
81
|
+
sig = getattr(pred, attr_name, None)
|
|
82
|
+
if sig:
|
|
83
|
+
for field in ("instructions", "__doc__"):
|
|
84
|
+
text = getattr(sig, field, None)
|
|
85
|
+
if text and len(text) > 50 and not text.startswith("str(object"):
|
|
86
|
+
return text
|
|
87
|
+
|
|
88
|
+
# Fallback to named_predictors
|
|
89
|
+
try:
|
|
90
|
+
for name, predictor in optimized_proxy.named_predictors():
|
|
91
|
+
sig = getattr(predictor, "signature", None)
|
|
92
|
+
if sig:
|
|
93
|
+
inst = getattr(sig, "instructions", None) or getattr(sig, "__doc__", None)
|
|
94
|
+
if inst and len(inst) > 50 and not inst.startswith("str(object"):
|
|
95
|
+
return inst
|
|
96
|
+
except Exception:
|
|
97
|
+
pass
|
|
98
|
+
|
|
99
|
+
return None
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "pi-para-gepa"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "GEPA optimizer for pi-para prompts, tools, and skills"
|
|
5
|
+
requires-python = ">=3.11"
|
|
6
|
+
dependencies = [
|
|
7
|
+
"dspy>=2.6.0",
|
|
8
|
+
"anthropic>=0.52.0",
|
|
9
|
+
"openai>=1.30.0",
|
|
10
|
+
"pyyaml>=6.0.0",
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
[tool.hatch.build.targets.wheel]
|
|
14
|
+
packages = ["lm_providers", "wiki_reader", "dataset", "program", "metric", "optimize"]
|
|
15
|
+
include = ["*.py"]
|
|
16
|
+
|
|
17
|
+
[build-system]
|
|
18
|
+
requires = ["hatchling"]
|
|
19
|
+
build-backend = "hatchling.build"
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Run GEPA optimization one target at a time.
|
|
3
|
+
# Default: Sonnet for task/judge (fast, cheap), Opus for reflection (smart mutations).
|
|
4
|
+
# Each target invocation re-reads auth.json for fresh token.
|
|
5
|
+
set -e
|
|
6
|
+
|
|
7
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
8
|
+
PROJECT_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
9
|
+
MODEL="${1:-anthropic/claude-sonnet-4-20250514}"
|
|
10
|
+
REFLECTION_MODEL="${2:-anthropic/claude-opus-4-6}"
|
|
11
|
+
AUTO="${3:-light}"
|
|
12
|
+
|
|
13
|
+
echo "[gepa-all] Model: $MODEL | Reflection: $REFLECTION_MODEL | Budget: $AUTO"
|
|
14
|
+
echo "[gepa-all] Started at $(date)"
|
|
15
|
+
|
|
16
|
+
# Get target list
|
|
17
|
+
TARGETS=$(cd "$PROJECT_DIR" && node dist/cli.js gepa targets 2>/dev/null | awk '{print $1}')
|
|
18
|
+
|
|
19
|
+
TOTAL=$(echo "$TARGETS" | wc -l)
|
|
20
|
+
CURRENT=0
|
|
21
|
+
SUCCEEDED=0
|
|
22
|
+
FAILED=0
|
|
23
|
+
|
|
24
|
+
for TARGET in $TARGETS; do
|
|
25
|
+
CURRENT=$((CURRENT + 1))
|
|
26
|
+
echo ""
|
|
27
|
+
echo "================================================================"
|
|
28
|
+
echo "[gepa-all] [$CURRENT/$TOTAL] Optimizing: $TARGET"
|
|
29
|
+
echo "[gepa-all] $(date)"
|
|
30
|
+
echo "================================================================"
|
|
31
|
+
|
|
32
|
+
cd "$PROJECT_DIR"
|
|
33
|
+
if node dist/cli.js gepa optimize \
|
|
34
|
+
--target "$TARGET" \
|
|
35
|
+
--model "$MODEL" \
|
|
36
|
+
--reflection-model "$REFLECTION_MODEL" \
|
|
37
|
+
--auto "$AUTO" 2>&1; then
|
|
38
|
+
SUCCEEDED=$((SUCCEEDED + 1))
|
|
39
|
+
echo "[gepa-all] ✅ $TARGET done"
|
|
40
|
+
else
|
|
41
|
+
FAILED=$((FAILED + 1))
|
|
42
|
+
echo "[gepa-all] ❌ $TARGET failed"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# Brief pause between targets to avoid rate limits
|
|
46
|
+
sleep 5
|
|
47
|
+
done
|
|
48
|
+
|
|
49
|
+
echo ""
|
|
50
|
+
echo "================================================================"
|
|
51
|
+
echo "[gepa-all] ALL DONE at $(date)"
|
|
52
|
+
echo "[gepa-all] Succeeded: $SUCCEEDED / $TOTAL, Failed: $FAILED"
|
|
53
|
+
echo "================================================================"
|