agentevolve-optimizer 0.5.0__py3-none-any.whl

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 (414) hide show
  1. agent_evolve/__init__.py +722 -0
  2. agent_evolve/agentic.py +2800 -0
  3. agent_evolve/api.py +767 -0
  4. agent_evolve/application/__init__.py +1580 -0
  5. agent_evolve/application/action_allocation.py +744 -0
  6. agent_evolve/application/action_allocation_frame.py +347 -0
  7. agent_evolve/application/action_allocation_frame_commit.py +185 -0
  8. agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
  9. agent_evolve/application/action_allocation_frame_v3.py +338 -0
  10. agent_evolve/application/action_archive_value.py +497 -0
  11. agent_evolve/application/action_evidence_consistency.py +455 -0
  12. agent_evolve/application/action_forecast_partitioning.py +1471 -0
  13. agent_evolve/application/action_metric_projection.py +211 -0
  14. agent_evolve/application/action_role_value.py +680 -0
  15. agent_evolve/application/action_score_authorities.py +363 -0
  16. agent_evolve/application/action_structural_signature.py +116 -0
  17. agent_evolve/application/action_target_realization.py +402 -0
  18. agent_evolve/application/agentic_evolution.py +7734 -0
  19. agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
  20. agent_evolve/application/anchor_residual_identification.py +463 -0
  21. agent_evolve/application/archive_conditioned_action_target.py +208 -0
  22. agent_evolve/application/artifact_journal.py +246 -0
  23. agent_evolve/application/artifact_replay.py +347 -0
  24. agent_evolve/application/budgeted_optimizer.py +1828 -0
  25. agent_evolve/application/calibrated_campaign.py +485 -0
  26. agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
  27. agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
  28. agent_evolve/application/campaign_capacity_recourse.py +254 -0
  29. agent_evolve/application/campaign_contextual_outcomes.py +119 -0
  30. agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
  31. agent_evolve/application/campaign_evidence_registry.py +262 -0
  32. agent_evolve/application/campaign_execution.py +2537 -0
  33. agent_evolve/application/campaign_generation_audit.py +942 -0
  34. agent_evolve/application/campaign_learning.py +1812 -0
  35. agent_evolve/application/campaign_learning_runtime.py +1977 -0
  36. agent_evolve/application/campaign_search_phase.py +227 -0
  37. agent_evolve/application/campaign_selector_context_extension.py +220 -0
  38. agent_evolve/application/campaign_variation_envelope.py +649 -0
  39. agent_evolve/application/campaign_variation_trace.py +451 -0
  40. agent_evolve/application/candidate_archive_consequence.py +128 -0
  41. agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
  42. agent_evolve/application/composite_outcome_updater.py +145 -0
  43. agent_evolve/application/composition_portfolio_selection.py +363 -0
  44. agent_evolve/application/concurrent_stage.py +144 -0
  45. agent_evolve/application/contextual_action_allocation.py +181 -0
  46. agent_evolve/application/contextual_campaign_outcomes.py +267 -0
  47. agent_evolve/application/contextual_campaign_planning.py +1366 -0
  48. agent_evolve/application/contextual_delayed_credit.py +651 -0
  49. agent_evolve/application/contextual_search_controller.py +2374 -0
  50. agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
  51. agent_evolve/application/decision_metric_projection.py +112 -0
  52. agent_evolve/application/derived_action_semantics.py +129 -0
  53. agent_evolve/application/detailed_evaluation.py +449 -0
  54. agent_evolve/application/earned_lineage.py +1011 -0
  55. agent_evolve/application/effective_choice_audit.py +484 -0
  56. agent_evolve/application/empirical_consequence_calibration.py +908 -0
  57. agent_evolve/application/evaluation_accounting.py +325 -0
  58. agent_evolve/application/evaluation_cache.py +199 -0
  59. agent_evolve/application/evaluation_escrow.py +547 -0
  60. agent_evolve/application/evaluation_recourse.py +253 -0
  61. agent_evolve/application/event_recorder.py +151 -0
  62. agent_evolve/application/evolution_campaign.py +1840 -0
  63. agent_evolve/application/executable_hypothesis.py +323 -0
  64. agent_evolve/application/factorial_branch_pilot.py +772 -0
  65. agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
  66. agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
  67. agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
  68. agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
  69. agent_evolve/application/finite_action_selection.py +188 -0
  70. agent_evolve/application/finite_action_set.py +306 -0
  71. agent_evolve/application/finite_action_transition.py +537 -0
  72. agent_evolve/application/finite_variation_eligibility.py +296 -0
  73. agent_evolve/application/forecast_geometry_portfolio.py +799 -0
  74. agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
  75. agent_evolve/application/front_proximity_admission.py +311 -0
  76. agent_evolve/application/front_proximity_parent_basis.py +458 -0
  77. agent_evolve/application/frozen_hurdle_score.py +659 -0
  78. agent_evolve/application/g3_causal_screen.py +2257 -0
  79. agent_evolve/application/g3_causal_validation.py +1046 -0
  80. agent_evolve/application/g3_postseal_curation.py +818 -0
  81. agent_evolve/application/gated_agentic_generator.py +205 -0
  82. agent_evolve/application/generation_feedback.py +293 -0
  83. agent_evolve/application/generative_proposal_journal.py +185 -0
  84. agent_evolve/application/geometry_conditional_elasticity.py +453 -0
  85. agent_evolve/application/global_wave_action_allocation.py +1151 -0
  86. agent_evolve/application/head_mass_conditional_seat.py +268 -0
  87. agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
  88. agent_evolve/application/identifiable_reflection_learning.py +395 -0
  89. agent_evolve/application/identifiable_reflection_request.py +364 -0
  90. agent_evolve/application/in_memory_residual_archive.py +341 -0
  91. agent_evolve/application/insight_memory.py +1804 -0
  92. agent_evolve/application/live_runtime_manifest.py +758 -0
  93. agent_evolve/application/llm_task_queue.py +769 -0
  94. agent_evolve/application/matched_finite_action_block.py +409 -0
  95. agent_evolve/application/materialized_action_broker.py +2328 -0
  96. agent_evolve/application/materialized_action_constraints.py +83 -0
  97. agent_evolve/application/materialized_variation.py +211 -0
  98. agent_evolve/application/multi_option_evolution.py +1536 -0
  99. agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
  100. agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
  101. agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
  102. agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
  103. agent_evolve/application/outcome_relation.py +193 -0
  104. agent_evolve/application/paired_allocation_comparison.py +241 -0
  105. agent_evolve/application/paired_block_schedule.py +127 -0
  106. agent_evolve/application/parent_measurement.py +226 -0
  107. agent_evolve/application/pareto_archive.py +811 -0
  108. agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
  109. agent_evolve/application/portfolio_evolution.py +2950 -0
  110. agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
  111. agent_evolve/application/portfolio_memory_attribution.py +581 -0
  112. agent_evolve/application/portfolio_memory_dose.py +788 -0
  113. agent_evolve/application/portfolio_memory_matched_control.py +938 -0
  114. agent_evolve/application/portfolio_memory_transfer.py +297 -0
  115. agent_evolve/application/portfolio_optimization_memory.py +363 -0
  116. agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
  117. agent_evolve/application/portfolio_projection.py +335 -0
  118. agent_evolve/application/portfolio_recombination.py +2032 -0
  119. agent_evolve/application/post_evolution_reflection.py +834 -0
  120. agent_evolve/application/postcommit_rank_authority.py +245 -0
  121. agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
  122. agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
  123. agent_evolve/application/prequential_residual_exploration.py +343 -0
  124. agent_evolve/application/prequential_score_portfolio.py +954 -0
  125. agent_evolve/application/projections.py +292 -0
  126. agent_evolve/application/protected_action_committee.py +1027 -0
  127. agent_evolve/application/protected_branch_pilot.py +376 -0
  128. agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
  129. agent_evolve/application/provider_replay.py +910 -0
  130. agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
  131. agent_evolve/application/recombination_residual_expert.py +403 -0
  132. agent_evolve/application/reflection_workflow.py +571 -0
  133. agent_evolve/application/region_conditional_credit.py +911 -0
  134. agent_evolve/application/residual_campaign_runtime.py +531 -0
  135. agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
  136. agent_evolve/application/residual_headroom_ledger.py +1544 -0
  137. agent_evolve/application/residual_learning_transaction.py +396 -0
  138. agent_evolve/application/residual_portfolio_evolution.py +1228 -0
  139. agent_evolve/application/residual_reachability.py +749 -0
  140. agent_evolve/application/residual_stage_credit.py +499 -0
  141. agent_evolve/application/same_prefix_paired_audit.py +1580 -0
  142. agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
  143. agent_evolve/application/sequential_lineage_allocation.py +1017 -0
  144. agent_evolve/application/sequential_market_replay.py +1395 -0
  145. agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
  146. agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
  147. agent_evolve/application/single_score_action_allocation.py +299 -0
  148. agent_evolve/application/source_exposure_allocation.py +906 -0
  149. agent_evolve/application/staged_memory.py +210 -0
  150. agent_evolve/application/stratified_cold_start_allocation.py +732 -0
  151. agent_evolve/application/support_guarded_hurdle_score.py +549 -0
  152. agent_evolve/application/target_conditioned_action_forecast.py +595 -0
  153. agent_evolve/application/target_conditioned_campaign.py +566 -0
  154. agent_evolve/application/treatment_assignment.py +201 -0
  155. agent_evolve/application/trusted_objective_evidence.py +217 -0
  156. agent_evolve/application/two_stage_action_evolution.py +1131 -0
  157. agent_evolve/application/v8lite_allocation_policy.py +1083 -0
  158. agent_evolve/application/v9_candidate_policy.py +1303 -0
  159. agent_evolve/bootstrap.py +108 -0
  160. agent_evolve/campaign_presets.py +517 -0
  161. agent_evolve/campaign_profiles.py +452 -0
  162. agent_evolve/campaign_variation_topology.py +288 -0
  163. agent_evolve/campaign_workload.py +950 -0
  164. agent_evolve/cli.py +797 -0
  165. agent_evolve/contract.py +241 -0
  166. agent_evolve/core/__init__.py +91 -0
  167. agent_evolve/core/action_semantics.py +411 -0
  168. agent_evolve/core/authored.py +105 -0
  169. agent_evolve/core/formatting.py +286 -0
  170. agent_evolve/core/optimization_semantics.py +324 -0
  171. agent_evolve/core/problem.py +167 -0
  172. agent_evolve/core/results.py +323 -0
  173. agent_evolve/core/stats.py +70 -0
  174. agent_evolve/core/telemetry.py +100 -0
  175. agent_evolve/domain/__init__.py +89 -0
  176. agent_evolve/domain/artifact.py +162 -0
  177. agent_evolve/domain/durable_text.py +68 -0
  178. agent_evolve/domain/event.py +1454 -0
  179. agent_evolve/domain/finite_action_set.py +426 -0
  180. agent_evolve/domain/finite_variation.py +526 -0
  181. agent_evolve/domain/generative_emission.py +559 -0
  182. agent_evolve/domain/ids.py +163 -0
  183. agent_evolve/domain/inline_text.py +106 -0
  184. agent_evolve/domain/insight.py +27 -0
  185. agent_evolve/domain/lineage.py +737 -0
  186. agent_evolve/domain/llm_task_queue.py +960 -0
  187. agent_evolve/domain/outcome.py +96 -0
  188. agent_evolve/domain/patch.py +854 -0
  189. agent_evolve/domain/typed_json.py +542 -0
  190. agent_evolve/domain/variation_space.py +158 -0
  191. agent_evolve/driver.py +1014 -0
  192. agent_evolve/harness/__init__.py +29 -0
  193. agent_evolve/harness/base.py +242 -0
  194. agent_evolve/harness/directives.py +163 -0
  195. agent_evolve/harness/generative_seal.py +479 -0
  196. agent_evolve/harness/registry.py +41 -0
  197. agent_evolve/infrastructure/__init__.py +39 -0
  198. agent_evolve/infrastructure/artifacts/__init__.py +6 -0
  199. agent_evolve/infrastructure/artifacts/_verification.py +67 -0
  200. agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
  201. agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
  202. agent_evolve/infrastructure/asyncio_runtime.py +109 -0
  203. agent_evolve/infrastructure/authored_runtime.py +188 -0
  204. agent_evolve/infrastructure/authored_worker.py +171 -0
  205. agent_evolve/infrastructure/clock.py +53 -0
  206. agent_evolve/infrastructure/events/__init__.py +6 -0
  207. agent_evolve/infrastructure/events/_validation.py +89 -0
  208. agent_evolve/infrastructure/events/in_memory.py +56 -0
  209. agent_evolve/infrastructure/events/jsonl.py +193 -0
  210. agent_evolve/infrastructure/exception_provenance.py +215 -0
  211. agent_evolve/infrastructure/ids.py +118 -0
  212. agent_evolve/infrastructure/lineage_codec.py +1836 -0
  213. agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
  214. agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
  215. agent_evolve/infrastructure/resource_lease.py +370 -0
  216. agent_evolve/infrastructure/sanitization/__init__.py +8 -0
  217. agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
  218. agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
  219. agent_evolve/infrastructure/stream_liveness.py +383 -0
  220. agent_evolve/infrastructure/subprocess_boundary.py +136 -0
  221. agent_evolve/integrations/__init__.py +1 -0
  222. agent_evolve/integrations/botorch/__init__.py +28 -0
  223. agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
  224. agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
  225. agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
  226. agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
  227. agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
  228. agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
  229. agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
  230. agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
  231. agent_evolve/integrations/completion.py +242 -0
  232. agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
  233. agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
  234. agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
  235. agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
  236. agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
  237. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
  238. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
  239. agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
  240. agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
  241. agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
  242. agent_evolve/integrations/pydantic_ai/harness.py +159 -0
  243. agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
  244. agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
  245. agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
  246. agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
  247. agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
  248. agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
  249. agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
  250. agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
  251. agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
  252. agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
  253. agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
  254. agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
  255. agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
  256. agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
  257. agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
  258. agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
  259. agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
  260. agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
  261. agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
  262. agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
  263. agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
  264. agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
  265. agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
  266. agent_evolve/integrations/pymoo_adapter.py +242 -0
  267. agent_evolve/policies/__init__.py +17 -0
  268. agent_evolve/policies/check.py +469 -0
  269. agent_evolve/policies/emit_scaffold.py +451 -0
  270. agent_evolve/policies/feedback/__init__.py +37 -0
  271. agent_evolve/policies/feedback/held_out_asn.py +1325 -0
  272. agent_evolve/policies/genetic.py +607 -0
  273. agent_evolve/policies/llm_backoff.py +183 -0
  274. agent_evolve/policies/llm_chooser.py +226 -0
  275. agent_evolve/policies/llm_generator.py +1760 -0
  276. agent_evolve/policies/llm_init.py +267 -0
  277. agent_evolve/policies/llm_operator.py +109 -0
  278. agent_evolve/policies/llm_prior.py +194 -0
  279. agent_evolve/policies/llm_surrogate.py +334 -0
  280. agent_evolve/policies/measurement_evidence.py +704 -0
  281. agent_evolve/policies/memory/__init__.py +223 -0
  282. agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
  283. agent_evolve/policies/memory/compatibility_matching.py +593 -0
  284. agent_evolve/policies/memory/global_falsification.py +1841 -0
  285. agent_evolve/policies/memory/prompt_shape.py +503 -0
  286. agent_evolve/policies/memory/randomized_subset.py +714 -0
  287. agent_evolve/policies/memory/staged_causal.py +1270 -0
  288. agent_evolve/policies/memory/treatment_compliance.py +759 -0
  289. agent_evolve/policies/objective_resolution/__init__.py +17 -0
  290. agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
  291. agent_evolve/policies/operator_portfolio.py +407 -0
  292. agent_evolve/policies/reguidance.py +1133 -0
  293. agent_evolve/policies/reward/__init__.py +83 -0
  294. agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
  295. agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
  296. agent_evolve/policies/reward/affine_hypervolume.py +490 -0
  297. agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
  298. agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
  299. agent_evolve/policies/reward/frozen_archive.py +360 -0
  300. agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
  301. agent_evolve/policies/search_state.py +208 -0
  302. agent_evolve/policies/selection/__init__.py +345 -0
  303. agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
  304. agent_evolve/policies/selection/affine_frontier_context.py +330 -0
  305. agent_evolve/policies/selection/affine_frontier_target.py +473 -0
  306. agent_evolve/policies/selection/archive_elite.py +1346 -0
  307. agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
  308. agent_evolve/policies/selection/calibrated_slate.py +1394 -0
  309. agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
  310. agent_evolve/policies/selection/common_candidate_pool.py +685 -0
  311. agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
  312. agent_evolve/policies/selection/disjoint_pairs.py +479 -0
  313. agent_evolve/policies/selection/elite_explorer.py +719 -0
  314. agent_evolve/policies/selection/finite_action.py +187 -0
  315. agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
  316. agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
  317. agent_evolve/policies/selection/forecast_calibration.py +922 -0
  318. agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
  319. agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
  320. agent_evolve/policies/selection/full_support_slate.py +91 -0
  321. agent_evolve/policies/selection/meaningful_direction.py +240 -0
  322. agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
  323. agent_evolve/policies/selection/model_anchored_slate.py +826 -0
  324. agent_evolve/policies/selection/phenotype_recourse.py +979 -0
  325. agent_evolve/policies/selection/proposal_support.py +368 -0
  326. agent_evolve/policies/selection/random_portfolio.py +254 -0
  327. agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
  328. agent_evolve/policies/selection/residual_frontier.py +463 -0
  329. agent_evolve/policies/selection/residual_frontier_target.py +605 -0
  330. agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
  331. agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
  332. agent_evolve/policies/selection/target_conditioned_features.py +812 -0
  333. agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
  334. agent_evolve/policies/selection/task_keyed_palette.py +906 -0
  335. agent_evolve/policies/semantics.py +147 -0
  336. agent_evolve/policies/structure.py +362 -0
  337. agent_evolve/policies/structured_output_budget.py +62 -0
  338. agent_evolve/policies/surrogate.py +696 -0
  339. agent_evolve/policies/variation/__init__.py +1 -0
  340. agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
  341. agent_evolve/policies/variation/crossover_inheritance.py +575 -0
  342. agent_evolve/policies/variation/disjoint_recombination.py +611 -0
  343. agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
  344. agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
  345. agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
  346. agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
  347. agent_evolve/policies/variation/typed_patch.py +1981 -0
  348. agent_evolve/policies/weighted_prior.py +394 -0
  349. agent_evolve/ports/__init__.py +383 -0
  350. agent_evolve/ports/action_allocation.py +733 -0
  351. agent_evolve/ports/action_allocation_frame.py +1153 -0
  352. agent_evolve/ports/action_allocation_frame_commit.py +294 -0
  353. agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
  354. agent_evolve/ports/action_allocation_frame_v3.py +995 -0
  355. agent_evolve/ports/action_forecast.py +1568 -0
  356. agent_evolve/ports/action_metric_projection.py +165 -0
  357. agent_evolve/ports/agentic_generator.py +1561 -0
  358. agent_evolve/ports/archive_context.py +136 -0
  359. agent_evolve/ports/artifact_sanitizer.py +44 -0
  360. agent_evolve/ports/artifact_store.py +225 -0
  361. agent_evolve/ports/clock.py +13 -0
  362. agent_evolve/ports/contextual_search_allocation.py +827 -0
  363. agent_evolve/ports/decision_metric_projection.py +258 -0
  364. agent_evolve/ports/event_store.py +55 -0
  365. agent_evolve/ports/executable_hypothesis.py +557 -0
  366. agent_evolve/ports/finite_acquisition.py +377 -0
  367. agent_evolve/ports/finite_acquisition_batch.py +296 -0
  368. agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
  369. agent_evolve/ports/finite_acquisition_json.py +247 -0
  370. agent_evolve/ports/finite_acquisition_space.py +168 -0
  371. agent_evolve/ports/finite_action_selection.py +348 -0
  372. agent_evolve/ports/finite_action_set.py +256 -0
  373. agent_evolve/ports/frontier_target.py +396 -0
  374. agent_evolve/ports/generation_failure.py +43 -0
  375. agent_evolve/ports/hard_feasibility.py +233 -0
  376. agent_evolve/ports/id_factory.py +34 -0
  377. agent_evolve/ports/llm_task_queue.py +93 -0
  378. agent_evolve/ports/objective_resolution.py +419 -0
  379. agent_evolve/ports/paired_allocation_comparison.py +401 -0
  380. agent_evolve/ports/paired_block_schedule.py +475 -0
  381. agent_evolve/ports/parent_measurement.py +336 -0
  382. agent_evolve/ports/portfolio_memory_dose.py +643 -0
  383. agent_evolve/ports/portfolio_selection.py +3169 -0
  384. agent_evolve/ports/postcommit_rank_authority.py +467 -0
  385. agent_evolve/ports/presented_action_evidence.py +794 -0
  386. agent_evolve/ports/resource_lease.py +162 -0
  387. agent_evolve/ports/structured_generator.py +734 -0
  388. agent_evolve/ports/structured_output_budget.py +120 -0
  389. agent_evolve/ports/subprocess_boundary.py +138 -0
  390. agent_evolve/ports/treatment_assignment.py +466 -0
  391. agent_evolve/ports/variation_catalog.py +76 -0
  392. agent_evolve/ports/variation_source.py +226 -0
  393. agent_evolve/proposal_mode.py +157 -0
  394. agent_evolve/proposers/__init__.py +10 -0
  395. agent_evolve/proposers/random_proposer.py +188 -0
  396. agent_evolve/provider_accounting.py +163 -0
  397. agent_evolve/py.typed +0 -0
  398. agent_evolve/reference_method.py +1570 -0
  399. agent_evolve/session/__init__.py +11 -0
  400. agent_evolve/session/authorship.py +864 -0
  401. agent_evolve/session/evaluate.py +236 -0
  402. agent_evolve/session/fidelity.py +237 -0
  403. agent_evolve/session/genetic_loop.py +742 -0
  404. agent_evolve/session/loop.py +803 -0
  405. agent_evolve/session/screening.py +671 -0
  406. agent_evolve/settings.py +376 -0
  407. agent_evolve/workload_kit.py +368 -0
  408. agent_evolve/workload_prompt.py +398 -0
  409. agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
  410. agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
  411. agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
  412. agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
  413. agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
  414. agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,520 @@
