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,227 @@
1
+ """Authenticated, workload-neutral phase context for campaign acquisition.
2
+
3
+ Selection policies need to know whether an evaluated slot can still create
4
+ downstream descendants. Without that fact a fixed exploration quota wastes
5
+ terminal evaluations, while workload adapters are tempted to smuggle schedule
6
+ knowledge into prompts. This module exposes only prior schedule geometry: the
7
+ current portfolio-generation ordinal and the number of later portfolio
8
+ generations. It contains no objective values, workload vocabulary, model
9
+ identity, or outcomes.
10
+ """
11
+
12
+ from __future__ import annotations
13
+
14
+ import hashlib
15
+ import json
16
+ from dataclasses import dataclass, field
17
+
18
+ from agent_evolve.domain.typed_json import (
19
+ FrozenJsonObject,
20
+ freeze_json,
21
+ thaw_json,
22
+ )
23
+
24
+
25
+ CAMPAIGN_SEARCH_PHASE_CONTEXT_KEY = "campaign_search_phase"
26
+ CAMPAIGN_SEARCH_PHASE_POLICY_ID = "portfolio_horizon_phase"
27
+ CAMPAIGN_SEARCH_PHASE_POLICY_VERSION = 1
28
+ CAMPAIGN_SEARCH_PHASE_POLICY_DEFINITION_SHA256 = hashlib.sha256(
29
+ b"agent-evolve:portfolio-horizon-phase:v1;"
30
+ b"inputs=prepared-portfolio-generation-indices,current-generation;"
31
+ b"outputs=ordinal,total,remaining;outcomes=false;"
32
+ b"workload-model-provider-fields=false"
33
+ ).hexdigest()
34
+ _CONTEXT_DOMAIN = b"agent-evolve:campaign-search-phase-context:v1\x00"
35
+
36
+
37
+ def _canonical_json(value: object) -> bytes:
38
+ return json.dumps(
39
+ value,
40
+ allow_nan=False,
41
+ ensure_ascii=True,
42
+ separators=(",", ":"),
43
+ sort_keys=True,
44
+ ).encode("ascii", errors="strict")
45
+
46
+
47
+ @dataclass(frozen=True, slots=True)
48
+ class CampaignSearchPhaseContext:
49
+ """Prior-only schedule position attached to every portfolio request."""
50
+
51
+ campaign_generation: int
52
+ portfolio_generation_ordinal: int
53
+ total_portfolio_generations: int
54
+ remaining_portfolio_generations: int
55
+ context_sha256: str = field(init=False)
56
+
57
+ def __post_init__(self) -> None:
58
+ for name in (
59
+ "campaign_generation",
60
+ "portfolio_generation_ordinal",
61
+ "total_portfolio_generations",
62
+ "remaining_portfolio_generations",
63
+ ):
64
+ value = getattr(self, name)
65
+ if type(value) is not int:
66
+ raise TypeError(f"{name} must be an exact integer")
67
+ if self.campaign_generation <= 0:
68
+ raise ValueError("campaign_generation must be positive")
69
+ if self.total_portfolio_generations <= 0:
70
+ raise ValueError("total_portfolio_generations must be positive")
71
+ if not 1 <= self.portfolio_generation_ordinal <= (
72
+ self.total_portfolio_generations
73
+ ):
74
+ raise ValueError("portfolio_generation_ordinal lies outside the schedule")
75
+ expected_remaining = (
76
+ self.total_portfolio_generations - self.portfolio_generation_ordinal
77
+ )
78
+ if self.remaining_portfolio_generations != expected_remaining:
79
+ raise ValueError("remaining portfolio horizon differs from the ordinal")
80
+ object.__setattr__(
81
+ self,
82
+ "context_sha256",
83
+ hashlib.sha256(
84
+ _CONTEXT_DOMAIN + _canonical_json(self._unsigned_record())
85
+ ).hexdigest(),
86
+ )
87
+
88
+ @property
89
+ def terminal(self) -> bool:
90
+ return self.remaining_portfolio_generations == 0
91
+
92
+ def _unsigned_record(self) -> dict[str, object]:
93
+ return {
94
+ "schema_version": 1,
95
+ "phase_policy": {
96
+ "policy_id": CAMPAIGN_SEARCH_PHASE_POLICY_ID,
97
+ "policy_version": CAMPAIGN_SEARCH_PHASE_POLICY_VERSION,
98
+ "definition_sha256": (
99
+ CAMPAIGN_SEARCH_PHASE_POLICY_DEFINITION_SHA256
100
+ ),
101
+ },
102
+ "campaign_generation": self.campaign_generation,
103
+ "portfolio_generation_ordinal": self.portfolio_generation_ordinal,
104
+ "total_portfolio_generations": self.total_portfolio_generations,
105
+ "remaining_portfolio_generations": (
106
+ self.remaining_portfolio_generations
107
+ ),
108
+ "current_or_future_outcomes_consulted": False,
109
+ }
110
+
111
+ def to_record(self) -> dict[str, object]:
112
+ self.__post_init__()
113
+ return {**self._unsigned_record(), "context_sha256": self.context_sha256}
114
+
115
+ @classmethod
116
+ def from_record(cls, record: object) -> "CampaignSearchPhaseContext":
117
+ if type(record) is not dict or set(record) != {
118
+ "schema_version",
119
+ "phase_policy",
120
+ "campaign_generation",
121
+ "portfolio_generation_ordinal",
122
+ "total_portfolio_generations",
123
+ "remaining_portfolio_generations",
124
+ "current_or_future_outcomes_consulted",
125
+ "context_sha256",
126
+ }:
127
+ raise ValueError("campaign search phase record has an invalid field set")
128
+ if record["schema_version"] != 1:
129
+ raise ValueError("campaign search phase record has an unknown schema")
130
+ if record["phase_policy"] != {
131
+ "policy_id": CAMPAIGN_SEARCH_PHASE_POLICY_ID,
132
+ "policy_version": CAMPAIGN_SEARCH_PHASE_POLICY_VERSION,
133
+ "definition_sha256": CAMPAIGN_SEARCH_PHASE_POLICY_DEFINITION_SHA256,
134
+ }:
135
+ raise ValueError("campaign search phase policy identity differs")
136
+ if record["current_or_future_outcomes_consulted"] is not False:
137
+ raise ValueError("campaign search phase cannot consult outcomes")
138
+ value = cls(
139
+ campaign_generation=record["campaign_generation"],
140
+ portfolio_generation_ordinal=record["portfolio_generation_ordinal"],
141
+ total_portfolio_generations=record["total_portfolio_generations"],
142
+ remaining_portfolio_generations=record[
143
+ "remaining_portfolio_generations"
144
+ ],
145
+ )
146
+ if record["context_sha256"] != value.context_sha256:
147
+ raise ValueError("campaign search phase authentication failed")
148
+ return value
149
+
150
+
151
+ def campaign_search_phase_context(
152
+ *,
153
+ campaign_generation: int,
154
+ portfolio_generations: tuple[int, ...],
155
+ ) -> CampaignSearchPhaseContext:
156
+ """Build the unique phase record for a prepared campaign schedule."""
157
+
158
+ if (
159
+ type(portfolio_generations) is not tuple
160
+ or not portfolio_generations
161
+ or any(type(value) is not int or value <= 0 for value in portfolio_generations)
162
+ or portfolio_generations != tuple(sorted(set(portfolio_generations)))
163
+ ):
164
+ raise ValueError("portfolio_generations must be positive and canonical")
165
+ try:
166
+ ordinal = portfolio_generations.index(campaign_generation) + 1
167
+ except ValueError as error:
168
+ raise ValueError(
169
+ "campaign_generation is not a portfolio generation"
170
+ ) from error
171
+ return CampaignSearchPhaseContext(
172
+ campaign_generation=campaign_generation,
173
+ portfolio_generation_ordinal=ordinal,
174
+ total_portfolio_generations=len(portfolio_generations),
175
+ remaining_portfolio_generations=len(portfolio_generations) - ordinal,
176
+ )
177
+
178
+
179
+ def attach_campaign_search_phase_context(
180
+ context: FrozenJsonObject,
181
+ phase: CampaignSearchPhaseContext,
182
+ ) -> FrozenJsonObject:
183
+ """Append the reserved phase subtree without changing existing fields."""
184
+
185
+ if type(context) is not FrozenJsonObject or freeze_json(context) is not context:
186
+ raise TypeError("context must be an exact frozen object")
187
+ if type(phase) is not CampaignSearchPhaseContext:
188
+ raise TypeError("phase must be exact")
189
+ phase.__post_init__()
190
+ values = thaw_json(context)
191
+ if type(values) is not dict: # pragma: no cover - frozen root is closed.
192
+ raise AssertionError("campaign context did not thaw to an object")
193
+ if CAMPAIGN_SEARCH_PHASE_CONTEXT_KEY in values:
194
+ raise ValueError("context already uses the reserved campaign phase key")
195
+ values[CAMPAIGN_SEARCH_PHASE_CONTEXT_KEY] = phase.to_record()
196
+ frozen = freeze_json(values)
197
+ if type(frozen) is not FrozenJsonObject: # pragma: no cover - closed root.
198
+ raise AssertionError("campaign phase context did not freeze to an object")
199
+ return frozen
200
+
201
+
202
+ def resolve_campaign_search_phase_context(
203
+ context: FrozenJsonObject,
204
+ ) -> CampaignSearchPhaseContext:
205
+ """Authenticate the phase subtree from one selection request."""
206
+
207
+ if type(context) is not FrozenJsonObject or freeze_json(context) is not context:
208
+ raise TypeError("context must be an exact frozen object")
209
+ values = thaw_json(context)
210
+ if type(values) is not dict: # pragma: no cover - frozen root is closed.
211
+ raise AssertionError("campaign context did not thaw to an object")
212
+ record = values.get(CAMPAIGN_SEARCH_PHASE_CONTEXT_KEY)
213
+ if record is None:
214
+ raise ValueError("campaign context omits the reserved search phase")
215
+ return CampaignSearchPhaseContext.from_record(record)
216
+
217
+
218
+ __all__ = [
219
+ "CAMPAIGN_SEARCH_PHASE_CONTEXT_KEY",
220
+ "CAMPAIGN_SEARCH_PHASE_POLICY_DEFINITION_SHA256",
221
+ "CAMPAIGN_SEARCH_PHASE_POLICY_ID",
222
+ "CAMPAIGN_SEARCH_PHASE_POLICY_VERSION",
223
+ "CampaignSearchPhaseContext",
224
+ "attach_campaign_search_phase_context",
225
+ "campaign_search_phase_context",
226
+ "resolve_campaign_search_phase_context",
227
+ ]
@@ -0,0 +1,220 @@
1
+ """Authenticated additive context for one campaign selector request.
2
+
3
+ Campaign runtimes own the complete trusted selector context. A workload
4
+ adapter may nevertheless need to publish a small, decision-local annotation
5
+ that can only be computed after the runtime has selected a parent and exposed
6
+ the current evidence cohort. Memory transfer authority is one example.
7
+
8
+ This module provides the sole generic escape hatch. An extension is attached
9
+ under one reserved top-level key, is source-sealed and content-addressed, and
10
+ may only be added to an otherwise byte-identical trusted context. It cannot
11
+ replace or delete workload or core-authored fields.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import hashlib
17
+ import json
18
+ import re
19
+ from dataclasses import dataclass, field
20
+
21
+ from agent_evolve.domain.typed_json import (
22
+ FrozenJsonObject,
23
+ freeze_json,
24
+ thaw_json,
25
+ typed_json_sha256,
26
+ )
27
+
28
+
29
+ CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY = "campaign_selector_context_extension"
30
+ CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_MAX_BYTES = 65_536
31
+
32
+ _EXTENSION_DOMAIN = b"agent-evolve:campaign-selector-context-extension:v1\x00"
33
+ _TOKEN = re.compile(r"^[a-z][a-z0-9_.-]{0,127}$")
34
+ _LOWER_SHA256 = frozenset("0123456789abcdef")
35
+
36
+
37
+ def _object(value: dict[str, object]) -> FrozenJsonObject:
38
+ frozen = freeze_json(value)
39
+ if type(frozen) is not FrozenJsonObject: # pragma: no cover - closed root.
40
+ raise AssertionError("selector context extension did not freeze to an object")
41
+ return frozen
42
+
43
+
44
+ def _canonical_bytes(value: object) -> bytes:
45
+ return json.dumps(
46
+ value,
47
+ allow_nan=False,
48
+ ensure_ascii=True,
49
+ separators=(",", ":"),
50
+ sort_keys=True,
51
+ ).encode("ascii", errors="strict")
52
+
53
+
54
+ def _require_sha256(value: object, *, name: str) -> str:
55
+ if (
56
+ type(value) is not str
57
+ or len(value) != 64
58
+ or any(character not in _LOWER_SHA256 for character in value)
59
+ ):
60
+ raise ValueError(f"{name} must be a lowercase SHA-256 digest")
61
+ return value
62
+
63
+
64
+ @dataclass(frozen=True, slots=True)
65
+ class CampaignSelectorContextExtension:
66
+ """One source-sealed, decision-local workload annotation."""
67
+
68
+ extension_id: str
69
+ extension_version: int
70
+ definition_sha256: str
71
+ payload: FrozenJsonObject
72
+ payload_sha256: str = field(init=False)
73
+ extension_sha256: str = field(init=False)
74
+
75
+ def __post_init__(self) -> None:
76
+ if type(self.extension_id) is not str or _TOKEN.fullmatch(
77
+ self.extension_id
78
+ ) is None:
79
+ raise ValueError("extension_id must use the closed lowercase token grammar")
80
+ if type(self.extension_version) is not int or self.extension_version <= 0:
81
+ raise ValueError("extension_version must be a positive exact integer")
82
+ _require_sha256(self.definition_sha256, name="definition_sha256")
83
+ if (
84
+ type(self.payload) is not FrozenJsonObject
85
+ or freeze_json(self.payload) is not self.payload
86
+ or not self.payload.items
87
+ ):
88
+ raise TypeError("payload must be a non-empty exact frozen object")
89
+ payload_bytes = _canonical_bytes(thaw_json(self.payload))
90
+ if len(payload_bytes) > CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_MAX_BYTES:
91
+ raise ValueError("selector context extension exceeds its byte bound")
92
+ payload_sha256 = typed_json_sha256(self.payload)
93
+ object.__setattr__(self, "payload_sha256", payload_sha256)
94
+ object.__setattr__(
95
+ self,
96
+ "extension_sha256",
97
+ hashlib.sha256(
98
+ _EXTENSION_DOMAIN + _canonical_bytes(self._unsigned_record())
99
+ ).hexdigest(),
100
+ )
101
+
102
+ def _unsigned_record(self) -> dict[str, object]:
103
+ return {
104
+ "schema_version": 1,
105
+ "extension_id": self.extension_id,
106
+ "extension_version": self.extension_version,
107
+ "definition_sha256": self.definition_sha256,
108
+ "payload_sha256": typed_json_sha256(self.payload),
109
+ }
110
+
111
+ def to_binding_record(self) -> dict[str, object]:
112
+ self.__post_init__()
113
+ return {
114
+ **self._unsigned_record(),
115
+ "extension_sha256": self.extension_sha256,
116
+ }
117
+
118
+ def to_prompt_record(self) -> dict[str, object]:
119
+ self.__post_init__()
120
+ return {
121
+ **self.to_binding_record(),
122
+ "payload": thaw_json(self.payload),
123
+ }
124
+
125
+ @classmethod
126
+ def from_prompt_record(
127
+ cls,
128
+ record: FrozenJsonObject,
129
+ ) -> "CampaignSelectorContextExtension":
130
+ """Replay and authenticate a model-visible extension record."""
131
+
132
+ if type(record) is not FrozenJsonObject:
133
+ raise TypeError("extension record must be an exact frozen object")
134
+ values = dict(record.items)
135
+ if set(values) != {
136
+ "schema_version",
137
+ "extension_id",
138
+ "extension_version",
139
+ "definition_sha256",
140
+ "payload_sha256",
141
+ "extension_sha256",
142
+ "payload",
143
+ }:
144
+ raise ValueError("extension record has an invalid field set")
145
+ if values["schema_version"] != 1:
146
+ raise ValueError("extension record uses an unknown schema version")
147
+ payload = values["payload"]
148
+ if type(payload) is not FrozenJsonObject:
149
+ raise TypeError("extension payload must remain a frozen object")
150
+ extension = cls(
151
+ extension_id=values["extension_id"],
152
+ extension_version=values["extension_version"],
153
+ definition_sha256=values["definition_sha256"],
154
+ payload=payload,
155
+ )
156
+ if (
157
+ values["payload_sha256"] != extension.payload_sha256
158
+ or values["extension_sha256"] != extension.extension_sha256
159
+ ):
160
+ raise ValueError("selector context extension authentication failed")
161
+ return extension
162
+
163
+
164
+ def attach_campaign_selector_context_extension(
165
+ trusted_context: FrozenJsonObject,
166
+ extension: CampaignSelectorContextExtension,
167
+ ) -> FrozenJsonObject:
168
+ """Append one extension without changing any trusted context field."""
169
+
170
+ if type(trusted_context) is not FrozenJsonObject:
171
+ raise TypeError("trusted_context must be an exact frozen object")
172
+ if type(extension) is not CampaignSelectorContextExtension:
173
+ raise TypeError("extension must be exact")
174
+ extension.__post_init__()
175
+ values = thaw_json(trusted_context)
176
+ if type(values) is not dict: # pragma: no cover - closed root.
177
+ raise AssertionError("trusted selector context did not thaw to an object")
178
+ if CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY in values:
179
+ raise ValueError("trusted context already uses the reserved extension key")
180
+ values[CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY] = extension.to_prompt_record()
181
+ return _object(values)
182
+
183
+
184
+ def resolve_campaign_selector_context_extension(
185
+ *,
186
+ trusted_context: FrozenJsonObject,
187
+ selector_context: FrozenJsonObject,
188
+ ) -> CampaignSelectorContextExtension | None:
189
+ """Validate exact identity or one authenticated additive extension."""
190
+
191
+ if type(trusted_context) is not FrozenJsonObject:
192
+ raise TypeError("trusted_context must be an exact frozen object")
193
+ if type(selector_context) is not FrozenJsonObject:
194
+ raise TypeError("selector_context must be an exact frozen object")
195
+ trusted = dict(trusted_context.items)
196
+ observed = dict(selector_context.items)
197
+ if CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY in trusted:
198
+ raise ValueError("trusted context uses the reserved extension key")
199
+ if observed == trusted:
200
+ return None
201
+ if set(observed) != {
202
+ *trusted,
203
+ CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY,
204
+ }:
205
+ raise ValueError("selector context is not an additive extension")
206
+ if any(observed[key] != value for key, value in trusted.items()):
207
+ raise ValueError("selector context changed a trusted base field")
208
+ record = observed[CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY]
209
+ if type(record) is not FrozenJsonObject:
210
+ raise TypeError("selector context extension record must be frozen")
211
+ return CampaignSelectorContextExtension.from_prompt_record(record)
212
+
213
+
214
+ __all__ = [
215
+ "CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_KEY",
216
+ "CAMPAIGN_SELECTOR_CONTEXT_EXTENSION_MAX_BYTES",
217
+ "CampaignSelectorContextExtension",
218
+ "attach_campaign_selector_context_extension",
219
+ "resolve_campaign_selector_context_extension",
220
+ ]