agent-apprenticeship 0.1.6 → 0.1.8
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/bin/agent-apprenticeship.js +85 -37
- package/package.json +1 -1
- package/pyproject.toml +1 -1
- package/src/agent_apprenticeship_trace/__init__.py +1 -1
- package/src/agent_apprenticeship_trace/actual_outputs_normalizer.py +104 -28
- package/src/agent_apprenticeship_trace/apprentice_adapters.py +3 -1
- package/src/agent_apprenticeship_trace/artifact_resolver.py +6 -0
- package/src/agent_apprenticeship_trace/bundle_exporter.py +132 -2
- package/src/agent_apprenticeship_trace/cli.py +1171 -262
- package/src/agent_apprenticeship_trace/codex_runner.py +89 -6
- package/src/agent_apprenticeship_trace/config.py +251 -32
- package/src/agent_apprenticeship_trace/ecosystem_r2.py +515 -0
- package/src/agent_apprenticeship_trace/env.py +5 -5
- package/src/agent_apprenticeship_trace/evaluator.py +127 -11
- package/src/agent_apprenticeship_trace/grader.py +12 -11
- package/src/agent_apprenticeship_trace/learning.py +270 -1
- package/src/agent_apprenticeship_trace/llm_output_normalizer.py +8 -7
- package/src/agent_apprenticeship_trace/loop.py +103 -4
- package/src/agent_apprenticeship_trace/loop_review.py +686 -0
- package/src/agent_apprenticeship_trace/mentor_checkpoints.py +49 -21
- package/src/agent_apprenticeship_trace/openai_structured.py +84 -14
- package/src/agent_apprenticeship_trace/package_exporter.py +1 -1
- package/src/agent_apprenticeship_trace/progress.py +2 -1
- package/src/agent_apprenticeship_trace/public_run.py +369 -57
- package/src/agent_apprenticeship_trace/public_sanitizer.py +37 -1
- package/src/agent_apprenticeship_trace/rubric_generation.py +11 -10
- package/src/agent_apprenticeship_trace/schemas.py +378 -3
- package/src/agent_apprenticeship_trace/task_intake.py +43 -9
- package/src/agent_apprenticeship_trace/tdo.py +2304 -0
- package/src/agent_apprenticeship_trace/trace_normalizer.py +351 -17
- package/src/agent_apprenticeship_trace/trace_prompt.py +38 -11
- package/src/agent_apprenticeship_trace/training_signals.py +1 -1
- package/src/agent_apprenticeship_trace/verifier.py +12 -6
|
@@ -11,6 +11,7 @@ from .codex_runner import deterministic_attempt, run_codex_attempt, run_custom_a
|
|
|
11
11
|
from .grader import grade_attempt, apply_score_reliability
|
|
12
12
|
from .verifier import verify_attempt
|
|
13
13
|
from .evaluator import evaluate_attempt
|
|
14
|
+
from .loop_review import reviewer_feedback_from_evaluator, write_loop_review_iteration
|
|
14
15
|
from .lesson_extractor import extract_lesson
|
|
15
16
|
from .training_signals import process_supervision_from_trace, reward_modeling, training_signals
|
|
16
17
|
from .revision import compute_hillclimb, preference_pair
|
|
@@ -42,12 +43,25 @@ def _write_baseline_only_signals(pkg: Path, b_actual: ActualOutputs, b_grade, b_
|
|
|
42
43
|
append_jsonl(pkg/'signals/reward_modeling.jsonl', reward_modeling(b_actual,b_grade))
|
|
43
44
|
|
|
44
45
|
|
|
46
|
+
def _package_manifest(settings, **data):
|
|
47
|
+
return {
|
|
48
|
+
**data,
|
|
49
|
+
"apprenticeship_mode": getattr(settings, "apprenticeship_mode", None),
|
|
50
|
+
"mentor_mode": settings.mentor_mode,
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def _mode_label(settings) -> str:
|
|
55
|
+
return getattr(settings, "apprenticeship_mode", None) or settings.mentor_mode
|
|
56
|
+
|
|
57
|
+
|
|
45
58
|
def run_task(
|
|
46
59
|
raw: RawTaskRecord,
|
|
47
60
|
run_root: Path,
|
|
48
61
|
runner='deterministic',
|
|
49
62
|
max_iterations: int | None=None,
|
|
50
63
|
pre_attempt_callback: Callable[[Path], None] | None = None,
|
|
64
|
+
attempt_complete_callback: Callable[[Path, str], None] | None = None,
|
|
51
65
|
revision_decision_callback: Callable[[Path], bool] | None = None,
|
|
52
66
|
) -> Path:
|
|
53
67
|
settings=get_settings()
|
|
@@ -63,31 +77,89 @@ def run_task(
|
|
|
63
77
|
baseline = _attempt(pkg, raw, spec, 'baseline', runner)
|
|
64
78
|
b_actual=ActualOutputs.model_validate(read_json(pkg/'attempts/baseline/actual_outputs.json'))
|
|
65
79
|
b_trace=AgentTrace.model_validate(read_json(pkg/'attempts/baseline/agent_trace.json'))
|
|
80
|
+
if attempt_complete_callback:
|
|
81
|
+
attempt_complete_callback(pkg, 'baseline')
|
|
66
82
|
revised_attempt_ids=[]; selected_attempt_id=b_actual.attempt_id
|
|
67
83
|
if _is_apprentice_operational_failure(b_actual):
|
|
68
|
-
write_json(pkg/'package_manifest.json',
|
|
84
|
+
write_json(pkg/'package_manifest.json', _package_manifest(settings, max_iterations=max_iter,actual_iterations=1,loop_stop_reason='apprentice_agent_operational_error',baseline_attempt_id=b_actual.attempt_id,revised_attempt_ids=revised_attempt_ids,selected_attempt_id=selected_attempt_id))
|
|
69
85
|
write_artifacts_index(pkg)
|
|
70
86
|
return pkg
|
|
71
87
|
b_grade=grade_attempt(rubric, b_actual, 'baseline', b_trace, role_root, pkg)
|
|
72
88
|
b_ver=verify_attempt(b_grade, b_actual, b_trace, role_root, pkg)
|
|
73
89
|
b_grade=apply_score_reliability(b_grade, b_ver)
|
|
74
90
|
write_json(pkg/'grading/baseline_grader_result.json', b_grade); write_json(pkg/'grading/baseline_verifier_result.json', b_ver)
|
|
91
|
+
write_loop_review_iteration(
|
|
92
|
+
pkg,
|
|
93
|
+
iteration=1,
|
|
94
|
+
mode=_mode_label(settings),
|
|
95
|
+
actual_outputs=b_actual,
|
|
96
|
+
trace=b_trace,
|
|
97
|
+
grader_result=b_grade,
|
|
98
|
+
verifier_result=b_ver,
|
|
99
|
+
stop_reason="awaiting_reviewer_feedback",
|
|
100
|
+
continue_loop=False,
|
|
101
|
+
)
|
|
75
102
|
stop_reason='max_iterations_reached' if max_iter <= 1 else 'completed_baseline_and_revision'
|
|
76
103
|
if max_iter <= 1:
|
|
77
104
|
fb,rp=evaluate_attempt(b_grade, b_ver, b_actual, b_trace, f'{spec.task_id}_revised', role_root, pkg)
|
|
78
105
|
write_json(pkg/'feedback/baseline_evaluator_feedback.json', fb); write_json(pkg/'feedback/revision_plan.json', rp)
|
|
106
|
+
write_loop_review_iteration(
|
|
107
|
+
pkg,
|
|
108
|
+
iteration=1,
|
|
109
|
+
mode=_mode_label(settings),
|
|
110
|
+
actual_outputs=b_actual,
|
|
111
|
+
trace=b_trace,
|
|
112
|
+
grader_result=b_grade,
|
|
113
|
+
verifier_result=b_ver,
|
|
114
|
+
evaluator_feedback=fb,
|
|
115
|
+
revision_plan=rp,
|
|
116
|
+
reviewer_feedback=reviewer_feedback_from_evaluator(fb, b_grade, b_ver),
|
|
117
|
+
stop_reason=stop_reason,
|
|
118
|
+
continue_loop=False,
|
|
119
|
+
)
|
|
79
120
|
if revision_decision_callback:
|
|
80
121
|
revision_decision_callback(pkg)
|
|
81
122
|
_write_baseline_only_signals(pkg, b_actual, b_grade, b_ver, b_trace, fb)
|
|
82
|
-
write_json(pkg/'package_manifest.json',
|
|
123
|
+
write_json(pkg/'package_manifest.json', _package_manifest(settings, max_iterations=max_iter,actual_iterations=actual_iterations,loop_stop_reason=stop_reason,baseline_attempt_id=b_actual.attempt_id,revised_attempt_ids=revised_attempt_ids,selected_attempt_id=selected_attempt_id))
|
|
83
124
|
write_artifacts_index(pkg)
|
|
84
125
|
return pkg
|
|
85
126
|
fb,rp=evaluate_attempt(b_grade, b_ver, b_actual, b_trace, f'{spec.task_id}_revised', role_root, pkg)
|
|
86
127
|
write_json(pkg/'feedback/baseline_evaluator_feedback.json', fb); write_json(pkg/'feedback/revision_plan.json', rp)
|
|
128
|
+
baseline_reviewer_feedback=reviewer_feedback_from_evaluator(fb, b_grade, b_ver)
|
|
129
|
+
write_loop_review_iteration(
|
|
130
|
+
pkg,
|
|
131
|
+
iteration=1,
|
|
132
|
+
mode=_mode_label(settings),
|
|
133
|
+
actual_outputs=b_actual,
|
|
134
|
+
trace=b_trace,
|
|
135
|
+
grader_result=b_grade,
|
|
136
|
+
verifier_result=b_ver,
|
|
137
|
+
evaluator_feedback=fb,
|
|
138
|
+
revision_plan=rp,
|
|
139
|
+
reviewer_feedback=baseline_reviewer_feedback,
|
|
140
|
+
stop_reason="revision_requested",
|
|
141
|
+
continue_loop=True,
|
|
142
|
+
)
|
|
87
143
|
if revision_decision_callback and not revision_decision_callback(pkg):
|
|
88
144
|
stop_reason='mentor_decision_finish'
|
|
145
|
+
existing_reviewer = read_json(pkg/'loops/iterations/001/reviewer_feedback.json') if (pkg/'loops/iterations/001/reviewer_feedback.json').exists() else {}
|
|
146
|
+
if existing_reviewer.get('reviewer_type') not in {'human_expert','simulated_for_test','org_custom_reviewer'}:
|
|
147
|
+
write_loop_review_iteration(
|
|
148
|
+
pkg,
|
|
149
|
+
iteration=1,
|
|
150
|
+
mode=_mode_label(settings),
|
|
151
|
+
actual_outputs=b_actual,
|
|
152
|
+
trace=b_trace,
|
|
153
|
+
grader_result=b_grade,
|
|
154
|
+
verifier_result=b_ver,
|
|
155
|
+
evaluator_feedback=fb,
|
|
156
|
+
revision_plan=rp,
|
|
157
|
+
reviewer_feedback=baseline_reviewer_feedback,
|
|
158
|
+
stop_reason=stop_reason,
|
|
159
|
+
continue_loop=False,
|
|
160
|
+
)
|
|
89
161
|
_write_baseline_only_signals(pkg, b_actual, b_grade, b_ver, b_trace, fb)
|
|
90
|
-
write_json(pkg/'package_manifest.json',
|
|
162
|
+
write_json(pkg/'package_manifest.json', _package_manifest(settings, max_iterations=max_iter,actual_iterations=actual_iterations,loop_stop_reason=stop_reason,baseline_attempt_id=b_actual.attempt_id,revised_attempt_ids=revised_attempt_ids,selected_attempt_id=selected_attempt_id))
|
|
91
163
|
write_artifacts_index(pkg)
|
|
92
164
|
return pkg
|
|
93
165
|
revised = _attempt(pkg, raw, spec, 'revised', runner, fb.feedback_summary)
|
|
@@ -98,14 +170,41 @@ def run_task(
|
|
|
98
170
|
r_ver=verify_attempt(r_grade, r_actual, r_trace, role_root, pkg)
|
|
99
171
|
r_grade=apply_score_reliability(r_grade, r_ver)
|
|
100
172
|
write_json(pkg/'grading/revised_grader_result.json', r_grade); write_json(pkg/'grading/revised_verifier_result.json', r_ver)
|
|
173
|
+
write_loop_review_iteration(
|
|
174
|
+
pkg,
|
|
175
|
+
iteration=2,
|
|
176
|
+
mode=_mode_label(settings),
|
|
177
|
+
actual_outputs=r_actual,
|
|
178
|
+
trace=r_trace,
|
|
179
|
+
grader_result=r_grade,
|
|
180
|
+
verifier_result=r_ver,
|
|
181
|
+
stop_reason="awaiting_reviewer_feedback",
|
|
182
|
+
continue_loop=False,
|
|
183
|
+
)
|
|
184
|
+
r_fb,r_rp=evaluate_attempt(r_grade, r_ver, r_actual, r_trace, f'{spec.task_id}_final', role_root, pkg)
|
|
185
|
+
write_json(pkg/'feedback/revised_evaluator_feedback.json', r_fb); write_json(pkg/'feedback/revised_revision_plan.json', r_rp)
|
|
101
186
|
revised_attempt_ids.append(r_actual.attempt_id)
|
|
102
187
|
selected_attempt_id=r_actual.attempt_id if (r_grade.final_score or r_grade.score) >= (b_grade.final_score or b_grade.score) else b_actual.attempt_id
|
|
188
|
+
write_loop_review_iteration(
|
|
189
|
+
pkg,
|
|
190
|
+
iteration=2,
|
|
191
|
+
mode=_mode_label(settings),
|
|
192
|
+
actual_outputs=r_actual,
|
|
193
|
+
trace=r_trace,
|
|
194
|
+
grader_result=r_grade,
|
|
195
|
+
verifier_result=r_ver,
|
|
196
|
+
evaluator_feedback=r_fb,
|
|
197
|
+
revision_plan=r_rp,
|
|
198
|
+
reviewer_feedback=reviewer_feedback_from_evaluator(r_fb, r_grade, r_ver),
|
|
199
|
+
stop_reason=stop_reason,
|
|
200
|
+
continue_loop=False,
|
|
201
|
+
)
|
|
103
202
|
hill=compute_hillclimb(b_grade, r_grade); write_json(pkg/'signals/hillclimb_result.json', hill)
|
|
104
203
|
lesson=extract_lesson(hill); write_json(pkg/'signals/lesson_pack.json', lesson)
|
|
105
204
|
for sig in training_signals(hill, ['attempts/baseline/agent_trace.json','attempts/revised/agent_trace.json'], ['grading/baseline_grader_result.json','grading/revised_grader_result.json'], ['grading/baseline_verifier_result.json','grading/revised_verifier_result.json']): append_jsonl(pkg/'signals/training_signals.jsonl', sig)
|
|
106
205
|
for ex in process_supervision_from_trace(b_trace, b_grade, b_ver, fb)+process_supervision_from_trace(r_trace, r_grade, r_ver, fb): append_jsonl(pkg/'signals/process_supervision.jsonl', ex)
|
|
107
206
|
append_jsonl(pkg/'signals/reward_modeling.jsonl', reward_modeling(b_actual,b_grade)); append_jsonl(pkg/'signals/reward_modeling.jsonl', reward_modeling(r_actual,r_grade))
|
|
108
207
|
append_jsonl(pkg/'signals/revision_preference_pairs.jsonl', preference_pair(hill, 'rubric/rubric.json'))
|
|
109
|
-
write_json(pkg/'package_manifest.json',
|
|
208
|
+
write_json(pkg/'package_manifest.json', _package_manifest(settings, max_iterations=max_iter,actual_iterations=actual_iterations,loop_stop_reason=stop_reason,baseline_attempt_id=b_actual.attempt_id,revised_attempt_ids=revised_attempt_ids,selected_attempt_id=selected_attempt_id))
|
|
110
209
|
write_artifacts_index(pkg)
|
|
111
210
|
return pkg
|