1
+ """Generic Pydantic-AI allocation policy over a sealed proposal population.
2
+
3
+ The application boundary is intentionally split in two:
4
+
5
+ * a workload adapter projects prior evidence into a cognitive representation;
6
+ * this adapter compares the complete sealed action universe and returns an
7
+ authenticated required set to the workload-blind broker.
8
+
9
+ The injected low-level runner owns provider setup, queuing, retry, exponential
10
+ backoff, and durable attempt evidence. This module contains no workload,
11
+ model, or provider branch.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import re
19
+ from collections.abc import Callable
20
+ from dataclasses import dataclass, field
21
+ from typing import Any, ClassVar, Literal, Protocol, cast, runtime_checkable
22
+
23
+ from pydantic import BaseModel, ConfigDict, Field, create_model, model_validator
24
+
25
+ from agent_evolve.application.materialized_action_broker import (
26
+ MaterializedActionAllocationRequirement,
27
+ )
28
+ from agent_evolve.application.residual_portfolio_evolution import (
29
+ MaterializedActionProposalBatch,
30
+ ResidualPortfolioDecisionRequest,
31
+ )
32
+ from agent_evolve.domain.ids import LLMCallId
33
+ from agent_evolve.domain.patch import require_sha256
34
+ from agent_evolve.domain.typed_json import (
35
+ FrozenJsonObject,
36
+ freeze_json,
37
+ thaw_json,
38
+ typed_json_sha256,
39
+ )
40
+ from agent_evolve.integrations.pydantic_ai.agentic_generator import (
41
+ AttemptedStructuredGenerationResponse,
42
+ LowLevelRunner,
43
+ )
44
+ from agent_evolve.ports.structured_generator import (
45
+ StructuredGenerationRequest,
46
+ StructuredGenerationResponse,
47
+ )
48
+
49
+
50
+ MATERIALIZED_PORTFOLIO_JUDGE_TOOL_NAME = "select_materialized_portfolio"
51
+ MATERIALIZED_PORTFOLIO_JUDGE_POLICY_ID = (
52
+ "pydantic_ai_outcome_blind_materialized_portfolio_nominator"
53
+ )
54
+ MATERIALIZED_PORTFOLIO_JUDGE_POLICY_VERSION = 2
55
+ MATERIALIZED_PORTFOLIO_JUDGE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
56
+ b"agent-evolve:pydantic-ai-outcome-blind-materialized-portfolio-judge:v2;"
57
+ b"input=prior-cutoff-request+complete-sealed-proposal-union+injected-cognitive-projection;"
58
+ b"output=bounded-nomination-action-identities+rationale+risk-pattern;"
59
+ b"nomination-width=injected-positive-integer-at-most-evaluation-capacity;"
60
+ b"remaining-capacity=owned-by-downstream-broker-or-other-allocators;"
61
+ b"candidate-outcomes=false;async=true;"
62
+ b"workload-model-provider-branches=false"
63
+ ).hexdigest()
64
+
65
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.:-]{0,255}$")
66
+ _PROJECTION_DOMAIN = (
67
+ b"agent-evolve:materialized-portfolio-judge-prompt-projection:v1\x00"
68
+ )
69
+
70
+
71
+ def _canonical_json(value: object) -> bytes:
72
+ return json.dumps(
73
+ value,
74
+ allow_nan=False,
75
+ ensure_ascii=True,
76
+ separators=(",", ":"),
77
+ sort_keys=True,
78
+ ).encode("ascii", errors="strict")
79
+
80
+
81
+ def _require_token(value: str, *, name: str) -> None:
82
+ if type(value) is not str or _TOKEN.fullmatch(value) is None:
83
+ raise ValueError(f"{name} must use the closed token grammar")
84
+
85
+
86
+ @dataclass(frozen=True, slots=True)
87
+ class MaterializedPortfolioJudgePromptProjection:
88
+ """Workload-owned cognitive view of one complete sealed action universe."""
89
+
90
+ projection_id: str
91
+ projection_version: int
92
+ projection_definition_sha256: str
93
+ action_sha256s: tuple[str, ...]
94
+ instruction: str
95
+ payload: FrozenJsonObject
96
+ candidate_outcomes_observed: bool = False
97
+ projection_sha256: str = field(init=False)
98
+
99
+ def __post_init__(self) -> None:
100
+ _require_token(self.projection_id, name="projection_id")
101
+ if (
102
+ type(self.projection_version) is not int
103
+ or self.projection_version <= 0
104
+ ):
105
+ raise ValueError("projection_version must be positive")
106
+ require_sha256(
107
+ self.projection_definition_sha256,
108
+ "projection_definition_sha256",
109
+ )
110
+ if type(self.action_sha256s) is not tuple or not self.action_sha256s:
111
+ raise ValueError("action_sha256s must be a non-empty exact tuple")
112
+ if self.action_sha256s != tuple(sorted(set(self.action_sha256s))):
113
+ raise ValueError("action_sha256s must be unique and canonical")
114
+ for value in self.action_sha256s:
115
+ require_sha256(value, "action_sha256")
116
+ if type(self.instruction) is not str or not self.instruction.strip():
117
+ raise ValueError("instruction must be a non-empty exact string")
118
+ if type(self.candidate_outcomes_observed) is not bool:
119
+ raise TypeError("candidate_outcomes_observed must be an exact bool")
120
+ if self.candidate_outcomes_observed:
121
+ raise ValueError("a judge projection cannot contain candidate outcomes")
122
+ if (
123
+ type(self.payload) is not FrozenJsonObject
124
+ or freeze_json(self.payload) is not self.payload
125
+ ):
126
+ raise TypeError("payload must be an exact frozen JSON object")
127
+ object.__setattr__(
128
+ self,
129
+ "projection_sha256",
130
+ hashlib.sha256(
131
+ _PROJECTION_DOMAIN + _canonical_json(self._unsigned_record())
132
+ ).hexdigest(),
133
+ )
134
+
135
+ def _unsigned_record(self) -> dict[str, object]:
136
+ return {
137
+ "schema_version": 1,
138
+ "projection": {
139
+ "projection_id": self.projection_id,
140
+ "projection_version": self.projection_version,
141
+ "definition_sha256": self.projection_definition_sha256,
142
+ },
143
+ "action_sha256s": list(self.action_sha256s),
144
+ "instruction_sha256": hashlib.sha256(
145
+ self.instruction.encode("utf-8", errors="strict")
146
+ ).hexdigest(),
147
+ "payload_sha256": typed_json_sha256(self.payload),
148
+ "candidate_outcomes_observed": self.candidate_outcomes_observed,
149
+ }
150
+
151
+ def to_record(self, *, include_payload: bool = False) -> dict[str, object]:
152
+ self.__post_init__()
153
+ record = {
154
+ **self._unsigned_record(),
155
+ "projection_sha256": self.projection_sha256,
156
+ }
157
+ if include_payload:
158
+ record["payload"] = thaw_json(self.payload)
159
+ return record
160
+
161
+
162
+ @runtime_checkable
163
+ class MaterializedPortfolioJudgePromptProjectionPort(Protocol):
164
+ """Project workload evidence without granting it selection authority."""
165
+
166
+ projection_id: str
167
+ projection_version: int
168
+ definition_sha256: str
169
+
170
+ def project(
171
+ self,
172
+ request: ResidualPortfolioDecisionRequest,
173
+ proposals: tuple[MaterializedActionProposalBatch, ...],
174
+ ) -> MaterializedPortfolioJudgePromptProjection: ...
175
+
176
+
177
+ class _JudgeOutputBase(BaseModel):
178
+ model_config = ConfigDict(extra="forbid", strict=True)
179
+
180
+ selection_count: ClassVar[int] = 1
181
+
182
+ @model_validator(mode="after")
183
+ def _validate_selection(self) -> "_JudgeOutputBase":
184
+ selected = tuple(cast(Any, self).selected_action_sha256s)
185
+ if len(selected) != type(self).selection_count:
186
+ raise ValueError("selected_action_sha256s has the wrong exact length")
187
+ if len(set(selected)) != len(selected):
188
+ raise ValueError("selected_action_sha256s must be distinct")
189
+ return self
190
+
191
+
192
+ def _judge_output_type(
193
+ action_sha256s: tuple[str, ...],
194
+ selection_count: int,
195
+ ) -> type[BaseModel]:
196
+ literal = Literal.__getitem__(action_sha256s)
197
+ result = create_model(
198
+ "OutcomeBlindMaterializedPortfolioSelection",
199
+ __base__=_JudgeOutputBase,
200
+ __module__=__name__,
201
+ selected_action_sha256s=(
202
+ list[literal],
203
+ Field(min_length=selection_count, max_length=selection_count),
204
+ ),
205
+ decision_rationale=(
206
+ str,
207
+ Field(min_length=1, max_length=16_384),
208
+ ),
209
+ rejected_high_risk_pattern=(
210
+ str,
211
+ Field(min_length=1, max_length=8_192),
212
+ ),
213
+ )
214
+ result.selection_count = selection_count
215
+ return result
216
+
217
+
218
+ def _action_identity_record(action: Any) -> dict[str, object]:
219
+ return {
220
+ "action_sha256": action.action_sha256,
221
+ "configuration_sha256": action.configuration_sha256,
222
+ "configuration": thaw_json(action.configuration),
223
+ "expert_id": action.expert_id,
224
+ "native_rank": action.native_rank,
225
+ "parent_candidate_ids": [value.value for value in action.parent_ids],
226
+ "operator_id": action.operator_id,
227
+ "role_id": action.role_id,
228
+ "reference_action": action.reference_action,
229
+ }
230
+
231
+
232
+ def render_materialized_portfolio_judge_prompt(
233
+ request: ResidualPortfolioDecisionRequest,
234
+ proposals: tuple[MaterializedActionProposalBatch, ...],
235
+ projection: MaterializedPortfolioJudgePromptProjection,
236
+ *,
237
+ selection_count: int | None = None,
238
+ ) -> str:
239
+ """Render an audit-bound identity envelope plus cognitive workload view."""
240
+
241
+ if type(request) is not ResidualPortfolioDecisionRequest:
242
+ raise TypeError("request must be exact")
243
+ request.__post_init__()
244
+ if type(proposals) is not tuple or not proposals:
245
+ raise ValueError("proposals must be a non-empty exact tuple")
246
+ for proposal in proposals:
247
+ if type(proposal) is not MaterializedActionProposalBatch:
248
+ raise TypeError("proposals must contain exact batches")
249
+ proposal.__post_init__()
250
+ proposal.require_request(request)
251
+ if type(projection) is not MaterializedPortfolioJudgePromptProjection:
252
+ raise TypeError("projection must be exact")
253
+ projection.__post_init__()
254
+ actions = tuple(
255
+ action for proposal in proposals for action in proposal.actions
256
+ )
257
+ action_sha256s = tuple(
258
+ sorted(value.action_sha256 for value in actions)
259
+ )
260
+ if projection.action_sha256s != action_sha256s:
261
+ raise ValueError("prompt projection does not cover the sealed action union")
262
+ count = request.evaluation_slots if selection_count is None else selection_count
263
+ if type(count) is not int or not 1 <= count <= request.evaluation_slots:
264
+ raise ValueError("selection_count must fit evaluation capacity")
265
+ envelope = {
266
+ "schema_version": 1,
267
+ "residual_request_sha256": request.request_sha256,
268
+ "prior_state_sha256": request.prior_state_sha256,
269
+ "decision_index": request.decision_index,
270
+ "phase": request.phase.value,
271
+ "evaluation_slots": request.evaluation_slots,
272
+ "proposal_sha256s": sorted(
273
+ value.proposal_sha256 for value in proposals
274
+ ),
275
+ "sealed_actions": [
276
+ _action_identity_record(value)
277
+ for value in sorted(actions, key=lambda item: item.action_sha256)
278
+ ],
279
+ "cognitive_projection": {
280
+ **projection.to_record(),
281
+ "payload": thaw_json(projection.payload),
282
+ },
283
+ "candidate_outcomes_observed": False,
284
+ }
285
+ encoded = json.dumps(
286
+ envelope,
287
+ allow_nan=False,
288
+ ensure_ascii=True,
289
+ separators=(",", ":"),
290
+ sort_keys=True,
291
+ )
292
+ return "\n".join(
293
+ (
294
+ projection.instruction,
295
+ "",
296
+ "OUTCOME-BLIND MATERIALIZED PORTFOLIO CONTRACT",
297
+ encoded,
298
+ "Compare the complete sealed population and nominate exactly "
299
+ f"{count} distinct action_sha256 values. "
300
+ "Maximize expected joint archive improvement, not agreement with "
301
+ "native ranks. The downstream broker or other authenticated "
302
+ "allocators own every unreserved evaluation slot; do not assume "
303
+ "your nominations are the complete final slate. Candidate outcomes "
304
+ "are unavailable. Numeric values "
305
+ "in the cognitive projection are ordinary decimal quantities; "
306
+ "hashes and audit encodings are identities, not magnitudes.",
307
+ )
308
+ )
309
+
310
+
311
+ def _validated_response(
312
+ result: object,
313
+ *,
314
+ output_type: type[BaseModel],
315
+ ) -> tuple[StructuredGenerationResponse[Any], int]:
316
+ if type(result) is AttemptedStructuredGenerationResponse:
317
+ AttemptedStructuredGenerationResponse.__post_init__(result)
318
+ response = result.response
319
+ attempt_count = result.attempt_count
320
+ elif type(result) is StructuredGenerationResponse:
321
+ response = result
322
+ attempt_count = 1
323
+ else:
324
+ raise TypeError(
325
+ "low-level runner must return StructuredGenerationResponse or "
326
+ "AttemptedStructuredGenerationResponse"
327
+ )
328
+ StructuredGenerationResponse.__post_init__(response)
329
+ if type(response.value) is not output_type:
330
+ raise TypeError("low-level response value does not match judge output")
331
+ return response, attempt_count
332
+
333
+
334
+ def _telemetry_record(
335
+ response: StructuredGenerationResponse[Any],
336
+ *,
337
+ attempt_count: int,
338
+ ) -> dict[str, object]:
339
+ return {
340
+ "requested_model": response.requested_model,
341
+ "resolved_model": response.resolved_model,
342
+ "resolved_provider": response.resolved_provider,
343
+ "provider_response_id": response.provider_response_id,
344
+ "finish_reason": response.finish_reason,
345
+ "input_tokens": response.input_tokens,
346
+ "output_tokens": response.output_tokens,
347
+ "reasoning_tokens": response.reasoning_tokens,
348
+ "cache_read_tokens": response.cache_read_tokens,
349
+ "cache_write_tokens": response.cache_write_tokens,
350
+ "cost_usd": (
351
+ None if response.cost_usd is None else str(response.cost_usd)
352
+ ),
353
+ "latency_ns": response.latency_ns,
354
+ "attempt_count": attempt_count,
355
+ }
356
+
357
+
358
+ @dataclass(slots=True)
359
+ class PydanticAIMaterializedPortfolioJudge:
360
+ """Translate one queued structured call into an allocation requirement."""
361
+
362
+ generate_once: LowLevelRunner
363
+ prompt_projection: MaterializedPortfolioJudgePromptProjectionPort
364
+ call_id_factory: Callable[
365
+ [ResidualPortfolioDecisionRequest],
366
+ LLMCallId,
367
+ ]
368
+ max_output_tokens: int = 131_072
369
+ temperature: float | None = None
370
+ nomination_slots: int | None = None
371
+
372
+ policy_id: ClassVar[str] = MATERIALIZED_PORTFOLIO_JUDGE_POLICY_ID
373
+ policy_version: ClassVar[int] = MATERIALIZED_PORTFOLIO_JUDGE_POLICY_VERSION
374
+ definition_sha256: ClassVar[str] = (
375
+ MATERIALIZED_PORTFOLIO_JUDGE_POLICY_DEFINITION_SHA256
376
+ )
377
+
378
+ def __post_init__(self) -> None:
379
+ if not callable(self.generate_once):
380
+ raise TypeError("generate_once must be callable")
381
+ if not isinstance(
382
+ self.prompt_projection,
383
+ MaterializedPortfolioJudgePromptProjectionPort,
384
+ ):
385
+ raise TypeError(
386
+ "prompt_projection must implement its projection port"
387
+ )
388
+ _require_token(
389
+ self.prompt_projection.projection_id,
390
+ name="projection_id",
391
+ )
392
+ if (
393
+ type(self.prompt_projection.projection_version) is not int
394
+ or self.prompt_projection.projection_version <= 0
395
+ ):
396
+ raise ValueError("projection_version must be positive")
397
+ require_sha256(
398
+ self.prompt_projection.definition_sha256,
399
+ "projection definition_sha256",
400
+ )
401
+ if not callable(self.call_id_factory):
402
+ raise TypeError("call_id_factory must be callable")
403
+ if type(self.max_output_tokens) is not int or self.max_output_tokens <= 0:
404
+ raise ValueError("max_output_tokens must be positive")
405
+ if self.nomination_slots is not None and (
406
+ type(self.nomination_slots) is not int
407
+ or self.nomination_slots <= 0
408
+ ):
409
+ raise ValueError("nomination_slots must be positive or None")
410
+
411
+ async def require(
412
+ self,
413
+ request: ResidualPortfolioDecisionRequest,
414
+ proposals: tuple[MaterializedActionProposalBatch, ...],
415
+ ) -> MaterializedActionAllocationRequirement:
416
+ self.__post_init__()
417
+ if type(request) is not ResidualPortfolioDecisionRequest:
418
+ raise TypeError("request must be exact")
419
+ request.__post_init__()
420
+ projection = self.prompt_projection.project(request, proposals)
421
+ if type(projection) is not MaterializedPortfolioJudgePromptProjection:
422
+ raise TypeError("prompt projection returned a foreign value")
423
+ projection.__post_init__()
424
+ if (
425
+ projection.projection_id,
426
+ projection.projection_version,
427
+ projection.projection_definition_sha256,
428
+ ) != (
429
+ self.prompt_projection.projection_id,
430
+ self.prompt_projection.projection_version,
431
+ self.prompt_projection.definition_sha256,
432
+ ):
433
+ raise ValueError("prompt projection has a foreign identity")
434
+ selection_count = (
435
+ request.evaluation_slots
436
+ if self.nomination_slots is None
437
+ else self.nomination_slots
438
+ )
439
+ if selection_count > request.evaluation_slots:
440
+ raise ValueError(
441
+ "nomination_slots cannot exceed evaluation capacity"
442
+ )
443
+ prompt = render_materialized_portfolio_judge_prompt(
444
+ request,
445
+ proposals,
446
+ projection,
447
+ selection_count=selection_count,
448
+ )
449
+ output_type = _judge_output_type(
450
+ projection.action_sha256s,
451
+ selection_count,
452
+ )
453
+ call_id = self.call_id_factory(request)
454
+ if type(call_id) is not LLMCallId:
455
+ raise TypeError("call_id_factory must return an exact LLMCallId")
456
+ low_level_request = StructuredGenerationRequest(
457
+ call_id=call_id,
458
+ operation="materialized_portfolio_judging",
459
+ prompt=prompt,
460
+ output_type=output_type,
461
+ output_tool_name=MATERIALIZED_PORTFOLIO_JUDGE_TOOL_NAME,
462
+ max_output_tokens=self.max_output_tokens,
463
+ temperature=self.temperature,
464
+ )
465
+ raw = await self.generate_once(low_level_request)
466
+ response, attempt_count = _validated_response(
467
+ raw,
468
+ output_type=output_type,
469
+ )
470
+ value = cast(Any, response.value)
471
+ ordered_selection = tuple(value.selected_action_sha256s)
472
+ return MaterializedActionAllocationRequirement(
473
+ policy_id=self.policy_id,
474
+ policy_version=self.policy_version,
475
+ policy_definition_sha256=self.definition_sha256,
476
+ residual_request_sha256=request.request_sha256,
477
+ proposal_sha256s=tuple(
478
+ sorted(item.proposal_sha256 for item in proposals)
479
+ ),
480
+ required_action_sha256s=tuple(sorted(ordered_selection)),
481
+ candidate_outcomes_observed=False,
482
+ evidence=freeze_json(
483
+ {
484
+ "call_id": call_id.value,
485
+ "prompt_sha256": hashlib.sha256(
486
+ prompt.encode("utf-8", errors="strict")
487
+ ).hexdigest(),
488
+ "projection": projection.to_record(),
489
+ "ordered_selected_action_sha256s": list(
490
+ ordered_selection
491
+ ),
492
+ "nomination_slots": selection_count,
493
+ "evaluation_slots": request.evaluation_slots,
494
+ "downstream_unreserved_slots": (
495
+ request.evaluation_slots - selection_count
496
+ ),
497
+ "decision_rationale": value.decision_rationale,
498
+ "rejected_high_risk_pattern": (
499
+ value.rejected_high_risk_pattern
500
+ ),
501
+ "telemetry": _telemetry_record(
502
+ response,
503
+ attempt_count=attempt_count,
504
+ ),
505
+ "candidate_outcomes_observed": False,
506
+ }
507
+ ),
508
+ )
509
+
510
+
511
+ __all__ = [
512
+ "MATERIALIZED_PORTFOLIO_JUDGE_POLICY_DEFINITION_SHA256",
513
+ "MATERIALIZED_PORTFOLIO_JUDGE_POLICY_ID",
514
+ "MATERIALIZED_PORTFOLIO_JUDGE_POLICY_VERSION",
515
+ "MATERIALIZED_PORTFOLIO_JUDGE_TOOL_NAME",
516
+ "MaterializedPortfolioJudgePromptProjection",
517
+ "MaterializedPortfolioJudgePromptProjectionPort",
518
+ "PydanticAIMaterializedPortfolioJudge",
519
+ "render_materialized_portfolio_judge_prompt",
520
+ ]