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,138 @@
|
|
|
1
|
+
"""Domain-neutral separation of scientific and execution call identities."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Awaitable, Callable
|
|
6
|
+
from dataclasses import dataclass, replace
|
|
7
|
+
import hashlib
|
|
8
|
+
import json
|
|
9
|
+
from typing import Any
|
|
10
|
+
|
|
11
|
+
from pydantic import BaseModel
|
|
12
|
+
|
|
13
|
+
from agent_evolve.domain.ids import LLMCallId
|
|
14
|
+
from agent_evolve.ports.structured_generator import StructuredGenerationRequest
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def _schema_bytes(output_type: type[object]) -> bytes:
|
|
18
|
+
if not issubclass(output_type, BaseModel):
|
|
19
|
+
raise TypeError("structured output type must be a Pydantic BaseModel")
|
|
20
|
+
return json.dumps(
|
|
21
|
+
output_type.model_json_schema(mode="validation"),
|
|
22
|
+
allow_nan=False,
|
|
23
|
+
ensure_ascii=True,
|
|
24
|
+
separators=(",", ":"),
|
|
25
|
+
sort_keys=True,
|
|
26
|
+
).encode("ascii")
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass(frozen=True, slots=True)
|
|
30
|
+
class StructuredScienceRequestBinding:
|
|
31
|
+
"""Fingerprint one scientific request independently of its execution ID."""
|
|
32
|
+
|
|
33
|
+
science_call_id: str
|
|
34
|
+
operation: str
|
|
35
|
+
prompt_utf8_bytes: int
|
|
36
|
+
prompt_sha256: str
|
|
37
|
+
output_schema_utf8_bytes: int
|
|
38
|
+
output_schema_sha256: str
|
|
39
|
+
output_tool_name: str
|
|
40
|
+
max_output_tokens: int
|
|
41
|
+
temperature_hex: str | None
|
|
42
|
+
|
|
43
|
+
@classmethod
|
|
44
|
+
def from_request(
|
|
45
|
+
cls,
|
|
46
|
+
request: StructuredGenerationRequest[Any],
|
|
47
|
+
) -> "StructuredScienceRequestBinding":
|
|
48
|
+
if type(request) is not StructuredGenerationRequest:
|
|
49
|
+
raise TypeError("request must be an exact StructuredGenerationRequest")
|
|
50
|
+
StructuredGenerationRequest.__post_init__(request)
|
|
51
|
+
prompt = request.prompt.encode("utf-8", errors="strict")
|
|
52
|
+
schema = _schema_bytes(request.output_type)
|
|
53
|
+
return cls(
|
|
54
|
+
science_call_id=request.call_id.value,
|
|
55
|
+
operation=request.operation,
|
|
56
|
+
prompt_utf8_bytes=len(prompt),
|
|
57
|
+
prompt_sha256=hashlib.sha256(prompt).hexdigest(),
|
|
58
|
+
output_schema_utf8_bytes=len(schema),
|
|
59
|
+
output_schema_sha256=hashlib.sha256(schema).hexdigest(),
|
|
60
|
+
output_tool_name=request.output_tool_name,
|
|
61
|
+
max_output_tokens=request.max_output_tokens,
|
|
62
|
+
temperature_hex=(
|
|
63
|
+
None
|
|
64
|
+
if request.temperature is None
|
|
65
|
+
else float(request.temperature).hex()
|
|
66
|
+
),
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def provider_fingerprint(self) -> tuple[object, ...]:
|
|
70
|
+
return (
|
|
71
|
+
self.operation,
|
|
72
|
+
self.prompt_utf8_bytes,
|
|
73
|
+
self.prompt_sha256,
|
|
74
|
+
self.output_schema_utf8_bytes,
|
|
75
|
+
self.output_schema_sha256,
|
|
76
|
+
self.output_tool_name,
|
|
77
|
+
self.max_output_tokens,
|
|
78
|
+
self.temperature_hex,
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def rebind_structured_execution_request(
|
|
83
|
+
request: StructuredGenerationRequest[Any],
|
|
84
|
+
*,
|
|
85
|
+
expected: StructuredScienceRequestBinding,
|
|
86
|
+
execution_call_id: LLMCallId,
|
|
87
|
+
) -> StructuredGenerationRequest[Any]:
|
|
88
|
+
"""Replace only queue identity after verifying the scientific payload."""
|
|
89
|
+
|
|
90
|
+
if type(expected) is not StructuredScienceRequestBinding:
|
|
91
|
+
raise TypeError("expected must be a StructuredScienceRequestBinding")
|
|
92
|
+
if type(execution_call_id) is not LLMCallId:
|
|
93
|
+
raise TypeError("execution_call_id must be an exact LLMCallId")
|
|
94
|
+
LLMCallId.__post_init__(execution_call_id)
|
|
95
|
+
observed = StructuredScienceRequestBinding.from_request(request)
|
|
96
|
+
if observed != expected:
|
|
97
|
+
raise ValueError("structured scientific request does not match its binding")
|
|
98
|
+
rebound = replace(request, call_id=execution_call_id)
|
|
99
|
+
rebound_binding = StructuredScienceRequestBinding.from_request(rebound)
|
|
100
|
+
if rebound_binding.provider_fingerprint() != expected.provider_fingerprint():
|
|
101
|
+
raise AssertionError("execution-ID rebinding changed provider-visible fields")
|
|
102
|
+
return rebound
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
@dataclass(slots=True)
|
|
106
|
+
class ExecutionIdRebindingRunner:
|
|
107
|
+
"""Adapt a frozen scientific request to a fresh queue execution ID."""
|
|
108
|
+
|
|
109
|
+
runner: Callable[[StructuredGenerationRequest[Any]], Awaitable[object]]
|
|
110
|
+
expected: StructuredScienceRequestBinding
|
|
111
|
+
execution_call_id: LLMCallId
|
|
112
|
+
|
|
113
|
+
def __post_init__(self) -> None:
|
|
114
|
+
if not callable(self.runner):
|
|
115
|
+
raise TypeError("runner must be callable")
|
|
116
|
+
if type(self.expected) is not StructuredScienceRequestBinding:
|
|
117
|
+
raise TypeError("expected must be a StructuredScienceRequestBinding")
|
|
118
|
+
if type(self.execution_call_id) is not LLMCallId:
|
|
119
|
+
raise TypeError("execution_call_id must be an exact LLMCallId")
|
|
120
|
+
LLMCallId.__post_init__(self.execution_call_id)
|
|
121
|
+
|
|
122
|
+
async def __call__(
|
|
123
|
+
self,
|
|
124
|
+
request: StructuredGenerationRequest[Any],
|
|
125
|
+
) -> object:
|
|
126
|
+
rebound = rebind_structured_execution_request(
|
|
127
|
+
request,
|
|
128
|
+
expected=self.expected,
|
|
129
|
+
execution_call_id=self.execution_call_id,
|
|
130
|
+
)
|
|
131
|
+
return await self.runner(rebound)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
__all__ = [
|
|
135
|
+
"ExecutionIdRebindingRunner",
|
|
136
|
+
"StructuredScienceRequestBinding",
|
|
137
|
+
"rebind_structured_execution_request",
|
|
138
|
+
]
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
"""Compose forecast-geometry ballots into one protected action committee."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass
|
|
6
|
+
import math
|
|
7
|
+
|
|
8
|
+
from agent_evolve.application.protected_action_committee import (
|
|
9
|
+
ActionCommitteeArmBinding,
|
|
10
|
+
ProtectedActionCommitteePolicy,
|
|
11
|
+
)
|
|
12
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
13
|
+
MaterializedSlateFeasibilityPort,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
from .semantic_coverage_residual_portfolio import (
|
|
17
|
+
ForecastGeometryRacingResidualPortfolio,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True, slots=True)
|
|
22
|
+
class ForecastGeometryActionCommitteePortfolio:
|
|
23
|
+
"""The existing consequence arms behind one outcome-blind exact-K policy."""
|
|
24
|
+
|
|
25
|
+
source_portfolio: ForecastGeometryRacingResidualPortfolio
|
|
26
|
+
allocation: ProtectedActionCommitteePolicy
|
|
27
|
+
additional_arm_bindings: tuple[ActionCommitteeArmBinding, ...] = ()
|
|
28
|
+
|
|
29
|
+
def __post_init__(self) -> None:
|
|
30
|
+
if (
|
|
31
|
+
type(self.source_portfolio)
|
|
32
|
+
is not ForecastGeometryRacingResidualPortfolio
|
|
33
|
+
):
|
|
34
|
+
raise TypeError("source_portfolio must be exact")
|
|
35
|
+
self.source_portfolio.__post_init__()
|
|
36
|
+
if type(self.allocation) is not ProtectedActionCommitteePolicy:
|
|
37
|
+
raise TypeError("allocation must be an exact protected committee")
|
|
38
|
+
self.allocation.__post_init__()
|
|
39
|
+
if (
|
|
40
|
+
type(self.additional_arm_bindings) is not tuple
|
|
41
|
+
or any(
|
|
42
|
+
type(value) is not ActionCommitteeArmBinding
|
|
43
|
+
for value in self.additional_arm_bindings
|
|
44
|
+
)
|
|
45
|
+
):
|
|
46
|
+
raise TypeError(
|
|
47
|
+
"additional_arm_bindings must contain exact bindings"
|
|
48
|
+
)
|
|
49
|
+
for value in self.additional_arm_bindings:
|
|
50
|
+
value.__post_init__()
|
|
51
|
+
additional_ids = tuple(
|
|
52
|
+
value.arm_id for value in self.additional_arm_bindings
|
|
53
|
+
)
|
|
54
|
+
if additional_ids != tuple(sorted(set(additional_ids))):
|
|
55
|
+
raise ValueError(
|
|
56
|
+
"additional arm bindings must be unique and canonical"
|
|
57
|
+
)
|
|
58
|
+
source_identities = tuple(
|
|
59
|
+
sorted(
|
|
60
|
+
(
|
|
61
|
+
value.branch_id,
|
|
62
|
+
value.policy.policy_id,
|
|
63
|
+
value.policy.policy_version,
|
|
64
|
+
value.policy.definition_sha256,
|
|
65
|
+
)
|
|
66
|
+
for value in self.source_portfolio.planner.branch_bindings
|
|
67
|
+
)
|
|
68
|
+
)
|
|
69
|
+
committee_identities = tuple(
|
|
70
|
+
sorted(
|
|
71
|
+
(
|
|
72
|
+
value.arm_id,
|
|
73
|
+
value.policy.policy_id,
|
|
74
|
+
value.policy.policy_version,
|
|
75
|
+
value.policy.definition_sha256,
|
|
76
|
+
)
|
|
77
|
+
for value in self.allocation.arm_bindings
|
|
78
|
+
)
|
|
79
|
+
)
|
|
80
|
+
additional_identities = tuple(
|
|
81
|
+
sorted(
|
|
82
|
+
(
|
|
83
|
+
value.arm_id,
|
|
84
|
+
value.policy.policy_id,
|
|
85
|
+
value.policy.policy_version,
|
|
86
|
+
value.policy.definition_sha256,
|
|
87
|
+
)
|
|
88
|
+
for value in self.additional_arm_bindings
|
|
89
|
+
)
|
|
90
|
+
)
|
|
91
|
+
if committee_identities != tuple(
|
|
92
|
+
sorted((*source_identities, *additional_identities))
|
|
93
|
+
):
|
|
94
|
+
raise ValueError(
|
|
95
|
+
"committee policies differ from source and additional arms"
|
|
96
|
+
)
|
|
97
|
+
if self.allocation.protected_arm_id != "forecast_neutral":
|
|
98
|
+
raise ValueError("forecast-neutral must remain the protected arm")
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def compose_forecast_geometry_action_committee(
|
|
102
|
+
*,
|
|
103
|
+
source_portfolio: ForecastGeometryRacingResidualPortfolio,
|
|
104
|
+
protected_slots: int,
|
|
105
|
+
audit_slots: int,
|
|
106
|
+
audit_seed_sha256: str,
|
|
107
|
+
arm_weights: tuple[tuple[str, float], ...] = (),
|
|
108
|
+
additional_arm_bindings: tuple[
|
|
109
|
+
ActionCommitteeArmBinding,
|
|
110
|
+
...,
|
|
111
|
+
] = (),
|
|
112
|
+
slate_feasibility: MaterializedSlateFeasibilityPort | None = None,
|
|
113
|
+
) -> ForecastGeometryActionCommitteePortfolio:
|
|
114
|
+
"""Replace complete-slate commitment with protected action aggregation.
|
|
115
|
+
|
|
116
|
+
``source_portfolio`` is an interceptable bundle of already-composed
|
|
117
|
+
outcome-blind policies. Its sequential race is not executed. The committee
|
|
118
|
+
reuses the exact branch policies, including any source-exposure or hard-
|
|
119
|
+
feasibility wrappers, so workload adapters do not acquire another seam.
|
|
120
|
+
Optional additional bindings can expose independent, workload-neutral
|
|
121
|
+
support views such as raw prequential score or provider-native rank.
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
if (
|
|
125
|
+
type(source_portfolio)
|
|
126
|
+
is not ForecastGeometryRacingResidualPortfolio
|
|
127
|
+
):
|
|
128
|
+
raise TypeError("source_portfolio must be exact")
|
|
129
|
+
source_portfolio.__post_init__()
|
|
130
|
+
source_bindings = source_portfolio.planner.branch_bindings
|
|
131
|
+
arm_ids = tuple(value.branch_id for value in source_bindings)
|
|
132
|
+
if (
|
|
133
|
+
type(additional_arm_bindings) is not tuple
|
|
134
|
+
or any(
|
|
135
|
+
type(value) is not ActionCommitteeArmBinding
|
|
136
|
+
for value in additional_arm_bindings
|
|
137
|
+
)
|
|
138
|
+
):
|
|
139
|
+
raise TypeError(
|
|
140
|
+
"additional_arm_bindings must contain exact bindings"
|
|
141
|
+
)
|
|
142
|
+
for value in additional_arm_bindings:
|
|
143
|
+
value.__post_init__()
|
|
144
|
+
additional_ids = tuple(
|
|
145
|
+
value.arm_id for value in additional_arm_bindings
|
|
146
|
+
)
|
|
147
|
+
if additional_ids != tuple(sorted(set(additional_ids))):
|
|
148
|
+
raise ValueError(
|
|
149
|
+
"additional arm bindings must be unique and canonical"
|
|
150
|
+
)
|
|
151
|
+
if set(additional_ids) & set(arm_ids):
|
|
152
|
+
raise ValueError("additional arms collide with consequence arms")
|
|
153
|
+
if not arm_weights:
|
|
154
|
+
weight_by_arm = {arm_id: 1.0 for arm_id in arm_ids}
|
|
155
|
+
else:
|
|
156
|
+
if (
|
|
157
|
+
type(arm_weights) is not tuple
|
|
158
|
+
or arm_weights
|
|
159
|
+
!= tuple(sorted(arm_weights, key=lambda value: value[0]))
|
|
160
|
+
):
|
|
161
|
+
raise ValueError("arm_weights must be canonical")
|
|
162
|
+
weight_by_arm: dict[str, float] = {}
|
|
163
|
+
for arm_id, weight in arm_weights:
|
|
164
|
+
if (
|
|
165
|
+
type(arm_id) is not str
|
|
166
|
+
or arm_id in weight_by_arm
|
|
167
|
+
or type(weight) is not float
|
|
168
|
+
or not math.isfinite(weight)
|
|
169
|
+
or weight <= 0.0
|
|
170
|
+
):
|
|
171
|
+
raise ValueError(
|
|
172
|
+
"arm weights require unique IDs and positive finite floats"
|
|
173
|
+
)
|
|
174
|
+
weight_by_arm[arm_id] = weight
|
|
175
|
+
if set(weight_by_arm) != set(arm_ids):
|
|
176
|
+
raise ValueError("arm_weights must cover every consequence arm")
|
|
177
|
+
|
|
178
|
+
source_arm_bindings = tuple(
|
|
179
|
+
sorted(
|
|
180
|
+
(
|
|
181
|
+
ActionCommitteeArmBinding(
|
|
182
|
+
arm_id=value.branch_id,
|
|
183
|
+
policy=value.policy,
|
|
184
|
+
weight=weight_by_arm[value.branch_id],
|
|
185
|
+
)
|
|
186
|
+
for value in source_bindings
|
|
187
|
+
),
|
|
188
|
+
key=lambda value: value.arm_id,
|
|
189
|
+
)
|
|
190
|
+
)
|
|
191
|
+
allocation = ProtectedActionCommitteePolicy(
|
|
192
|
+
arm_bindings=tuple(
|
|
193
|
+
sorted(
|
|
194
|
+
(
|
|
195
|
+
*source_arm_bindings,
|
|
196
|
+
*additional_arm_bindings,
|
|
197
|
+
),
|
|
198
|
+
key=lambda value: value.arm_id,
|
|
199
|
+
)
|
|
200
|
+
),
|
|
201
|
+
protected_arm_id="forecast_neutral",
|
|
202
|
+
protected_slots=protected_slots,
|
|
203
|
+
audit_slots=audit_slots,
|
|
204
|
+
audit_seed_sha256=audit_seed_sha256,
|
|
205
|
+
slate_feasibility=slate_feasibility,
|
|
206
|
+
)
|
|
207
|
+
return ForecastGeometryActionCommitteePortfolio(
|
|
208
|
+
source_portfolio=source_portfolio,
|
|
209
|
+
allocation=allocation,
|
|
210
|
+
additional_arm_bindings=additional_arm_bindings,
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
__all__ = [
|
|
215
|
+
"ForecastGeometryActionCommitteePortfolio",
|
|
216
|
+
"compose_forecast_geometry_action_committee",
|
|
217
|
+
]
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
"""pydantic-ai harness: typed structured outputs per op (no JSON-string round-trip).
|
|
2
|
+
|
|
3
|
+
Prompt wording comes from the problem's ``Directives`` (``self.directives``); this
|
|
4
|
+
adapter runs ``pydantic_ai.Agent`` with a typed ``output_type`` per op:
|
|
5
|
+
``list[CandidateConfig]`` for candidate ops, ``list[str]`` / ``str`` for insights.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from typing import Any, List, Optional
|
|
11
|
+
|
|
12
|
+
from agent_evolve.harness.base import HarnessBase, HarnessOutputError
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
_AGENT_RUN_FAILED = object()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _attempt_agent_run_sync(agent: Any, instruction: str, settings: dict | None) -> Any:
|
|
19
|
+
"""Run the framework behind an exception-state-clearing private boundary."""
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
if settings is not None:
|
|
23
|
+
return agent.run_sync(instruction, model_settings=settings)
|
|
24
|
+
return agent.run_sync(instruction)
|
|
25
|
+
except Exception:
|
|
26
|
+
return _AGENT_RUN_FAILED
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class PydanticAIHarness(HarnessBase):
|
|
30
|
+
id = "pydantic_ai"
|
|
31
|
+
|
|
32
|
+
def __init__(self) -> None:
|
|
33
|
+
super().__init__()
|
|
34
|
+
self._last_output_type_contract = None
|
|
35
|
+
|
|
36
|
+
@property
|
|
37
|
+
def last_output_type_contract(self):
|
|
38
|
+
"""The immutable contract bound to the most recent Agent execution."""
|
|
39
|
+
|
|
40
|
+
return self._last_output_type_contract
|
|
41
|
+
|
|
42
|
+
def _model_settings(self) -> Optional[dict]:
|
|
43
|
+
settings: dict = {}
|
|
44
|
+
if self.cfg.temperature is not None:
|
|
45
|
+
settings["temperature"] = self.cfg.temperature
|
|
46
|
+
# OpenRouter provider routing (pin official first-party provider, no fallbacks)
|
|
47
|
+
# flows through LLMConfig.extra as {"extra_body": {"provider": {...}}}.
|
|
48
|
+
extra_body = (self.cfg.extra or {}).get("extra_body")
|
|
49
|
+
if extra_body:
|
|
50
|
+
settings["extra_body"] = extra_body
|
|
51
|
+
return settings or None
|
|
52
|
+
|
|
53
|
+
def _output(self, output_type: Any, instruction: str) -> Any:
|
|
54
|
+
from pydantic_ai import Agent
|
|
55
|
+
|
|
56
|
+
from agent_evolve.integrations.pydantic_ai.boundary_codec import (
|
|
57
|
+
build_output_type_contract,
|
|
58
|
+
validate_output_type_contract,
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
# The application workflow is the sole retry owner. Framework output
|
|
62
|
+
# retries can issue a different repair prompt while the legacy/event
|
|
63
|
+
# layer still believes it is replaying one request, so they must remain
|
|
64
|
+
# disabled at this boundary. Provider-client transport retries are a
|
|
65
|
+
# separate M1e composition-root gate and are not asserted here.
|
|
66
|
+
# Reject unsupported/deferred output workflows and bind their canonical
|
|
67
|
+
# type/schema identity before any Agent request can execute.
|
|
68
|
+
self._last_output_type_contract = None
|
|
69
|
+
output_contract = build_output_type_contract(output_type)
|
|
70
|
+
agent = Agent(
|
|
71
|
+
self.cfg.model,
|
|
72
|
+
output_type=output_contract.output_type,
|
|
73
|
+
retries=0,
|
|
74
|
+
)
|
|
75
|
+
validate_output_type_contract(
|
|
76
|
+
output_contract,
|
|
77
|
+
compiled_json_schema=agent.output_json_schema(),
|
|
78
|
+
)
|
|
79
|
+
self._last_output_type_contract = output_contract
|
|
80
|
+
settings = self._model_settings()
|
|
81
|
+
res = _attempt_agent_run_sync(agent, instruction, settings)
|
|
82
|
+
if res is _AGENT_RUN_FAILED:
|
|
83
|
+
# Raised outside the private handler so framework ExceptionGroups,
|
|
84
|
+
# provider payloads, and secrets cannot survive as context/cause.
|
|
85
|
+
raise HarnessOutputError("pydantic_ai: agent execution failed") from None
|
|
86
|
+
self._observe_usage(res)
|
|
87
|
+
return res.output
|
|
88
|
+
|
|
89
|
+
def _observe_usage(self, res: Any) -> None:
|
|
90
|
+
"""Surface per-call token usage to the loop's event observer (best-effort)."""
|
|
91
|
+
if self._observer is None:
|
|
92
|
+
return
|
|
93
|
+
try:
|
|
94
|
+
u = res.usage
|
|
95
|
+
if callable(u): # older pydantic-ai exposed usage() as a method
|
|
96
|
+
u = u()
|
|
97
|
+
except Exception:
|
|
98
|
+
return
|
|
99
|
+
inp = getattr(u, "input_tokens", None)
|
|
100
|
+
if inp is None:
|
|
101
|
+
inp = getattr(u, "request_tokens", None)
|
|
102
|
+
out = getattr(u, "output_tokens", None)
|
|
103
|
+
if out is None:
|
|
104
|
+
out = getattr(u, "response_tokens", None)
|
|
105
|
+
self._observer({"kind": "llm_usage", "model": self.cfg.model,
|
|
106
|
+
"input_tokens": inp, "output_tokens": out})
|
|
107
|
+
|
|
108
|
+
def _candidates(self, op: str, instruction: str) -> List[dict]:
|
|
109
|
+
# Wrap the typed list in a Proposal model with a thought_process field so
|
|
110
|
+
# the model reasons before committing to factors.
|
|
111
|
+
from pydantic import create_model
|
|
112
|
+
|
|
113
|
+
proposal = create_model(
|
|
114
|
+
"Proposal",
|
|
115
|
+
thought_process=(str, ...),
|
|
116
|
+
candidates=(List[self.candidate_type], ...),
|
|
117
|
+
)
|
|
118
|
+
result = self._output(proposal, instruction)
|
|
119
|
+
return self._to_dicts(result.candidates, op)
|
|
120
|
+
|
|
121
|
+
# -- ops -------------------------------------------------------------
|
|
122
|
+
def generate_initial(self, n):
|
|
123
|
+
self._observe("generate_initial")
|
|
124
|
+
return self._candidates("generate_initial", self.directives.compose_initial(self.context, n))
|
|
125
|
+
|
|
126
|
+
def regenerate(self, failed_str, n, constraint_instruction, performance_insights):
|
|
127
|
+
self._observe("regenerate")
|
|
128
|
+
instr = self.directives.compose_regenerate(
|
|
129
|
+
self.context, failed_str, n, constraint_instruction, performance_insights)
|
|
130
|
+
return self._candidates("regenerate", instr)
|
|
131
|
+
|
|
132
|
+
def generate_offspring(self, pareto_str, n, constraint_instruction, performance_insights):
|
|
133
|
+
self._observe("generate_offspring")
|
|
134
|
+
instr = self.directives.compose_offspring(
|
|
135
|
+
self.context, pareto_str, n, constraint_instruction, performance_insights)
|
|
136
|
+
return self._candidates("generate_offspring", instr)
|
|
137
|
+
|
|
138
|
+
def regenerate_offspring(self, failed_str, pareto_str, n,
|
|
139
|
+
constraint_instruction, performance_insights):
|
|
140
|
+
self._observe("regenerate_offspring")
|
|
141
|
+
instr = self.directives.compose_regenerate_offspring(
|
|
142
|
+
self.context, failed_str, pareto_str, n, constraint_instruction, performance_insights)
|
|
143
|
+
return self._candidates("regenerate_offspring", instr)
|
|
144
|
+
|
|
145
|
+
def failure_insights(self, failed_str, n_failed):
|
|
146
|
+
self._observe("failure_insights")
|
|
147
|
+
instr = self.directives.compose_failure_insights(self.context, failed_str, n_failed)
|
|
148
|
+
return self._to_str_list(self._output(List[str], instr))
|
|
149
|
+
|
|
150
|
+
def constraint_instruction(self, failed_str, previous=None):
|
|
151
|
+
self._observe("constraint_instruction")
|
|
152
|
+
instr = self.directives.compose_constraint_instruction(self.context, failed_str, previous or "")
|
|
153
|
+
return str(self._output(str, instr)).strip()
|
|
154
|
+
|
|
155
|
+
def performance_insights(self, stats_str, pareto_str, previous=None):
|
|
156
|
+
self._observe("performance_insights")
|
|
157
|
+
instr = self.directives.compose_performance_insights(
|
|
158
|
+
self.context, stats_str, pareto_str, previous or "")
|
|
159
|
+
return str(self._output(str, instr)).strip()
|