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.
Files changed (414) hide show
  1. agent_evolve/__init__.py +722 -0
  2. agent_evolve/agentic.py +2800 -0
  3. agent_evolve/api.py +767 -0
  4. agent_evolve/application/__init__.py +1580 -0
  5. agent_evolve/application/action_allocation.py +744 -0
  6. agent_evolve/application/action_allocation_frame.py +347 -0
  7. agent_evolve/application/action_allocation_frame_commit.py +185 -0
  8. agent_evolve/application/action_allocation_frame_commit_v3.py +184 -0
  9. agent_evolve/application/action_allocation_frame_v3.py +338 -0
  10. agent_evolve/application/action_archive_value.py +497 -0
  11. agent_evolve/application/action_evidence_consistency.py +455 -0
  12. agent_evolve/application/action_forecast_partitioning.py +1471 -0
  13. agent_evolve/application/action_metric_projection.py +211 -0
  14. agent_evolve/application/action_role_value.py +680 -0
  15. agent_evolve/application/action_score_authorities.py +363 -0
  16. agent_evolve/application/action_structural_signature.py +116 -0
  17. agent_evolve/application/action_target_realization.py +402 -0
  18. agent_evolve/application/agentic_evolution.py +7734 -0
  19. agent_evolve/application/agentic_portfolio_residual_expert.py +835 -0
  20. agent_evolve/application/anchor_residual_identification.py +463 -0
  21. agent_evolve/application/archive_conditioned_action_target.py +208 -0
  22. agent_evolve/application/artifact_journal.py +246 -0
  23. agent_evolve/application/artifact_replay.py +347 -0
  24. agent_evolve/application/budgeted_optimizer.py +1828 -0
  25. agent_evolve/application/calibrated_campaign.py +485 -0
  26. agent_evolve/application/calibrated_current_prefix_forecast_opportunity.py +322 -0
  27. agent_evolve/application/calibrated_positive_gain_opportunity.py +1581 -0
  28. agent_evolve/application/campaign_capacity_recourse.py +254 -0
  29. agent_evolve/application/campaign_contextual_outcomes.py +119 -0
  30. agent_evolve/application/campaign_diagnostic_blocks.py +930 -0
  31. agent_evolve/application/campaign_evidence_registry.py +262 -0
  32. agent_evolve/application/campaign_execution.py +2537 -0
  33. agent_evolve/application/campaign_generation_audit.py +942 -0
  34. agent_evolve/application/campaign_learning.py +1812 -0
  35. agent_evolve/application/campaign_learning_runtime.py +1977 -0
  36. agent_evolve/application/campaign_search_phase.py +227 -0
  37. agent_evolve/application/campaign_selector_context_extension.py +220 -0
  38. agent_evolve/application/campaign_variation_envelope.py +649 -0
  39. agent_evolve/application/campaign_variation_trace.py +451 -0
  40. agent_evolve/application/candidate_archive_consequence.py +128 -0
  41. agent_evolve/application/causal_opportunity_portfolio_gate.py +385 -0
  42. agent_evolve/application/composite_outcome_updater.py +145 -0
  43. agent_evolve/application/composition_portfolio_selection.py +363 -0
  44. agent_evolve/application/concurrent_stage.py +144 -0
  45. agent_evolve/application/contextual_action_allocation.py +181 -0
  46. agent_evolve/application/contextual_campaign_outcomes.py +267 -0
  47. agent_evolve/application/contextual_campaign_planning.py +1366 -0
  48. agent_evolve/application/contextual_delayed_credit.py +651 -0
  49. agent_evolve/application/contextual_search_controller.py +2374 -0
  50. agent_evolve/application/current_prefix_forecast_opportunity.py +714 -0
  51. agent_evolve/application/decision_metric_projection.py +112 -0
  52. agent_evolve/application/derived_action_semantics.py +129 -0
  53. agent_evolve/application/detailed_evaluation.py +449 -0
  54. agent_evolve/application/earned_lineage.py +1011 -0
  55. agent_evolve/application/effective_choice_audit.py +484 -0
  56. agent_evolve/application/empirical_consequence_calibration.py +908 -0
  57. agent_evolve/application/evaluation_accounting.py +325 -0
  58. agent_evolve/application/evaluation_cache.py +199 -0
  59. agent_evolve/application/evaluation_escrow.py +547 -0
  60. agent_evolve/application/evaluation_recourse.py +253 -0
  61. agent_evolve/application/event_recorder.py +151 -0
  62. agent_evolve/application/evolution_campaign.py +1840 -0
  63. agent_evolve/application/executable_hypothesis.py +323 -0
  64. agent_evolve/application/factorial_branch_pilot.py +772 -0
  65. agent_evolve/application/finite_acquisition_capacity_recourse.py +672 -0
  66. agent_evolve/application/finite_acquisition_residual_expert.py +373 -0
  67. agent_evolve/application/finite_acquisition_variation_envelope.py +802 -0
  68. agent_evolve/application/finite_action_hypothesis_semantics.py +446 -0
  69. agent_evolve/application/finite_action_selection.py +188 -0
  70. agent_evolve/application/finite_action_set.py +306 -0
  71. agent_evolve/application/finite_action_transition.py +537 -0
  72. agent_evolve/application/finite_variation_eligibility.py +296 -0
  73. agent_evolve/application/forecast_geometry_portfolio.py +799 -0
  74. agent_evolve/application/forecast_opportunity_shadow_calibration.py +316 -0
  75. agent_evolve/application/front_proximity_admission.py +311 -0
  76. agent_evolve/application/front_proximity_parent_basis.py +458 -0
  77. agent_evolve/application/frozen_hurdle_score.py +659 -0
  78. agent_evolve/application/g3_causal_screen.py +2257 -0
  79. agent_evolve/application/g3_causal_validation.py +1046 -0
  80. agent_evolve/application/g3_postseal_curation.py +818 -0
  81. agent_evolve/application/gated_agentic_generator.py +205 -0
  82. agent_evolve/application/generation_feedback.py +293 -0
  83. agent_evolve/application/generative_proposal_journal.py +185 -0
  84. agent_evolve/application/geometry_conditional_elasticity.py +453 -0
  85. agent_evolve/application/global_wave_action_allocation.py +1151 -0
  86. agent_evolve/application/head_mass_conditional_seat.py +268 -0
  87. agent_evolve/application/identifiable_reflection_evidence.py +1147 -0
  88. agent_evolve/application/identifiable_reflection_learning.py +395 -0
  89. agent_evolve/application/identifiable_reflection_request.py +364 -0
  90. agent_evolve/application/in_memory_residual_archive.py +341 -0
  91. agent_evolve/application/insight_memory.py +1804 -0
  92. agent_evolve/application/live_runtime_manifest.py +758 -0
  93. agent_evolve/application/llm_task_queue.py +769 -0
  94. agent_evolve/application/matched_finite_action_block.py +409 -0
  95. agent_evolve/application/materialized_action_broker.py +2328 -0
  96. agent_evolve/application/materialized_action_constraints.py +83 -0
  97. agent_evolve/application/materialized_variation.py +211 -0
  98. agent_evolve/application/multi_option_evolution.py +1536 -0
  99. agent_evolve/application/outcome_adaptive_action_racing.py +2827 -0
  100. agent_evolve/application/outcome_adaptive_residual_campaign_runtime.py +580 -0
  101. agent_evolve/application/outcome_adaptive_residual_portfolio_evolution.py +3671 -0
  102. agent_evolve/application/outcome_conditioned_portfolio_selection.py +1374 -0
  103. agent_evolve/application/outcome_relation.py +193 -0
  104. agent_evolve/application/paired_allocation_comparison.py +241 -0
  105. agent_evolve/application/paired_block_schedule.py +127 -0
  106. agent_evolve/application/parent_measurement.py +226 -0
  107. agent_evolve/application/pareto_archive.py +811 -0
  108. agent_evolve/application/portfolio_campaign_runtime.py +4739 -0
  109. agent_evolve/application/portfolio_evolution.py +2950 -0
  110. agent_evolve/application/portfolio_hypothesis_observations.py +814 -0
  111. agent_evolve/application/portfolio_memory_attribution.py +581 -0
  112. agent_evolve/application/portfolio_memory_dose.py +788 -0
  113. agent_evolve/application/portfolio_memory_matched_control.py +938 -0
  114. agent_evolve/application/portfolio_memory_transfer.py +297 -0
  115. agent_evolve/application/portfolio_optimization_memory.py +363 -0
  116. agent_evolve/application/portfolio_outcome_feedback.py +1613 -0
  117. agent_evolve/application/portfolio_projection.py +335 -0
  118. agent_evolve/application/portfolio_recombination.py +2032 -0
  119. agent_evolve/application/post_evolution_reflection.py +834 -0
  120. agent_evolve/application/postcommit_rank_authority.py +245 -0
  121. agent_evolve/application/precommitted_portfolio_racing.py +2762 -0
  122. agent_evolve/application/prequential_archive_opportunity_calibration.py +1154 -0
  123. agent_evolve/application/prequential_residual_exploration.py +343 -0
  124. agent_evolve/application/prequential_score_portfolio.py +954 -0
  125. agent_evolve/application/projections.py +292 -0
  126. agent_evolve/application/protected_action_committee.py +1027 -0
  127. agent_evolve/application/protected_branch_pilot.py +376 -0
  128. agent_evolve/application/protected_current_prefix_forecast_opportunity.py +552 -0
  129. agent_evolve/application/provider_replay.py +910 -0
  130. agent_evolve/application/rank_balanced_causal_pilot.py +1372 -0
  131. agent_evolve/application/recombination_residual_expert.py +403 -0
  132. agent_evolve/application/reflection_workflow.py +571 -0
  133. agent_evolve/application/region_conditional_credit.py +911 -0
  134. agent_evolve/application/residual_campaign_runtime.py +531 -0
  135. agent_evolve/application/residual_headroom_campaign_runtime.py +459 -0
  136. agent_evolve/application/residual_headroom_ledger.py +1544 -0
  137. agent_evolve/application/residual_learning_transaction.py +396 -0
  138. agent_evolve/application/residual_portfolio_evolution.py +1228 -0
  139. agent_evolve/application/residual_reachability.py +749 -0
  140. agent_evolve/application/residual_stage_credit.py +499 -0
  141. agent_evolve/application/same_prefix_paired_audit.py +1580 -0
  142. agent_evolve/application/semantic_coverage_score_portfolio.py +838 -0
  143. agent_evolve/application/sequential_lineage_allocation.py +1017 -0
  144. agent_evolve/application/sequential_market_replay.py +1395 -0
  145. agent_evolve/application/sequential_residual_campaign_runtime.py +305 -0
  146. agent_evolve/application/sequential_residual_portfolio_evolution.py +940 -0
  147. agent_evolve/application/single_score_action_allocation.py +299 -0
  148. agent_evolve/application/source_exposure_allocation.py +906 -0
  149. agent_evolve/application/staged_memory.py +210 -0
  150. agent_evolve/application/stratified_cold_start_allocation.py +732 -0
  151. agent_evolve/application/support_guarded_hurdle_score.py +549 -0
  152. agent_evolve/application/target_conditioned_action_forecast.py +595 -0
  153. agent_evolve/application/target_conditioned_campaign.py +566 -0
  154. agent_evolve/application/treatment_assignment.py +201 -0
  155. agent_evolve/application/trusted_objective_evidence.py +217 -0
  156. agent_evolve/application/two_stage_action_evolution.py +1131 -0
  157. agent_evolve/application/v8lite_allocation_policy.py +1083 -0
  158. agent_evolve/application/v9_candidate_policy.py +1303 -0
  159. agent_evolve/bootstrap.py +108 -0
  160. agent_evolve/campaign_presets.py +517 -0
  161. agent_evolve/campaign_profiles.py +452 -0
  162. agent_evolve/campaign_variation_topology.py +288 -0
  163. agent_evolve/campaign_workload.py +950 -0
  164. agent_evolve/cli.py +797 -0
  165. agent_evolve/contract.py +241 -0
  166. agent_evolve/core/__init__.py +91 -0
  167. agent_evolve/core/action_semantics.py +411 -0
  168. agent_evolve/core/authored.py +105 -0
  169. agent_evolve/core/formatting.py +286 -0
  170. agent_evolve/core/optimization_semantics.py +324 -0
  171. agent_evolve/core/problem.py +167 -0
  172. agent_evolve/core/results.py +323 -0
  173. agent_evolve/core/stats.py +70 -0
  174. agent_evolve/core/telemetry.py +100 -0
  175. agent_evolve/domain/__init__.py +89 -0
  176. agent_evolve/domain/artifact.py +162 -0
  177. agent_evolve/domain/durable_text.py +68 -0
  178. agent_evolve/domain/event.py +1454 -0
  179. agent_evolve/domain/finite_action_set.py +426 -0
  180. agent_evolve/domain/finite_variation.py +526 -0
  181. agent_evolve/domain/generative_emission.py +559 -0
  182. agent_evolve/domain/ids.py +163 -0
  183. agent_evolve/domain/inline_text.py +106 -0
  184. agent_evolve/domain/insight.py +27 -0
  185. agent_evolve/domain/lineage.py +737 -0
  186. agent_evolve/domain/llm_task_queue.py +960 -0
  187. agent_evolve/domain/outcome.py +96 -0
  188. agent_evolve/domain/patch.py +854 -0
  189. agent_evolve/domain/typed_json.py +542 -0
  190. agent_evolve/domain/variation_space.py +158 -0
  191. agent_evolve/driver.py +1014 -0
  192. agent_evolve/harness/__init__.py +29 -0
  193. agent_evolve/harness/base.py +242 -0
  194. agent_evolve/harness/directives.py +163 -0
  195. agent_evolve/harness/generative_seal.py +479 -0
  196. agent_evolve/harness/registry.py +41 -0
  197. agent_evolve/infrastructure/__init__.py +39 -0
  198. agent_evolve/infrastructure/artifacts/__init__.py +6 -0
  199. agent_evolve/infrastructure/artifacts/_verification.py +67 -0
  200. agent_evolve/infrastructure/artifacts/filesystem.py +343 -0
  201. agent_evolve/infrastructure/artifacts/in_memory.py +73 -0
  202. agent_evolve/infrastructure/asyncio_runtime.py +109 -0
  203. agent_evolve/infrastructure/authored_runtime.py +188 -0
  204. agent_evolve/infrastructure/authored_worker.py +171 -0
  205. agent_evolve/infrastructure/clock.py +53 -0
  206. agent_evolve/infrastructure/events/__init__.py +6 -0
  207. agent_evolve/infrastructure/events/_validation.py +89 -0
  208. agent_evolve/infrastructure/events/in_memory.py +56 -0
  209. agent_evolve/infrastructure/events/jsonl.py +193 -0
  210. agent_evolve/infrastructure/exception_provenance.py +215 -0
  211. agent_evolve/infrastructure/ids.py +118 -0
  212. agent_evolve/infrastructure/lineage_codec.py +1836 -0
  213. agent_evolve/infrastructure/outcome_adaptive_phase_journal.py +170 -0
  214. agent_evolve/infrastructure/residual_headroom_journal.py +221 -0
  215. agent_evolve/infrastructure/resource_lease.py +370 -0
  216. agent_evolve/infrastructure/sanitization/__init__.py +8 -0
  217. agent_evolve/infrastructure/sanitization/strict_json.py +484 -0
  218. agent_evolve/infrastructure/sequential_phase_journal.py +170 -0
  219. agent_evolve/infrastructure/stream_liveness.py +383 -0
  220. agent_evolve/infrastructure/subprocess_boundary.py +136 -0
  221. agent_evolve/integrations/__init__.py +1 -0
  222. agent_evolve/integrations/botorch/__init__.py +28 -0
  223. agent_evolve/integrations/botorch/finite_qlognehvi.py +190 -0
  224. agent_evolve/integrations/botorch/finite_qlognehvi_batch.py +155 -0
  225. agent_evolve/integrations/botorch/finite_qlognehvi_batch_identity.py +20 -0
  226. agent_evolve/integrations/botorch/finite_qlognehvi_batch_worker.py +55 -0
  227. agent_evolve/integrations/botorch/finite_qlognehvi_identity.py +22 -0
  228. agent_evolve/integrations/botorch/finite_qlognehvi_worker.py +55 -0
  229. agent_evolve/integrations/botorch/subprocess_qlognehvi.py +261 -0
  230. agent_evolve/integrations/botorch/subprocess_qlognehvi_batch.py +273 -0
  231. agent_evolve/integrations/completion.py +242 -0
  232. agent_evolve/integrations/pydantic_ai/__init__.py +441 -0
  233. agent_evolve/integrations/pydantic_ai/action_forecast.py +1068 -0
  234. agent_evolve/integrations/pydantic_ai/agentic_generator.py +2308 -0
  235. agent_evolve/integrations/pydantic_ai/async_generator.py +1604 -0
  236. agent_evolve/integrations/pydantic_ai/boundary_codec.py +1526 -0
  237. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_campaign.py +756 -0
  238. agent_evolve/integrations/pydantic_ai/calibrated_portfolio_selection.py +7537 -0
  239. agent_evolve/integrations/pydantic_ai/campaign_acquisition.py +609 -0
  240. agent_evolve/integrations/pydantic_ai/execution_binding.py +138 -0
  241. agent_evolve/integrations/pydantic_ai/forecast_geometry_action_committee.py +217 -0
  242. agent_evolve/integrations/pydantic_ai/harness.py +159 -0
  243. agent_evolve/integrations/pydantic_ai/heterogeneous_model_execution.py +306 -0
  244. agent_evolve/integrations/pydantic_ai/hierarchical_residual_adaptive_semantic_view.py +179 -0
  245. agent_evolve/integrations/pydantic_ai/json_schema_dialect.py +108 -0
  246. agent_evolve/integrations/pydantic_ai/materialized_hierarchical_residual_expert.py +952 -0
  247. agent_evolve/integrations/pydantic_ai/materialized_portfolio_judge.py +520 -0
  248. agent_evolve/integrations/pydantic_ai/model_execution_profile.py +659 -0
  249. agent_evolve/integrations/pydantic_ai/outbound_request_manifest.py +1170 -0
  250. agent_evolve/integrations/pydantic_ai/portable_residual_consequence_features.py +575 -0
  251. agent_evolve/integrations/pydantic_ai/portfolio_selection.py +422 -0
  252. agent_evolve/integrations/pydantic_ai/progress_aware_openrouter.py +416 -0
  253. agent_evolve/integrations/pydantic_ai/provider_attempt_join.py +1523 -0
  254. agent_evolve/integrations/pydantic_ai/provider_free_calibrated_runner.py +607 -0
  255. agent_evolve/integrations/pydantic_ai/queued_runner.py +2634 -0
  256. agent_evolve/integrations/pydantic_ai/reconciled_residual_reachability.py +1417 -0
  257. agent_evolve/integrations/pydantic_ai/residual_forecast_geometry.py +445 -0
  258. agent_evolve/integrations/pydantic_ai/residual_reachability.py +674 -0
  259. agent_evolve/integrations/pydantic_ai/residual_semantic_cells.py +239 -0
  260. agent_evolve/integrations/pydantic_ai/sealed_output_replay.py +1068 -0
  261. agent_evolve/integrations/pydantic_ai/semantic_coverage_residual_portfolio.py +770 -0
  262. agent_evolve/integrations/pydantic_ai/semantic_decision_replay.py +383 -0
  263. agent_evolve/integrations/pydantic_ai/support_adaptive_residual_portfolio.py +135 -0
  264. agent_evolve/integrations/pydantic_ai/trusted_residual_prompt_context.py +143 -0
  265. agent_evolve/integrations/pydantic_ai/validated_openrouter_model.py +107 -0
  266. agent_evolve/integrations/pymoo_adapter.py +242 -0
  267. agent_evolve/policies/__init__.py +17 -0
  268. agent_evolve/policies/check.py +469 -0
  269. agent_evolve/policies/emit_scaffold.py +451 -0
  270. agent_evolve/policies/feedback/__init__.py +37 -0
  271. agent_evolve/policies/feedback/held_out_asn.py +1325 -0
  272. agent_evolve/policies/genetic.py +607 -0
  273. agent_evolve/policies/llm_backoff.py +183 -0
  274. agent_evolve/policies/llm_chooser.py +226 -0
  275. agent_evolve/policies/llm_generator.py +1760 -0
  276. agent_evolve/policies/llm_init.py +267 -0
  277. agent_evolve/policies/llm_operator.py +109 -0
  278. agent_evolve/policies/llm_prior.py +194 -0
  279. agent_evolve/policies/llm_surrogate.py +334 -0
  280. agent_evolve/policies/measurement_evidence.py +704 -0
  281. agent_evolve/policies/memory/__init__.py +223 -0
  282. agent_evolve/policies/memory/balanced_subset_blocks.py +707 -0
  283. agent_evolve/policies/memory/compatibility_matching.py +593 -0
  284. agent_evolve/policies/memory/global_falsification.py +1841 -0
  285. agent_evolve/policies/memory/prompt_shape.py +503 -0
  286. agent_evolve/policies/memory/randomized_subset.py +714 -0
  287. agent_evolve/policies/memory/staged_causal.py +1270 -0
  288. agent_evolve/policies/memory/treatment_compliance.py +759 -0
  289. agent_evolve/policies/objective_resolution/__init__.py +17 -0
  290. agent_evolve/policies/objective_resolution/fixed_grid.py +364 -0
  291. agent_evolve/policies/operator_portfolio.py +407 -0
  292. agent_evolve/policies/reguidance.py +1133 -0
  293. agent_evolve/policies/reward/__init__.py +83 -0
  294. agent_evolve/policies/reward/affine_candidate_consequence.py +156 -0
  295. agent_evolve/policies/reward/affine_candidate_consequence_3d.py +159 -0
  296. agent_evolve/policies/reward/affine_hypervolume.py +490 -0
  297. agent_evolve/policies/reward/affine_hypervolume_3d.py +567 -0
  298. agent_evolve/policies/reward/contextual_marginal_utility.py +318 -0
  299. agent_evolve/policies/reward/frozen_archive.py +360 -0
  300. agent_evolve/policies/reward/frozen_wave_archive.py +368 -0
  301. agent_evolve/policies/search_state.py +208 -0
  302. agent_evolve/policies/selection/__init__.py +345 -0
  303. agent_evolve/policies/selection/acquisition_certified_slate.py +684 -0
  304. agent_evolve/policies/selection/affine_frontier_context.py +330 -0
  305. agent_evolve/policies/selection/affine_frontier_target.py +473 -0
  306. agent_evolve/policies/selection/archive_elite.py +1346 -0
  307. agent_evolve/policies/selection/calibrated_portfolio_binding.py +640 -0
  308. agent_evolve/policies/selection/calibrated_slate.py +1394 -0
  309. agent_evolve/policies/selection/calibrated_slate_codec.py +579 -0
  310. agent_evolve/policies/selection/common_candidate_pool.py +685 -0
  311. agent_evolve/policies/selection/diagnostic_sampling.py +319 -0
  312. agent_evolve/policies/selection/disjoint_pairs.py +479 -0
  313. agent_evolve/policies/selection/elite_explorer.py +719 -0
  314. agent_evolve/policies/selection/finite_action.py +187 -0
  315. agent_evolve/policies/selection/finite_option_prompt_projection.py +377 -0
  316. agent_evolve/policies/selection/finite_palette_evidence.py +247 -0
  317. agent_evolve/policies/selection/forecast_calibration.py +922 -0
  318. agent_evolve/policies/selection/frontier_probe_slate.py +814 -0
  319. agent_evolve/policies/selection/frozen_archive_pairs.py +762 -0
  320. agent_evolve/policies/selection/full_support_slate.py +91 -0
  321. agent_evolve/policies/selection/meaningful_direction.py +240 -0
  322. agent_evolve/policies/selection/memory_dose_feasibility.py +259 -0
  323. agent_evolve/policies/selection/model_anchored_slate.py +826 -0
  324. agent_evolve/policies/selection/phenotype_recourse.py +979 -0
  325. agent_evolve/policies/selection/proposal_support.py +368 -0
  326. agent_evolve/policies/selection/random_portfolio.py +254 -0
  327. agent_evolve/policies/selection/regret_bounded_slate.py +1084 -0
  328. agent_evolve/policies/selection/residual_frontier.py +463 -0
  329. agent_evolve/policies/selection/residual_frontier_target.py +605 -0
  330. agent_evolve/policies/selection/structural_posterior_slate.py +1571 -0
  331. agent_evolve/policies/selection/target_conditioned_allocator.py +648 -0
  332. agent_evolve/policies/selection/target_conditioned_features.py +812 -0
  333. agent_evolve/policies/selection/target_conditioned_prequential.py +1527 -0
  334. agent_evolve/policies/selection/task_keyed_palette.py +906 -0
  335. agent_evolve/policies/semantics.py +147 -0
  336. agent_evolve/policies/structure.py +362 -0
  337. agent_evolve/policies/structured_output_budget.py +62 -0
  338. agent_evolve/policies/surrogate.py +696 -0
  339. agent_evolve/policies/variation/__init__.py +1 -0
  340. agent_evolve/policies/variation/compositional_finite_catalog.py +426 -0
  341. agent_evolve/policies/variation/crossover_inheritance.py +575 -0
  342. agent_evolve/policies/variation/disjoint_recombination.py +611 -0
  343. agent_evolve/policies/variation/exact_composition_capacity.py +214 -0
  344. agent_evolve/policies/variation/exact_parent_crossover.py +950 -0
  345. agent_evolve/policies/variation/multiscale_restart_catalog.py +372 -0
  346. agent_evolve/policies/variation/source_union_finite_catalog.py +403 -0
  347. agent_evolve/policies/variation/typed_patch.py +1981 -0
  348. agent_evolve/policies/weighted_prior.py +394 -0
  349. agent_evolve/ports/__init__.py +383 -0
  350. agent_evolve/ports/action_allocation.py +733 -0
  351. agent_evolve/ports/action_allocation_frame.py +1153 -0
  352. agent_evolve/ports/action_allocation_frame_commit.py +294 -0
  353. agent_evolve/ports/action_allocation_frame_commit_v3.py +432 -0
  354. agent_evolve/ports/action_allocation_frame_v3.py +995 -0
  355. agent_evolve/ports/action_forecast.py +1568 -0
  356. agent_evolve/ports/action_metric_projection.py +165 -0
  357. agent_evolve/ports/agentic_generator.py +1561 -0
  358. agent_evolve/ports/archive_context.py +136 -0
  359. agent_evolve/ports/artifact_sanitizer.py +44 -0
  360. agent_evolve/ports/artifact_store.py +225 -0
  361. agent_evolve/ports/clock.py +13 -0
  362. agent_evolve/ports/contextual_search_allocation.py +827 -0
  363. agent_evolve/ports/decision_metric_projection.py +258 -0
  364. agent_evolve/ports/event_store.py +55 -0
  365. agent_evolve/ports/executable_hypothesis.py +557 -0
  366. agent_evolve/ports/finite_acquisition.py +377 -0
  367. agent_evolve/ports/finite_acquisition_batch.py +296 -0
  368. agent_evolve/ports/finite_acquisition_batch_json.py +164 -0
  369. agent_evolve/ports/finite_acquisition_json.py +247 -0
  370. agent_evolve/ports/finite_acquisition_space.py +168 -0
  371. agent_evolve/ports/finite_action_selection.py +348 -0
  372. agent_evolve/ports/finite_action_set.py +256 -0
  373. agent_evolve/ports/frontier_target.py +396 -0
  374. agent_evolve/ports/generation_failure.py +43 -0
  375. agent_evolve/ports/hard_feasibility.py +233 -0
  376. agent_evolve/ports/id_factory.py +34 -0
  377. agent_evolve/ports/llm_task_queue.py +93 -0
  378. agent_evolve/ports/objective_resolution.py +419 -0
  379. agent_evolve/ports/paired_allocation_comparison.py +401 -0
  380. agent_evolve/ports/paired_block_schedule.py +475 -0
  381. agent_evolve/ports/parent_measurement.py +336 -0
  382. agent_evolve/ports/portfolio_memory_dose.py +643 -0
  383. agent_evolve/ports/portfolio_selection.py +3169 -0
  384. agent_evolve/ports/postcommit_rank_authority.py +467 -0
  385. agent_evolve/ports/presented_action_evidence.py +794 -0
  386. agent_evolve/ports/resource_lease.py +162 -0
  387. agent_evolve/ports/structured_generator.py +734 -0
  388. agent_evolve/ports/structured_output_budget.py +120 -0
  389. agent_evolve/ports/subprocess_boundary.py +138 -0
  390. agent_evolve/ports/treatment_assignment.py +466 -0
  391. agent_evolve/ports/variation_catalog.py +76 -0
  392. agent_evolve/ports/variation_source.py +226 -0
  393. agent_evolve/proposal_mode.py +157 -0
  394. agent_evolve/proposers/__init__.py +10 -0
  395. agent_evolve/proposers/random_proposer.py +188 -0
  396. agent_evolve/provider_accounting.py +163 -0
  397. agent_evolve/py.typed +0 -0
  398. agent_evolve/reference_method.py +1570 -0
  399. agent_evolve/session/__init__.py +11 -0
  400. agent_evolve/session/authorship.py +864 -0
  401. agent_evolve/session/evaluate.py +236 -0
  402. agent_evolve/session/fidelity.py +237 -0
  403. agent_evolve/session/genetic_loop.py +742 -0
  404. agent_evolve/session/loop.py +803 -0
  405. agent_evolve/session/screening.py +671 -0
  406. agent_evolve/settings.py +376 -0
  407. agent_evolve/workload_kit.py +368 -0
  408. agent_evolve/workload_prompt.py +398 -0
  409. agentevolve_optimizer-0.5.0.dist-info/METADATA +599 -0
  410. agentevolve_optimizer-0.5.0.dist-info/RECORD +414 -0
  411. agentevolve_optimizer-0.5.0.dist-info/WHEEL +5 -0
  412. agentevolve_optimizer-0.5.0.dist-info/entry_points.txt +2 -0
  413. agentevolve_optimizer-0.5.0.dist-info/licenses/LICENSE +21 -0
  414. agentevolve_optimizer-0.5.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,306 @@
