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.
- agent_evolve/__init__.py +722 -0
- agent_evolve/agentic.py +2800 -0
- agent_evolve/api.py +767 -0
- agent_evolve/application/__init__.py +1580 -0
- agent_evolve/application/action_allocation.py +744 -0
- agent_evolve/application/action_allocation_frame.py +347 -0
- agent_evolve/application/action_allocation_frame_commit.py +185 -0
- agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
- agent_evolve/application/action_allocation_frame_v3.py +338 -0
- agent_evolve/application/action_archive_value.py +497 -0
- agent_evolve/application/action_evidence_consistency.py +455 -0
- agent_evolve/application/action_forecast_partitioning.py +1471 -0
- agent_evolve/application/action_metric_projection.py +211 -0
- agent_evolve/application/action_role_value.py +680 -0
- agent_evolve/application/action_score_authorities.py +363 -0
- agent_evolve/application/action_structural_signature.py +116 -0
- agent_evolve/application/action_target_realization.py +402 -0
- agent_evolve/application/agentic_evolution.py +7734 -0
- agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
- agent_evolve/application/anchor_residual_identification.py +463 -0
- agent_evolve/application/archive_conditioned_action_target.py +208 -0
- agent_evolve/application/artifact_journal.py +246 -0
- agent_evolve/application/artifact_replay.py +347 -0
- agent_evolve/application/budgeted_optimizer.py +1828 -0
- agent_evolve/application/calibrated_campaign.py +485 -0
- agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
- agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
- agent_evolve/application/campaign_capacity_recourse.py +254 -0
- agent_evolve/application/campaign_contextual_outcomes.py +119 -0
- agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
- agent_evolve/application/campaign_evidence_registry.py +262 -0
- agent_evolve/application/campaign_execution.py +2537 -0
- agent_evolve/application/campaign_generation_audit.py +942 -0
- agent_evolve/application/campaign_learning.py +1812 -0
- agent_evolve/application/campaign_learning_runtime.py +1977 -0
- agent_evolve/application/campaign_search_phase.py +227 -0
- agent_evolve/application/campaign_selector_context_extension.py +220 -0
- agent_evolve/application/campaign_variation_envelope.py +649 -0
- agent_evolve/application/campaign_variation_trace.py +451 -0
- agent_evolve/application/candidate_archive_consequence.py +128 -0
- agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
- agent_evolve/application/composite_outcome_updater.py +145 -0
- agent_evolve/application/composition_portfolio_selection.py +363 -0
- agent_evolve/application/concurrent_stage.py +144 -0
- agent_evolve/application/contextual_action_allocation.py +181 -0
- agent_evolve/application/contextual_campaign_outcomes.py +267 -0
- agent_evolve/application/contextual_campaign_planning.py +1366 -0
- agent_evolve/application/contextual_delayed_credit.py +651 -0
- agent_evolve/application/contextual_search_controller.py +2374 -0
- agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
- agent_evolve/application/decision_metric_projection.py +112 -0
- agent_evolve/application/derived_action_semantics.py +129 -0
- agent_evolve/application/detailed_evaluation.py +449 -0
- agent_evolve/application/earned_lineage.py +1011 -0
- agent_evolve/application/effective_choice_audit.py +484 -0
- agent_evolve/application/empirical_consequence_calibration.py +908 -0
- agent_evolve/application/evaluation_accounting.py +325 -0
- agent_evolve/application/evaluation_cache.py +199 -0
- agent_evolve/application/evaluation_escrow.py +547 -0
- agent_evolve/application/evaluation_recourse.py +253 -0
- agent_evolve/application/event_recorder.py +151 -0
- agent_evolve/application/evolution_campaign.py +1840 -0
- agent_evolve/application/executable_hypothesis.py +323 -0
- agent_evolve/application/factorial_branch_pilot.py +772 -0
- agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
- agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
- agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
- agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
- agent_evolve/application/finite_action_selection.py +188 -0
- agent_evolve/application/finite_action_set.py +306 -0
- agent_evolve/application/finite_action_transition.py +537 -0
- agent_evolve/application/finite_variation_eligibility.py +296 -0
- agent_evolve/application/forecast_geometry_portfolio.py +799 -0
- agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
- agent_evolve/application/front_proximity_admission.py +311 -0
- agent_evolve/application/front_proximity_parent_basis.py +458 -0
- agent_evolve/application/frozen_hurdle_score.py +659 -0
- agent_evolve/application/g3_causal_screen.py +2257 -0
- agent_evolve/application/g3_causal_validation.py +1046 -0
- agent_evolve/application/g3_postseal_curation.py +818 -0
- agent_evolve/application/gated_agentic_generator.py +205 -0
- agent_evolve/application/generation_feedback.py +293 -0
- agent_evolve/application/generative_proposal_journal.py +185 -0
- agent_evolve/application/geometry_conditional_elasticity.py +453 -0
- agent_evolve/application/global_wave_action_allocation.py +1151 -0
- agent_evolve/application/head_mass_conditional_seat.py +268 -0
- agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
- agent_evolve/application/identifiable_reflection_learning.py +395 -0
- agent_evolve/application/identifiable_reflection_request.py +364 -0
- agent_evolve/application/in_memory_residual_archive.py +341 -0
- agent_evolve/application/insight_memory.py +1804 -0
- agent_evolve/application/live_runtime_manifest.py +758 -0
- agent_evolve/application/llm_task_queue.py +769 -0
- agent_evolve/application/matched_finite_action_block.py +409 -0
- agent_evolve/application/materialized_action_broker.py +2328 -0
- agent_evolve/application/materialized_action_constraints.py +83 -0
- agent_evolve/application/materialized_variation.py +211 -0
- agent_evolve/application/multi_option_evolution.py +1536 -0
- agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
- agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
- agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
- agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
- agent_evolve/application/outcome_relation.py +193 -0
- agent_evolve/application/paired_allocation_comparison.py +241 -0
- agent_evolve/application/paired_block_schedule.py +127 -0
- agent_evolve/application/parent_measurement.py +226 -0
- agent_evolve/application/pareto_archive.py +811 -0
- agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
- agent_evolve/application/portfolio_evolution.py +2950 -0
- agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
- agent_evolve/application/portfolio_memory_attribution.py +581 -0
- agent_evolve/application/portfolio_memory_dose.py +788 -0
- agent_evolve/application/portfolio_memory_matched_control.py +938 -0
- agent_evolve/application/portfolio_memory_transfer.py +297 -0
- agent_evolve/application/portfolio_optimization_memory.py +363 -0
- agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
- agent_evolve/application/portfolio_projection.py +335 -0
- agent_evolve/application/portfolio_recombination.py +2032 -0
- agent_evolve/application/post_evolution_reflection.py +834 -0
- agent_evolve/application/postcommit_rank_authority.py +245 -0
- agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
- agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
- agent_evolve/application/prequential_residual_exploration.py +343 -0
- agent_evolve/application/prequential_score_portfolio.py +954 -0
- agent_evolve/application/projections.py +292 -0
- agent_evolve/application/protected_action_committee.py +1027 -0
- agent_evolve/application/protected_branch_pilot.py +376 -0
- agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
- agent_evolve/application/provider_replay.py +910 -0
- agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
- agent_evolve/application/recombination_residual_expert.py +403 -0
- agent_evolve/application/reflection_workflow.py +571 -0
- agent_evolve/application/region_conditional_credit.py +911 -0
- agent_evolve/application/residual_campaign_runtime.py +531 -0
- agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
- agent_evolve/application/residual_headroom_ledger.py +1544 -0
- agent_evolve/application/residual_learning_transaction.py +396 -0
- agent_evolve/application/residual_portfolio_evolution.py +1228 -0
- agent_evolve/application/residual_reachability.py +749 -0
- agent_evolve/application/residual_stage_credit.py +499 -0
- agent_evolve/application/same_prefix_paired_audit.py +1580 -0
- agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
- agent_evolve/application/sequential_lineage_allocation.py +1017 -0
- agent_evolve/application/sequential_market_replay.py +1395 -0
- agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
- agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
- agent_evolve/application/single_score_action_allocation.py +299 -0
- agent_evolve/application/source_exposure_allocation.py +906 -0
- agent_evolve/application/staged_memory.py +210 -0
- agent_evolve/application/stratified_cold_start_allocation.py +732 -0
- agent_evolve/application/support_guarded_hurdle_score.py +549 -0
- agent_evolve/application/target_conditioned_action_forecast.py +595 -0
- agent_evolve/application/target_conditioned_campaign.py +566 -0
- agent_evolve/application/treatment_assignment.py +201 -0
- agent_evolve/application/trusted_objective_evidence.py +217 -0
- agent_evolve/application/two_stage_action_evolution.py +1131 -0
- agent_evolve/application/v8lite_allocation_policy.py +1083 -0
- agent_evolve/application/v9_candidate_policy.py +1303 -0
- agent_evolve/bootstrap.py +108 -0
- agent_evolve/campaign_presets.py +517 -0
- agent_evolve/campaign_profiles.py +452 -0
- agent_evolve/campaign_variation_topology.py +288 -0
- agent_evolve/campaign_workload.py +950 -0
- agent_evolve/cli.py +797 -0
- agent_evolve/contract.py +241 -0
- agent_evolve/core/__init__.py +91 -0
- agent_evolve/core/action_semantics.py +411 -0
- agent_evolve/core/authored.py +105 -0
- agent_evolve/core/formatting.py +286 -0
- agent_evolve/core/optimization_semantics.py +324 -0
- agent_evolve/core/problem.py +167 -0
- agent_evolve/core/results.py +323 -0
- agent_evolve/core/stats.py +70 -0
- agent_evolve/core/telemetry.py +100 -0
- agent_evolve/domain/__init__.py +89 -0
- agent_evolve/domain/artifact.py +162 -0
- agent_evolve/domain/durable_text.py +68 -0
- agent_evolve/domain/event.py +1454 -0
- agent_evolve/domain/finite_action_set.py +426 -0
- agent_evolve/domain/finite_variation.py +526 -0
- agent_evolve/domain/generative_emission.py +559 -0
- agent_evolve/domain/ids.py +163 -0
- agent_evolve/domain/inline_text.py +106 -0
- agent_evolve/domain/insight.py +27 -0
- agent_evolve/domain/lineage.py +737 -0
- agent_evolve/domain/llm_task_queue.py +960 -0
- agent_evolve/domain/outcome.py +96 -0
- agent_evolve/domain/patch.py +854 -0
- agent_evolve/domain/typed_json.py +542 -0
- agent_evolve/domain/variation_space.py +158 -0
- agent_evolve/driver.py +1014 -0
- agent_evolve/harness/__init__.py +29 -0
- agent_evolve/harness/base.py +242 -0
- agent_evolve/harness/directives.py +163 -0
- agent_evolve/harness/generative_seal.py +479 -0
- agent_evolve/harness/registry.py +41 -0
- agent_evolve/infrastructure/__init__.py +39 -0
- agent_evolve/infrastructure/artifacts/__init__.py +6 -0
- agent_evolve/infrastructure/artifacts/_verification.py +67 -0
- agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
- agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
- agent_evolve/infrastructure/asyncio_runtime.py +109 -0
- agent_evolve/infrastructure/authored_runtime.py +188 -0
- agent_evolve/infrastructure/authored_worker.py +171 -0
- agent_evolve/infrastructure/clock.py +53 -0
- agent_evolve/infrastructure/events/__init__.py +6 -0
- agent_evolve/infrastructure/events/_validation.py +89 -0
- agent_evolve/infrastructure/events/in_memory.py +56 -0
- agent_evolve/infrastructure/events/jsonl.py +193 -0
- agent_evolve/infrastructure/exception_provenance.py +215 -0
- agent_evolve/infrastructure/ids.py +118 -0
- agent_evolve/infrastructure/lineage_codec.py +1836 -0
- agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
- agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
- agent_evolve/infrastructure/resource_lease.py +370 -0
- agent_evolve/infrastructure/sanitization/__init__.py +8 -0
- agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
- agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
- agent_evolve/infrastructure/stream_liveness.py +383 -0
- agent_evolve/infrastructure/subprocess_boundary.py +136 -0
- agent_evolve/integrations/__init__.py +1 -0
- agent_evolve/integrations/botorch/__init__.py +28 -0
- agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
- agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
- agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
- agent_evolve/integrations/completion.py +242 -0
- agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
- agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
- agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
- agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
- agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
- agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
- agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
- agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
- agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
- agent_evolve/integrations/pydantic_ai/harness.py +159 -0
- agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
- agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
- agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
- agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
- agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
- agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
- agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
- agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
- agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
- agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
- agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
- agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
- agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
- agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
- agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
- agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
- agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
- agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
- agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
- agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
- agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
- agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
- agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
- agent_evolve/integrations/pymoo_adapter.py +242 -0
- agent_evolve/policies/__init__.py +17 -0
- agent_evolve/policies/check.py +469 -0
- agent_evolve/policies/emit_scaffold.py +451 -0
- agent_evolve/policies/feedback/__init__.py +37 -0
- agent_evolve/policies/feedback/held_out_asn.py +1325 -0
- agent_evolve/policies/genetic.py +607 -0
- agent_evolve/policies/llm_backoff.py +183 -0
- agent_evolve/policies/llm_chooser.py +226 -0
- agent_evolve/policies/llm_generator.py +1760 -0
- agent_evolve/policies/llm_init.py +267 -0
- agent_evolve/policies/llm_operator.py +109 -0
- agent_evolve/policies/llm_prior.py +194 -0
- agent_evolve/policies/llm_surrogate.py +334 -0
- agent_evolve/policies/measurement_evidence.py +704 -0
- agent_evolve/policies/memory/__init__.py +223 -0
- agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
- agent_evolve/policies/memory/compatibility_matching.py +593 -0
- agent_evolve/policies/memory/global_falsification.py +1841 -0
- agent_evolve/policies/memory/prompt_shape.py +503 -0
- agent_evolve/policies/memory/randomized_subset.py +714 -0
- agent_evolve/policies/memory/staged_causal.py +1270 -0
- agent_evolve/policies/memory/treatment_compliance.py +759 -0
- agent_evolve/policies/objective_resolution/__init__.py +17 -0
- agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
- agent_evolve/policies/operator_portfolio.py +407 -0
- agent_evolve/policies/reguidance.py +1133 -0
- agent_evolve/policies/reward/__init__.py +83 -0
- agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
- agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
- agent_evolve/policies/reward/affine_hypervolume.py +490 -0
- agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
- agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
- agent_evolve/policies/reward/frozen_archive.py +360 -0
- agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
- agent_evolve/policies/search_state.py +208 -0
- agent_evolve/policies/selection/__init__.py +345 -0
- agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
- agent_evolve/policies/selection/affine_frontier_context.py +330 -0
- agent_evolve/policies/selection/affine_frontier_target.py +473 -0
- agent_evolve/policies/selection/archive_elite.py +1346 -0
- agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
- agent_evolve/policies/selection/calibrated_slate.py +1394 -0
- agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
- agent_evolve/policies/selection/common_candidate_pool.py +685 -0
- agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
- agent_evolve/policies/selection/disjoint_pairs.py +479 -0
- agent_evolve/policies/selection/elite_explorer.py +719 -0
- agent_evolve/policies/selection/finite_action.py +187 -0
- agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
- agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
- agent_evolve/policies/selection/forecast_calibration.py +922 -0
- agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
- agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
- agent_evolve/policies/selection/full_support_slate.py +91 -0
- agent_evolve/policies/selection/meaningful_direction.py +240 -0
- agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
- agent_evolve/policies/selection/model_anchored_slate.py +826 -0
- agent_evolve/policies/selection/phenotype_recourse.py +979 -0
- agent_evolve/policies/selection/proposal_support.py +368 -0
- agent_evolve/policies/selection/random_portfolio.py +254 -0
- agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
- agent_evolve/policies/selection/residual_frontier.py +463 -0
- agent_evolve/policies/selection/residual_frontier_target.py +605 -0
- agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
- agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
- agent_evolve/policies/selection/target_conditioned_features.py +812 -0
- agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
- agent_evolve/policies/selection/task_keyed_palette.py +906 -0
- agent_evolve/policies/semantics.py +147 -0
- agent_evolve/policies/structure.py +362 -0
- agent_evolve/policies/structured_output_budget.py +62 -0
- agent_evolve/policies/surrogate.py +696 -0
- agent_evolve/policies/variation/__init__.py +1 -0
- agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
- agent_evolve/policies/variation/crossover_inheritance.py +575 -0
- agent_evolve/policies/variation/disjoint_recombination.py +611 -0
- agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
- agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
- agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
- agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
- agent_evolve/policies/variation/typed_patch.py +1981 -0
- agent_evolve/policies/weighted_prior.py +394 -0
- agent_evolve/ports/__init__.py +383 -0
- agent_evolve/ports/action_allocation.py +733 -0
- agent_evolve/ports/action_allocation_frame.py +1153 -0
- agent_evolve/ports/action_allocation_frame_commit.py +294 -0
- agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
- agent_evolve/ports/action_allocation_frame_v3.py +995 -0
- agent_evolve/ports/action_forecast.py +1568 -0
- agent_evolve/ports/action_metric_projection.py +165 -0
- agent_evolve/ports/agentic_generator.py +1561 -0
- agent_evolve/ports/archive_context.py +136 -0
- agent_evolve/ports/artifact_sanitizer.py +44 -0
- agent_evolve/ports/artifact_store.py +225 -0
- agent_evolve/ports/clock.py +13 -0
- agent_evolve/ports/contextual_search_allocation.py +827 -0
- agent_evolve/ports/decision_metric_projection.py +258 -0
- agent_evolve/ports/event_store.py +55 -0
- agent_evolve/ports/executable_hypothesis.py +557 -0
- agent_evolve/ports/finite_acquisition.py +377 -0
- agent_evolve/ports/finite_acquisition_batch.py +296 -0
- agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
- agent_evolve/ports/finite_acquisition_json.py +247 -0
- agent_evolve/ports/finite_acquisition_space.py +168 -0
- agent_evolve/ports/finite_action_selection.py +348 -0
- agent_evolve/ports/finite_action_set.py +256 -0
- agent_evolve/ports/frontier_target.py +396 -0
- agent_evolve/ports/generation_failure.py +43 -0
- agent_evolve/ports/hard_feasibility.py +233 -0
- agent_evolve/ports/id_factory.py +34 -0
- agent_evolve/ports/llm_task_queue.py +93 -0
- agent_evolve/ports/objective_resolution.py +419 -0
- agent_evolve/ports/paired_allocation_comparison.py +401 -0
- agent_evolve/ports/paired_block_schedule.py +475 -0
- agent_evolve/ports/parent_measurement.py +336 -0
- agent_evolve/ports/portfolio_memory_dose.py +643 -0
- agent_evolve/ports/portfolio_selection.py +3169 -0
- agent_evolve/ports/postcommit_rank_authority.py +467 -0
- agent_evolve/ports/presented_action_evidence.py +794 -0
- agent_evolve/ports/resource_lease.py +162 -0
- agent_evolve/ports/structured_generator.py +734 -0
- agent_evolve/ports/structured_output_budget.py +120 -0
- agent_evolve/ports/subprocess_boundary.py +138 -0
- agent_evolve/ports/treatment_assignment.py +466 -0
- agent_evolve/ports/variation_catalog.py +76 -0
- agent_evolve/ports/variation_source.py +226 -0
- agent_evolve/proposal_mode.py +157 -0
- agent_evolve/proposers/__init__.py +10 -0
- agent_evolve/proposers/random_proposer.py +188 -0
- agent_evolve/provider_accounting.py +163 -0
- agent_evolve/py.typed +0 -0
- agent_evolve/reference_method.py +1570 -0
- agent_evolve/session/__init__.py +11 -0
- agent_evolve/session/authorship.py +864 -0
- agent_evolve/session/evaluate.py +236 -0
- agent_evolve/session/fidelity.py +237 -0
- agent_evolve/session/genetic_loop.py +742 -0
- agent_evolve/session/loop.py +803 -0
- agent_evolve/session/screening.py +671 -0
- agent_evolve/settings.py +376 -0
- agent_evolve/workload_kit.py +368 -0
- agent_evolve/workload_prompt.py +398 -0
- agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
- agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
- agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
- agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
- agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
- 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
|
+
]
|