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,607 @@
|
|
|
1
|
+
"""Outcome-blind typed runner for calibrated-portfolio conformance assays.
|
|
2
|
+
|
|
3
|
+
The production selector exposes a complete finite action contract on its
|
|
4
|
+
dynamic Pydantic output type. This runner derives one legal proposal slate
|
|
5
|
+
from that contract without consulting a workload adapter, objective value,
|
|
6
|
+
model, provider, or hidden evaluator. It is deliberately a transport double:
|
|
7
|
+
its only purpose is to exercise the real prompt, schema, reconciliation, and
|
|
8
|
+
allocation stack before a paid or simulator-backed campaign is admitted.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from dataclasses import dataclass
|
|
14
|
+
from decimal import Decimal
|
|
15
|
+
from typing import Any, get_args
|
|
16
|
+
|
|
17
|
+
from pydantic import BaseModel
|
|
18
|
+
|
|
19
|
+
from agent_evolve.policies.variation.compositional_finite_catalog import (
|
|
20
|
+
COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY,
|
|
21
|
+
CompositionSelectionExposure,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.ports.portfolio_memory_dose import (
|
|
24
|
+
BoundedPortfolioMemoryDoseContract,
|
|
25
|
+
)
|
|
26
|
+
from agent_evolve.ports.portfolio_selection import (
|
|
27
|
+
pairwise_disjoint_parent_patch_witness,
|
|
28
|
+
)
|
|
29
|
+
from agent_evolve.ports.structured_generator import (
|
|
30
|
+
StructuredGenerationRequest,
|
|
31
|
+
StructuredGenerationResponse,
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class ProviderFreeCalibratedConformanceError(RuntimeError):
|
|
36
|
+
"""The published calibrated-output contract has no derived legal slate."""
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
@dataclass(frozen=True, slots=True)
|
|
40
|
+
class ProviderFreeCalibratedCallRecord:
|
|
41
|
+
call_id: str
|
|
42
|
+
proposal_option_ids: tuple[str, ...]
|
|
43
|
+
supporting_card_keys_by_member: tuple[tuple[str, ...], ...]
|
|
44
|
+
assigned_card_keys: tuple[str, ...]
|
|
45
|
+
evaluation_witness_option_ids: tuple[str, ...]
|
|
46
|
+
required_proposal_support_option_ids: tuple[str, ...]
|
|
47
|
+
required_composite_proposals: int
|
|
48
|
+
bounded_memory_dose: bool
|
|
49
|
+
|
|
50
|
+
def to_record(self) -> dict[str, object]:
|
|
51
|
+
return {
|
|
52
|
+
"call_id": self.call_id,
|
|
53
|
+
"proposal_option_ids": list(self.proposal_option_ids),
|
|
54
|
+
"proposal_width": len(self.proposal_option_ids),
|
|
55
|
+
"supporting_card_keys_by_member": [
|
|
56
|
+
list(value) for value in self.supporting_card_keys_by_member
|
|
57
|
+
],
|
|
58
|
+
# Preserve the established provider-free trace names while also
|
|
59
|
+
# publishing the workload-neutral spelling above.
|
|
60
|
+
"proposal_supporting_card_keys": [
|
|
61
|
+
list(value) for value in self.supporting_card_keys_by_member
|
|
62
|
+
],
|
|
63
|
+
"assigned_card_keys": list(self.assigned_card_keys),
|
|
64
|
+
"evaluation_witness_option_ids": list(
|
|
65
|
+
self.evaluation_witness_option_ids
|
|
66
|
+
),
|
|
67
|
+
"required_proposal_support_option_ids": list(
|
|
68
|
+
self.required_proposal_support_option_ids
|
|
69
|
+
),
|
|
70
|
+
"required_composite_proposals": self.required_composite_proposals,
|
|
71
|
+
"bounded_memory_dose": self.bounded_memory_dose,
|
|
72
|
+
"provider_calls": 0,
|
|
73
|
+
"outcomes_consulted": False,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def _nested_model_types(annotation: object) -> tuple[type[BaseModel], ...]:
|
|
78
|
+
found: list[type[BaseModel]] = []
|
|
79
|
+
|
|
80
|
+
def visit(value: object) -> None:
|
|
81
|
+
if isinstance(value, type) and issubclass(value, BaseModel):
|
|
82
|
+
found.append(value)
|
|
83
|
+
return
|
|
84
|
+
for child in get_args(value):
|
|
85
|
+
visit(child)
|
|
86
|
+
|
|
87
|
+
visit(annotation)
|
|
88
|
+
unique: list[type[BaseModel]] = []
|
|
89
|
+
for value in found:
|
|
90
|
+
if value not in unique:
|
|
91
|
+
unique.append(value)
|
|
92
|
+
return tuple(unique)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _member_model_types(output_type: type[BaseModel]) -> tuple[type[BaseModel], ...]:
|
|
96
|
+
member_field = output_type.model_fields.get("members")
|
|
97
|
+
if member_field is None:
|
|
98
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
99
|
+
"structured output omits the calibrated members field"
|
|
100
|
+
)
|
|
101
|
+
result = tuple(
|
|
102
|
+
value
|
|
103
|
+
for value in _nested_model_types(member_field.annotation)
|
|
104
|
+
if hasattr(value, "required_metric_ids")
|
|
105
|
+
and (
|
|
106
|
+
hasattr(value, "allowed_option_ids")
|
|
107
|
+
or hasattr(value, "allowed_composite_option_ids")
|
|
108
|
+
)
|
|
109
|
+
)
|
|
110
|
+
if not result:
|
|
111
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
112
|
+
"structured output does not publish calibrated member contracts"
|
|
113
|
+
)
|
|
114
|
+
return result
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _metric_ids(member_types: tuple[type[BaseModel], ...]) -> tuple[str, ...]:
|
|
118
|
+
declarations = {
|
|
119
|
+
tuple(getattr(value, "required_metric_ids")) for value in member_types
|
|
120
|
+
}
|
|
121
|
+
if len(declarations) != 1:
|
|
122
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
123
|
+
"calibrated member variants disagree on required metrics"
|
|
124
|
+
)
|
|
125
|
+
result = next(iter(declarations))
|
|
126
|
+
if not result or any(type(value) is not str or not value for value in result):
|
|
127
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
128
|
+
"calibrated output publishes an invalid metric contract"
|
|
129
|
+
)
|
|
130
|
+
return result
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _composite_bindings(
|
|
134
|
+
member_types: tuple[type[BaseModel], ...],
|
|
135
|
+
) -> dict[str, tuple[str, str]]:
|
|
136
|
+
result: dict[str, tuple[str, str]] = {}
|
|
137
|
+
for member_type in member_types:
|
|
138
|
+
local = getattr(member_type, "components_by_composite", None)
|
|
139
|
+
if local is None:
|
|
140
|
+
continue
|
|
141
|
+
if type(local) is not dict:
|
|
142
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
143
|
+
"composite member contract published invalid bindings"
|
|
144
|
+
)
|
|
145
|
+
for option_id, components in local.items():
|
|
146
|
+
if (
|
|
147
|
+
type(option_id) is not str
|
|
148
|
+
or type(components) is not tuple
|
|
149
|
+
or len(components) != 2
|
|
150
|
+
or any(type(value) is not str for value in components)
|
|
151
|
+
):
|
|
152
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
153
|
+
"composite member contract published an invalid binding"
|
|
154
|
+
)
|
|
155
|
+
prior = result.get(option_id)
|
|
156
|
+
if prior is not None and prior != components:
|
|
157
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
158
|
+
"composite member variants disagree on one binding"
|
|
159
|
+
)
|
|
160
|
+
result[option_id] = components
|
|
161
|
+
return result
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
def _eligible_options(output_type: type[BaseModel]) -> tuple[Any, ...]:
|
|
165
|
+
contract = getattr(output_type, "finite_variation_contract", None)
|
|
166
|
+
if contract is None:
|
|
167
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
168
|
+
"calibrated output omits its finite variation contract"
|
|
169
|
+
)
|
|
170
|
+
contract.__post_init__()
|
|
171
|
+
option_by_id = {value.option_id: value for value in contract.options}
|
|
172
|
+
ordered_pool = getattr(output_type, "ordered_common_pool_option_ids", None)
|
|
173
|
+
option_ids = (
|
|
174
|
+
tuple(option_by_id)
|
|
175
|
+
if ordered_pool is None
|
|
176
|
+
else tuple(ordered_pool)
|
|
177
|
+
)
|
|
178
|
+
if (
|
|
179
|
+
len(option_ids) < 8
|
|
180
|
+
or len(set(option_ids)) != len(option_ids)
|
|
181
|
+
or any(value not in option_by_id for value in option_ids)
|
|
182
|
+
):
|
|
183
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
184
|
+
"calibrated finite candidate universe cannot supply a unique K8"
|
|
185
|
+
)
|
|
186
|
+
return tuple(option_by_id[value] for value in option_ids)
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
def _is_composite(option: Any, bindings: dict[str, tuple[str, str]]) -> bool:
|
|
190
|
+
if option.option_id in bindings:
|
|
191
|
+
return True
|
|
192
|
+
exposure = dict(option.metadata).get(
|
|
193
|
+
COMPOSITION_SELECTION_EXPOSURE_METADATA_KEY
|
|
194
|
+
)
|
|
195
|
+
if exposure == CompositionSelectionExposure.HIERARCHICAL_RANKED_UNION.value:
|
|
196
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
197
|
+
"hierarchical composite lacks its exact component binding"
|
|
198
|
+
)
|
|
199
|
+
return False
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _evaluation_witness(
|
|
203
|
+
output_type: type[BaseModel],
|
|
204
|
+
eligible_option_ids: tuple[str, ...],
|
|
205
|
+
) -> tuple[str, ...]:
|
|
206
|
+
if not getattr(output_type, "enforce_cross_member_constraints", True):
|
|
207
|
+
return ()
|
|
208
|
+
if not getattr(
|
|
209
|
+
output_type,
|
|
210
|
+
"require_pairwise_disjoint_parent_patches",
|
|
211
|
+
False,
|
|
212
|
+
):
|
|
213
|
+
return ()
|
|
214
|
+
contract = output_type.finite_variation_contract
|
|
215
|
+
witness = pairwise_disjoint_parent_patch_witness(
|
|
216
|
+
contract,
|
|
217
|
+
eligible_option_ids,
|
|
218
|
+
portfolio_size=output_type.evaluation_portfolio_size,
|
|
219
|
+
min_distinct_families=output_type.min_distinct_families,
|
|
220
|
+
family_exposure_bounds=output_type.required_evaluation_family_bounds,
|
|
221
|
+
)
|
|
222
|
+
if witness is None:
|
|
223
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
224
|
+
"finite candidate universe has no legal evaluator witness"
|
|
225
|
+
)
|
|
226
|
+
return witness
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
def _fits_hierarchy(
|
|
230
|
+
option_id: str,
|
|
231
|
+
*,
|
|
232
|
+
chosen: set[str],
|
|
233
|
+
composite_ids: set[str],
|
|
234
|
+
composite_capacity: int,
|
|
235
|
+
total_capacity: int,
|
|
236
|
+
) -> bool:
|
|
237
|
+
if option_id in chosen:
|
|
238
|
+
return True
|
|
239
|
+
composite_count = len(chosen.intersection(composite_ids))
|
|
240
|
+
atomic_count = len(chosen) - composite_count
|
|
241
|
+
if option_id in composite_ids:
|
|
242
|
+
composite_count += 1
|
|
243
|
+
else:
|
|
244
|
+
atomic_count += 1
|
|
245
|
+
return (
|
|
246
|
+
composite_count <= composite_capacity
|
|
247
|
+
and atomic_count <= total_capacity - composite_capacity
|
|
248
|
+
and composite_count + atomic_count <= total_capacity
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
def _memory_support_choices(
|
|
253
|
+
*,
|
|
254
|
+
dose: BoundedPortfolioMemoryDoseContract,
|
|
255
|
+
eligible: tuple[Any, ...],
|
|
256
|
+
chosen: set[str],
|
|
257
|
+
composite_ids: set[str],
|
|
258
|
+
composite_capacity: int,
|
|
259
|
+
total_capacity: int,
|
|
260
|
+
) -> tuple[str, ...]:
|
|
261
|
+
"""Choose enough compatible members without objective or prose ranking."""
|
|
262
|
+
|
|
263
|
+
dose.__post_init__()
|
|
264
|
+
eligible_by_id = {value.option_id: value for value in eligible}
|
|
265
|
+
result: list[str] = []
|
|
266
|
+
occupied: set[str] = set()
|
|
267
|
+
for support in dose.card_supports:
|
|
268
|
+
compatible = tuple(
|
|
269
|
+
option_id
|
|
270
|
+
for option_id, identity in support.compatible_options
|
|
271
|
+
if option_id in eligible_by_id
|
|
272
|
+
and eligible_by_id[option_id].identity_sha256 == identity
|
|
273
|
+
)
|
|
274
|
+
selected = next(
|
|
275
|
+
(value for value in compatible if value in chosen and value not in occupied),
|
|
276
|
+
None,
|
|
277
|
+
)
|
|
278
|
+
if selected is None:
|
|
279
|
+
selected = next(
|
|
280
|
+
(
|
|
281
|
+
value
|
|
282
|
+
for value in compatible
|
|
283
|
+
if value not in occupied
|
|
284
|
+
and _fits_hierarchy(
|
|
285
|
+
value,
|
|
286
|
+
chosen=chosen | set(result),
|
|
287
|
+
composite_ids=composite_ids,
|
|
288
|
+
composite_capacity=composite_capacity,
|
|
289
|
+
total_capacity=total_capacity,
|
|
290
|
+
)
|
|
291
|
+
),
|
|
292
|
+
None,
|
|
293
|
+
)
|
|
294
|
+
if selected is None:
|
|
295
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
296
|
+
f"no distinct legal support option for assigned card {support.card_key}"
|
|
297
|
+
)
|
|
298
|
+
result.append(selected)
|
|
299
|
+
occupied.add(selected)
|
|
300
|
+
|
|
301
|
+
lower, upper = dose.proposed_supported_member_bounds
|
|
302
|
+
maximum_supported = min(
|
|
303
|
+
upper,
|
|
304
|
+
total_capacity - dose.minimum_unattributed_proposed_members,
|
|
305
|
+
)
|
|
306
|
+
if lower > maximum_supported:
|
|
307
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
308
|
+
"memory-dose bounds cannot fit the calibrated proposal width"
|
|
309
|
+
)
|
|
310
|
+
compatible_union = tuple(
|
|
311
|
+
option_id
|
|
312
|
+
for option in eligible
|
|
313
|
+
for option_id in (option.option_id,)
|
|
314
|
+
if any(
|
|
315
|
+
support.supports(option.option_id, option.identity_sha256)
|
|
316
|
+
for support in dose.card_supports
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
for option_id in compatible_union:
|
|
320
|
+
if len(set(result)) >= lower:
|
|
321
|
+
break
|
|
322
|
+
if option_id in result or not _fits_hierarchy(
|
|
323
|
+
option_id,
|
|
324
|
+
chosen=chosen | set(result),
|
|
325
|
+
composite_ids=composite_ids,
|
|
326
|
+
composite_capacity=composite_capacity,
|
|
327
|
+
total_capacity=total_capacity,
|
|
328
|
+
):
|
|
329
|
+
continue
|
|
330
|
+
result.append(option_id)
|
|
331
|
+
if len(set(result)) < lower:
|
|
332
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
333
|
+
"finite candidate universe cannot realize the memory-dose lower bound"
|
|
334
|
+
)
|
|
335
|
+
return tuple(dict.fromkeys(result))
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
def _select_option_ids(
|
|
339
|
+
output_type: type[BaseModel],
|
|
340
|
+
eligible: tuple[Any, ...],
|
|
341
|
+
bindings: dict[str, tuple[str, str]],
|
|
342
|
+
) -> tuple[tuple[str, ...], tuple[str, ...]]:
|
|
343
|
+
proposal_width = 8
|
|
344
|
+
required_composites = getattr(output_type, "required_composite_proposals", 0)
|
|
345
|
+
if type(required_composites) is not int or not (
|
|
346
|
+
0 <= required_composites < proposal_width
|
|
347
|
+
):
|
|
348
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
349
|
+
"calibrated output publishes an invalid composite count"
|
|
350
|
+
)
|
|
351
|
+
eligible_ids = tuple(value.option_id for value in eligible)
|
|
352
|
+
composite_ids = {
|
|
353
|
+
value.option_id for value in eligible if _is_composite(value, bindings)
|
|
354
|
+
}
|
|
355
|
+
required_support = tuple(
|
|
356
|
+
sorted(getattr(output_type, "required_proposal_support_option_ids", ()))
|
|
357
|
+
)
|
|
358
|
+
if not set(required_support).issubset(eligible_ids):
|
|
359
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
360
|
+
"proposal-support reservation escapes the finite universe"
|
|
361
|
+
)
|
|
362
|
+
witness = _evaluation_witness(output_type, eligible_ids)
|
|
363
|
+
mandatory = set(required_support) | set(witness)
|
|
364
|
+
if len(mandatory) > proposal_width or any(
|
|
365
|
+
not _fits_hierarchy(
|
|
366
|
+
option_id,
|
|
367
|
+
chosen=mandatory - {option_id},
|
|
368
|
+
composite_ids=composite_ids,
|
|
369
|
+
composite_capacity=required_composites,
|
|
370
|
+
total_capacity=proposal_width,
|
|
371
|
+
)
|
|
372
|
+
for option_id in mandatory
|
|
373
|
+
):
|
|
374
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
375
|
+
"proposal reservations and evaluator witness exceed K8 capacity"
|
|
376
|
+
)
|
|
377
|
+
dose = getattr(output_type, "memory_dose_contract", None)
|
|
378
|
+
if dose is not None:
|
|
379
|
+
mandatory.update(
|
|
380
|
+
_memory_support_choices(
|
|
381
|
+
dose=dose,
|
|
382
|
+
eligible=eligible,
|
|
383
|
+
chosen=mandatory,
|
|
384
|
+
composite_ids=composite_ids,
|
|
385
|
+
composite_capacity=required_composites,
|
|
386
|
+
total_capacity=proposal_width,
|
|
387
|
+
)
|
|
388
|
+
)
|
|
389
|
+
for target_composite, candidate_ids in (
|
|
390
|
+
(True, tuple(value for value in eligible_ids if value in composite_ids)),
|
|
391
|
+
(False, tuple(value for value in eligible_ids if value not in composite_ids)),
|
|
392
|
+
):
|
|
393
|
+
target_count = (
|
|
394
|
+
required_composites
|
|
395
|
+
if target_composite
|
|
396
|
+
else proposal_width - required_composites
|
|
397
|
+
)
|
|
398
|
+
current_count = len(
|
|
399
|
+
mandatory.intersection(composite_ids)
|
|
400
|
+
if target_composite
|
|
401
|
+
else mandatory - composite_ids
|
|
402
|
+
)
|
|
403
|
+
for option_id in candidate_ids:
|
|
404
|
+
if current_count == target_count:
|
|
405
|
+
break
|
|
406
|
+
if option_id not in mandatory:
|
|
407
|
+
mandatory.add(option_id)
|
|
408
|
+
current_count += 1
|
|
409
|
+
if current_count != target_count:
|
|
410
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
411
|
+
"finite universe cannot fill the exact hierarchical K8"
|
|
412
|
+
)
|
|
413
|
+
selected = tuple(value for value in eligible_ids if value in mandatory)
|
|
414
|
+
if (
|
|
415
|
+
len(selected) != proposal_width
|
|
416
|
+
or len(set(selected)) != proposal_width
|
|
417
|
+
or len(set(selected).intersection(composite_ids)) != required_composites
|
|
418
|
+
):
|
|
419
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
420
|
+
"derived calibrated proposal slate does not close"
|
|
421
|
+
)
|
|
422
|
+
return selected, witness
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
def _supporting_cards_by_option(
|
|
426
|
+
*,
|
|
427
|
+
output_type: type[BaseModel],
|
|
428
|
+
selected: tuple[Any, ...],
|
|
429
|
+
) -> dict[str, tuple[str, ...]]:
|
|
430
|
+
assigned_cards = tuple(sorted(output_type.assigned_card_keys))
|
|
431
|
+
if not assigned_cards:
|
|
432
|
+
return {option.option_id: () for option in selected}
|
|
433
|
+
dose = output_type.memory_dose_contract
|
|
434
|
+
if dose is None:
|
|
435
|
+
return {
|
|
436
|
+
option.option_id: (
|
|
437
|
+
assigned_cards if index == 0 else (assigned_cards[0],)
|
|
438
|
+
)
|
|
439
|
+
for index, option in enumerate(selected)
|
|
440
|
+
}
|
|
441
|
+
dose.__post_init__()
|
|
442
|
+
assignments: dict[str, list[str]] = {
|
|
443
|
+
option.option_id: [] for option in selected
|
|
444
|
+
}
|
|
445
|
+
for support in dose.card_supports:
|
|
446
|
+
target = next(
|
|
447
|
+
(
|
|
448
|
+
option
|
|
449
|
+
for option in selected
|
|
450
|
+
if len(assignments[option.option_id])
|
|
451
|
+
< dose.maximum_cards_per_member
|
|
452
|
+
and support.supports(option.option_id, option.identity_sha256)
|
|
453
|
+
),
|
|
454
|
+
None,
|
|
455
|
+
)
|
|
456
|
+
if target is None:
|
|
457
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
458
|
+
f"selected K8 cannot attribute assigned card {support.card_key}"
|
|
459
|
+
)
|
|
460
|
+
assignments[target.option_id].append(support.card_key)
|
|
461
|
+
lower, _ = dose.proposed_supported_member_bounds
|
|
462
|
+
while sum(bool(value) for value in assignments.values()) < lower:
|
|
463
|
+
target_pair = next(
|
|
464
|
+
(
|
|
465
|
+
(option, support)
|
|
466
|
+
for option in selected
|
|
467
|
+
if not assignments[option.option_id]
|
|
468
|
+
for support in dose.card_supports
|
|
469
|
+
if support.supports(option.option_id, option.identity_sha256)
|
|
470
|
+
),
|
|
471
|
+
None,
|
|
472
|
+
)
|
|
473
|
+
if target_pair is None:
|
|
474
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
475
|
+
"selected K8 cannot realize its supported-member lower bound"
|
|
476
|
+
)
|
|
477
|
+
option, support = target_pair
|
|
478
|
+
assignments[option.option_id].append(support.card_key)
|
|
479
|
+
return {
|
|
480
|
+
option_id: tuple(card_keys)
|
|
481
|
+
for option_id, card_keys in assignments.items()
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
class ProviderFreeCalibratedPortfolioRunner:
|
|
486
|
+
"""Callable local runner over the real calibrated structured-output port."""
|
|
487
|
+
|
|
488
|
+
def __init__(self) -> None:
|
|
489
|
+
self.calls = 0
|
|
490
|
+
self.records: list[dict[str, object]] = []
|
|
491
|
+
|
|
492
|
+
async def __call__(
|
|
493
|
+
self,
|
|
494
|
+
request: StructuredGenerationRequest[Any],
|
|
495
|
+
) -> StructuredGenerationResponse[Any]:
|
|
496
|
+
request.__post_init__()
|
|
497
|
+
if not issubclass(request.output_type, BaseModel):
|
|
498
|
+
raise ProviderFreeCalibratedConformanceError(
|
|
499
|
+
"calibrated output type must be a Pydantic model"
|
|
500
|
+
)
|
|
501
|
+
output_type = request.output_type
|
|
502
|
+
member_types = _member_model_types(output_type)
|
|
503
|
+
metric_ids = _metric_ids(member_types)
|
|
504
|
+
bindings = _composite_bindings(member_types)
|
|
505
|
+
eligible = _eligible_options(output_type)
|
|
506
|
+
selected_ids, witness = _select_option_ids(
|
|
507
|
+
output_type,
|
|
508
|
+
eligible,
|
|
509
|
+
bindings,
|
|
510
|
+
)
|
|
511
|
+
option_by_id = {value.option_id: value for value in eligible}
|
|
512
|
+
selected = tuple(option_by_id[value] for value in selected_ids)
|
|
513
|
+
cards_by_option = _supporting_cards_by_option(
|
|
514
|
+
output_type=output_type,
|
|
515
|
+
selected=selected,
|
|
516
|
+
)
|
|
517
|
+
# A bounded dose is rank-addressed by the downstream assessment: the
|
|
518
|
+
# supported treatment member must occupy the leading proposal rank so
|
|
519
|
+
# the remaining members are an explicit neutral control stratum. The
|
|
520
|
+
# ordering is derived only from the typed dose contract, remains stable
|
|
521
|
+
# within both strata, and is workload/model/provider independent.
|
|
522
|
+
selected = tuple(
|
|
523
|
+
sorted(
|
|
524
|
+
selected,
|
|
525
|
+
key=lambda option: not bool(cards_by_option[option.option_id]),
|
|
526
|
+
)
|
|
527
|
+
)
|
|
528
|
+
selected_ids = tuple(option.option_id for option in selected)
|
|
529
|
+
members: list[dict[str, object]] = []
|
|
530
|
+
for index, option in enumerate(selected):
|
|
531
|
+
common: dict[str, object] = {
|
|
532
|
+
"supporting_card_keys": list(cards_by_option[option.option_id]),
|
|
533
|
+
"effect_predictions": [
|
|
534
|
+
{
|
|
535
|
+
"metric_id": metric_id,
|
|
536
|
+
"direction": "unknown",
|
|
537
|
+
"confidence": "unknown",
|
|
538
|
+
}
|
|
539
|
+
for metric_id in metric_ids
|
|
540
|
+
],
|
|
541
|
+
"role_proposal": (
|
|
542
|
+
"exploit" if index < 4 else "falsify" if index < 7 else "coverage"
|
|
543
|
+
),
|
|
544
|
+
"design_rationale": (
|
|
545
|
+
"Outcome-blind provider-free conformance proposal derived "
|
|
546
|
+
"from the sealed finite action contract."
|
|
547
|
+
),
|
|
548
|
+
}
|
|
549
|
+
if option.option_id in bindings:
|
|
550
|
+
members.append(
|
|
551
|
+
{
|
|
552
|
+
"action_kind": "compose_r2",
|
|
553
|
+
"composite_option_id": option.option_id,
|
|
554
|
+
"component_option_ids": list(bindings[option.option_id]),
|
|
555
|
+
**common,
|
|
556
|
+
}
|
|
557
|
+
)
|
|
558
|
+
elif bindings:
|
|
559
|
+
members.append(
|
|
560
|
+
{
|
|
561
|
+
"action_kind": "atomic",
|
|
562
|
+
"option_id": option.option_id,
|
|
563
|
+
**common,
|
|
564
|
+
}
|
|
565
|
+
)
|
|
566
|
+
else:
|
|
567
|
+
members.append({"option_id": option.option_id, **common})
|
|
568
|
+
value = output_type.model_validate({"members": members}, strict=True)
|
|
569
|
+
self.calls += 1
|
|
570
|
+
self.records.append(
|
|
571
|
+
ProviderFreeCalibratedCallRecord(
|
|
572
|
+
call_id=request.call_id.value,
|
|
573
|
+
proposal_option_ids=selected_ids,
|
|
574
|
+
supporting_card_keys_by_member=tuple(
|
|
575
|
+
cards_by_option[value] for value in selected_ids
|
|
576
|
+
),
|
|
577
|
+
assigned_card_keys=tuple(sorted(output_type.assigned_card_keys)),
|
|
578
|
+
evaluation_witness_option_ids=witness,
|
|
579
|
+
required_proposal_support_option_ids=tuple(
|
|
580
|
+
sorted(output_type.required_proposal_support_option_ids)
|
|
581
|
+
),
|
|
582
|
+
required_composite_proposals=output_type.required_composite_proposals,
|
|
583
|
+
bounded_memory_dose=output_type.memory_dose_contract is not None,
|
|
584
|
+
).to_record()
|
|
585
|
+
)
|
|
586
|
+
return StructuredGenerationResponse(
|
|
587
|
+
value=value,
|
|
588
|
+
requested_model="provider-free/calibrated-conformance",
|
|
589
|
+
resolved_model="provider-free/calibrated-conformance",
|
|
590
|
+
resolved_provider="local-deterministic-conformance",
|
|
591
|
+
provider_response_id=None,
|
|
592
|
+
finish_reason="policy_completed",
|
|
593
|
+
input_tokens=0,
|
|
594
|
+
output_tokens=0,
|
|
595
|
+
reasoning_tokens=0,
|
|
596
|
+
cache_read_tokens=0,
|
|
597
|
+
cache_write_tokens=0,
|
|
598
|
+
cost_usd=Decimal("0"),
|
|
599
|
+
latency_ns=0,
|
|
600
|
+
)
|
|
601
|
+
|
|
602
|
+
|
|
603
|
+
__all__ = [
|
|
604
|
+
"ProviderFreeCalibratedCallRecord",
|
|
605
|
+
"ProviderFreeCalibratedConformanceError",
|
|
606
|
+
"ProviderFreeCalibratedPortfolioRunner",
|
|
607
|
+
]
|