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
agent_evolve/settings.py
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
"""Runtime settings and credential loading at the composition root.
|
|
2
|
+
|
|
3
|
+
Two rules, both learned from defects.
|
|
4
|
+
|
|
5
|
+
**Never search.** A ``.env`` is read only when the caller names one -- through
|
|
6
|
+
``dotenv_path``/``AGENTEVOLVE_DOTENV`` here, or the explicit path handed to
|
|
7
|
+
:func:`load_credentials`. ``dotenv.load_dotenv()`` with no argument walks
|
|
8
|
+
*upward* from the calling module until it finds any ``.env``, so a library
|
|
9
|
+
buried in a monorepo silently adopts an unrelated project's credentials.
|
|
10
|
+
|
|
11
|
+
**Never re-introduce a name the operator removed.** ``load_dotenv(path,
|
|
12
|
+
override=False)`` looks safe and is not. ``override=False`` defers only to
|
|
13
|
+
variables that are *present*; a variable deliberately removed with ``env -u
|
|
14
|
+
OPENROUTER_API_KEY`` is absent, so the file value is set anyway. A run launched
|
|
15
|
+
to demonstrate that it made no provider call was handed the key straight back by
|
|
16
|
+
the very next line. A process cannot tell "never set" from "deliberately unset",
|
|
17
|
+
so the intent has to be stated -- name the variables in ``AGENTEVOLVE_SCRUBBED``
|
|
18
|
+
and they are removed from the environment and never reintroduced from a file,
|
|
19
|
+
whatever else the caller asks for::
|
|
20
|
+
|
|
21
|
+
AGENTEVOLVE_SCRUBBED=OPENROUTER_API_KEY python run_campaign.py
|
|
22
|
+
|
|
23
|
+
This module therefore never calls ``dotenv.load_dotenv`` at all. It reads a
|
|
24
|
+
named file with ``dotenv_values`` -- which touches nothing -- then applies the
|
|
25
|
+
result key by key and returns a record of exactly what it introduced, refused,
|
|
26
|
+
and removed, so a run can seal that record as evidence instead of asserting a
|
|
27
|
+
constant.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
from __future__ import annotations
|
|
31
|
+
|
|
32
|
+
import os
|
|
33
|
+
from dataclasses import dataclass
|
|
34
|
+
from pathlib import Path
|
|
35
|
+
from typing import Any, Dict, Mapping, Optional, Sequence, Tuple, Union
|
|
36
|
+
|
|
37
|
+
#: Default model. Cheap by policy, not by accident: a package that defaults to
|
|
38
|
+
#: a frontier model hands a stranger a bill they never chose on their first
|
|
39
|
+
#: run. This route is $0.10 per million input tokens and $0.60 per million
|
|
40
|
+
#: output. Whatever is set here is echoed before any paid call, so nobody is
|
|
41
|
+
#: billed by a default they did not see.
|
|
42
|
+
_DEFAULT_MODEL = "openrouter:openai/gpt-5.6-luna"
|
|
43
|
+
_DEFAULT_HARNESS = "pydantic_ai"
|
|
44
|
+
|
|
45
|
+
#: Published price per million tokens for the routes we default to or document,
|
|
46
|
+
#: so cost can be shown rather than guessed. Absent from this table means
|
|
47
|
+
#: unknown, and unknown is reported as unknown.
|
|
48
|
+
#:
|
|
49
|
+
#: Both spellings of each route are entered because a run is priced by the name
|
|
50
|
+
#: the *caller* used: ``model=`` is echoed straight into the usage record, and a
|
|
51
|
+
#: caller may write either the package's prefixed form or the bare id the
|
|
52
|
+
#: raw-HTTP seam sends. One spelling in the table would report `cost_usd: null`
|
|
53
|
+
#: on the other, which is the defect 0.4.0 fixed for luna.
|
|
54
|
+
#:
|
|
55
|
+
#: The three tiers are the ladder this project measures capability on, and the
|
|
56
|
+
#: numbers are its own routing table (wave-D `wd_common.py`'s `PRICES`, itself
|
|
57
|
+
#: the OpenRouter catalog's published prices) rather than anything recalled.
|
|
58
|
+
#: terra and sol were absent until the ladder wave started using them, so those
|
|
59
|
+
#: runs reported cost unknown -- honest, and no longer necessary.
|
|
60
|
+
MODEL_PRICES_PER_MTOK = {
|
|
61
|
+
"openrouter:openai/gpt-5.6-luna": (0.10, 0.60),
|
|
62
|
+
"openai/gpt-5.6-luna": (0.10, 0.60),
|
|
63
|
+
"openrouter:openai/gpt-5.6-terra": (1.00, 6.00),
|
|
64
|
+
"openai/gpt-5.6-terra": (1.00, 6.00),
|
|
65
|
+
"openrouter:openai/gpt-5.6-sol": (5.00, 30.00),
|
|
66
|
+
"openai/gpt-5.6-sol": (5.00, 30.00),
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def model_price(model: str):
|
|
71
|
+
"""Return ``(input, output)`` USD per million tokens, or ``None``."""
|
|
72
|
+
return MODEL_PRICES_PER_MTOK.get(model)
|
|
73
|
+
|
|
74
|
+
_API_KEYS = ("OPENAI_API_KEY", "GROQ_API_KEY", "GOOGLE_API_KEY", "ANTHROPIC_API_KEY")
|
|
75
|
+
|
|
76
|
+
#: Environment variable naming an explicit ``.env`` file to load.
|
|
77
|
+
DOTENV_PATH_VAR = "AGENTEVOLVE_DOTENV"
|
|
78
|
+
|
|
79
|
+
#: Environment variable naming variables that must stay unset (comma separated).
|
|
80
|
+
SCRUBBED_VAR = "AGENTEVOLVE_SCRUBBED"
|
|
81
|
+
|
|
82
|
+
#: Name shapes treated as credentials. Deliberately generic -- no provider is
|
|
83
|
+
#: named, so a new provider is covered the day it first appears in a ``.env``.
|
|
84
|
+
_CREDENTIAL_SUFFIXES = (
|
|
85
|
+
"_API_KEY",
|
|
86
|
+
"_KEY",
|
|
87
|
+
"_TOKEN",
|
|
88
|
+
"_SECRET",
|
|
89
|
+
"_PASSWORD",
|
|
90
|
+
"_CREDENTIAL",
|
|
91
|
+
"_CREDENTIALS",
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
#: The variable names model providers actually document. Used ONLY to answer the
|
|
96
|
+
#: routing question below -- never to decide what to redact.
|
|
97
|
+
#:
|
|
98
|
+
#: Exact names, not a vendor substring. A substring rule reads
|
|
99
|
+
#: `CLAUDE_CODE_MESSAGING_TOKEN` -- an agent harness's own IPC token -- as an
|
|
100
|
+
#: Anthropic credential, which is the same false positive one level down. A new
|
|
101
|
+
#: provider is one line here, and `proposer="llm"` reaches any provider without
|
|
102
|
+
#: consulting this list at all.
|
|
103
|
+
PROVIDER_CREDENTIAL_VARS = frozenset({
|
|
104
|
+
"OPENAI_API_KEY",
|
|
105
|
+
"OPENROUTER_API_KEY",
|
|
106
|
+
"ANTHROPIC_API_KEY",
|
|
107
|
+
"GEMINI_API_KEY",
|
|
108
|
+
"GOOGLE_API_KEY",
|
|
109
|
+
"GOOGLE_GENAI_API_KEY",
|
|
110
|
+
"GOOGLE_APPLICATION_CREDENTIALS",
|
|
111
|
+
"MISTRAL_API_KEY",
|
|
112
|
+
"DEEPSEEK_API_KEY",
|
|
113
|
+
"GROQ_API_KEY",
|
|
114
|
+
"COHERE_API_KEY",
|
|
115
|
+
"CO_API_KEY",
|
|
116
|
+
"XAI_API_KEY",
|
|
117
|
+
"GROK_API_KEY",
|
|
118
|
+
"TOGETHER_API_KEY",
|
|
119
|
+
"FIREWORKS_API_KEY",
|
|
120
|
+
"PERPLEXITY_API_KEY",
|
|
121
|
+
"CEREBRAS_API_KEY",
|
|
122
|
+
"MOONSHOT_API_KEY",
|
|
123
|
+
"HUGGINGFACE_API_KEY",
|
|
124
|
+
"HUGGING_FACE_HUB_TOKEN",
|
|
125
|
+
"HF_TOKEN",
|
|
126
|
+
"AZURE_API_KEY",
|
|
127
|
+
"AZURE_OPENAI_API_KEY",
|
|
128
|
+
"AWS_BEDROCK_API_KEY",
|
|
129
|
+
"OLLAMA_API_KEY",
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
#: Prefix reserved for this package, so an operator can declare a credential for
|
|
133
|
+
#: a provider the list above does not name yet without editing the package.
|
|
134
|
+
_PROVIDER_VAR_PREFIX = "AGENTEVOLVE_"
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def is_credential_name(name: str) -> bool:
|
|
138
|
+
"""Whether *name* looks like a secret rather than plain configuration.
|
|
139
|
+
|
|
140
|
+
This is the **redaction** predicate: it decides what must not be echoed and
|
|
141
|
+
what an allowlist has to name explicitly. Over-classifying here is safe --
|
|
142
|
+
it protects more -- so the rule stays deliberately generic and no provider
|
|
143
|
+
is named, which is why a new provider is covered the day it first appears in
|
|
144
|
+
a ``.env``.
|
|
145
|
+
|
|
146
|
+
It is *not* the routing predicate. See :func:`is_provider_credential_name`.
|
|
147
|
+
"""
|
|
148
|
+
upper = name.upper()
|
|
149
|
+
return upper.endswith(_CREDENTIAL_SUFFIXES) or upper in {"API_KEY", "TOKEN", "SECRET"}
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
def is_provider_credential_name(name: str) -> bool:
|
|
153
|
+
"""Whether *name* plausibly holds a credential for a **model provider**.
|
|
154
|
+
|
|
155
|
+
The two questions the generic rule above used to answer at once are not the
|
|
156
|
+
same question, and conflating them had a consequence in exactly one
|
|
157
|
+
direction. `credentials_present()` decides whether ``proposer="auto"`` may
|
|
158
|
+
reach a provider at all; asking "does this look like a secret" answered
|
|
159
|
+
*yes* for `VSCODE_GIT_IPC_AUTH_TOKEN` and `CLAUDE_CODE_MESSAGING_TOKEN`, so
|
|
160
|
+
on an ordinary developer machine -- an editor open, an agent running, no
|
|
161
|
+
provider account anywhere -- ``auto`` stopped choosing the credential-free
|
|
162
|
+
path and announced that it had found a credential. The documented default
|
|
163
|
+
was being flipped by a variable belonging to something else entirely.
|
|
164
|
+
|
|
165
|
+
So routing requires *both* a credential-shaped name and a vendor this
|
|
166
|
+
package can reach. Over-classifying is safe for redaction and unsafe for
|
|
167
|
+
routing, and the asymmetry is why these are two functions.
|
|
168
|
+
|
|
169
|
+
The escape hatch is explicit rather than inferred: ``proposer="llm"`` never
|
|
170
|
+
consults this at all, so an unrecognized vendor is one flag away and never a
|
|
171
|
+
silent misroute. ``AGENTEVOLVE_*`` credential names also route, so an
|
|
172
|
+
operator can declare one without editing the package.
|
|
173
|
+
"""
|
|
174
|
+
upper = name.upper()
|
|
175
|
+
if upper in PROVIDER_CREDENTIAL_VARS:
|
|
176
|
+
return True
|
|
177
|
+
return upper.startswith(_PROVIDER_VAR_PREFIX) and is_credential_name(upper)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def scrubbed_names() -> Tuple[str, ...]:
|
|
181
|
+
"""Variables the operator declared must stay unset, via ``AGENTEVOLVE_SCRUBBED``."""
|
|
182
|
+
raw = os.environ.get(SCRUBBED_VAR, "")
|
|
183
|
+
return tuple(sorted({part.strip() for part in raw.split(",") if part.strip()}))
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def enforce_scrubbed_environment() -> Tuple[str, ...]:
|
|
187
|
+
"""Remove every declared-scrubbed variable from the process environment.
|
|
188
|
+
|
|
189
|
+
Returns the names actually removed. A no-op when nothing is declared, so
|
|
190
|
+
importing this package cannot surprise a caller who has not asked for it.
|
|
191
|
+
"""
|
|
192
|
+
removed = []
|
|
193
|
+
for name in scrubbed_names():
|
|
194
|
+
if name in os.environ:
|
|
195
|
+
del os.environ[name]
|
|
196
|
+
removed.append(name)
|
|
197
|
+
return tuple(removed)
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
@dataclass(frozen=True)
|
|
201
|
+
class CredentialLoad:
|
|
202
|
+
"""What a credential load actually did. Names only -- never values."""
|
|
203
|
+
|
|
204
|
+
dotenv_path: Optional[str] = None
|
|
205
|
+
introduced: Tuple[str, ...] = ()
|
|
206
|
+
refused_scrubbed: Tuple[str, ...] = ()
|
|
207
|
+
refused_undeclared: Tuple[str, ...] = ()
|
|
208
|
+
already_present: Tuple[str, ...] = ()
|
|
209
|
+
removed_from_environment: Tuple[str, ...] = ()
|
|
210
|
+
|
|
211
|
+
def to_record(self) -> Dict[str, Any]:
|
|
212
|
+
"""A sealable record of the load, safe to write into a run receipt."""
|
|
213
|
+
return {
|
|
214
|
+
"dotenv_path": self.dotenv_path,
|
|
215
|
+
"introduced": list(self.introduced),
|
|
216
|
+
"refused_scrubbed": list(self.refused_scrubbed),
|
|
217
|
+
"refused_undeclared": list(self.refused_undeclared),
|
|
218
|
+
"already_present": list(self.already_present),
|
|
219
|
+
"removed_from_environment": list(self.removed_from_environment),
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
@dataclass(frozen=True)
|
|
224
|
+
class AgentEvolveSettings:
|
|
225
|
+
"""Model selection and credentials. Secrets are never echoed by repr helpers."""
|
|
226
|
+
|
|
227
|
+
model: str = _DEFAULT_MODEL
|
|
228
|
+
harness: str = _DEFAULT_HARNESS
|
|
229
|
+
temperature: Optional[float] = None
|
|
230
|
+
dotenv_source: Optional[str] = None
|
|
231
|
+
|
|
232
|
+
@classmethod
|
|
233
|
+
def from_env(cls, *, dotenv_path: Optional[str] = None) -> "AgentEvolveSettings":
|
|
234
|
+
"""Read settings from the process environment.
|
|
235
|
+
|
|
236
|
+
``dotenv_path`` (or ``AGENTEVOLVE_DOTENV``) names a ``.env`` to merge in
|
|
237
|
+
underneath the process environment. Without one, no file is read at all
|
|
238
|
+
and the process environment is the single source of truth.
|
|
239
|
+
"""
|
|
240
|
+
named = dotenv_path or os.environ.get(DOTENV_PATH_VAR)
|
|
241
|
+
if named is None:
|
|
242
|
+
enforce_scrubbed_environment()
|
|
243
|
+
source = None
|
|
244
|
+
else:
|
|
245
|
+
source = load_credentials(named).dotenv_path
|
|
246
|
+
temp = os.environ.get("AGENTEVOLVE_TEMPERATURE")
|
|
247
|
+
return cls(
|
|
248
|
+
model=os.environ.get("AGENTEVOLVE_MODEL", _DEFAULT_MODEL),
|
|
249
|
+
harness=os.environ.get("AGENTEVOLVE_HARNESS", _DEFAULT_HARNESS),
|
|
250
|
+
temperature=float(temp) if temp else None,
|
|
251
|
+
dotenv_source=source,
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
def public_metadata(self) -> Dict[str, Any]:
|
|
255
|
+
"""Settings safe to log (no secrets)."""
|
|
256
|
+
return {
|
|
257
|
+
"model": self.model,
|
|
258
|
+
"harness": self.harness,
|
|
259
|
+
"temperature": self.temperature,
|
|
260
|
+
"available_keys": [k for k in _API_KEYS if os.environ.get(k)],
|
|
261
|
+
"dotenv_source": self.dotenv_source,
|
|
262
|
+
"scrubbed": list(scrubbed_names()),
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
|
|
266
|
+
def load_credentials(
|
|
267
|
+
dotenv_path: Union[str, Path],
|
|
268
|
+
*,
|
|
269
|
+
allow_credentials: Optional[Sequence[str]] = None,
|
|
270
|
+
override: bool = False,
|
|
271
|
+
optional: bool = False,
|
|
272
|
+
) -> CredentialLoad:
|
|
273
|
+
"""Merge an explicitly named ``.env`` into the environment, safely.
|
|
274
|
+
|
|
275
|
+
This replaces ``dotenv.load_dotenv(path, override=False)`` at every call
|
|
276
|
+
site. The difference that matters: a variable named in
|
|
277
|
+
``AGENTEVOLVE_SCRUBBED`` is removed from the environment and never set from
|
|
278
|
+
the file, so the scrub actually holds.
|
|
279
|
+
|
|
280
|
+
``allow_credentials`` optionally restricts which credential-shaped names the
|
|
281
|
+
file may introduce -- pass ``()`` for a run that should need none. ``None``
|
|
282
|
+
(the default) allows any, matching the behaviour of the call it replaces.
|
|
283
|
+
``override`` replaces variables already in the environment; the scrub list
|
|
284
|
+
outranks it either way.
|
|
285
|
+
|
|
286
|
+
Raises ``FileNotFoundError`` if the named file is absent, because a named
|
|
287
|
+
path that silently does nothing is how credential bugs hide. Pass
|
|
288
|
+
``optional=True`` where the file is genuinely a maybe -- a run that layers a
|
|
289
|
+
workspace ``.env`` over a repository one, say -- and its absence returns an
|
|
290
|
+
empty record instead. The scrub list is enforced either way.
|
|
291
|
+
"""
|
|
292
|
+
removed = enforce_scrubbed_environment()
|
|
293
|
+
scrubbed = set(scrubbed_names())
|
|
294
|
+
allowed = None if allow_credentials is None else set(allow_credentials)
|
|
295
|
+
|
|
296
|
+
resolved = Path(dotenv_path).expanduser()
|
|
297
|
+
if not resolved.is_file():
|
|
298
|
+
if optional:
|
|
299
|
+
return CredentialLoad(removed_from_environment=removed)
|
|
300
|
+
raise FileNotFoundError(f"agent_evolve dotenv file not found: {resolved}")
|
|
301
|
+
|
|
302
|
+
introduced, refused_scrubbed, refused_undeclared, present = [], [], [], []
|
|
303
|
+
for name, value in _read_dotenv_file(resolved).items():
|
|
304
|
+
if value is None:
|
|
305
|
+
continue
|
|
306
|
+
if name in scrubbed:
|
|
307
|
+
refused_scrubbed.append(name)
|
|
308
|
+
continue
|
|
309
|
+
if name in os.environ and not override:
|
|
310
|
+
present.append(name)
|
|
311
|
+
continue
|
|
312
|
+
if allowed is not None and is_credential_name(name) and name not in allowed:
|
|
313
|
+
refused_undeclared.append(name)
|
|
314
|
+
continue
|
|
315
|
+
os.environ[name] = value
|
|
316
|
+
introduced.append(name)
|
|
317
|
+
|
|
318
|
+
return CredentialLoad(
|
|
319
|
+
dotenv_path=str(resolved.resolve()),
|
|
320
|
+
introduced=tuple(sorted(introduced)),
|
|
321
|
+
refused_scrubbed=tuple(sorted(refused_scrubbed)),
|
|
322
|
+
refused_undeclared=tuple(sorted(refused_undeclared)),
|
|
323
|
+
already_present=tuple(sorted(present)),
|
|
324
|
+
removed_from_environment=removed,
|
|
325
|
+
)
|
|
326
|
+
|
|
327
|
+
|
|
328
|
+
def _read_dotenv_file(resolved: Path) -> Mapping[str, Optional[str]]:
|
|
329
|
+
"""Parse a ``.env`` without touching the environment."""
|
|
330
|
+
try:
|
|
331
|
+
from dotenv import dotenv_values
|
|
332
|
+
except Exception as exc: # pragma: no cover - python-dotenv is a hard dep
|
|
333
|
+
raise RuntimeError(
|
|
334
|
+
f"a dotenv file was requested ({resolved}) but python-dotenv is not installed"
|
|
335
|
+
) from exc
|
|
336
|
+
return dotenv_values(resolved)
|
|
337
|
+
|
|
338
|
+
|
|
339
|
+
def credentials_present() -> bool:
|
|
340
|
+
"""True when some provider credential is available in the environment.
|
|
341
|
+
|
|
342
|
+
Used only to decide whether ``proposer="auto"`` may reach a provider. A
|
|
343
|
+
name the operator scrubbed does not count as present, so a run launched to
|
|
344
|
+
demonstrate that it made no provider call falls back to random rather than
|
|
345
|
+
quietly finding a key somewhere else.
|
|
346
|
+
|
|
347
|
+
The test is :func:`is_provider_credential_name`, not the broad redaction
|
|
348
|
+
rule: a secret-shaped variable belonging to an editor or an agent is not
|
|
349
|
+
evidence of a model-provider account, and treating it as one turned the
|
|
350
|
+
credential-free default off on machines that had no provider credential at
|
|
351
|
+
all.
|
|
352
|
+
"""
|
|
353
|
+
scrubbed = set(scrubbed_names())
|
|
354
|
+
for name, value in os.environ.items():
|
|
355
|
+
if not value or name in scrubbed:
|
|
356
|
+
continue
|
|
357
|
+
if is_provider_credential_name(name):
|
|
358
|
+
return True
|
|
359
|
+
return False
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
__all__ = [
|
|
363
|
+
"AgentEvolveSettings",
|
|
364
|
+
"CredentialLoad",
|
|
365
|
+
"DOTENV_PATH_VAR",
|
|
366
|
+
"SCRUBBED_VAR",
|
|
367
|
+
"MODEL_PRICES_PER_MTOK",
|
|
368
|
+
"credentials_present",
|
|
369
|
+
"model_price",
|
|
370
|
+
"enforce_scrubbed_environment",
|
|
371
|
+
"is_credential_name",
|
|
372
|
+
"is_provider_credential_name",
|
|
373
|
+
"PROVIDER_CREDENTIAL_VARS",
|
|
374
|
+
"load_credentials",
|
|
375
|
+
"scrubbed_names",
|
|
376
|
+
]
|