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,183 @@
|
|
|
1
|
+
"""Injectable exponential backoff and jitter policies for LLM task retries."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
import hashlib
|
|
7
|
+
from typing import Protocol, runtime_checkable
|
|
8
|
+
|
|
9
|
+
from agent_evolve.domain.llm_task_queue import RetryClassification, RetryReason
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@runtime_checkable
|
|
13
|
+
class JitterPolicy(Protocol):
|
|
14
|
+
def apply(
|
|
15
|
+
self,
|
|
16
|
+
upper_bound_ns: int,
|
|
17
|
+
*,
|
|
18
|
+
task_id: str,
|
|
19
|
+
failed_attempt_number: int,
|
|
20
|
+
) -> int: ...
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@runtime_checkable
|
|
24
|
+
class RandomRange(Protocol):
|
|
25
|
+
def randrange(self, stop: int) -> int: ...
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True, slots=True)
|
|
29
|
+
class NoJitter:
|
|
30
|
+
"""Use the capped exponential delay exactly."""
|
|
31
|
+
|
|
32
|
+
def apply(
|
|
33
|
+
self,
|
|
34
|
+
upper_bound_ns: int,
|
|
35
|
+
*,
|
|
36
|
+
task_id: str,
|
|
37
|
+
failed_attempt_number: int,
|
|
38
|
+
) -> int:
|
|
39
|
+
del task_id, failed_attempt_number
|
|
40
|
+
if type(upper_bound_ns) is not int or upper_bound_ns < 0:
|
|
41
|
+
raise ValueError("upper_bound_ns must be a non-negative integer")
|
|
42
|
+
return upper_bound_ns
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
@dataclass(frozen=True, slots=True)
|
|
46
|
+
class FullJitter:
|
|
47
|
+
"""Choose uniformly from the inclusive interval ``[0, upper_bound]``."""
|
|
48
|
+
|
|
49
|
+
random: RandomRange
|
|
50
|
+
|
|
51
|
+
def __post_init__(self) -> None:
|
|
52
|
+
if not isinstance(self.random, RandomRange):
|
|
53
|
+
raise TypeError("random must implement RandomRange")
|
|
54
|
+
|
|
55
|
+
def apply(
|
|
56
|
+
self,
|
|
57
|
+
upper_bound_ns: int,
|
|
58
|
+
*,
|
|
59
|
+
task_id: str,
|
|
60
|
+
failed_attempt_number: int,
|
|
61
|
+
) -> int:
|
|
62
|
+
del task_id, failed_attempt_number
|
|
63
|
+
if type(upper_bound_ns) is not int or upper_bound_ns < 0:
|
|
64
|
+
raise ValueError("upper_bound_ns must be a non-negative integer")
|
|
65
|
+
sampled = self.random.randrange(upper_bound_ns + 1)
|
|
66
|
+
if type(sampled) is not int or not 0 <= sampled <= upper_bound_ns:
|
|
67
|
+
raise ValueError("random source returned a value outside the jitter interval")
|
|
68
|
+
return sampled
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@dataclass(frozen=True, slots=True)
|
|
72
|
+
class DeterministicHashJitter:
|
|
73
|
+
"""Task-keyed full jitter independent of concurrent completion order.
|
|
74
|
+
|
|
75
|
+
The domain string makes the byte framing experiment- or application-specific,
|
|
76
|
+
while the task ID and failed-attempt number prevent a shared mutable RNG from
|
|
77
|
+
coupling otherwise independent requests.
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
seed: int
|
|
81
|
+
domain: str = "agent-evolve-jitter-v1"
|
|
82
|
+
|
|
83
|
+
def __post_init__(self) -> None:
|
|
84
|
+
if type(self.seed) is not int or self.seed < 0:
|
|
85
|
+
raise ValueError("seed must be a non-negative exact integer")
|
|
86
|
+
if (
|
|
87
|
+
type(self.domain) is not str
|
|
88
|
+
or not self.domain
|
|
89
|
+
or "\x00" in self.domain
|
|
90
|
+
or not self.domain.isascii()
|
|
91
|
+
):
|
|
92
|
+
raise ValueError("domain must be non-empty NUL-free ASCII")
|
|
93
|
+
|
|
94
|
+
def apply(
|
|
95
|
+
self,
|
|
96
|
+
upper_bound_ns: int,
|
|
97
|
+
*,
|
|
98
|
+
task_id: str,
|
|
99
|
+
failed_attempt_number: int,
|
|
100
|
+
) -> int:
|
|
101
|
+
if type(upper_bound_ns) is not int or upper_bound_ns < 0:
|
|
102
|
+
raise ValueError("upper_bound_ns must be a non-negative integer")
|
|
103
|
+
if type(task_id) is not str or not task_id or "\x00" in task_id:
|
|
104
|
+
raise ValueError("task_id must be non-empty and NUL-free")
|
|
105
|
+
if type(failed_attempt_number) is not int or failed_attempt_number < 1:
|
|
106
|
+
raise ValueError("failed_attempt_number must be a positive integer")
|
|
107
|
+
framed = b"\x00".join(
|
|
108
|
+
(
|
|
109
|
+
self.domain.encode("ascii"),
|
|
110
|
+
str(self.seed).encode("ascii"),
|
|
111
|
+
task_id.encode("utf-8", errors="strict"),
|
|
112
|
+
str(failed_attempt_number).encode("ascii"),
|
|
113
|
+
)
|
|
114
|
+
)
|
|
115
|
+
value = int.from_bytes(hashlib.sha256(framed).digest(), "big")
|
|
116
|
+
return value % (upper_bound_ns + 1)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
@dataclass(frozen=True, slots=True)
|
|
120
|
+
class ExponentialBackoff:
|
|
121
|
+
"""Capped exponential backoff with jitter and a rate-limit floor.
|
|
122
|
+
|
|
123
|
+
Full jitter is useful for ordinary transient failures, but a sampled delay
|
|
124
|
+
close to zero defeats provider recovery after an HTTP 429. The optional
|
|
125
|
+
floor is classification-aware: it applies only to ``RATE_LIMIT`` retries,
|
|
126
|
+
leaving timeout, transient, and structured-output behavior unchanged.
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
base_delay_ns: int
|
|
130
|
+
max_delay_ns: int
|
|
131
|
+
jitter: JitterPolicy = NoJitter()
|
|
132
|
+
rate_limit_floor_ns: int = 0
|
|
133
|
+
|
|
134
|
+
def __post_init__(self) -> None:
|
|
135
|
+
if type(self.base_delay_ns) is not int or self.base_delay_ns < 0:
|
|
136
|
+
raise ValueError("base_delay_ns must be a non-negative integer")
|
|
137
|
+
if type(self.max_delay_ns) is not int or self.max_delay_ns < 0:
|
|
138
|
+
raise ValueError("max_delay_ns must be a non-negative integer")
|
|
139
|
+
if self.base_delay_ns > self.max_delay_ns:
|
|
140
|
+
raise ValueError("base_delay_ns cannot exceed max_delay_ns")
|
|
141
|
+
if (
|
|
142
|
+
type(self.rate_limit_floor_ns) is not int
|
|
143
|
+
or self.rate_limit_floor_ns < 0
|
|
144
|
+
or self.rate_limit_floor_ns > self.max_delay_ns
|
|
145
|
+
):
|
|
146
|
+
raise ValueError(
|
|
147
|
+
"rate_limit_floor_ns must lie in [0, max_delay_ns]"
|
|
148
|
+
)
|
|
149
|
+
if not isinstance(self.jitter, JitterPolicy):
|
|
150
|
+
raise TypeError("jitter must implement JitterPolicy")
|
|
151
|
+
|
|
152
|
+
def delay_ns(
|
|
153
|
+
self,
|
|
154
|
+
*,
|
|
155
|
+
task_id: str,
|
|
156
|
+
failed_attempt_number: int,
|
|
157
|
+
classification: RetryClassification,
|
|
158
|
+
) -> int:
|
|
159
|
+
if type(task_id) is not str or not task_id:
|
|
160
|
+
raise ValueError("task_id must be a non-empty string")
|
|
161
|
+
if type(failed_attempt_number) is not int or failed_attempt_number < 1:
|
|
162
|
+
raise ValueError("failed_attempt_number must be a positive integer")
|
|
163
|
+
if type(classification) is not RetryClassification:
|
|
164
|
+
raise TypeError("classification must be a RetryClassification")
|
|
165
|
+
|
|
166
|
+
if self.base_delay_ns == 0 or self.max_delay_ns == 0:
|
|
167
|
+
upper_bound = 0
|
|
168
|
+
else:
|
|
169
|
+
shift = failed_attempt_number - 1
|
|
170
|
+
# Avoid constructing an enormous intermediate integer for a bad
|
|
171
|
+
# attempt value while retaining the exact capped result.
|
|
172
|
+
if shift >= self.max_delay_ns.bit_length():
|
|
173
|
+
upper_bound = self.max_delay_ns
|
|
174
|
+
else:
|
|
175
|
+
upper_bound = min(self.base_delay_ns << shift, self.max_delay_ns)
|
|
176
|
+
delay = self.jitter.apply(
|
|
177
|
+
upper_bound,
|
|
178
|
+
task_id=task_id,
|
|
179
|
+
failed_attempt_number=failed_attempt_number,
|
|
180
|
+
)
|
|
181
|
+
if classification.reason is RetryReason.RATE_LIMIT:
|
|
182
|
+
return max(delay, self.rate_limit_floor_ns)
|
|
183
|
+
return delay
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
"""An operator chooser backed by a language model.
|
|
2
|
+
|
|
3
|
+
The model is asked *which parents to recombine and where to cut*. It is never
|
|
4
|
+
asked to write a candidate, and it could not: :class:`OperatorChoice` has no
|
|
5
|
+
field that can hold a configuration. That is the distinction this project's
|
|
6
|
+
claim rests on -- guidance over operator choice rather than artifact authoring --
|
|
7
|
+
and it is enforced by the type rather than by the prompt.
|
|
8
|
+
|
|
9
|
+
Everything the model sees is derived from the problem's own candidate shape and
|
|
10
|
+
objective declarations. Nothing here knows what a locus means.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import annotations
|
|
14
|
+
|
|
15
|
+
import json
|
|
16
|
+
import re
|
|
17
|
+
from typing import Any, Callable, Mapping, Sequence
|
|
18
|
+
|
|
19
|
+
from agent_evolve.policies.genetic import Locus, loci_of
|
|
20
|
+
from agent_evolve.session.genetic_loop import OperatorChoice
|
|
21
|
+
|
|
22
|
+
__all__ = ["ChooserTelemetry", "llm_chooser", "render_population", "parse_choices"]
|
|
23
|
+
|
|
24
|
+
Config = dict[str, Any]
|
|
25
|
+
|
|
26
|
+
#: Minimal provider surface: prompt in, text out. Deliberately not the harness
|
|
27
|
+
#: interface -- a chooser needs one completion, not a proposal protocol, and a
|
|
28
|
+
#: narrow seam is testable without a provider.
|
|
29
|
+
Complete = Callable[[str], str]
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class ChooserTelemetry:
|
|
33
|
+
"""Counts what the model actually returned. Reported, never inferred.
|
|
34
|
+
|
|
35
|
+
``wrote_candidate`` is the one that matters: a model that answers with a
|
|
36
|
+
configuration instead of operator arguments has stepped outside the claim,
|
|
37
|
+
and a silent fallback to random choice would produce a null result
|
|
38
|
+
indistinguishable from an honest one.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
__slots__ = ("calls", "accepted", "unparseable", "malformed",
|
|
42
|
+
"wrote_candidate", "out_of_range", "errors")
|
|
43
|
+
|
|
44
|
+
def __init__(self) -> None:
|
|
45
|
+
self.calls = 0
|
|
46
|
+
self.accepted = 0
|
|
47
|
+
self.unparseable = 0
|
|
48
|
+
self.malformed = 0
|
|
49
|
+
self.wrote_candidate = 0
|
|
50
|
+
self.out_of_range = 0
|
|
51
|
+
self.errors = 0
|
|
52
|
+
|
|
53
|
+
def as_dict(self) -> dict[str, int]:
|
|
54
|
+
return {name: getattr(self, name) for name in self.__slots__}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
_PROMPT = """You are choosing recombination operations for a genetic optimizer.
|
|
58
|
+
{context}
|
|
59
|
+
OBJECTIVES (this is what the numbers mean):
|
|
60
|
+
{objectives}
|
|
61
|
+
{state}
|
|
62
|
+
CURRENT POPULATION -- index, then the candidate, then its measured objectives:
|
|
63
|
+
{population}
|
|
64
|
+
|
|
65
|
+
Each candidate has {n_loci} heritable positions, in this order:
|
|
66
|
+
{loci}
|
|
67
|
+
|
|
68
|
+
Budget used: {used} of {total} evaluations.
|
|
69
|
+
|
|
70
|
+
Choose {k} recombination operations. For each, name TWO parents by INDEX and a
|
|
71
|
+
crossover MASK of exactly {n_loci} bits: bit i = 0 takes position i from
|
|
72
|
+
parent_a, bit i = 1 takes it from parent_b.
|
|
73
|
+
|
|
74
|
+
CHOOSE FOR COMPLEMENTARITY, NOT RANK. Recombination only helps when the two
|
|
75
|
+
parents carry DIFFERENT useful material: repeatedly pairing the top-ranked
|
|
76
|
+
candidate, or masks that copy nearly everything from one side, spend
|
|
77
|
+
evaluations on near-clones. Across your {k} choices use varied parent pairs --
|
|
78
|
+
including mid-rank candidates whose positions differ from the leaders' -- and
|
|
79
|
+
prefer masks that genuinely mix both parents.
|
|
80
|
+
|
|
81
|
+
Do NOT write candidates. Choose indices and mask bits only.
|
|
82
|
+
|
|
83
|
+
Reply with ONLY a JSON list of {k} objects and no other text:
|
|
84
|
+
[{{"parent_a": 0, "parent_b": 2, "mask": [{example}]}}]"""
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def render_population(
|
|
88
|
+
population: Sequence[tuple[Config, float]],
|
|
89
|
+
objectives: Sequence[Any] | None = None,
|
|
90
|
+
) -> str:
|
|
91
|
+
"""One line per member: index, candidate, rank. Compact and lossless."""
|
|
92
|
+
|
|
93
|
+
lines = []
|
|
94
|
+
for i, (config, rank) in enumerate(population):
|
|
95
|
+
lines.append(f" {i}: {json.dumps(config, sort_keys=True)} "
|
|
96
|
+
f"(rank {rank:g}; lower is better)")
|
|
97
|
+
return "\n".join(lines)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def parse_choices(
|
|
101
|
+
text: str,
|
|
102
|
+
*,
|
|
103
|
+
n_loci: int,
|
|
104
|
+
population_size: int,
|
|
105
|
+
telemetry: ChooserTelemetry,
|
|
106
|
+
) -> list[OperatorChoice]:
|
|
107
|
+
"""Parse operator arguments, rejecting anything that is a candidate.
|
|
108
|
+
|
|
109
|
+
Rejections are counted rather than silently dropped, because the number of
|
|
110
|
+
rejected responses is the difference between "guidance did not help" and
|
|
111
|
+
"guidance never arrived".
|
|
112
|
+
"""
|
|
113
|
+
|
|
114
|
+
match = re.search(r"\[.*\]", text, re.S)
|
|
115
|
+
if match is None:
|
|
116
|
+
telemetry.unparseable += 1
|
|
117
|
+
return []
|
|
118
|
+
try:
|
|
119
|
+
raw = json.loads(match.group(0))
|
|
120
|
+
except (ValueError, TypeError):
|
|
121
|
+
telemetry.unparseable += 1
|
|
122
|
+
return []
|
|
123
|
+
if not isinstance(raw, list):
|
|
124
|
+
telemetry.unparseable += 1
|
|
125
|
+
return []
|
|
126
|
+
|
|
127
|
+
out: list[OperatorChoice] = []
|
|
128
|
+
for item in raw:
|
|
129
|
+
if not isinstance(item, dict):
|
|
130
|
+
telemetry.malformed += 1
|
|
131
|
+
continue
|
|
132
|
+
# A nested structure under any key is a candidate, not a choice. This is
|
|
133
|
+
# the failure that would collapse the arm into whole-artifact rewrite.
|
|
134
|
+
if any(isinstance(v, (dict,)) for v in item.values()) or "mask" not in item:
|
|
135
|
+
telemetry.wrote_candidate += 1
|
|
136
|
+
continue
|
|
137
|
+
try:
|
|
138
|
+
parent_a = int(item["parent_a"])
|
|
139
|
+
parent_b = int(item["parent_b"])
|
|
140
|
+
mask = tuple(bool(int(bit)) for bit in item["mask"])
|
|
141
|
+
except (KeyError, TypeError, ValueError):
|
|
142
|
+
telemetry.malformed += 1
|
|
143
|
+
continue
|
|
144
|
+
if not (0 <= parent_a < population_size and 0 <= parent_b < population_size):
|
|
145
|
+
telemetry.out_of_range += 1
|
|
146
|
+
continue
|
|
147
|
+
if len(mask) != n_loci:
|
|
148
|
+
telemetry.out_of_range += 1
|
|
149
|
+
continue
|
|
150
|
+
out.append(OperatorChoice(parent_a=parent_a, parent_b=parent_b, mask=mask))
|
|
151
|
+
telemetry.accepted += len(out)
|
|
152
|
+
return out
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
def llm_chooser(
|
|
156
|
+
complete: Complete,
|
|
157
|
+
*,
|
|
158
|
+
objectives: Sequence[Any],
|
|
159
|
+
budget: int,
|
|
160
|
+
telemetry: ChooserTelemetry | None = None,
|
|
161
|
+
on_shortfall: Callable[[int, int], None] | None = None,
|
|
162
|
+
domain_context: str = "",
|
|
163
|
+
):
|
|
164
|
+
"""Build an :class:`OperatorChooser` that asks *complete* for choices.
|
|
165
|
+
|
|
166
|
+
When the model returns fewer usable choices than asked for, the caller is
|
|
167
|
+
told through *on_shortfall* and the loop fills the remainder itself. A run
|
|
168
|
+
that quietly substitutes random choices for model choices is a run whose
|
|
169
|
+
result cannot be attributed.
|
|
170
|
+
"""
|
|
171
|
+
|
|
172
|
+
from agent_evolve.policies.semantics import objective_lines
|
|
173
|
+
|
|
174
|
+
stats = telemetry if telemetry is not None else ChooserTelemetry()
|
|
175
|
+
spent = {"n": 0}
|
|
176
|
+
# Empty context renders to nothing at all, keeping the no-card prompt
|
|
177
|
+
# byte-identical (the state-block precedent).
|
|
178
|
+
context_block = (f"\n{domain_context.strip()}\n"
|
|
179
|
+
if domain_context.strip() else "")
|
|
180
|
+
|
|
181
|
+
def choose(population: Sequence[tuple[Config, float]], count: int,
|
|
182
|
+
state: Any = None):
|
|
183
|
+
if not population:
|
|
184
|
+
return []
|
|
185
|
+
loci = loci_of(population[0][0])
|
|
186
|
+
# An absent state renders to nothing at all, so the score-only baseline
|
|
187
|
+
# is byte-identical to the prompt this chooser sent before the search
|
|
188
|
+
# state existed -- an ablation must not carry an empty heading.
|
|
189
|
+
block = ""
|
|
190
|
+
if state is not None:
|
|
191
|
+
rendered = state.render([spec.name for spec in objectives])
|
|
192
|
+
if rendered:
|
|
193
|
+
block = "\n" + rendered + "\n"
|
|
194
|
+
prompt = _PROMPT.format(
|
|
195
|
+
context=context_block,
|
|
196
|
+
objectives="\n".join(
|
|
197
|
+
f" {line}" for line in objective_lines(objectives)
|
|
198
|
+
),
|
|
199
|
+
state=block,
|
|
200
|
+
population=render_population(population, objectives),
|
|
201
|
+
n_loci=len(loci),
|
|
202
|
+
loci=" " + ", ".join(str(locus) for locus in loci),
|
|
203
|
+
used=spent["n"],
|
|
204
|
+
total=budget,
|
|
205
|
+
k=count,
|
|
206
|
+
example=",".join("0" for _ in loci),
|
|
207
|
+
)
|
|
208
|
+
stats.calls += 1
|
|
209
|
+
try:
|
|
210
|
+
text = complete(prompt)
|
|
211
|
+
except Exception:
|
|
212
|
+
stats.errors += 1
|
|
213
|
+
return []
|
|
214
|
+
choices = parse_choices(
|
|
215
|
+
text, n_loci=len(loci), population_size=len(population),
|
|
216
|
+
telemetry=stats,
|
|
217
|
+
)
|
|
218
|
+
spent["n"] += count
|
|
219
|
+
if len(choices) < count and on_shortfall is not None:
|
|
220
|
+
on_shortfall(len(choices), count)
|
|
221
|
+
return choices
|
|
222
|
+
|
|
223
|
+
choose.telemetry = stats # type: ignore[attr-defined]
|
|
224
|
+
choose.mechanism = "chooser" # type: ignore[attr-defined]
|
|
225
|
+
choose.authored_by = "llm" # type: ignore[attr-defined]
|
|
226
|
+
return choose
|