1
+ """Workload-neutral execution for heterogeneous model portfolios.
2
+
3
+ Workload adapters own candidate semantics and evaluators. This module owns
4
+ only opaque model-lane identity, immutable execution profiles, and structured
5
+ request routing. It therefore permits one evolutionary campaign to populate
6
+ the same typed proposal market with multiple models without introducing
7
+ model-specific branches into an application service or workload adapter.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import asyncio
13
+ import hashlib
14
+ import json
15
+ import re
16
+ from collections.abc import Callable
17
+ from dataclasses import dataclass
18
+ from typing import Any, Protocol
19
+
20
+ from agent_evolve.integrations.pydantic_ai.model_execution_profile import (
21
+ OpenRouterModelExecutionProfile,
22
+ )
23
+ from agent_evolve.ports.agentic_generator import AgenticCallTelemetry
24
+
25
+ _LANE_ID = re.compile(r"^[a-z][a-z0-9_]{0,63}$")
26
+ _PROFILE_ID = re.compile(r"^[a-z][a-z0-9_]{0,127}$")
27
+ _PROFILE_DOMAIN = b"agent-evolve:heterogeneous-model-profile:v1\x00"
28
+
29
+
30
+ def _canonical_json(value: object) -> bytes:
31
+ return json.dumps(
32
+ value,
33
+ allow_nan=False,
34
+ ensure_ascii=True,
35
+ separators=(",", ":"),
36
+ sort_keys=True,
37
+ ).encode("ascii", errors="strict")
38
+
39
+
40
+ @dataclass(frozen=True, slots=True)
41
+ class ModelLaneBinding:
42
+ """Bind one opaque lane ID to one complete provider execution contract."""
43
+
44
+ lane_id: str
45
+ profile: OpenRouterModelExecutionProfile
46
+
47
+ def __post_init__(self) -> None:
48
+ if (
49
+ type(self.lane_id) is not str
50
+ or _LANE_ID.fullmatch(self.lane_id) is None
51
+ ):
52
+ raise ValueError(
53
+ "lane_id must use the closed lowercase token grammar"
54
+ )
55
+ if type(self.profile) is not OpenRouterModelExecutionProfile:
56
+ raise TypeError("profile must be an exact execution profile")
57
+ self.profile.__post_init__()
58
+
59
+
60
+ @dataclass(frozen=True, slots=True)
61
+ class HeterogeneousModelExecutionProfile:
62
+ """Canonical, workload-free portfolio of independently queued models."""
63
+
64
+ profile_id: str
65
+ lanes: tuple[ModelLaneBinding, ...]
66
+
67
+ def __post_init__(self) -> None:
68
+ if (
69
+ type(self.profile_id) is not str
70
+ or _PROFILE_ID.fullmatch(self.profile_id) is None
71
+ ):
72
+ raise ValueError(
73
+ "profile_id must use the closed lowercase token grammar"
74
+ )
75
+ if (
76
+ type(self.lanes) is not tuple
77
+ or len(self.lanes) < 2
78
+ or any(type(value) is not ModelLaneBinding for value in self.lanes)
79
+ ):
80
+ raise TypeError(
81
+ "lanes must be an exact tuple with at least two bindings"
82
+ )
83
+ for lane in self.lanes:
84
+ lane.__post_init__()
85
+ lane_ids = tuple(value.lane_id for value in self.lanes)
86
+ if lane_ids != tuple(sorted(set(lane_ids))):
87
+ raise ValueError("model lanes must be unique and canonical")
88
+ models = tuple(
89
+ value.profile.requested_model for value in self.lanes
90
+ )
91
+ if len(models) != len(set(models)):
92
+ raise ValueError(
93
+ "each requested model must identify exactly one lane"
94
+ )
95
+
96
+ @property
97
+ def lane_ids(self) -> tuple[str, ...]:
98
+ self.__post_init__()
99
+ return tuple(value.lane_id for value in self.lanes)
100
+
101
+ def lane(self, lane_id: str) -> ModelLaneBinding:
102
+ self.__post_init__()
103
+ matches = tuple(
104
+ value for value in self.lanes if value.lane_id == lane_id
105
+ )
106
+ if len(matches) != 1:
107
+ raise KeyError(f"unknown model lane: {lane_id}")
108
+ return matches[0]
109
+
110
+ def _unsigned_record(self) -> dict[str, object]:
111
+ self.__post_init__()
112
+ return {
113
+ "schema_version": 1,
114
+ "profile_id": self.profile_id,
115
+ "lanes": [
116
+ {
117
+ "lane_id": value.lane_id,
118
+ "profile": value.profile.to_record(),
119
+ }
120
+ for value in self.lanes
121
+ ],
122
+ "routing": "operation_suffix_then_repair_call_lineage",
123
+ "independent_provider_queues": True,
124
+ "workload_specific_fields": [],
125
+ }
126
+
127
+ @property
128
+ def profile_sha256(self) -> str:
129
+ return hashlib.sha256(
130
+ _PROFILE_DOMAIN + _canonical_json(self._unsigned_record())
131
+ ).hexdigest()
132
+
133
+ def to_record(self) -> dict[str, object]:
134
+ record = self._unsigned_record()
135
+ record["profile_sha256"] = self.profile_sha256
136
+ return record
137
+
138
+ def validate_telemetry(
139
+ self,
140
+ telemetry: AgenticCallTelemetry,
141
+ ) -> None:
142
+ """Delegate terminal validation to the uniquely identified lane."""
143
+
144
+ self.__post_init__()
145
+ matches = tuple(
146
+ value.profile
147
+ for value in self.lanes
148
+ if telemetry.requested_model == value.profile.requested_model
149
+ )
150
+ if len(matches) != 1:
151
+ raise ValueError(
152
+ "telemetry does not identify exactly one model lane"
153
+ )
154
+ matches[0].validate_telemetry(telemetry)
155
+
156
+
157
+ @dataclass(frozen=True, slots=True)
158
+ class HeterogeneousRunnerConfig:
159
+ """The only shared state required to instantiate independent queues."""
160
+
161
+ seed: int
162
+
163
+ def __post_init__(self) -> None:
164
+ if type(self.seed) is not int or self.seed < 0:
165
+ raise ValueError("seed must be a non-negative exact integer")
166
+
167
+
168
+ class StructuredRunnerPort(Protocol):
169
+ """Minimum async surface required from a model-lane runner."""
170
+
171
+ async def __call__(self, request: Any) -> Any:
172
+ """Execute one structured request."""
173
+
174
+ async def aclose(self) -> None:
175
+ """Release runner resources."""
176
+
177
+
178
+ LaneRunnerFactory = Callable[
179
+ [ModelLaneBinding, int],
180
+ StructuredRunnerPort,
181
+ ]
182
+
183
+
184
+ class OperationSuffixDispatchingStructuredRunner:
185
+ """Route calls by authenticated operation and repair-call lineage.
186
+
187
+ A proposal expert binds ``_<lane_id>`` to its operation. Repair calls
188
+ retain the originating call ID plus a configured suffix and are routed to
189
+ the same queue. No prompt, workload, objective, candidate, or provider
190
+ field is inspected.
191
+ """
192
+
193
+ def __init__(
194
+ self,
195
+ *,
196
+ profile: HeterogeneousModelExecutionProfile,
197
+ runners: tuple[tuple[str, StructuredRunnerPort], ...],
198
+ repair_call_id_suffixes: tuple[str, ...] = ("_reground",),
199
+ ) -> None:
200
+ profile.__post_init__()
201
+ if (
202
+ type(runners) is not tuple
203
+ or any(
204
+ type(value) is not tuple or len(value) != 2
205
+ for value in runners
206
+ )
207
+ ):
208
+ raise TypeError("runners must be an exact tuple of lane pairs")
209
+ runner_ids = tuple(value[0] for value in runners)
210
+ if runner_ids != profile.lane_ids:
211
+ raise ValueError(
212
+ "runner lanes must exactly match the canonical profile"
213
+ )
214
+ if (
215
+ type(repair_call_id_suffixes) is not tuple
216
+ or not repair_call_id_suffixes
217
+ or any(
218
+ type(value) is not str
219
+ or not value.startswith("_")
220
+ or len(value) < 2
221
+ for value in repair_call_id_suffixes
222
+ )
223
+ or repair_call_id_suffixes
224
+ != tuple(sorted(set(repair_call_id_suffixes)))
225
+ ):
226
+ raise ValueError(
227
+ "repair suffixes must be a canonical non-empty tuple"
228
+ )
229
+ self._profile = profile
230
+ self._runners = dict(runners)
231
+ self._repair_call_id_suffixes = repair_call_id_suffixes
232
+ self._route_by_call_id: dict[str, str] = {}
233
+
234
+ def _route(self, request: Any) -> str:
235
+ operation = getattr(request, "operation", None)
236
+ call_id_value = getattr(getattr(request, "call_id", None), "value", None)
237
+ if type(operation) is not str or type(call_id_value) is not str:
238
+ raise TypeError(
239
+ "structured request must expose string operation and call ID"
240
+ )
241
+ direct = tuple(
242
+ lane_id
243
+ for lane_id in self._profile.lane_ids
244
+ if operation.endswith(f"_{lane_id}")
245
+ )
246
+ if len(direct) == 1:
247
+ route = direct[0]
248
+ self._route_by_call_id[call_id_value] = route
249
+ return route
250
+ for suffix in self._repair_call_id_suffixes:
251
+ if not call_id_value.endswith(suffix):
252
+ continue
253
+ source_call_id = call_id_value.removesuffix(suffix)
254
+ route = self._route_by_call_id.get(source_call_id)
255
+ if route is not None:
256
+ self._route_by_call_id[call_id_value] = route
257
+ return route
258
+ raise ValueError(
259
+ "structured request has no authenticated model-lane route"
260
+ )
261
+
262
+ async def __call__(self, request: Any) -> Any:
263
+ return await self._runners[self._route(request)](request)
264
+
265
+ async def aclose(self) -> None:
266
+ await asyncio.gather(
267
+ *(self._runners[value].aclose() for value in self._profile.lane_ids)
268
+ )
269
+
270
+
271
+ def compose_operation_suffix_dispatching_runner(
272
+ *,
273
+ profile: HeterogeneousModelExecutionProfile,
274
+ config: HeterogeneousRunnerConfig,
275
+ lane_runner_factory: LaneRunnerFactory,
276
+ repair_call_id_suffixes: tuple[str, ...] = ("_reground",),
277
+ ) -> OperationSuffixDispatchingStructuredRunner:
278
+ """Instantiate one independently configured queue per opaque model lane."""
279
+
280
+ profile.__post_init__()
281
+ config.__post_init__()
282
+ if not callable(lane_runner_factory):
283
+ raise TypeError("lane_runner_factory must be callable")
284
+ runners = tuple(
285
+ (
286
+ binding.lane_id,
287
+ lane_runner_factory(binding, config.seed + ordinal),
288
+ )
289
+ for ordinal, binding in enumerate(profile.lanes)
290
+ )
291
+ return OperationSuffixDispatchingStructuredRunner(
292
+ profile=profile,
293
+ runners=runners,
294
+ repair_call_id_suffixes=repair_call_id_suffixes,
295
+ )
296
+
297
+
298
+ __all__ = [
299
+ "HeterogeneousModelExecutionProfile",
300
+ "HeterogeneousRunnerConfig",
301
+ "LaneRunnerFactory",
302
+ "ModelLaneBinding",
303
+ "OperationSuffixDispatchingStructuredRunner",
304
+ "StructuredRunnerPort",
305
+ "compose_operation_suffix_dispatching_runner",
306
+ ]
@@ -0,0 +1,179 @@
1
+ """Adaptive semantic cells from generic hierarchical-residual evidence."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import hashlib
6
+ import json
7
+ from dataclasses import dataclass, field
8
+
9
+ from agent_evolve.application.materialized_action_broker import (
10
+ MaterializedActionDescriptor,
11
+ )
12
+ from agent_evolve.application.outcome_adaptive_residual_portfolio_evolution import (
13
+ AdaptiveActionSemanticView,
14
+ )
15
+ from agent_evolve.domain.patch import require_sha256
16
+ from agent_evolve.integrations.pydantic_ai.materialized_hierarchical_residual_expert import (
17
+ MaterializedHierarchicalResidualActionEvidencePort,
18
+ )
19
+
20
+
21
+ HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID = (
22
+ "hierarchical_residual_adaptive_semantic_view"
23
+ )
24
+ HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION = 1
25
+ _DEFINITION_DOMAIN = (
26
+ b"agent-evolve:hierarchical-residual-adaptive-semantic-view:v1\x00"
27
+ )
28
+
29
+
30
+ def _canonical_json(value: object) -> bytes:
31
+ return json.dumps(
32
+ value,
33
+ allow_nan=False,
34
+ ensure_ascii=True,
35
+ separators=(",", ":"),
36
+ sort_keys=True,
37
+ ).encode("ascii", errors="strict")
38
+
39
+
40
+ @dataclass(frozen=True, slots=True)
41
+ class HierarchicalResidualAdaptiveSemanticView:
42
+ """Hash portable component and forecast-direction claims into cells."""
43
+
44
+ evidence_sources: tuple[
45
+ MaterializedHierarchicalResidualActionEvidencePort,
46
+ ...,
47
+ ] = field(repr=False, compare=False)
48
+ projection_id: str = HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID
49
+ projection_version: int = (
50
+ HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION
51
+ )
52
+ definition_sha256: str = field(init=False)
53
+
54
+ def __post_init__(self) -> None:
55
+ if (
56
+ type(self.evidence_sources) is not tuple
57
+ or not self.evidence_sources
58
+ ):
59
+ raise ValueError("evidence_sources must be non-empty")
60
+ identities: list[dict[str, object]] = []
61
+ for source in self.evidence_sources:
62
+ if not isinstance(
63
+ source,
64
+ MaterializedHierarchicalResidualActionEvidencePort,
65
+ ):
66
+ raise TypeError("evidence source must implement its port")
67
+ expert_id = getattr(source, "expert_id", None)
68
+ expert_version = getattr(source, "expert_version", None)
69
+ definition_sha256 = getattr(
70
+ source,
71
+ "definition_sha256",
72
+ None,
73
+ )
74
+ if type(expert_id) is not str or not expert_id:
75
+ raise ValueError("evidence source expert_id is malformed")
76
+ if type(expert_version) is not int or expert_version <= 0:
77
+ raise ValueError("evidence source version is malformed")
78
+ require_sha256(
79
+ definition_sha256,
80
+ "evidence source definition",
81
+ )
82
+ identities.append(
83
+ {
84
+ "expert_id": expert_id,
85
+ "expert_version": expert_version,
86
+ "definition_sha256": definition_sha256,
87
+ }
88
+ )
89
+ if [value["expert_id"] for value in identities] != sorted(
90
+ {value["expert_id"] for value in identities}
91
+ ):
92
+ raise ValueError(
93
+ "evidence sources must be unique and expert-canonical"
94
+ )
95
+ object.__setattr__(
96
+ self,
97
+ "definition_sha256",
98
+ hashlib.sha256(
99
+ _DEFINITION_DOMAIN
100
+ + _canonical_json(
101
+ {
102
+ "schema_version": 1,
103
+ "projection_id": self.projection_id,
104
+ "projection_version": self.projection_version,
105
+ "evidence_sources": identities,
106
+ "operator_group": "component_count",
107
+ "semantic_cells": (
108
+ "hashed_component_identity_and_forecast_direction"
109
+ ),
110
+ "candidate_outcomes_observed": False,
111
+ "workload_objective_model_provider_prompt_branches": (
112
+ False
113
+ ),
114
+ }
115
+ )
116
+ ).hexdigest(),
117
+ )
118
+
119
+ def view(
120
+ self,
121
+ action: MaterializedActionDescriptor,
122
+ ) -> AdaptiveActionSemanticView:
123
+ self.__post_init__()
124
+ if type(action) is not MaterializedActionDescriptor:
125
+ raise TypeError("action must be exact")
126
+ action.__post_init__()
127
+ matches = tuple(
128
+ value
129
+ for source in self.evidence_sources
130
+ if (
131
+ value := source.evidence_for(action.action_sha256)
132
+ )
133
+ is not None
134
+ )
135
+ if len(matches) != 1:
136
+ raise ValueError(
137
+ "one action must have exactly one semantic evidence row"
138
+ )
139
+ evidence = matches[0]
140
+ evidence.__post_init__()
141
+ cells = {
142
+ f"components:{len(evidence.plan.component_option_ids)}"
143
+ }
144
+ cells.update(
145
+ "component:"
146
+ + hashlib.sha256(
147
+ value.encode("utf-8")
148
+ ).hexdigest()[:16]
149
+ for value in evidence.plan.component_option_ids
150
+ )
151
+ cells.update(
152
+ "direction:"
153
+ + hashlib.sha256(
154
+ (
155
+ f"{value.metric_id}:"
156
+ + (
157
+ "increase"
158
+ if value.p50_delta > 0.0
159
+ else "decrease"
160
+ if value.p50_delta < 0.0
161
+ else "unchanged"
162
+ )
163
+ ).encode("utf-8")
164
+ ).hexdigest()[:16]
165
+ for value in evidence.effect_predictions
166
+ )
167
+ return AdaptiveActionSemanticView(
168
+ operator_id=(
169
+ f"components:{len(evidence.plan.component_option_ids)}"
170
+ ),
171
+ semantic_cell_ids=tuple(sorted(cells)),
172
+ )
173
+
174
+
175
+ __all__ = [
176
+ "HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_ID",
177
+ "HIERARCHICAL_RESIDUAL_ADAPTIVE_SEMANTIC_VIEW_VERSION",
178
+ "HierarchicalResidualAdaptiveSemanticView",
179
+ ]
@@ -0,0 +1,108 @@
1
+ """Model-route-owned JSON-schema compatibility transformations.
2
+
3
+ Provider-native structured output APIs do not all implement the same JSON
4
+ Schema vocabulary. These transformations affect only the schema sent on the
5
+ wire; AgentEvolve still validates the returned object against the original
6
+ Pydantic type, so semantic and validation constraints remain authoritative.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ from enum import Enum
12
+ from typing import Any
13
+
14
+
15
+ class OpenRouterJsonSchemaDialect(str, Enum):
16
+ """Closed wire-schema dialect selected by a model execution profile."""
17
+
18
+ PROVIDER_DEFAULT = "provider_default"
19
+ ALIBABA_NATIVE_V1 = "alibaba_native_v1"
20
+ OPENAI_STRICT_BOUNDED_TEXT_V1 = "openai_strict_bounded_text_v1"
21
+
22
+
23
+ def json_schema_transformer_for_dialect(
24
+ base_transformer: type[Any],
25
+ dialect: OpenRouterJsonSchemaDialect,
26
+ ) -> type[Any]:
27
+ """Compose a provider dialect over Pydantic-AI's model transformer.
28
+
29
+ Alibaba's native JSON-schema endpoint currently rejects the standard
30
+ ``uniqueItems`` array keyword. Dropping it is safe here because the
31
+ request's original Pydantic output type performs the uniqueness check
32
+ after decoding. The inherited transformer continues to own every other
33
+ model-profile transformation, including definition inlining.
34
+ """
35
+
36
+ if not isinstance(base_transformer, type):
37
+ raise TypeError("base_transformer must be a class")
38
+ if type(dialect) is not OpenRouterJsonSchemaDialect:
39
+ raise TypeError("dialect must be an exact OpenRouterJsonSchemaDialect")
40
+ if dialect is OpenRouterJsonSchemaDialect.PROVIDER_DEFAULT:
41
+ return base_transformer
42
+
43
+ if dialect is OpenRouterJsonSchemaDialect.OPENAI_STRICT_BOUNDED_TEXT_V1:
44
+
45
+ class OpenAIStrictBoundedTextJsonSchemaTransformer(base_transformer):
46
+ """Encode unsupported string-length bounds in an allowed pattern.
47
+
48
+ Pydantic-AI's OpenAI strict transformer correctly removes
49
+ ``minLength`` and ``maxLength`` because OpenAI's strict subset does
50
+ not accept those keywords. A bounded anchored pattern retains the
51
+ same generation constraint for unconstrained free-text fields.
52
+ Fields that already own a semantic pattern are left unchanged;
53
+ local Pydantic validation remains authoritative in every case.
54
+ """
55
+
56
+ def transform(self, schema: Any) -> Any:
57
+ if (
58
+ isinstance(schema, dict)
59
+ and self.strict is True
60
+ and schema.get("type") == "string"
61
+ and "pattern" not in schema
62
+ ):
63
+ minimum = schema.get("minLength", 0)
64
+ maximum = schema.get("maxLength")
65
+ if (
66
+ type(minimum) is int
67
+ and minimum >= 0
68
+ and type(maximum) is int
69
+ and minimum <= maximum <= 65_536
70
+ ):
71
+ schema = dict(schema)
72
+ # Newlines are not useful in AgentEvolve's bounded
73
+ # rationale/insight atoms and avoiding DOTALL-specific
74
+ # constructs keeps the provider grammar portable.
75
+ schema["pattern"] = f"^.{{{minimum},{maximum}}}$"
76
+ return super().transform(schema)
77
+
78
+ OpenAIStrictBoundedTextJsonSchemaTransformer.__name__ = (
79
+ "OpenAIStrictBoundedTextJsonSchemaTransformer"
80
+ )
81
+ OpenAIStrictBoundedTextJsonSchemaTransformer.__qualname__ = (
82
+ "OpenAIStrictBoundedTextJsonSchemaTransformer"
83
+ )
84
+ OpenAIStrictBoundedTextJsonSchemaTransformer.__module__ = __name__
85
+ return OpenAIStrictBoundedTextJsonSchemaTransformer
86
+
87
+ class AlibabaNativeJsonSchemaTransformer(base_transformer):
88
+ def transform(self, schema: Any) -> Any:
89
+ transformed = super().transform(schema)
90
+ if isinstance(transformed, dict) and "uniqueItems" in transformed:
91
+ transformed = dict(transformed)
92
+ transformed.pop("uniqueItems")
93
+ return transformed
94
+
95
+ AlibabaNativeJsonSchemaTransformer.__name__ = (
96
+ "AlibabaNativeJsonSchemaTransformer"
97
+ )
98
+ AlibabaNativeJsonSchemaTransformer.__qualname__ = (
99
+ "AlibabaNativeJsonSchemaTransformer"
100
+ )
101
+ AlibabaNativeJsonSchemaTransformer.__module__ = __name__
102
+ return AlibabaNativeJsonSchemaTransformer
103
+
104
+
105
+ __all__ = [
106
+ "OpenRouterJsonSchemaDialect",
107
+ "json_schema_transformer_for_dialect",
108
+ ]