agent-apprenticeship 0.1.6 → 0.1.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.
Files changed (33) hide show
  1. package/bin/agent-apprenticeship.js +85 -37
  2. package/package.json +1 -1
  3. package/pyproject.toml +1 -1
  4. package/src/agent_apprenticeship_trace/__init__.py +1 -1
  5. package/src/agent_apprenticeship_trace/actual_outputs_normalizer.py +104 -28
  6. package/src/agent_apprenticeship_trace/apprentice_adapters.py +3 -1
  7. package/src/agent_apprenticeship_trace/artifact_resolver.py +6 -0
  8. package/src/agent_apprenticeship_trace/bundle_exporter.py +132 -2
  9. package/src/agent_apprenticeship_trace/cli.py +1171 -262
  10. package/src/agent_apprenticeship_trace/codex_runner.py +89 -6
  11. package/src/agent_apprenticeship_trace/config.py +251 -32
  12. package/src/agent_apprenticeship_trace/ecosystem_r2.py +515 -0
  13. package/src/agent_apprenticeship_trace/env.py +5 -5
  14. package/src/agent_apprenticeship_trace/evaluator.py +127 -11
  15. package/src/agent_apprenticeship_trace/grader.py +12 -11
  16. package/src/agent_apprenticeship_trace/learning.py +270 -1
  17. package/src/agent_apprenticeship_trace/llm_output_normalizer.py +8 -7
  18. package/src/agent_apprenticeship_trace/loop.py +103 -4
  19. package/src/agent_apprenticeship_trace/loop_review.py +686 -0
  20. package/src/agent_apprenticeship_trace/mentor_checkpoints.py +49 -21
  21. package/src/agent_apprenticeship_trace/openai_structured.py +84 -14
  22. package/src/agent_apprenticeship_trace/package_exporter.py +1 -1
  23. package/src/agent_apprenticeship_trace/progress.py +2 -1
  24. package/src/agent_apprenticeship_trace/public_run.py +369 -57
  25. package/src/agent_apprenticeship_trace/public_sanitizer.py +37 -1
  26. package/src/agent_apprenticeship_trace/rubric_generation.py +11 -10
  27. package/src/agent_apprenticeship_trace/schemas.py +378 -3
  28. package/src/agent_apprenticeship_trace/task_intake.py +43 -9
  29. package/src/agent_apprenticeship_trace/tdo.py +2304 -0
  30. package/src/agent_apprenticeship_trace/trace_normalizer.py +351 -17
  31. package/src/agent_apprenticeship_trace/trace_prompt.py +38 -11
  32. package/src/agent_apprenticeship_trace/training_signals.py +1 -1
  33. 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', {'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})
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', {'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})
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', {'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})
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', {'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})
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