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,659 @@
|
|
|
1
|
+
"""Authenticated, workload-neutral OpenRouter model execution profiles.
|
|
2
|
+
|
|
3
|
+
Workload adapters describe candidates and evaluators. They must not decide
|
|
4
|
+
provider routing, reasoning controls, output ceilings, or terminal telemetry
|
|
5
|
+
requirements. This module keeps those model-facing choices in one immutable
|
|
6
|
+
composition object that can be injected into any AgentEvolve campaign.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import hashlib
|
|
12
|
+
import json
|
|
13
|
+
import math
|
|
14
|
+
import re
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
|
|
17
|
+
from agent_evolve.integrations.pydantic_ai.async_generator import (
|
|
18
|
+
OpenRouterReasoningConfig,
|
|
19
|
+
OpenRouterStructuredOutputMode,
|
|
20
|
+
)
|
|
21
|
+
from agent_evolve.integrations.pydantic_ai.json_schema_dialect import (
|
|
22
|
+
OpenRouterJsonSchemaDialect,
|
|
23
|
+
)
|
|
24
|
+
from agent_evolve.ports.agentic_generator import AgenticCallTelemetry
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
_TOKEN = re.compile(r"^[a-z][a-z0-9_]{0,63}$")
|
|
28
|
+
_MODEL = re.compile(r"^[a-z0-9][a-z0-9_.-]*/[A-Za-z0-9][A-Za-z0-9_.-]*$")
|
|
29
|
+
_PROVIDER_SLUG = re.compile(r"^[a-z0-9][a-z0-9_-]{0,63}$")
|
|
30
|
+
_PROFILE_DOMAIN = b"agent-evolve:openrouter-model-execution-profile:v1\x00"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _canonical_json(value: object) -> bytes:
|
|
34
|
+
return json.dumps(
|
|
35
|
+
value,
|
|
36
|
+
allow_nan=False,
|
|
37
|
+
ensure_ascii=True,
|
|
38
|
+
separators=(",", ":"),
|
|
39
|
+
sort_keys=True,
|
|
40
|
+
).encode("ascii", errors="strict")
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _canonical_strings(
|
|
44
|
+
values: tuple[str, ...],
|
|
45
|
+
*,
|
|
46
|
+
name: str,
|
|
47
|
+
pattern: re.Pattern[str] | None = None,
|
|
48
|
+
) -> None:
|
|
49
|
+
if type(values) is not tuple or not values or any(
|
|
50
|
+
type(value) is not str
|
|
51
|
+
or not value
|
|
52
|
+
or (pattern is not None and pattern.fullmatch(value) is None)
|
|
53
|
+
for value in values
|
|
54
|
+
):
|
|
55
|
+
raise TypeError(f"{name} must be a non-empty exact string tuple")
|
|
56
|
+
if values != tuple(sorted(set(values))):
|
|
57
|
+
raise ValueError(f"{name} must be unique and canonical")
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass(frozen=True, slots=True, eq=False)
|
|
61
|
+
class OpenRouterModelExecutionProfile:
|
|
62
|
+
"""One complete model/provider contract independent of any workload."""
|
|
63
|
+
|
|
64
|
+
profile_id: str
|
|
65
|
+
profile_version: int
|
|
66
|
+
requested_model: str
|
|
67
|
+
accepted_resolved_models: tuple[str, ...]
|
|
68
|
+
provider_only: tuple[str, ...]
|
|
69
|
+
accepted_resolved_providers: tuple[str, ...]
|
|
70
|
+
max_output_tokens: int
|
|
71
|
+
reasoning_effort: str | None
|
|
72
|
+
temperature: float | None
|
|
73
|
+
structured_output_mode: OpenRouterStructuredOutputMode = (
|
|
74
|
+
OpenRouterStructuredOutputMode.TOOL
|
|
75
|
+
)
|
|
76
|
+
structured_output_strict: bool = False
|
|
77
|
+
json_schema_dialect: OpenRouterJsonSchemaDialect = (
|
|
78
|
+
OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT
|
|
79
|
+
)
|
|
80
|
+
require_positive_reasoning_tokens: bool = True
|
|
81
|
+
provider_require_parameters: bool = True
|
|
82
|
+
supports_forced_tool_choice: bool = True
|
|
83
|
+
route_concurrency_cap: int | None = None
|
|
84
|
+
rate_limit_backoff_floor_ns: int = 0
|
|
85
|
+
|
|
86
|
+
def __post_init__(self) -> None:
|
|
87
|
+
if type(self.profile_id) is not str or _TOKEN.fullmatch(self.profile_id) is None:
|
|
88
|
+
raise ValueError("profile_id must use the closed lowercase token grammar")
|
|
89
|
+
if type(self.profile_version) is not int or self.profile_version <= 0:
|
|
90
|
+
raise ValueError("profile_version must be a positive exact integer")
|
|
91
|
+
if (
|
|
92
|
+
type(self.requested_model) is not str
|
|
93
|
+
or _MODEL.fullmatch(self.requested_model) is None
|
|
94
|
+
):
|
|
95
|
+
raise ValueError("requested_model must be an OpenRouter model slug")
|
|
96
|
+
_canonical_strings(
|
|
97
|
+
self.accepted_resolved_models,
|
|
98
|
+
name="accepted_resolved_models",
|
|
99
|
+
pattern=_MODEL,
|
|
100
|
+
)
|
|
101
|
+
if self.requested_model not in self.accepted_resolved_models:
|
|
102
|
+
raise ValueError("requested_model must be an accepted resolved model")
|
|
103
|
+
_canonical_strings(
|
|
104
|
+
self.provider_only,
|
|
105
|
+
name="provider_only",
|
|
106
|
+
pattern=_PROVIDER_SLUG,
|
|
107
|
+
)
|
|
108
|
+
_canonical_strings(
|
|
109
|
+
self.accepted_resolved_providers,
|
|
110
|
+
name="accepted_resolved_providers",
|
|
111
|
+
)
|
|
112
|
+
if type(self.max_output_tokens) is not int or self.max_output_tokens <= 0:
|
|
113
|
+
raise ValueError("max_output_tokens must be a positive exact integer")
|
|
114
|
+
if self.reasoning_effort is not None:
|
|
115
|
+
if type(self.reasoning_effort) is not str:
|
|
116
|
+
raise TypeError("reasoning_effort must be an exact string or None")
|
|
117
|
+
OpenRouterReasoningConfig(effort=self.reasoning_effort).__post_init__()
|
|
118
|
+
if self.temperature is not None and (
|
|
119
|
+
type(self.temperature) is not float
|
|
120
|
+
or not math.isfinite(self.temperature)
|
|
121
|
+
or not 0.0 <= self.temperature <= 2.0
|
|
122
|
+
):
|
|
123
|
+
raise ValueError("temperature must be None or a finite float in [0,2]")
|
|
124
|
+
if type(self.structured_output_mode) is not OpenRouterStructuredOutputMode:
|
|
125
|
+
raise TypeError(
|
|
126
|
+
"structured_output_mode must be an exact "
|
|
127
|
+
"OpenRouterStructuredOutputMode"
|
|
128
|
+
)
|
|
129
|
+
if type(self.structured_output_strict) is not bool:
|
|
130
|
+
raise TypeError("structured_output_strict must be an exact bool")
|
|
131
|
+
if type(self.json_schema_dialect) is not OpenRouterJsonSchemaDialect:
|
|
132
|
+
raise TypeError(
|
|
133
|
+
"json_schema_dialect must be an exact "
|
|
134
|
+
"OpenRouterJsonSchemaDialect"
|
|
135
|
+
)
|
|
136
|
+
if type(self.require_positive_reasoning_tokens) is not bool:
|
|
137
|
+
raise TypeError("require_positive_reasoning_tokens must be exact bool")
|
|
138
|
+
if self.reasoning_effort is None and self.require_positive_reasoning_tokens:
|
|
139
|
+
raise ValueError(
|
|
140
|
+
"a non-reasoning profile cannot require positive reasoning tokens"
|
|
141
|
+
)
|
|
142
|
+
if type(self.provider_require_parameters) is not bool:
|
|
143
|
+
raise TypeError("provider_require_parameters must be exact bool")
|
|
144
|
+
if type(self.supports_forced_tool_choice) is not bool:
|
|
145
|
+
raise TypeError("supports_forced_tool_choice must be exact bool")
|
|
146
|
+
if self.route_concurrency_cap is not None and (
|
|
147
|
+
type(self.route_concurrency_cap) is not int
|
|
148
|
+
or self.route_concurrency_cap <= 0
|
|
149
|
+
):
|
|
150
|
+
raise ValueError(
|
|
151
|
+
"route_concurrency_cap must be a positive exact integer or None"
|
|
152
|
+
)
|
|
153
|
+
if (
|
|
154
|
+
type(self.rate_limit_backoff_floor_ns) is not int
|
|
155
|
+
or self.rate_limit_backoff_floor_ns < 0
|
|
156
|
+
):
|
|
157
|
+
raise ValueError(
|
|
158
|
+
"rate_limit_backoff_floor_ns must be a non-negative exact integer"
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def reasoning_config(self) -> OpenRouterReasoningConfig | None:
|
|
163
|
+
self.__post_init__()
|
|
164
|
+
if self.reasoning_effort is None:
|
|
165
|
+
return None
|
|
166
|
+
return OpenRouterReasoningConfig(effort=self.reasoning_effort)
|
|
167
|
+
|
|
168
|
+
@property
|
|
169
|
+
def outbound_reasoning_setting(self) -> dict[str, object] | None:
|
|
170
|
+
"""Return the exact OpenRouter reasoning field expected on the wire."""
|
|
171
|
+
|
|
172
|
+
config = self.reasoning_config
|
|
173
|
+
return None if config is None else config.to_model_setting()
|
|
174
|
+
|
|
175
|
+
def accepts_reasoning_tokens(self, value: object) -> bool:
|
|
176
|
+
"""Validate telemetry without assuming that every model reasons."""
|
|
177
|
+
|
|
178
|
+
self.__post_init__()
|
|
179
|
+
return type(value) is int and (
|
|
180
|
+
value > 0 if self.require_positive_reasoning_tokens else value >= 0
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
def effective_max_connections(self, *, default: int) -> int:
|
|
184
|
+
"""Resolve the authenticated route cap against a composition default."""
|
|
185
|
+
|
|
186
|
+
self.__post_init__()
|
|
187
|
+
if type(default) is not int or default <= 0:
|
|
188
|
+
raise ValueError("default must be a positive exact integer")
|
|
189
|
+
return (
|
|
190
|
+
default
|
|
191
|
+
if self.route_concurrency_cap is None
|
|
192
|
+
else min(default, self.route_concurrency_cap)
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
@property
|
|
196
|
+
def accepted_finish_reasons(self) -> tuple[str, ...]:
|
|
197
|
+
"""Return the closed terminal-reason contract for the wire mode."""
|
|
198
|
+
|
|
199
|
+
self.__post_init__()
|
|
200
|
+
if self.structured_output_mode is OpenRouterStructuredOutputMode.TOOL:
|
|
201
|
+
return ("tool_call",)
|
|
202
|
+
if (
|
|
203
|
+
self.structured_output_mode
|
|
204
|
+
is OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
205
|
+
):
|
|
206
|
+
return ("stop",)
|
|
207
|
+
raise AssertionError("unreachable structured output mode")
|
|
208
|
+
|
|
209
|
+
def _unsigned_record(self) -> dict[str, object]:
|
|
210
|
+
self.__post_init__()
|
|
211
|
+
record: dict[str, object] = {
|
|
212
|
+
"schema_version": 2,
|
|
213
|
+
"profile_id": self.profile_id,
|
|
214
|
+
"profile_version": self.profile_version,
|
|
215
|
+
"requested_model": self.requested_model,
|
|
216
|
+
"accepted_resolved_models": list(self.accepted_resolved_models),
|
|
217
|
+
"provider_options": {
|
|
218
|
+
"only": list(self.provider_only),
|
|
219
|
+
"allow_fallbacks": False,
|
|
220
|
+
"require_parameters": self.provider_require_parameters,
|
|
221
|
+
},
|
|
222
|
+
"accepted_resolved_providers": list(
|
|
223
|
+
self.accepted_resolved_providers
|
|
224
|
+
),
|
|
225
|
+
"max_output_tokens": self.max_output_tokens,
|
|
226
|
+
"reasoning": self.outbound_reasoning_setting,
|
|
227
|
+
"structured_output_mode": self.structured_output_mode.value,
|
|
228
|
+
"structured_output_strict": self.structured_output_strict,
|
|
229
|
+
"json_schema_dialect": self.json_schema_dialect.value,
|
|
230
|
+
"supports_forced_tool_choice": self.supports_forced_tool_choice,
|
|
231
|
+
"temperature_hex": (
|
|
232
|
+
None if self.temperature is None else self.temperature.hex()
|
|
233
|
+
),
|
|
234
|
+
"terminal_telemetry": {
|
|
235
|
+
"requested_model_exact": True,
|
|
236
|
+
"resolved_model_allowlist": True,
|
|
237
|
+
"resolved_provider_allowlist": True,
|
|
238
|
+
"accepted_finish_reasons": list(self.accepted_finish_reasons),
|
|
239
|
+
"positive_reasoning_tokens_required": (
|
|
240
|
+
self.require_positive_reasoning_tokens
|
|
241
|
+
),
|
|
242
|
+
},
|
|
243
|
+
"workload_specific_fields": [],
|
|
244
|
+
}
|
|
245
|
+
if self.route_concurrency_cap is not None:
|
|
246
|
+
record["schema_version"] = 3
|
|
247
|
+
record["route_concurrency_cap"] = self.route_concurrency_cap
|
|
248
|
+
if self.rate_limit_backoff_floor_ns:
|
|
249
|
+
record["schema_version"] = 4
|
|
250
|
+
record["rate_limit_backoff_floor_ns"] = (
|
|
251
|
+
self.rate_limit_backoff_floor_ns
|
|
252
|
+
)
|
|
253
|
+
return record
|
|
254
|
+
|
|
255
|
+
@property
|
|
256
|
+
def profile_sha256(self) -> str:
|
|
257
|
+
return hashlib.sha256(
|
|
258
|
+
_PROFILE_DOMAIN + _canonical_json(self._unsigned_record())
|
|
259
|
+
).hexdigest()
|
|
260
|
+
|
|
261
|
+
def to_record(self) -> dict[str, object]:
|
|
262
|
+
return {**self._unsigned_record(), "profile_sha256": self.profile_sha256}
|
|
263
|
+
|
|
264
|
+
def validate_telemetry(self, telemetry: AgenticCallTelemetry) -> None:
|
|
265
|
+
"""Fail closed when a terminal response escapes the frozen route."""
|
|
266
|
+
|
|
267
|
+
self.__post_init__()
|
|
268
|
+
if type(telemetry) is not AgenticCallTelemetry:
|
|
269
|
+
raise TypeError("telemetry must be exact AgenticCallTelemetry")
|
|
270
|
+
AgenticCallTelemetry.__post_init__(telemetry)
|
|
271
|
+
if telemetry.requested_model != self.requested_model:
|
|
272
|
+
raise ValueError("terminal telemetry has a foreign requested model")
|
|
273
|
+
if telemetry.resolved_model not in self.accepted_resolved_models:
|
|
274
|
+
raise ValueError("terminal telemetry has a foreign resolved model")
|
|
275
|
+
if telemetry.resolved_provider not in self.accepted_resolved_providers:
|
|
276
|
+
raise ValueError("terminal telemetry has a foreign resolved provider")
|
|
277
|
+
if telemetry.finish_reason not in self.accepted_finish_reasons:
|
|
278
|
+
raise ValueError("terminal telemetry has a foreign finish reason")
|
|
279
|
+
if not self.accepts_reasoning_tokens(telemetry.reasoning_tokens):
|
|
280
|
+
raise ValueError("terminal telemetry violates the reasoning-token contract")
|
|
281
|
+
|
|
282
|
+
def __eq__(self, other: object) -> bool:
|
|
283
|
+
return (
|
|
284
|
+
type(other) is OpenRouterModelExecutionProfile
|
|
285
|
+
and self.profile_sha256 == other.profile_sha256
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
__hash__ = None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH = OpenRouterModelExecutionProfile(
|
|
292
|
+
profile_id="deepseek_v4_pro_streamlake_xhigh",
|
|
293
|
+
profile_version=2,
|
|
294
|
+
requested_model="deepseek/deepseek-v4-pro",
|
|
295
|
+
accepted_resolved_models=("deepseek/deepseek-v4-pro",),
|
|
296
|
+
provider_only=("streamlake",),
|
|
297
|
+
accepted_resolved_providers=("StreamLake",),
|
|
298
|
+
max_output_tokens=384_000,
|
|
299
|
+
reasoning_effort="xhigh",
|
|
300
|
+
temperature=0.2,
|
|
301
|
+
# StreamLake intermittently rejects ``tool_choice=required`` when xhigh
|
|
302
|
+
# thinking is active. The one-tool AgentEvolve contract remains closed,
|
|
303
|
+
# while Pydantic-AI emits ``auto`` and the semantic prompt requires that
|
|
304
|
+
# sole output tool. Terminal typed validation is unchanged.
|
|
305
|
+
supports_forced_tool_choice=False,
|
|
306
|
+
provider_require_parameters=False,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
|
|
310
|
+
# Prospective transport repair for providers that cannot reliably combine
|
|
311
|
+
# long reasoning with a forced output tool. Keep the legacy tool profile
|
|
312
|
+
# addressable so completed studies remain replayable; promotion of this
|
|
313
|
+
# response-format variant requires its own canary and registry identity.
|
|
314
|
+
DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH_NATIVE_JSON = OpenRouterModelExecutionProfile(
|
|
315
|
+
profile_id="deepseek_v4_pro_streamlake_xhigh_native_json",
|
|
316
|
+
profile_version=1,
|
|
317
|
+
requested_model="deepseek/deepseek-v4-pro",
|
|
318
|
+
accepted_resolved_models=("deepseek/deepseek-v4-pro",),
|
|
319
|
+
provider_only=("streamlake",),
|
|
320
|
+
accepted_resolved_providers=("StreamLake",),
|
|
321
|
+
max_output_tokens=384_000,
|
|
322
|
+
reasoning_effort="xhigh",
|
|
323
|
+
temperature=0.2,
|
|
324
|
+
structured_output_mode=(
|
|
325
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
326
|
+
),
|
|
327
|
+
structured_output_strict=False,
|
|
328
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT,
|
|
329
|
+
provider_require_parameters=False,
|
|
330
|
+
supports_forced_tool_choice=False,
|
|
331
|
+
)
|
|
332
|
+
|
|
333
|
+
|
|
334
|
+
QWEN_3_7_MAX_ALIBABA_XHIGH = OpenRouterModelExecutionProfile(
|
|
335
|
+
profile_id="qwen_3_7_max_alibaba_xhigh",
|
|
336
|
+
profile_version=2,
|
|
337
|
+
requested_model="qwen/qwen3.7-max",
|
|
338
|
+
accepted_resolved_models=("qwen/qwen3.7-max",),
|
|
339
|
+
provider_only=("alibaba",),
|
|
340
|
+
accepted_resolved_providers=("Alibaba",),
|
|
341
|
+
max_output_tokens=65_536,
|
|
342
|
+
reasoning_effort="xhigh",
|
|
343
|
+
temperature=0.2,
|
|
344
|
+
structured_output_mode=(
|
|
345
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
346
|
+
),
|
|
347
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.ALIBABA_NATIVE_V1,
|
|
348
|
+
# Alibaba advertises ``max_tokens`` while Pydantic-AI's OpenAI-compatible
|
|
349
|
+
# transport serializes ``max_completion_tokens``. OpenRouter can bridge
|
|
350
|
+
# that spelling only when its capability prefilter is disabled. Routing
|
|
351
|
+
# remains Alibaba-only with fallbacks forbidden, and AgentEvolve still
|
|
352
|
+
# authenticates the exact wire budget and validates the typed response.
|
|
353
|
+
provider_require_parameters=False,
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
|
|
357
|
+
# Prospective provider-systems repair after an otherwise healthy Qwen/BOiLS
|
|
358
|
+
# campaign launched reflection plus two selectors concurrently. Alibaba
|
|
359
|
+
# accepted the earlier two-selector wave but returned repeated HTTP 429s for
|
|
360
|
+
# the three-call wave. The model, provider, reasoning, schema, temperature,
|
|
361
|
+
# and completion budget remain identical. This explicit variant caps the
|
|
362
|
+
# route at the highest observed healthy concurrency and prevents full jitter
|
|
363
|
+
# from reducing an admitted rate-limit retry to a sub-second delay.
|
|
364
|
+
QWEN_3_7_MAX_ALIBABA_XHIGH_RATE_SAFE = OpenRouterModelExecutionProfile(
|
|
365
|
+
profile_id="qwen_3_7_max_alibaba_xhigh_rate_safe",
|
|
366
|
+
profile_version=1,
|
|
367
|
+
requested_model="qwen/qwen3.7-max",
|
|
368
|
+
accepted_resolved_models=("qwen/qwen3.7-max",),
|
|
369
|
+
provider_only=("alibaba",),
|
|
370
|
+
accepted_resolved_providers=("Alibaba",),
|
|
371
|
+
max_output_tokens=65_536,
|
|
372
|
+
reasoning_effort="xhigh",
|
|
373
|
+
temperature=0.2,
|
|
374
|
+
structured_output_mode=(
|
|
375
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
376
|
+
),
|
|
377
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.ALIBABA_NATIVE_V1,
|
|
378
|
+
provider_require_parameters=False,
|
|
379
|
+
route_concurrency_cap=2,
|
|
380
|
+
rate_limit_backoff_floor_ns=15_000_000_000,
|
|
381
|
+
)
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
MISTRAL_LARGE_3_MISTRAL = OpenRouterModelExecutionProfile(
|
|
385
|
+
profile_id="mistral_large_3_mistral",
|
|
386
|
+
profile_version=3,
|
|
387
|
+
requested_model="mistralai/mistral-large-2512",
|
|
388
|
+
accepted_resolved_models=("mistralai/mistral-large-2512",),
|
|
389
|
+
provider_only=("mistral",),
|
|
390
|
+
accepted_resolved_providers=("Mistral",),
|
|
391
|
+
max_output_tokens=131_072,
|
|
392
|
+
reasoning_effort=None,
|
|
393
|
+
temperature=0.2,
|
|
394
|
+
structured_output_mode=(
|
|
395
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
396
|
+
),
|
|
397
|
+
structured_output_strict=True,
|
|
398
|
+
require_positive_reasoning_tokens=False,
|
|
399
|
+
# Mistral advertises ``max_tokens`` while the maintained OpenAI-compatible
|
|
400
|
+
# transport emits ``max_completion_tokens``. Keep the sole Mistral route
|
|
401
|
+
# pinned and fallbacks forbidden while allowing OpenRouter's field bridge.
|
|
402
|
+
provider_require_parameters=False,
|
|
403
|
+
)
|
|
404
|
+
|
|
405
|
+
|
|
406
|
+
GPT_5_6_SOL_OPENAI_XHIGH = OpenRouterModelExecutionProfile(
|
|
407
|
+
profile_id="gpt_5_6_sol_openai_xhigh",
|
|
408
|
+
profile_version=2,
|
|
409
|
+
requested_model="openai/gpt-5.6-sol",
|
|
410
|
+
accepted_resolved_models=(
|
|
411
|
+
"openai/gpt-5.6-sol",
|
|
412
|
+
"openai/gpt-5.6-sol-20260709",
|
|
413
|
+
),
|
|
414
|
+
provider_only=("openai",),
|
|
415
|
+
accepted_resolved_providers=("OpenAI",),
|
|
416
|
+
max_output_tokens=128_000,
|
|
417
|
+
reasoning_effort="xhigh",
|
|
418
|
+
# The pinned first-party endpoint does not advertise temperature.
|
|
419
|
+
temperature=None,
|
|
420
|
+
structured_output_mode=(
|
|
421
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
422
|
+
),
|
|
423
|
+
structured_output_strict=True,
|
|
424
|
+
json_schema_dialect=(
|
|
425
|
+
OpenRouterJsonSchemaDialect.OPENAI_STRICT_BOUNDED_TEXT_V1
|
|
426
|
+
),
|
|
427
|
+
# The endpoint advertises ``max_tokens`` while the maintained transport
|
|
428
|
+
# emits ``max_completion_tokens``. Routing is still pinned to OpenAI with
|
|
429
|
+
# fallbacks forbidden; this only permits OpenRouter's spelling bridge.
|
|
430
|
+
provider_require_parameters=False,
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
|
|
434
|
+
GPT_5_6_LUNA_OPENAI_XHIGH = OpenRouterModelExecutionProfile(
|
|
435
|
+
profile_id="gpt_5_6_luna_openai_xhigh",
|
|
436
|
+
profile_version=1,
|
|
437
|
+
requested_model="openai/gpt-5.6-luna",
|
|
438
|
+
accepted_resolved_models=("openai/gpt-5.6-luna",),
|
|
439
|
+
provider_only=("openai",),
|
|
440
|
+
accepted_resolved_providers=("OpenAI",),
|
|
441
|
+
max_output_tokens=128_000,
|
|
442
|
+
reasoning_effort="xhigh",
|
|
443
|
+
# The pinned first-party endpoint does not advertise temperature.
|
|
444
|
+
temperature=None,
|
|
445
|
+
structured_output_mode=(
|
|
446
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
447
|
+
),
|
|
448
|
+
structured_output_strict=True,
|
|
449
|
+
json_schema_dialect=(
|
|
450
|
+
OpenRouterJsonSchemaDialect.OPENAI_STRICT_BOUNDED_TEXT_V1
|
|
451
|
+
),
|
|
452
|
+
# Same OpenRouter spelling bridge as the sibling OpenAI route: the endpoint
|
|
453
|
+
# advertises ``max_tokens`` while the maintained transport emits
|
|
454
|
+
# ``max_completion_tokens``. Routing stays pinned to OpenAI, fallbacks
|
|
455
|
+
# forbidden.
|
|
456
|
+
provider_require_parameters=False,
|
|
457
|
+
)
|
|
458
|
+
|
|
459
|
+
|
|
460
|
+
# The third tier of the same OpenAI family, and the one the model ladder was
|
|
461
|
+
# missing. Without a profile here `declared_max_output_tokens` returns None for
|
|
462
|
+
# the terra route, so nothing is sent, so the route runs at the provider's
|
|
463
|
+
# undeclared default (~65,536) while its luna and sol siblings run at 128,000 --
|
|
464
|
+
# a silent per-tier ceiling that truncates exactly the longest replies and would
|
|
465
|
+
# have selected against terra at high effort, manufacturing non-monotonicity out
|
|
466
|
+
# of a transport gap. Provenance: OpenRouter model catalog,
|
|
467
|
+
# `top_provider.max_completion_tokens`, fetched 2026-08-20, reads 128000 for all
|
|
468
|
+
# three tiers (luna, terra, sol).
|
|
469
|
+
GPT_5_6_TERRA_OPENAI_XHIGH = OpenRouterModelExecutionProfile(
|
|
470
|
+
profile_id="gpt_5_6_terra_openai_xhigh",
|
|
471
|
+
profile_version=1,
|
|
472
|
+
requested_model="openai/gpt-5.6-terra",
|
|
473
|
+
accepted_resolved_models=("openai/gpt-5.6-terra",),
|
|
474
|
+
provider_only=("openai",),
|
|
475
|
+
accepted_resolved_providers=("OpenAI",),
|
|
476
|
+
max_output_tokens=128_000,
|
|
477
|
+
reasoning_effort="xhigh",
|
|
478
|
+
# The pinned first-party endpoint does not advertise temperature.
|
|
479
|
+
temperature=None,
|
|
480
|
+
structured_output_mode=(
|
|
481
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
482
|
+
),
|
|
483
|
+
structured_output_strict=True,
|
|
484
|
+
json_schema_dialect=(
|
|
485
|
+
OpenRouterJsonSchemaDialect.OPENAI_STRICT_BOUNDED_TEXT_V1
|
|
486
|
+
),
|
|
487
|
+
# Same OpenRouter spelling bridge as its luna and sol siblings: the endpoint
|
|
488
|
+
# advertises ``max_tokens`` while the maintained transport emits
|
|
489
|
+
# ``max_completion_tokens``. Routing stays pinned to OpenAI, fallbacks
|
|
490
|
+
# forbidden.
|
|
491
|
+
provider_require_parameters=False,
|
|
492
|
+
)
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
GPT_OSS_120B_GROQ_HIGH = OpenRouterModelExecutionProfile(
|
|
496
|
+
profile_id="gpt_oss_120b_groq_high",
|
|
497
|
+
profile_version=7,
|
|
498
|
+
requested_model="openai/gpt-oss-120b",
|
|
499
|
+
accepted_resolved_models=("openai/gpt-oss-120b",),
|
|
500
|
+
provider_only=("groq",),
|
|
501
|
+
accepted_resolved_providers=("Groq",),
|
|
502
|
+
# The endpoint's 131,072-token context is shared by input and output. A
|
|
503
|
+
# 65,536-token completion ceiling preserves half the window for evolving
|
|
504
|
+
# prompts, memory, and schemas while remaining far above observed outputs.
|
|
505
|
+
max_output_tokens=65_536,
|
|
506
|
+
reasoning_effort="high",
|
|
507
|
+
temperature=0.2,
|
|
508
|
+
structured_output_mode=(
|
|
509
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
510
|
+
),
|
|
511
|
+
structured_output_strict=True,
|
|
512
|
+
# Groq accepts native length bounds but rejects the OpenAI-dialect rewrite
|
|
513
|
+
# ``^.{1,16384}$`` because its regex engine caps repeat counts. The base
|
|
514
|
+
# transformer removes unsupported bounds while local Pydantic validation
|
|
515
|
+
# remains authoritative.
|
|
516
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT,
|
|
517
|
+
# Groq advertises the OpenAI-compatible ``max_tokens`` capability,
|
|
518
|
+
# while the Pydantic-AI transport emits ``max_completion_tokens``. Keep
|
|
519
|
+
# the route pinned and fallbacks forbidden, but let OpenRouter translate
|
|
520
|
+
# the equivalent field spelling instead of prefiltering the sole route.
|
|
521
|
+
provider_require_parameters=False,
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
GPT_OSS_20B_GROQ_HIGH = OpenRouterModelExecutionProfile(
|
|
526
|
+
profile_id="gpt_oss_20b_groq_high",
|
|
527
|
+
profile_version=7,
|
|
528
|
+
requested_model="openai/gpt-oss-20b",
|
|
529
|
+
accepted_resolved_models=("openai/gpt-oss-20b",),
|
|
530
|
+
provider_only=("groq",),
|
|
531
|
+
accepted_resolved_providers=("Groq",),
|
|
532
|
+
max_output_tokens=65_536,
|
|
533
|
+
reasoning_effort="high",
|
|
534
|
+
temperature=0.2,
|
|
535
|
+
structured_output_mode=(
|
|
536
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
537
|
+
),
|
|
538
|
+
structured_output_strict=True,
|
|
539
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT,
|
|
540
|
+
provider_require_parameters=False,
|
|
541
|
+
)
|
|
542
|
+
|
|
543
|
+
|
|
544
|
+
# Prospective deployment repair after a two-connection reference cell received
|
|
545
|
+
# two HTTP 429 responses followed by a long-stream HTTP 502 while its sibling
|
|
546
|
+
# occupied the other Groq connection. The requested model, provider, schema,
|
|
547
|
+
# reasoning, and completion budget are unchanged; only queue admission is
|
|
548
|
+
# serialized. Keep the original profile addressable for exact replay.
|
|
549
|
+
GPT_OSS_20B_GROQ_HIGH_SERIAL = OpenRouterModelExecutionProfile(
|
|
550
|
+
profile_id="gpt_oss_20b_groq_high_serial",
|
|
551
|
+
profile_version=1,
|
|
552
|
+
requested_model="openai/gpt-oss-20b",
|
|
553
|
+
accepted_resolved_models=("openai/gpt-oss-20b",),
|
|
554
|
+
provider_only=("groq",),
|
|
555
|
+
accepted_resolved_providers=("Groq",),
|
|
556
|
+
max_output_tokens=65_536,
|
|
557
|
+
reasoning_effort="high",
|
|
558
|
+
temperature=0.2,
|
|
559
|
+
structured_output_mode=(
|
|
560
|
+
OpenRouterStructuredOutputMode.NATIVE_JSON_SCHEMA
|
|
561
|
+
),
|
|
562
|
+
structured_output_strict=True,
|
|
563
|
+
json_schema_dialect=OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT,
|
|
564
|
+
provider_require_parameters=False,
|
|
565
|
+
route_concurrency_cap=1,
|
|
566
|
+
)
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
OPENROUTER_MODEL_EXECUTION_PROFILES = {
|
|
570
|
+
"deepseek": DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH,
|
|
571
|
+
"gpt_oss_120b": GPT_OSS_120B_GROQ_HIGH,
|
|
572
|
+
"gpt_oss_20b": GPT_OSS_20B_GROQ_HIGH,
|
|
573
|
+
"gpt_luna": GPT_5_6_LUNA_OPENAI_XHIGH,
|
|
574
|
+
"gpt_sol": GPT_5_6_SOL_OPENAI_XHIGH,
|
|
575
|
+
"gpt_terra": GPT_5_6_TERRA_OPENAI_XHIGH,
|
|
576
|
+
"mistral": MISTRAL_LARGE_3_MISTRAL,
|
|
577
|
+
"qwen": QWEN_3_7_MAX_ALIBABA_XHIGH,
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
# Transport variants are deliberately excluded from the six-model scientific
|
|
581
|
+
# roster above. They are separately named so a registry cannot silently
|
|
582
|
+
# reinterpret an already completed model cell after a route-capability repair.
|
|
583
|
+
OPENROUTER_MODEL_EXECUTION_PROFILE_VARIANTS = {
|
|
584
|
+
"deepseek_json": DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH_NATIVE_JSON,
|
|
585
|
+
"gpt_oss_20b_serial": GPT_OSS_20B_GROQ_HIGH_SERIAL,
|
|
586
|
+
"qwen_rate_safe": QWEN_3_7_MAX_ALIBABA_XHIGH_RATE_SAFE,
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
|
|
590
|
+
def openrouter_model_execution_profile(
|
|
591
|
+
name: str,
|
|
592
|
+
) -> OpenRouterModelExecutionProfile:
|
|
593
|
+
"""Resolve one closed built-in profile without workload-dependent logic."""
|
|
594
|
+
|
|
595
|
+
if type(name) is not str:
|
|
596
|
+
raise TypeError("model profile name must be an exact string")
|
|
597
|
+
matches = tuple(
|
|
598
|
+
registry[name]
|
|
599
|
+
for registry in (
|
|
600
|
+
OPENROUTER_MODEL_EXECUTION_PROFILES,
|
|
601
|
+
OPENROUTER_MODEL_EXECUTION_PROFILE_VARIANTS,
|
|
602
|
+
)
|
|
603
|
+
if name in registry
|
|
604
|
+
)
|
|
605
|
+
if len(matches) != 1:
|
|
606
|
+
raise ValueError(f"unknown OpenRouter model execution profile: {name}")
|
|
607
|
+
return matches[0]
|
|
608
|
+
|
|
609
|
+
|
|
610
|
+
def declared_max_output_tokens(model: str) -> "int | None":
|
|
611
|
+
"""The completion ceiling THIS PRODUCT declares for *model*, or ``None``.
|
|
612
|
+
|
|
613
|
+
A route sent no ``max_tokens`` does not run uncapped; it runs at the
|
|
614
|
+
PROVIDER's undeclared default, which on ``openai/gpt-5.6-luna`` is 65,536
|
|
615
|
+
against a route ceiling of 128,000 and against the 128,000 the profile
|
|
616
|
+
above already declares. The declaration was therefore unreachable from
|
|
617
|
+
the lightweight completion seam, and the gap silently truncated exactly
|
|
618
|
+
the calls that reasoned longest. This resolver is the one place that
|
|
619
|
+
turns the declaration into a number a caller can send.
|
|
620
|
+
|
|
621
|
+
Matching is on ``requested_model`` and tolerates a harness prefix
|
|
622
|
+
(``"openrouter:openai/gpt-5.6-luna"``), because that is the form
|
|
623
|
+
``Settings.model`` carries. ``None`` means "this product declares
|
|
624
|
+
nothing for that route" -- an unknown model, or two profiles that
|
|
625
|
+
disagree -- and an honest ``None`` is returned rather than a guess, so
|
|
626
|
+
the caller keeps the pre-cap body instead of inventing a ceiling.
|
|
627
|
+
"""
|
|
628
|
+
|
|
629
|
+
if type(model) is not str:
|
|
630
|
+
raise TypeError("model must be an exact string")
|
|
631
|
+
route = model.split(":", 1)[1] if ":" in model else model
|
|
632
|
+
declared = {
|
|
633
|
+
profile.max_output_tokens
|
|
634
|
+
for registry in (OPENROUTER_MODEL_EXECUTION_PROFILES,
|
|
635
|
+
OPENROUTER_MODEL_EXECUTION_PROFILE_VARIANTS)
|
|
636
|
+
for profile in registry.values()
|
|
637
|
+
if profile.requested_model == route
|
|
638
|
+
}
|
|
639
|
+
return declared.pop() if len(declared) == 1 else None
|
|
640
|
+
|
|
641
|
+
|
|
642
|
+
__all__ = [
|
|
643
|
+
"DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH",
|
|
644
|
+
"DEEPSEEK_V4_PRO_STREAMLAKE_XHIGH_NATIVE_JSON",
|
|
645
|
+
"GPT_5_6_LUNA_OPENAI_XHIGH",
|
|
646
|
+
"GPT_5_6_SOL_OPENAI_XHIGH",
|
|
647
|
+
"GPT_5_6_TERRA_OPENAI_XHIGH",
|
|
648
|
+
"GPT_OSS_120B_GROQ_HIGH",
|
|
649
|
+
"GPT_OSS_20B_GROQ_HIGH",
|
|
650
|
+
"GPT_OSS_20B_GROQ_HIGH_SERIAL",
|
|
651
|
+
"MISTRAL_LARGE_3_MISTRAL",
|
|
652
|
+
"OPENROUTER_MODEL_EXECUTION_PROFILES",
|
|
653
|
+
"OPENROUTER_MODEL_EXECUTION_PROFILE_VARIANTS",
|
|
654
|
+
"OpenRouterModelExecutionProfile",
|
|
655
|
+
"QWEN_3_7_MAX_ALIBABA_XHIGH",
|
|
656
|
+
"QWEN_3_7_MAX_ALIBABA_XHIGH_RATE_SAFE",
|
|
657
|
+
"declared_max_output_tokens",
|
|
658
|
+
"openrouter_model_execution_profile",
|
|
659
|
+
]
|