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,306 @@
|
|
|
1
|
+
"""Workload-neutral execution for heterogeneous model portfolios.
|
|
2
|
+
|
|
3
|
+
Workload adapters own candidate semantics and evaluators. This module owns
|
|
4
|
+
only opaque model-lane identity, immutable execution profiles, and structured
|
|
5
|
+
request routing. It therefore permits one evolutionary campaign to populate
|
|
6
|
+
the same typed proposal market with multiple models without introducing
|
|
7
|
+
model-specific branches into an application service or workload adapter.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import asyncio
|
|
13
|
+
import hashlib
|
|
14
|
+
import json
|
|
15
|
+
import re
|
|
16
|
+
from collections.abc import Callable
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from typing import Any, Protocol
|
|
19
|
+
|
|
20
|
+
from agent_evolve.integrations.pydantic_ai.model_execution_profile import (
|
|
21
|
+
OpenRouterModelExecutionProfile,
|
|
22
|
+
)
|
|
23
|
+
from agent_evolve.ports.agentic_generator import AgenticCallTelemetry
|
|
24
|
+
|
|
25
|
+
_LANE_ID = re.compile(r"^[a-z][a-z0-9_]{0,63}$")
|
|
26
|
+
_PROFILE_ID = re.compile(r"^[a-z][a-z0-9_]{0,127}$")
|
|
27
|
+
_PROFILE_DOMAIN = b"agent-evolve:heterogeneous-model-profile:v1\x00"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _canonical_json(value: object) -> bytes:
|
|
31
|
+
return json.dumps(
|
|
32
|
+
value,
|
|
33
|
+
allow_nan=False,
|
|
34
|
+
ensure_ascii=True,
|
|
35
|
+
separators=(",", ":"),
|
|
36
|
+
sort_keys=True,
|
|
37
|
+
).encode("ascii", errors="strict")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True, slots=True)
|
|
41
|
+
class ModelLaneBinding:
|
|
42
|
+
"""Bind one opaque lane ID to one complete provider execution contract."""
|
|
43
|
+
|
|
44
|
+
lane_id: str
|
|
45
|
+
profile: OpenRouterModelExecutionProfile
|
|
46
|
+
|
|
47
|
+
def __post_init__(self) -> None:
|
|
48
|
+
if (
|
|
49
|
+
type(self.lane_id) is not str
|
|
50
|
+
or _LANE_ID.fullmatch(self.lane_id) is None
|
|
51
|
+
):
|
|
52
|
+
raise ValueError(
|
|
53
|
+
"lane_id must use the closed lowercase token grammar"
|
|
54
|
+
)
|
|
55
|
+
if type(self.profile) is not OpenRouterModelExecutionProfile:
|
|
56
|
+
raise TypeError("profile must be an exact execution profile")
|
|
57
|
+
self.profile.__post_init__()
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True, slots=True)
|
|
61
|
+
class HeterogeneousModelExecutionProfile:
|
|
62
|
+
"""Canonical, workload-free portfolio of independently queued models."""
|
|
63
|
+
|
|
64
|
+
profile_id: str
|
|
65
|
+
lanes: tuple[ModelLaneBinding, ...]
|
|
66
|
+
|
|
67
|
+
def __post_init__(self) -> None:
|
|
68
|
+
if (
|
|
69
|
+
type(self.profile_id) is not str
|
|
70
|
+
or _PROFILE_ID.fullmatch(self.profile_id) is None
|
|
71
|
+
):
|
|
72
|
+
raise ValueError(
|
|
73
|
+
"profile_id must use the closed lowercase token grammar"
|
|
74
|
+
)
|
|
75
|
+
if (
|
|
76
|
+
type(self.lanes) is not tuple
|
|
77
|
+
or len(self.lanes) < 2
|
|
78
|
+
or any(type(value) is not ModelLaneBinding for value in self.lanes)
|
|
79
|
+
):
|
|
80
|
+
raise TypeError(
|
|
81
|
+
"lanes must be an exact tuple with at least two bindings"
|
|
82
|
+
)
|
|
83
|
+
for lane in self.lanes:
|
|
84
|
+
lane.__post_init__()
|
|
85
|
+
lane_ids = tuple(value.lane_id for value in self.lanes)
|
|
86
|
+
if lane_ids != tuple(sorted(set(lane_ids))):
|
|
87
|
+
raise ValueError("model lanes must be unique and canonical")
|
|
88
|
+
models = tuple(
|
|
89
|
+
value.profile.requested_model for value in self.lanes
|
|
90
|
+
)
|
|
91
|
+
if len(models) != len(set(models)):
|
|
92
|
+
raise ValueError(
|
|
93
|
+
"each requested model must identify exactly one lane"
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
@property
|
|
97
|
+
def lane_ids(self) -> tuple[str, ...]:
|
|
98
|
+
self.__post_init__()
|
|
99
|
+
return tuple(value.lane_id for value in self.lanes)
|
|
100
|
+
|
|
101
|
+
def lane(self, lane_id: str) -> ModelLaneBinding:
|
|
102
|
+
self.__post_init__()
|
|
103
|
+
matches = tuple(
|
|
104
|
+
value for value in self.lanes if value.lane_id == lane_id
|
|
105
|
+
)
|
|
106
|
+
if len(matches) != 1:
|
|
107
|
+
raise KeyError(f"unknown model lane: {lane_id}")
|
|
108
|
+
return matches[0]
|
|
109
|
+
|
|
110
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
111
|
+
self.__post_init__()
|
|
112
|
+
return {
|
|
113
|
+
"schema_version": 1,
|
|
114
|
+
"profile_id": self.profile_id,
|
|
115
|
+
"lanes": [
|
|
116
|
+
{
|
|
117
|
+
"lane_id": value.lane_id,
|
|
118
|
+
"profile": value.profile.to_record(),
|
|
119
|
+
}
|
|
120
|
+
for value in self.lanes
|
|
121
|
+
],
|
|
122
|
+
"routing": "operation_suffix_then_repair_call_lineage",
|
|
123
|
+
"independent_provider_queues": True,
|
|
124
|
+
"workload_specific_fields": [],
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
@property
|
|
128
|
+
def profile_sha256(self) -> str:
|
|
129
|
+
return hashlib.sha256(
|
|
130
|
+
_PROFILE_DOMAIN + _canonical_json(self._unsigned_record())
|
|
131
|
+
).hexdigest()
|
|
132
|
+
|
|
133
|
+
def to_record(self) -> dict[str, object]:
|
|
134
|
+
record = self._unsigned_record()
|
|
135
|
+
record["profile_sha256"] = self.profile_sha256
|
|
136
|
+
return record
|
|
137
|
+
|
|
138
|
+
def validate_telemetry(
|
|
139
|
+
self,
|
|
140
|
+
telemetry: AgenticCallTelemetry,
|
|
141
|
+
) -> None:
|
|
142
|
+
"""Delegate terminal validation to the uniquely identified lane."""
|
|
143
|
+
|
|
144
|
+
self.__post_init__()
|
|
145
|
+
matches = tuple(
|
|
146
|
+
value.profile
|
|
147
|
+
for value in self.lanes
|
|
148
|
+
if telemetry.requested_model == value.profile.requested_model
|
|
149
|
+
)
|
|
150
|
+
if len(matches) != 1:
|
|
151
|
+
raise ValueError(
|
|
152
|
+
"telemetry does not identify exactly one model lane"
|
|
153
|
+
)
|
|
154
|
+
matches[0].validate_telemetry(telemetry)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
@dataclass(frozen=True, slots=True)
|
|
158
|
+
class HeterogeneousRunnerConfig:
|
|
159
|
+
"""The only shared state required to instantiate independent queues."""
|
|
160
|
+
|
|
161
|
+
seed: int
|
|
162
|
+
|
|
163
|
+
def __post_init__(self) -> None:
|
|
164
|
+
if type(self.seed) is not int or self.seed < 0:
|
|
165
|
+
raise ValueError("seed must be a non-negative exact integer")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
class StructuredRunnerPort(Protocol):
|
|
169
|
+
"""Minimum async surface required from a model-lane runner."""
|
|
170
|
+
|
|
171
|
+
async def __call__(self, request: Any) -> Any:
|
|
172
|
+
"""Execute one structured request."""
|
|
173
|
+
|
|
174
|
+
async def aclose(self) -> None:
|
|
175
|
+
"""Release runner resources."""
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
LaneRunnerFactory = Callable[
|
|
179
|
+
[ModelLaneBinding, int],
|
|
180
|
+
StructuredRunnerPort,
|
|
181
|
+
]
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class OperationSuffixDispatchingStructuredRunner:
|
|
185
|
+
"""Route calls by authenticated operation and repair-call lineage.
|
|
186
|
+
|
|
187
|
+
A proposal expert binds ``_<lane_id>`` to its operation. Repair calls
|
|
188
|
+
retain the originating call ID plus a configured suffix and are routed to
|
|
189
|
+
the same queue. No prompt, workload, objective, candidate, or provider
|
|
190
|
+
field is inspected.
|
|
191
|
+
"""
|
|
192
|
+
|
|
193
|
+
def __init__(
|
|
194
|
+
self,
|
|
195
|
+
*,
|
|
196
|
+
profile: HeterogeneousModelExecutionProfile,
|
|
197
|
+
runners: tuple[tuple[str, StructuredRunnerPort], ...],
|
|
198
|
+
repair_call_id_suffixes: tuple[str, ...] = ("_reground",),
|
|
199
|
+
) -> None:
|
|
200
|
+
profile.__post_init__()
|
|
201
|
+
if (
|
|
202
|
+
type(runners) is not tuple
|
|
203
|
+
or any(
|
|
204
|
+
type(value) is not tuple or len(value) != 2
|
|
205
|
+
for value in runners
|
|
206
|
+
)
|
|
207
|
+
):
|
|
208
|
+
raise TypeError("runners must be an exact tuple of lane pairs")
|
|
209
|
+
runner_ids = tuple(value[0] for value in runners)
|
|
210
|
+
if runner_ids != profile.lane_ids:
|
|
211
|
+
raise ValueError(
|
|
212
|
+
"runner lanes must exactly match the canonical profile"
|
|
213
|
+
)
|
|
214
|
+
if (
|
|
215
|
+
type(repair_call_id_suffixes) is not tuple
|
|
216
|
+
or not repair_call_id_suffixes
|
|
217
|
+
or any(
|
|
218
|
+
type(value) is not str
|
|
219
|
+
or not value.startswith("_")
|
|
220
|
+
or len(value) < 2
|
|
221
|
+
for value in repair_call_id_suffixes
|
|
222
|
+
)
|
|
223
|
+
or repair_call_id_suffixes
|
|
224
|
+
!= tuple(sorted(set(repair_call_id_suffixes)))
|
|
225
|
+
):
|
|
226
|
+
raise ValueError(
|
|
227
|
+
"repair suffixes must be a canonical non-empty tuple"
|
|
228
|
+
)
|
|
229
|
+
self._profile = profile
|
|
230
|
+
self._runners = dict(runners)
|
|
231
|
+
self._repair_call_id_suffixes = repair_call_id_suffixes
|
|
232
|
+
self._route_by_call_id: dict[str, str] = {}
|
|
233
|
+
|
|
234
|
+
def _route(self, request: Any) -> str:
|
|
235
|
+
operation = getattr(request, "operation", None)
|
|
236
|
+
call_id_value = getattr(getattr(request, "call_id", None), "value", None)
|
|
237
|
+
if type(operation) is not str or type(call_id_value) is not str:
|
|
238
|
+
raise TypeError(
|
|
239
|
+
"structured request must expose string operation and call ID"
|
|
240
|
+
)
|
|
241
|
+
direct = tuple(
|
|
242
|
+
lane_id
|
|
243
|
+
for lane_id in self._profile.lane_ids
|
|
244
|
+
if operation.endswith(f"_{lane_id}")
|
|
245
|
+
)
|
|
246
|
+
if len(direct) == 1:
|
|
247
|
+
route = direct[0]
|
|
248
|
+
self._route_by_call_id[call_id_value] = route
|
|
249
|
+
return route
|
|
250
|
+
for suffix in self._repair_call_id_suffixes:
|
|
251
|
+
if not call_id_value.endswith(suffix):
|
|
252
|
+
continue
|
|
253
|
+
source_call_id = call_id_value.removesuffix(suffix)
|
|
254
|
+
route = self._route_by_call_id.get(source_call_id)
|
|
255
|
+
if route is not None:
|
|
256
|
+
self._route_by_call_id[call_id_value] = route
|
|
257
|
+
return route
|
|
258
|
+
raise ValueError(
|
|
259
|
+
"structured request has no authenticated model-lane route"
|
|
260
|
+
)
|
|
261
|
+
|
|
262
|
+
async def __call__(self, request: Any) -> Any:
|
|
263
|
+
return await self._runners[self._route(request)](request)
|
|
264
|
+
|
|
265
|
+
async def aclose(self) -> None:
|
|
266
|
+
await asyncio.gather(
|
|
267
|
+
*(self._runners[value].aclose() for value in self._profile.lane_ids)
|
|
268
|
+
)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def compose_operation_suffix_dispatching_runner(
|
|
272
|
+
*,
|
|
273
|
+
profile: HeterogeneousModelExecutionProfile,
|
|
274
|
+
config: HeterogeneousRunnerConfig,
|
|
275
|
+
lane_runner_factory: LaneRunnerFactory,
|
|
276
|
+
repair_call_id_suffixes: tuple[str, ...] = ("_reground",),
|
|
277
|
+
) -> OperationSuffixDispatchingStructuredRunner:
|
|
278
|
+
"""Instantiate one independently configured queue per opaque model lane."""
|
|
279
|
+
|
|
280
|
+
profile.__post_init__()
|
|
281
|
+
config.__post_init__()
|
|
282
|
+
if not callable(lane_runner_factory):
|
|
283
|
+
raise TypeError("lane_runner_factory must be callable")
|
|
284
|
+
runners = tuple(
|
|
285
|
+
(
|
|
286
|
+
binding.lane_id,
|
|
287
|
+
lane_runner_factory(binding, config.seed + ordinal),
|
|
288
|
+
)
|
|
289
|
+
for ordinal, binding in enumerate(profile.lanes)
|
|
290
|
+
)
|
|
291
|
+
return OperationSuffixDispatchingStructuredRunner(
|
|
292
|
+
profile=profile,
|
|
293
|
+
runners=runners,
|
|
294
|
+
repair_call_id_suffixes=repair_call_id_suffixes,
|
|
295
|
+
)
|
|
296
|
+
|
|
297
|
+
|
|
298
|
+
__all__ = [
|
|
299
|
+
"HeterogeneousModelExecutionProfile",
|
|
300
|
+
"HeterogeneousRunnerConfig",
|
|
301
|
+
"LaneRunnerFactory",
|
|
302
|
+
"ModelLaneBinding",
|
|
303
|
+
"OperationSuffixDispatchingStructuredRunner",
|
|
304
|
+
"StructuredRunnerPort",
|
|
305
|
+
"compose_operation_suffix_dispatching_runner",
|
|
306
|
+
]
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"""Adaptive semantic cells from generic hierarchical-residual evidence."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import hashlib
|
|
6
|
+
import json
|
|
7
|
+
from dataclasses import dataclass, field
|
|
8
|
+
|
|
9
|
+
from agent_evolve.application.materialized_action_broker import (
|
|
10
|
+
MaterializedActionDescriptor,
|
|
11
|
+
)
|
|
12
|
+
from agent_evolve.application.outcome_adaptive_residual_portfolio_evolution import (
|
|
13
|
+
AdaptiveActionSemanticView,
|
|
14
|
+
)
|
|
15
|
+
from agent_evolve.domain.patch import require_sha256
|
|
16
|
+
from agent_evolve.integrations.pydantic_ai.materialized_hierarchical_residual_expert import (
|
|
17
|
+
MaterializedHierarchicalResidualActionEvidencePort,
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID = (
|
|
22
|
+
"hierarchical_residual_adaptive_semantic_view"
|
|
23
|
+
)
|
|
24
|
+
HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION = 1
|
|
25
|
+
_DEFINITION_DOMAIN = (
|
|
26
|
+
b"agent-evolve:hierarchical-residual-adaptive-semantic-view:v1\x00"
|
|
27
|
+
)
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def _canonical_json(value: object) -> bytes:
|
|
31
|
+
return json.dumps(
|
|
32
|
+
value,
|
|
33
|
+
allow_nan=False,
|
|
34
|
+
ensure_ascii=True,
|
|
35
|
+
separators=(",", ":"),
|
|
36
|
+
sort_keys=True,
|
|
37
|
+
).encode("ascii", errors="strict")
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass(frozen=True, slots=True)
|
|
41
|
+
class HierarchicalResidualAdaptiveSemanticView:
|
|
42
|
+
"""Hash portable component and forecast-direction claims into cells."""
|
|
43
|
+
|
|
44
|
+
evidence_sources: tuple[
|
|
45
|
+
MaterializedHierarchicalResidualActionEvidencePort,
|
|
46
|
+
...,
|
|
47
|
+
] = field(repr=False, compare=False)
|
|
48
|
+
projection_id: str = HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID
|
|
49
|
+
projection_version: int = (
|
|
50
|
+
HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION
|
|
51
|
+
)
|
|
52
|
+
definition_sha256: str = field(init=False)
|
|
53
|
+
|
|
54
|
+
def __post_init__(self) -> None:
|
|
55
|
+
if (
|
|
56
|
+
type(self.evidence_sources) is not tuple
|
|
57
|
+
or not self.evidence_sources
|
|
58
|
+
):
|
|
59
|
+
raise ValueError("evidence_sources must be non-empty")
|
|
60
|
+
identities: list[dict[str, object]] = []
|
|
61
|
+
for source in self.evidence_sources:
|
|
62
|
+
if not isinstance(
|
|
63
|
+
source,
|
|
64
|
+
MaterializedHierarchicalResidualActionEvidencePort,
|
|
65
|
+
):
|
|
66
|
+
raise TypeError("evidence source must implement its port")
|
|
67
|
+
expert_id = getattr(source, "expert_id", None)
|
|
68
|
+
expert_version = getattr(source, "expert_version", None)
|
|
69
|
+
definition_sha256 = getattr(
|
|
70
|
+
source,
|
|
71
|
+
"definition_sha256",
|
|
72
|
+
None,
|
|
73
|
+
)
|
|
74
|
+
if type(expert_id) is not str or not expert_id:
|
|
75
|
+
raise ValueError("evidence source expert_id is malformed")
|
|
76
|
+
if type(expert_version) is not int or expert_version <= 0:
|
|
77
|
+
raise ValueError("evidence source version is malformed")
|
|
78
|
+
require_sha256(
|
|
79
|
+
definition_sha256,
|
|
80
|
+
"evidence source definition",
|
|
81
|
+
)
|
|
82
|
+
identities.append(
|
|
83
|
+
{
|
|
84
|
+
"expert_id": expert_id,
|
|
85
|
+
"expert_version": expert_version,
|
|
86
|
+
"definition_sha256": definition_sha256,
|
|
87
|
+
}
|
|
88
|
+
)
|
|
89
|
+
if [value["expert_id"] for value in identities] != sorted(
|
|
90
|
+
{value["expert_id"] for value in identities}
|
|
91
|
+
):
|
|
92
|
+
raise ValueError(
|
|
93
|
+
"evidence sources must be unique and expert-canonical"
|
|
94
|
+
)
|
|
95
|
+
object.__setattr__(
|
|
96
|
+
self,
|
|
97
|
+
"definition_sha256",
|
|
98
|
+
hashlib.sha256(
|
|
99
|
+
_DEFINITION_DOMAIN
|
|
100
|
+
+ _canonical_json(
|
|
101
|
+
{
|
|
102
|
+
"schema_version": 1,
|
|
103
|
+
"projection_id": self.projection_id,
|
|
104
|
+
"projection_version": self.projection_version,
|
|
105
|
+
"evidence_sources": identities,
|
|
106
|
+
"operator_group": "component_count",
|
|
107
|
+
"semantic_cells": (
|
|
108
|
+
"hashed_component_identity_and_forecast_direction"
|
|
109
|
+
),
|
|
110
|
+
"candidate_outcomes_observed": False,
|
|
111
|
+
"workload_objective_model_provider_prompt_branches": (
|
|
112
|
+
False
|
|
113
|
+
),
|
|
114
|
+
}
|
|
115
|
+
)
|
|
116
|
+
).hexdigest(),
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def view(
|
|
120
|
+
self,
|
|
121
|
+
action: MaterializedActionDescriptor,
|
|
122
|
+
) -> AdaptiveActionSemanticView:
|
|
123
|
+
self.__post_init__()
|
|
124
|
+
if type(action) is not MaterializedActionDescriptor:
|
|
125
|
+
raise TypeError("action must be exact")
|
|
126
|
+
action.__post_init__()
|
|
127
|
+
matches = tuple(
|
|
128
|
+
value
|
|
129
|
+
for source in self.evidence_sources
|
|
130
|
+
if (
|
|
131
|
+
value := source.evidence_for(action.action_sha256)
|
|
132
|
+
)
|
|
133
|
+
is not None
|
|
134
|
+
)
|
|
135
|
+
if len(matches) != 1:
|
|
136
|
+
raise ValueError(
|
|
137
|
+
"one action must have exactly one semantic evidence row"
|
|
138
|
+
)
|
|
139
|
+
evidence = matches[0]
|
|
140
|
+
evidence.__post_init__()
|
|
141
|
+
cells = {
|
|
142
|
+
f"components:{len(evidence.plan.component_option_ids)}"
|
|
143
|
+
}
|
|
144
|
+
cells.update(
|
|
145
|
+
"component:"
|
|
146
|
+
+ hashlib.sha256(
|
|
147
|
+
value.encode("utf-8")
|
|
148
|
+
).hexdigest()[:16]
|
|
149
|
+
for value in evidence.plan.component_option_ids
|
|
150
|
+
)
|
|
151
|
+
cells.update(
|
|
152
|
+
"direction:"
|
|
153
|
+
+ hashlib.sha256(
|
|
154
|
+
(
|
|
155
|
+
f"{value.metric_id}:"
|
|
156
|
+
+ (
|
|
157
|
+
"increase"
|
|
158
|
+
if value.p50_delta > 0.0
|
|
159
|
+
else "decrease"
|
|
160
|
+
if value.p50_delta < 0.0
|
|
161
|
+
else "unchanged"
|
|
162
|
+
)
|
|
163
|
+
).encode("utf-8")
|
|
164
|
+
).hexdigest()[:16]
|
|
165
|
+
for value in evidence.effect_predictions
|
|
166
|
+
)
|
|
167
|
+
return AdaptiveActionSemanticView(
|
|
168
|
+
operator_id=(
|
|
169
|
+
f"components:{len(evidence.plan.component_option_ids)}"
|
|
170
|
+
),
|
|
171
|
+
semantic_cell_ids=tuple(sorted(cells)),
|
|
172
|
+
)
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
__all__ = [
|
|
176
|
+
"HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID",
|
|
177
|
+
"HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION",
|
|
178
|
+
"HierarchicalResidualAdaptiveSemanticView",
|
|
179
|
+
]
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"""Model-route-owned JSON-schema compatibility transformations.
|
|
2
|
+
|
|
3
|
+
Provider-native structured output APIs do not all implement the same JSON
|
|
4
|
+
Schema vocabulary. These transformations affect only the schema sent on the
|
|
5
|
+
wire; AgentEvolve still validates the returned object against the original
|
|
6
|
+
Pydantic type, so semantic and validation constraints remain authoritative.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
from enum import Enum
|
|
12
|
+
from typing import Any
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class OpenRouterJsonSchemaDialect(str, Enum):
|
|
16
|
+
"""Closed wire-schema dialect selected by a model execution profile."""
|
|
17
|
+
|
|
18
|
+
PROVIDER_DEFAULT = "provider_default"
|
|
19
|
+
ALIBABA_NATIVE_V1 = "alibaba_native_v1"
|
|
20
|
+
OPENAI_STRICT_BOUNDED_TEXT_V1 = "openai_strict_bounded_text_v1"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def json_schema_transformer_for_dialect(
|
|
24
|
+
base_transformer: type[Any],
|
|
25
|
+
dialect: OpenRouterJsonSchemaDialect,
|
|
26
|
+
) -> type[Any]:
|
|
27
|
+
"""Compose a provider dialect over Pydantic-AI's model transformer.
|
|
28
|
+
|
|
29
|
+
Alibaba's native JSON-schema endpoint currently rejects the standard
|
|
30
|
+
``uniqueItems`` array keyword. Dropping it is safe here because the
|
|
31
|
+
request's original Pydantic output type performs the uniqueness check
|
|
32
|
+
after decoding. The inherited transformer continues to own every other
|
|
33
|
+
model-profile transformation, including definition inlining.
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
if not isinstance(base_transformer, type):
|
|
37
|
+
raise TypeError("base_transformer must be a class")
|
|
38
|
+
if type(dialect) is not OpenRouterJsonSchemaDialect:
|
|
39
|
+
raise TypeError("dialect must be an exact OpenRouterJsonSchemaDialect")
|
|
40
|
+
if dialect is OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT:
|
|
41
|
+
return base_transformer
|
|
42
|
+
|
|
43
|
+
if dialect is OpenRouterJsonSchemaDialect.OPENAI_STRICT_BOUNDED_TEXT_V1:
|
|
44
|
+
|
|
45
|
+
class OpenAIStrictBoundedTextJsonSchemaTransformer(base_transformer):
|
|
46
|
+
"""Encode unsupported string-length bounds in an allowed pattern.
|
|
47
|
+
|
|
48
|
+
Pydantic-AI's OpenAI strict transformer correctly removes
|
|
49
|
+
``minLength`` and ``maxLength`` because OpenAI's strict subset does
|
|
50
|
+
not accept those keywords. A bounded anchored pattern retains the
|
|
51
|
+
same generation constraint for unconstrained free-text fields.
|
|
52
|
+
Fields that already own a semantic pattern are left unchanged;
|
|
53
|
+
local Pydantic validation remains authoritative in every case.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def transform(self, schema: Any) -> Any:
|
|
57
|
+
if (
|
|
58
|
+
isinstance(schema, dict)
|
|
59
|
+
and self.strict is True
|
|
60
|
+
and schema.get("type") == "string"
|
|
61
|
+
and "pattern" not in schema
|
|
62
|
+
):
|
|
63
|
+
minimum = schema.get("minLength", 0)
|
|
64
|
+
maximum = schema.get("maxLength")
|
|
65
|
+
if (
|
|
66
|
+
type(minimum) is int
|
|
67
|
+
and minimum >= 0
|
|
68
|
+
and type(maximum) is int
|
|
69
|
+
and minimum <= maximum <= 65_536
|
|
70
|
+
):
|
|
71
|
+
schema = dict(schema)
|
|
72
|
+
# Newlines are not useful in AgentEvolve's bounded
|
|
73
|
+
# rationale/insight atoms and avoiding DOTALL-specific
|
|
74
|
+
# constructs keeps the provider grammar portable.
|
|
75
|
+
schema["pattern"] = f"^.{{{minimum},{maximum}}}$"
|
|
76
|
+
return super().transform(schema)
|
|
77
|
+
|
|
78
|
+
OpenAIStrictBoundedTextJsonSchemaTransformer.__name__ = (
|
|
79
|
+
"OpenAIStrictBoundedTextJsonSchemaTransformer"
|
|
80
|
+
)
|
|
81
|
+
OpenAIStrictBoundedTextJsonSchemaTransformer.__qualname__ = (
|
|
82
|
+
"OpenAIStrictBoundedTextJsonSchemaTransformer"
|
|
83
|
+
)
|
|
84
|
+
OpenAIStrictBoundedTextJsonSchemaTransformer.__module__ = __name__
|
|
85
|
+
return OpenAIStrictBoundedTextJsonSchemaTransformer
|
|
86
|
+
|
|
87
|
+
class AlibabaNativeJsonSchemaTransformer(base_transformer):
|
|
88
|
+
def transform(self, schema: Any) -> Any:
|
|
89
|
+
transformed = super().transform(schema)
|
|
90
|
+
if isinstance(transformed, dict) and "uniqueItems" in transformed:
|
|
91
|
+
transformed = dict(transformed)
|
|
92
|
+
transformed.pop("uniqueItems")
|
|
93
|
+
return transformed
|
|
94
|
+
|
|
95
|
+
AlibabaNativeJsonSchemaTransformer.__name__ = (
|
|
96
|
+
"AlibabaNativeJsonSchemaTransformer"
|
|
97
|
+
)
|
|
98
|
+
AlibabaNativeJsonSchemaTransformer.__qualname__ = (
|
|
99
|
+
"AlibabaNativeJsonSchemaTransformer"
|
|
100
|
+
)
|
|
101
|
+
AlibabaNativeJsonSchemaTransformer.__module__ = __name__
|
|
102
|
+
return AlibabaNativeJsonSchemaTransformer
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
__all__ = [
|
|
106
|
+
"OpenRouterJsonSchemaDialect",
|
|
107
|
+
"json_schema_transformer_for_dialect",
|
|
108
|
+
]
|