traigent 0.17.0.dev0__tar.gz → 0.18.0.dev0__tar.gz

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 (634) hide show
  1. {traigent-0.17.0.dev0/traigent.egg-info → traigent-0.18.0.dev0}/PKG-INFO +1 -1
  2. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/pyproject.toml +2 -1
  3. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/adapters/execution_adapter.py +16 -2
  4. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/__init__.py +2 -0
  5. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/example_insights.py +3 -2
  6. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/next_steps.py +3 -2
  7. traigent-0.18.0.dev0/traigent/analytics/optimization_plan.py +212 -0
  8. traigent-0.18.0.dev0/traigent/analytics/render.py +349 -0
  9. traigent-0.18.0.dev0/traigent/analytics_mcp/__init__.py +12 -0
  10. traigent-0.18.0.dev0/traigent/analytics_mcp/server.py +280 -0
  11. traigent-0.18.0.dev0/traigent/analytics_mcp/tools.py +454 -0
  12. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/parameter_ranges.py +12 -0
  13. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/types.py +9 -0
  14. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/main.py +4 -0
  15. traigent-0.18.0.dev0/traigent/cli/plan_command.py +225 -0
  16. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/sync_commands.py +10 -0
  17. traigent-0.18.0.dev0/traigent/cloud/analytics_auth.py +73 -0
  18. traigent-0.18.0.dev0/traigent/cloud/analytics_client.py +565 -0
  19. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/auth.py +16 -10
  20. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_client.py +178 -0
  21. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/session_operations.py +3 -0
  22. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/sync_manager.py +204 -23
  23. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/trial_operations.py +20 -1
  24. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/backend_config.py +62 -0
  25. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/project.py +6 -0
  26. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/providers.py +21 -12
  27. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/backend_session_manager.py +3 -9
  28. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cost_enforcement.py +12 -6
  29. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/execution_policy_runtime.py +12 -3
  30. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/mandatory_metrics.py +7 -1
  31. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/objectives.py +12 -5
  32. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/optimized_function.py +121 -3
  33. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/orchestrator.py +44 -20
  34. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/result_selection.py +24 -16
  35. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_lifecycle.py +48 -6
  36. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_result_factory.py +45 -0
  37. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/base.py +102 -1
  38. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/local.py +21 -17
  39. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/metrics.py +4 -1
  40. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/metrics_tracker.py +68 -0
  41. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/__main__.py +51 -13
  42. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/framework_override.py +110 -16
  43. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langchain/handler.py +146 -17
  44. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/server.py +32 -0
  45. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/tools.py +31 -0
  46. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/base.py +20 -34
  47. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/batch_optimizers.py +39 -18
  48. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/grid.py +52 -9
  49. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/random.py +100 -21
  50. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/cost_calculator.py +141 -16
  51. traigent-0.18.0.dev0/traigent/utils/discrete_domains.py +232 -0
  52. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/insights.py +31 -9
  53. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/objectives.py +14 -1
  54. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/optimization_logger.py +6 -1
  55. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0/traigent.egg-info}/PKG-INFO +1 -1
  56. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/SOURCES.txt +9 -7
  57. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/entry_points.txt +1 -0
  58. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/validators.py +67 -9
  59. traigent-0.17.0.dev0/traigent/cloud/event_manager.py +0 -551
  60. traigent-0.17.0.dev0/traigent/core/config_builder.py +0 -565
  61. traigent-0.17.0.dev0/traigent/core/llm_processor.py +0 -357
  62. traigent-0.17.0.dev0/traigent/core/refactoring_utils.py +0 -263
  63. traigent-0.17.0.dev0/traigent/integrations/llms/langchain/discovery.py +0 -311
  64. traigent-0.17.0.dev0/traigent/optimizers/service_registry.py +0 -924
  65. traigent-0.17.0.dev0/traigent/telemetry/__init__.py +0 -5
  66. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CHANGELOG.md +0 -0
  67. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/COMMERCIAL-LICENSE.md +0 -0
  68. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CONTRIBUTING.md +0 -0
  69. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CONTRIBUTOR-LICENSING.md +0 -0
  70. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/DISCLAIMER.md +0 -0
  71. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/LICENSE +0 -0
  72. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/MANIFEST.in +0 -0
  73. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/NOTICE +0 -0
  74. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/README.md +0 -0
  75. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/SECURITY.md +0 -0
  76. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/LOCAL_CI_GATE.md +0 -0
  77. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/README.md +0 -0
  78. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/SYNC_MAP.md +0 -0
  79. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/agent-skill.md +0 -0
  80. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/complete-function-specification.md +0 -0
  81. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/decorator-reference.md +0 -0
  82. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/enterprise-beta-api.md +0 -0
  83. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/interactive_optimizer.md +0 -0
  84. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/telemetry.md +0 -0
  85. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/thread-pool-examples.md +0 -0
  86. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/ARCHITECTURE.md +0 -0
  87. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/cost-architecture-validation.md +0 -0
  88. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/execution_mode_follow_up.md +0 -0
  89. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/integrations-inventory.md +0 -0
  90. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/plugin_architecture.md +0 -0
  91. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/project-structure.md +0 -0
  92. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/stop_conditions.md +0 -0
  93. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/composite-knob-ir.md +0 -0
  94. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/composite-knobs.md +0 -0
  95. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/guided-generation.md +0 -0
  96. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/ADDING_NEW_INTEGRATIONS.md +0 -0
  97. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/CODE_OF_CONDUCT.md +0 -0
  98. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/CONTRIBUTING.md +0 -0
  99. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/EXAMPLE_TEMPLATE.md +0 -0
  100. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/README.md +0 -0
  101. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/SECURITY.md +0 -0
  102. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/aikido_triage.md +0 -0
  103. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/code_review_instructions.md +0 -0
  104. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/test-quality-guide.md +0 -0
  105. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/demos/DEMO_VIDEO_GUIDE.md +0 -0
  106. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/demos/README.md +0 -0
  107. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/API_PATTERNS.md +0 -0
  108. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/LEARNING_ROADMAP.md +0 -0
  109. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/QUICK_REFERENCE.md +0 -0
  110. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/README.md +0 -0
  111. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/START_HERE.md +0 -0
  112. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/TROUBLESHOOTING.md +0 -0
  113. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/fake-completion-tracking.md +0 -0
  114. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/feature_matrices/README.md +0 -0
  115. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/README.md +0 -0
  116. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/authentication.md +0 -0
  117. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/constraint-dsl.md +0 -0
  118. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/dataflow-detection.md +0 -0
  119. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/framework_override_enhanced_features.md +0 -0
  120. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/mcp-server.md +0 -0
  121. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/observability-spans.md +0 -0
  122. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/onboarding.md +0 -0
  123. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/prompt_management.md +0 -0
  124. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/recommendations.md +0 -0
  125. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/safety-gates.md +0 -0
  126. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/seamless_injection.md +0 -0
  127. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/strategy-presets.md +0 -0
  128. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/strict_metrics_nulls.md +0 -0
  129. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/GETTING_STARTED.md +0 -0
  130. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/README.md +0 -0
  131. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/installation.md +0 -0
  132. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/minimal-integration.md +0 -0
  133. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/portal-dev-laptop-agent.md +0 -0
  134. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/testing.md +0 -0
  135. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/VSCODE_RESTART_GUIDE.md +0 -0
  136. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/evaluation.md +0 -0
  137. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/execution-mode-migration.md +0 -0
  138. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/execution-modes.md +0 -0
  139. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/js-bridge.md +0 -0
  140. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/llm_plugin_migration_guide.md +0 -0
  141. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/parallel-configuration.md +0 -0
  142. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/secrets_management.md +0 -0
  143. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/hybrid-mode-api-contract.md +0 -0
  144. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/hybrid-mode-client-guide.md +0 -0
  145. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/azure_openai.md +0 -0
  146. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/bedrock.md +0 -0
  147. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/google_gemini.md +0 -0
  148. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/security/trust_model.md +0 -0
  149. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/testing/CREATIVE_STRESS_TESTING.md +0 -0
  150. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/composite-knob-ir.md +0 -0
  151. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/composite-knobs.md +0 -0
  152. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/guided-generation.md +0 -0
  153. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/schema.md +0 -0
  154. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/tagging_tracking.md +0 -0
  155. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/taxonomy_reference.md +0 -0
  156. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/tvl/CONSTRAINT_EXPRESSIONS.md +0 -0
  157. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/README.md +0 -0
  158. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/agent_optimization.md +0 -0
  159. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/choosing_optimization_model.md +0 -0
  160. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/configuration-spaces.md +0 -0
  161. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/evaluation_guide.md +0 -0
  162. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/injection_modes.md +0 -0
  163. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/interactive_optimization.md +0 -0
  164. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/smart_optimization.md +0 -0
  165. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/tuned_variables.md +0 -0
  166. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/walkthrough.md +0 -0
  167. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-all.txt +0 -0
  168. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-analytics.txt +0 -0
  169. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-bayesian.txt +0 -0
  170. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-chroma.txt +0 -0
  171. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-dev.txt +0 -0
  172. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-hybrid.txt +0 -0
  173. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-integrations.txt +0 -0
  174. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-security.txt +0 -0
  175. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-test.txt +0 -0
  176. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements.txt +0 -0
  177. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/setup.cfg +0 -0
  178. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/__init__.py +0 -0
  179. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/_version.py +0 -0
  180. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/__init__.py +0 -0
  181. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/client.py +0 -0
  182. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/config.py +0 -0
  183. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/dtos.py +0 -0
  184. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/__init__.py +0 -0
  185. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/config_mapper.py +0 -0
  186. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/executor.py +0 -0
  187. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/platforms.py +0 -0
  188. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/specification_generator.py +0 -0
  189. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/anomaly.py +0 -0
  190. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/cost_optimization.py +0 -0
  191. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/intelligence.py +0 -0
  192. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/meta_learning.py +0 -0
  193. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/predictive.py +0 -0
  194. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/scheduling.py +0 -0
  195. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/__init__.py +0 -0
  196. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/agent_inference.py +0 -0
  197. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/config_builder.py +0 -0
  198. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/config_space.py +0 -0
  199. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/constraint_builders.py +0 -0
  200. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/constraints.py +0 -0
  201. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/decorators.py +0 -0
  202. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/functions.py +0 -0
  203. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/parameter_validator.py +0 -0
  204. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/safety.py +0 -0
  205. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/strategy_presets.py +0 -0
  206. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/validation_protocol.py +0 -0
  207. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/__init__.py +0 -0
  208. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/auth_commands.py +0 -0
  209. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/detect_tvars_command.py +0 -0
  210. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/function_discovery.py +0 -0
  211. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/generate_config_command.py +0 -0
  212. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/hooks_commands.py +0 -0
  213. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/local_commands.py +0 -0
  214. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/next_steps_command.py +0 -0
  215. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/onboard_commands.py +0 -0
  216. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/optimization_validator.py +0 -0
  217. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/playbook_commands.py +0 -0
  218. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/validation_types.py +0 -0
  219. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/__init__.py +0 -0
  220. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/_aiohttp_compat.py +0 -0
  221. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/agent_dtos.py +0 -0
  222. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/api_key_manager.py +0 -0
  223. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/api_operations.py +0 -0
  224. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/async_batch_transport.py +0 -0
  225. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_bridges.py +0 -0
  226. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_components.py +0 -0
  227. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_synchronizer.py +0 -0
  228. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/benchmark_client.py +0 -0
  229. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/billing.py +0 -0
  230. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/client.py +0 -0
  231. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/cloud_operations.py +0 -0
  232. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/credential_manager.py +0 -0
  233. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/credential_resolver.py +0 -0
  234. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/dataset_converter.py +0 -0
  235. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/dtos.py +0 -0
  236. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/governance.py +0 -0
  237. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/integration_manager.py +0 -0
  238. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/models.py +0 -0
  239. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/optimizer_client.py +0 -0
  240. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/password_auth_handler.py +0 -0
  241. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/privacy_operations.py +0 -0
  242. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/production_mcp_client.py +0 -0
  243. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/remote_guidance.py +0 -0
  244. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/resilient_client.py +0 -0
  245. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/service.py +0 -0
  246. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/session_types.py +0 -0
  247. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/sessions.py +0 -0
  248. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/subset_selection.py +0 -0
  249. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/token_manager.py +0 -0
  250. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/trial_tracker.py +0 -0
  251. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/url_security.py +0 -0
  252. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/validators.py +0 -0
  253. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/__init__.py +0 -0
  254. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/api_keys.py +0 -0
  255. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/ast_transformer.py +0 -0
  256. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/context.py +0 -0
  257. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/feature_flags.py +0 -0
  258. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/models.yaml +0 -0
  259. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/parallel.py +0 -0
  260. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/runtime_injector.py +0 -0
  261. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/seamless_injection.py +0 -0
  262. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/tenant.py +0 -0
  263. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/types.py +0 -0
  264. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/__init__.py +0 -0
  265. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/agent_classifier.py +0 -0
  266. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/apply.py +0 -0
  267. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_catalog_entry_schema.json +0 -0
  268. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_observation_schema.json +0 -0
  269. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_value_recommendation_schema.json +0 -0
  270. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/tvar_catalog.v1.json +0 -0
  271. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog.py +0 -0
  272. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/llm_backend.py +0 -0
  273. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/pipeline.py +0 -0
  274. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/__init__.py +0 -0
  275. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/agent_type_catalog.py +0 -0
  276. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/benchmark_catalog.py +0 -0
  277. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/constraint_templates.py +0 -0
  278. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/range_presets.py +0 -0
  279. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/recommendations.py +0 -0
  280. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/__init__.py +0 -0
  281. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/benchmarks.py +0 -0
  282. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/objectives.py +0 -0
  283. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/safety_constraints.py +0 -0
  284. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/structural_constraints.py +0 -0
  285. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/tvar_ranges.py +0 -0
  286. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/tvar_recommendations.py +0 -0
  287. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/types.py +0 -0
  288. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/__init__.py +0 -0
  289. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/best_config_runtime.py +0 -0
  290. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cache_policy.py +0 -0
  291. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/ci_approval.py +0 -0
  292. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/config_state_manager.py +0 -0
  293. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/constants.py +0 -0
  294. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cost_estimator.py +0 -0
  295. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/evaluator_wrapper.py +0 -0
  296. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/exception_handler.py +0 -0
  297. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/license.py +0 -0
  298. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/logger_facade.py +0 -0
  299. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/meta_types.py +0 -0
  300. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metadata_helpers.py +0 -0
  301. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metric_registry.py +0 -0
  302. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metrics_aggregator.py +0 -0
  303. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/namespace.py +0 -0
  304. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/optimization_pipeline.py +0 -0
  305. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/orchestrator_helpers.py +0 -0
  306. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/parallel_execution_manager.py +0 -0
  307. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/progress_manager.py +0 -0
  308. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/sample_budget.py +0 -0
  309. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/samplers/__init__.py +0 -0
  310. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/samplers/random_sampler.py +0 -0
  311. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/session_context.py +0 -0
  312. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/session_types.py +0 -0
  313. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stat_significance.py +0 -0
  314. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stop_condition_manager.py +0 -0
  315. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stop_conditions.py +0 -0
  316. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trace_env.py +0 -0
  317. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/tracing.py +0 -0
  318. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_context.py +0 -0
  319. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/types.py +0 -0
  320. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/types_ext.py +0 -0
  321. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/utils.py +0 -0
  322. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/workflow_trace_manager.py +0 -0
  323. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/__init__.py +0 -0
  324. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/client.py +0 -0
  325. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/config.py +0 -0
  326. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/dtos.py +0 -0
  327. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/__init__.py +0 -0
  328. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/contracts.py +0 -0
  329. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/__init__.py +0 -0
  330. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/framework_param.py +0 -0
  331. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/self_consistency.py +0 -0
  332. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/__init__.py +0 -0
  333. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/client.py +0 -0
  334. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/config.py +0 -0
  335. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/dtos.py +0 -0
  336. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/__init__.py +0 -0
  337. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog/metric_eval_catalog.v1.json +0 -0
  338. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog/schemas/metric_eval_catalog_entry_schema.json +0 -0
  339. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog_loader.py +0 -0
  340. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/dataset_registry.py +0 -0
  341. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/hybrid_api.py +0 -0
  342. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/recommendations.py +0 -0
  343. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/__init__.py +0 -0
  344. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/__init__.py +0 -0
  345. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/_bootstrap.py +0 -0
  346. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/_demo.py +0 -0
  347. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/anthropic.py +0 -0
  348. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/aws.py +0 -0
  349. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/azure.py +0 -0
  350. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/gcp.py +0 -0
  351. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/gemini.py +0 -0
  352. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/groq.py +0 -0
  353. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/litellm_any.py +0 -0
  354. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/manifest.json +0 -0
  355. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/openai.py +0 -0
  356. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/openrouter.py +0 -0
  357. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/qa_samples.jsonl +0 -0
  358. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/__init__.py +0 -0
  359. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/_env.py +0 -0
  360. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/qa_samples.jsonl +0 -0
  361. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/tutorial_bootstrap.py +0 -0
  362. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/__init__.py +0 -0
  363. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/backend_provider.py +0 -0
  364. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/example_synth.py +0 -0
  365. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/llm_provider.py +0 -0
  366. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/loop.py +0 -0
  367. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/models.py +0 -0
  368. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/options.py +0 -0
  369. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/prompt_rewriter.py +0 -0
  370. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/__init__.py +0 -0
  371. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/artifacts.py +0 -0
  372. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/buffer.py +0 -0
  373. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/document.py +0 -0
  374. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/edits.py +0 -0
  375. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/prompts.py +0 -0
  376. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/reflection.py +0 -0
  377. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/schedule.py +0 -0
  378. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/slow_update.py +0 -0
  379. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/splits.py +0 -0
  380. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/trainer.py +0 -0
  381. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/trainer_result.py +0 -0
  382. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/validators.py +0 -0
  383. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/guaranteed_modes.py +0 -0
  384. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/__init__.py +0 -0
  385. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/config.py +0 -0
  386. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/installer.py +0 -0
  387. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/validator.py +0 -0
  388. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/__init__.py +0 -0
  389. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/discovery.py +0 -0
  390. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/http_transport.py +0 -0
  391. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/lifecycle.py +0 -0
  392. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/mcp_transport.py +0 -0
  393. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/protocol.py +0 -0
  394. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/transport.py +0 -0
  395. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/__init__.py +0 -0
  396. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/activation.py +0 -0
  397. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/base.py +0 -0
  398. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/base_plugin.py +0 -0
  399. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/batch_wrapper.py +0 -0
  400. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/bedrock_client.py +0 -0
  401. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/config.py +0 -0
  402. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/dspy_adapter.py +0 -0
  403. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langchain/__init__.py +0 -0
  404. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/__init__.py +0 -0
  405. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/callback.py +0 -0
  406. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/client.py +0 -0
  407. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/tracker.py +0 -0
  408. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/__init__.py +0 -0
  409. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/anthropic_plugin.py +0 -0
  410. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/azure_openai_plugin.py +0 -0
  411. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/base_llm_plugin.py +0 -0
  412. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/bedrock_plugin.py +0 -0
  413. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/cohere_plugin.py +0 -0
  414. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/gemini_plugin.py +0 -0
  415. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/huggingface_plugin.py +0 -0
  416. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain/__init__.py +0 -0
  417. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain/base.py +0 -0
  418. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain_plugin.py +0 -0
  419. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/litellm_plugin.py +0 -0
  420. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/llamaindex_plugin.py +0 -0
  421. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/mistral_plugin.py +0 -0
  422. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/openai.py +0 -0
  423. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/openai_plugin.py +0 -0
  424. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/mappings.py +0 -0
  425. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/__init__.py +0 -0
  426. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/anthropic_discovery.py +0 -0
  427. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/azure_discovery.py +0 -0
  428. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/base.py +0 -0
  429. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/cache.py +0 -0
  430. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/gemini_discovery.py +0 -0
  431. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/mistral_discovery.py +0 -0
  432. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/openai_discovery.py +0 -0
  433. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/registry.py +0 -0
  434. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/__init__.py +0 -0
  435. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/mlflow.py +0 -0
  436. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/wandb.py +0 -0
  437. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/workflow_traces.py +0 -0
  438. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/plugin_registry.py +0 -0
  439. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/providers.py +0 -0
  440. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/__init__.py +0 -0
  441. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/_types.py +0 -0
  442. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/handler.py +0 -0
  443. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/plugin.py +0 -0
  444. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/__init__.py +0 -0
  445. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/discovery.py +0 -0
  446. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/message_coercion.py +0 -0
  447. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/mock_adapter.py +0 -0
  448. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/parameter_normalizer.py +0 -0
  449. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/response_wrapper.py +0 -0
  450. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/validation.py +0 -0
  451. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/version_compat.py +0 -0
  452. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/__init__.py +0 -0
  453. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/base.py +0 -0
  454. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/chromadb_plugin.py +0 -0
  455. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/pinecone_plugin.py +0 -0
  456. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/weaviate_plugin.py +0 -0
  457. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/wrappers.py +0 -0
  458. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/__init__.py +0 -0
  459. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/base.py +0 -0
  460. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/batch.py +0 -0
  461. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/local.py +0 -0
  462. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/streaming.py +0 -0
  463. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/__init__.py +0 -0
  464. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/adapters.py +0 -0
  465. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/bindings.py +0 -0
  466. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/canonical.py +0 -0
  467. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/cascade.py +0 -0
  468. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/certificates.py +0 -0
  469. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/composites.py +0 -0
  470. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/kinds.py +0 -0
  471. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/patterns.py +0 -0
  472. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/resolution.py +0 -0
  473. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/resolver.py +0 -0
  474. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/runtime.py +0 -0
  475. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/signals.py +0 -0
  476. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/telemetry.py +0 -0
  477. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/__init__.py +0 -0
  478. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/__init__.py +0 -0
  479. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/agent_metrics.py +0 -0
  480. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/content_features.py +0 -0
  481. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/deepeval_metrics.py +0 -0
  482. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/ragas_metrics.py +0 -0
  483. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/registry.py +0 -0
  484. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/__init__.py +0 -0
  485. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/agent_spans.py +0 -0
  486. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/client.py +0 -0
  487. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/config.py +0 -0
  488. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/decorators.py +0 -0
  489. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/dtos.py +0 -0
  490. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/__init__.py +0 -0
  491. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/cloud_optimizer.py +0 -0
  492. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/interactive_optimizer.py +0 -0
  493. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/registry.py +0 -0
  494. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/remote.py +0 -0
  495. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/remote_services.py +0 -0
  496. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/results.py +0 -0
  497. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/__init__.py +0 -0
  498. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/loader.py +0 -0
  499. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/model.py +0 -0
  500. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/scaffold.py +0 -0
  501. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/schemas/agent_playbook_schema.json +0 -0
  502. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/staleness.py +0 -0
  503. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/validator.py +0 -0
  504. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/plugins/__init__.py +0 -0
  505. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/plugins/registry.py +0 -0
  506. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/__init__.py +0 -0
  507. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/client.py +0 -0
  508. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/config.py +0 -0
  509. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/dtos.py +0 -0
  510. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/__init__.py +0 -0
  511. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/client.py +0 -0
  512. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/config.py +0 -0
  513. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/dtos.py +0 -0
  514. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/providers/__init__.py +0 -0
  515. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/providers/validation.py +0 -0
  516. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/py.typed +0 -0
  517. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/reporting/__init__.py +0 -0
  518. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/reporting/example_map.py +0 -0
  519. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/__init__.py +0 -0
  520. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/audit.py +0 -0
  521. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/__init__.py +0 -0
  522. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/helpers.py +0 -0
  523. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/mfa.py +0 -0
  524. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/models.py +0 -0
  525. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/oidc.py +0 -0
  526. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/saml.py +0 -0
  527. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/sms.py +0 -0
  528. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/totp.py +0 -0
  529. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/config.py +0 -0
  530. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/credentials.py +0 -0
  531. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/crypto_utils.py +0 -0
  532. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/deployment.py +0 -0
  533. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/encryption.py +0 -0
  534. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/enterprise.py +0 -0
  535. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/headers.py +0 -0
  536. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/input_validation.py +0 -0
  537. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/jwt_validator.py +0 -0
  538. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/rate_limiter.py +0 -0
  539. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/redaction.py +0 -0
  540. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/session_manager.py +0 -0
  541. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/tenant.py +0 -0
  542. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/SKILL.md +0 -0
  543. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/references/convergence-patterns.md +0 -0
  544. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/references/optimization-result-api.md +0 -0
  545. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/SKILL.md +0 -0
  546. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/references/constraints.md +0 -0
  547. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/references/parameter-types.md +0 -0
  548. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/SKILL.md +0 -0
  549. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/error-reference.md +0 -0
  550. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/logging-config.md +0 -0
  551. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/mock-mode.md +0 -0
  552. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/SKILL.md +0 -0
  553. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/evaluation-options.md +0 -0
  554. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/execution-modes.md +0 -0
  555. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/injection-modes.md +0 -0
  556. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/SKILL.md +0 -0
  557. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/dspy.md +0 -0
  558. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/langchain.md +0 -0
  559. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/litellm.md +0 -0
  560. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/SKILL.md +0 -0
  561. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/references/environment-variables.md +0 -0
  562. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/references/installation-extras.md +0 -0
  563. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/SKILL.md +0 -0
  564. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/algorithms.md +0 -0
  565. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/cost-management.md +0 -0
  566. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/parallel-config.md +0 -0
  567. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/storage/__init__.py +0 -0
  568. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/storage/local_storage.py +0 -0
  569. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/testing/__init__.py +0 -0
  570. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/traigent_client.py +0 -0
  571. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/traigent_integration.py +0 -0
  572. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/__init__.py +0 -0
  573. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/dataflow_strategy.py +0 -0
  574. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detection_strategies.py +0 -0
  575. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detection_types.py +0 -0
  576. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detector.py +0 -0
  577. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/discovery.py +0 -0
  578. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/observation.py +0 -0
  579. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/py.typed +0 -0
  580. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/__init__.py +0 -0
  581. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/__main__.py +0 -0
  582. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/models.py +0 -0
  583. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/objectives.py +0 -0
  584. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/options.py +0 -0
  585. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/promotion_gate.py +0 -0
  586. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/registry.py +0 -0
  587. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/spec_loader.py +0 -0
  588. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/spec_validator.py +0 -0
  589. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/statistics.py +0 -0
  590. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/__init__.py +0 -0
  591. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/batch_optimizer_utils.py +0 -0
  592. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/batch_processing.py +0 -0
  593. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/callbacks.py +0 -0
  594. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/console.py +0 -0
  595. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/constraints.py +0 -0
  596. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/diagnostics.py +0 -0
  597. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/env_config.py +0 -0
  598. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/error_handler.py +0 -0
  599. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/example_id.py +0 -0
  600. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/exceptions.py +0 -0
  601. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/file_versioning.py +0 -0
  602. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/function_identity.py +0 -0
  603. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/hashing.py +0 -0
  604. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/importance.py +0 -0
  605. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/incentives.py +0 -0
  606. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/langchain_interceptor.py +0 -0
  607. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/litellm_interceptor.py +0 -0
  608. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/llm_response_parsing.py +0 -0
  609. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/local_analytics.py +0 -0
  610. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/logging.py +0 -0
  611. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/multi_objective.py +0 -0
  612. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/numpy_compat.py +0 -0
  613. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/optimization_analyzer.py +0 -0
  614. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/persistence.py +0 -0
  615. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/reproducibility.py +0 -0
  616. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/results_table.py +0 -0
  617. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/retry.py +0 -0
  618. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/secure_path.py +0 -0
  619. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/url_security.py +0 -0
  620. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/user_prompts.py +0 -0
  621. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/validation.py +0 -0
  622. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/visualization/__init__.py +0 -0
  623. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/visualization/plots.py +0 -0
  624. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/__init__.py +0 -0
  625. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/errors.py +0 -0
  626. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/server.py +0 -0
  627. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/service.py +0 -0
  628. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/dependency_links.txt +0 -0
  629. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/requires.txt +0 -0
  630. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/top_level.txt +0 -0
  631. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/__init__.py +0 -0
  632. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/base.py +0 -0
  633. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/plugins.py +0 -0
  634. {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: traigent
3
- Version: 0.17.0.dev0
3
+ Version: 0.18.0.dev0
4
4
  Summary: Enterprise-grade LLM optimization platform with advanced analytics and AI-powered insights
5
5
  Author-email: Traigent Team <opensource@traigent.ai>
6
6
  License-Expression: AGPL-3.0-only OR LicenseRef-Traigent-Commercial
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "traigent"
7
- version = "0.17.0.dev0"
7
+ version = "0.18.0.dev0"
8
8
  authors = [
9
9
  {name = "Traigent Team", email = "opensource@traigent.ai"},
10
10
  ]
@@ -239,6 +239,7 @@ Changelog = "https://github.com/Traigent/Traigent/blob/main/CHANGELOG.md"
239
239
 
240
240
  [project.scripts]
241
241
  traigent = "traigent.cli.main:cli"
242
+ traigent-analytics-mcp = "traigent.analytics_mcp.server:main"
242
243
 
243
244
  [project.entry-points."traigent.validators"]
244
245
  python = "traigent_validation.validators:PythonConstraintValidator"
@@ -9,6 +9,7 @@ from abc import ABC, abstractmethod
9
9
  from typing import Any, cast
10
10
 
11
11
  from traigent.config.types import ExecutionMode
12
+ from traigent.evaluators.base import _accuracy_values_match
12
13
 
13
14
  logger = logging.getLogger(__name__)
14
15
 
@@ -192,7 +193,7 @@ class LocalExecutionAdapter(ExecutionAdapter):
192
193
  # Exact / case-insensitive match — must stay aligned with
193
194
  # LocalEvaluator and the public docs (the tracked fix). Diverging
194
195
  # here was how "Paris" vs "paris" silently scored 0.0.
195
- is_correct = str(output).strip().lower() == str(expected).strip().lower()
196
+ is_correct = _accuracy_values_match(output, expected)
196
197
  result["correct"] = is_correct
197
198
 
198
199
  elif eval_type == "contains":
@@ -245,8 +246,21 @@ class LocalExecutionAdapter(ExecutionAdapter):
245
246
 
246
247
  else:
247
248
  # Unknown evaluation type
248
- result["correct"] = None
249
+ result["correct"] = False
250
+ result["success"] = False
249
251
  result["unknown_eval_type"] = eval_type
252
+ result["error"] = (
253
+ f"Unsupported evaluation_type '{eval_type}'. "
254
+ "Use exact_match, contains, numeric, semantic with a custom evaluator, "
255
+ "or provide a scoring_function."
256
+ )
257
+ logger.error(
258
+ "Unsupported evaluation_type %r for LocalExecutionAdapter; marking "
259
+ "example as failed. trial_id=%s example_index=%s",
260
+ eval_type,
261
+ trial_id or "<unknown>",
262
+ example_index if example_index is not None else "<unknown>",
263
+ )
250
264
 
251
265
  return result
252
266
 
@@ -92,6 +92,7 @@ except ImportError:
92
92
  PerformancePredictor,
93
93
  )
94
94
  from .next_steps import NextStepsClient
95
+ from .optimization_plan import OptimizationPlanClient
95
96
 
96
97
  # Predictive analytics
97
98
  from .predictive import (
@@ -130,6 +131,7 @@ __all__ = [
130
131
  # Example Insights
131
132
  "ExampleInsightsClient",
132
133
  "NextStepsClient",
134
+ "OptimizationPlanClient",
133
135
  # Historical analytics
134
136
  "HistoricalAnalyticsEngine",
135
137
  "OptimizationHistory",
@@ -30,6 +30,7 @@ import asyncio
30
30
  import time
31
31
  from typing import Any, cast
32
32
 
33
+ from traigent.cloud.auth import _build_api_key_auth_headers
33
34
  from traigent.config.backend_config import DEFAULT_LOCAL_URL
34
35
  from traigent.utils.logging import get_logger
35
36
 
@@ -100,9 +101,9 @@ class ExampleInsightsClient:
100
101
 
101
102
  raise_if_backend_offline("ExampleInsightsClient request")
102
103
  if self._client is None:
103
- headers = {}
104
+ headers: dict[str, str] = {}
104
105
  if self.api_key:
105
- headers["Authorization"] = f"Bearer {self.api_key}"
106
+ headers.update(_build_api_key_auth_headers(self.api_key))
106
107
 
107
108
  self._client = httpx.AsyncClient(
108
109
  base_url=self.backend_url,
@@ -23,6 +23,7 @@ from __future__ import annotations
23
23
 
24
24
  from typing import Any, cast
25
25
 
26
+ from traigent.cloud.auth import _build_api_key_auth_headers
26
27
  from traigent.config.backend_config import DEFAULT_LOCAL_URL
27
28
  from traigent.utils.logging import get_logger
28
29
 
@@ -102,9 +103,9 @@ class NextStepsClient:
102
103
 
103
104
  raise_if_backend_offline("NextStepsClient request")
104
105
  if self._client is None:
105
- headers = {}
106
+ headers: dict[str, str] = {}
106
107
  if self.api_key:
107
- headers["Authorization"] = f"Bearer {self.api_key}"
108
+ headers.update(_build_api_key_auth_headers(self.api_key))
108
109
 
109
110
  self._client = httpx.AsyncClient(
110
111
  base_url=self.backend_url,
@@ -0,0 +1,212 @@
1
+ """Client for retrieving backend-provided pre-run optimization plans.
2
+
3
+ This module provides an async-first thin client for:
4
+ ``POST /api/v1/optimization/plan``.
5
+
6
+ The backend owns all planning intelligence. The SDK only sends the request
7
+ context, validates the response has the required top-level contract keys, and
8
+ returns the allowlisted payload unchanged.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from collections.abc import Sequence
14
+ from typing import Any, cast
15
+
16
+ from traigent.config.backend_config import DEFAULT_LOCAL_URL
17
+ from traigent.utils.logging import get_logger
18
+
19
+ logger = get_logger(__name__)
20
+
21
+ try:
22
+ import httpx
23
+
24
+ HTTPX_AVAILABLE = True
25
+ except ImportError:
26
+ HTTPX_AVAILABLE = False
27
+ httpx = None # type: ignore
28
+
29
+
30
+ _REQUIRED_RESPONSE_KEYS = {
31
+ "schema_version",
32
+ "phase",
33
+ "plan",
34
+ "steps",
35
+ "evidence_level",
36
+ "caveat",
37
+ "advisory",
38
+ }
39
+
40
+
41
+ def _build_auth_headers(credential: str | None) -> dict[str, str]:
42
+ """Return optimization-plan auth headers for an API-key credential."""
43
+ from traigent.cloud.auth import _build_api_key_auth_headers
44
+
45
+ # OptimizationPlanClient accepts API-key credentials only. Reuse the same
46
+ # X-API-Key-only construction as AuthManager._get_api_key_headers
47
+ # (cloud/auth.py) and do not infer JWT mode from string shape.
48
+ return _build_api_key_auth_headers(credential)
49
+
50
+
51
+ class OptimizationPlanClient:
52
+ """Client for retrieving allowlisted pre-run optimization plans.
53
+
54
+ Thread Safety: Safe for concurrent use (httpx.AsyncClient is thread-safe).
55
+ """
56
+
57
+ def __init__(
58
+ self,
59
+ backend_url: str = DEFAULT_LOCAL_URL,
60
+ api_key: str | None = None,
61
+ timeout: float = 30.0,
62
+ ):
63
+ """Initialize OptimizationPlanClient.
64
+
65
+ Args:
66
+ backend_url: Backend API base URL. The backend must expose the
67
+ optimization plan endpoint.
68
+ api_key: API key for authentication (None uses env var
69
+ TRAIGENT_API_KEY)
70
+ timeout: Default timeout for HTTP requests in seconds
71
+
72
+ Raises:
73
+ ImportError: If httpx is not installed
74
+ """
75
+ if not HTTPX_AVAILABLE:
76
+ raise ImportError(
77
+ "httpx is required for OptimizationPlanClient. "
78
+ "Install with: pip install traigent[hybrid]"
79
+ )
80
+
81
+ self.backend_url = backend_url.rstrip("/")
82
+ self.timeout = timeout
83
+
84
+ # Import here to avoid circular dependency
85
+ from traigent.config.backend_config import get_no_credentials_hint
86
+ from traigent.utils.env_config import get_api_key
87
+
88
+ self.api_key = get_api_key("traigent") if api_key is None else api_key
89
+ if not self.api_key:
90
+ logger.warning(
91
+ "No API key found for OptimizationPlanClient. %s",
92
+ get_no_credentials_hint(),
93
+ )
94
+
95
+ self._client: httpx.AsyncClient | None = None
96
+
97
+ def _get_client(self) -> httpx.AsyncClient:
98
+ """Get or create async HTTP client.
99
+
100
+ Returns:
101
+ Configured httpx.AsyncClient instance
102
+ """
103
+ from traigent.utils.env_config import raise_if_backend_offline
104
+
105
+ raise_if_backend_offline("OptimizationPlanClient request")
106
+ if self._client is None:
107
+ headers: dict[str, str] = {}
108
+ if self.api_key:
109
+ headers.update(_build_auth_headers(self.api_key))
110
+
111
+ self._client = httpx.AsyncClient(
112
+ base_url=self.backend_url,
113
+ headers=headers,
114
+ timeout=self.timeout,
115
+ )
116
+
117
+ return self._client
118
+
119
+ async def close(self) -> None:
120
+ """Close HTTP client and release resources."""
121
+ if self._client is not None:
122
+ await self._client.aclose()
123
+ self._client = None
124
+
125
+ async def __aenter__(self) -> OptimizationPlanClient:
126
+ """Async context manager entry."""
127
+ return self
128
+
129
+ async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
130
+ """Async context manager exit."""
131
+ await self.close()
132
+
133
+ async def get_optimization_plan(
134
+ self,
135
+ *,
136
+ task_description: str,
137
+ dataset_size: int,
138
+ dataset_has_holdout: bool,
139
+ objectives: Sequence[str],
140
+ max_trials: int,
141
+ cost_limit_usd: float,
142
+ task_type: str | None = None,
143
+ agent_shape: str | None = None,
144
+ weights: dict[str, float] | None = None,
145
+ offline: bool | None = None,
146
+ ) -> dict[str, Any]:
147
+ """Retrieve a backend-provided pre-run optimization plan.
148
+
149
+ The backend must expose ``POST /api/v1/optimization/plan`` and returns
150
+ the bare allowlisted optimization plan contract payload.
151
+
152
+ Args:
153
+ task_description: Natural-language description of the optimization
154
+ task.
155
+ dataset_size: Number of available examples.
156
+ dataset_has_holdout: Whether the dataset already has a holdout split.
157
+ objectives: Objective metric names to plan against.
158
+ max_trials: Maximum trial count requested for the planned run.
159
+ cost_limit_usd: Maximum approved spend for the planned run, in USD.
160
+ task_type: Optional safe task category.
161
+ agent_shape: Optional safe label for the agent shape.
162
+ weights: Optional objective-name to relative-weight map.
163
+ offline: Optional request for a fully offline plan.
164
+
165
+ Returns:
166
+ Dict with the backend optimization plan contract payload.
167
+
168
+ Raises:
169
+ httpx.HTTPError: If request fails.
170
+ ValueError: If the backend returns a non-object JSON payload or an
171
+ object missing required optimization-plan contract keys.
172
+ """
173
+ body: dict[str, Any] = {
174
+ "task_description": task_description,
175
+ "dataset": {
176
+ "size": dataset_size,
177
+ "has_holdout": dataset_has_holdout,
178
+ },
179
+ "objectives": list(objectives),
180
+ "budget": {
181
+ "max_trials": max_trials,
182
+ "cost_limit_usd": cost_limit_usd,
183
+ },
184
+ }
185
+ if task_type is not None:
186
+ body["task_type"] = task_type
187
+ if agent_shape is not None:
188
+ body["agent_shape"] = agent_shape
189
+ if weights is not None:
190
+ body["weights"] = dict(weights)
191
+ if offline is not None:
192
+ body["offline"] = offline
193
+
194
+ client = self._get_client()
195
+ response = await client.post("/api/v1/optimization/plan", json=body)
196
+ response.raise_for_status()
197
+
198
+ payload = response.json()
199
+ if not isinstance(payload, dict):
200
+ raise ValueError(
201
+ "Malformed optimization-plan response: expected a JSON object "
202
+ "matching the optimization-plan contract."
203
+ )
204
+
205
+ missing = sorted(_REQUIRED_RESPONSE_KEYS - payload.keys())
206
+ if missing:
207
+ raise ValueError(
208
+ "Malformed optimization-plan response: missing required key(s): "
209
+ f"{', '.join(missing)}."
210
+ )
211
+
212
+ return cast(dict[str, Any], payload)
@@ -0,0 +1,349 @@
1
+ """Local chart rendering for backend analytics payloads.
2
+
3
+ This module turns a canonical, backend-produced analytics payload (a
4
+ ``run_pareto`` or ``run_correlations`` document, per the frozen v0 contracts)
5
+ into an image file on disk and returns the path.
6
+
7
+ It is a **pure presentation layer**: it renders pixels *from the numbers the
8
+ backend already computed*. It never recomputes a frontier, a correlation, a
9
+ p-value, or any other analytic — doing so would risk the chart disagreeing with
10
+ the backend's own report. If a value is missing from the payload, the point is
11
+ skipped, not invented.
12
+
13
+ ``matplotlib`` is imported lazily inside :func:`render_chart` so it stays an
14
+ optional dependency (``pip install 'traigent[analytics]'`` or
15
+ ``traigent[visualization]``) and the base SDK install is not bloated.
16
+ """
17
+
18
+ # Traceability: CONC-Layer-Infra FUNC-ANALYTICS
19
+
20
+ from __future__ import annotations
21
+
22
+ from pathlib import Path
23
+ from typing import Any, Literal
24
+
25
+ from traigent.utils.logging import get_logger
26
+
27
+ logger = get_logger(__name__)
28
+
29
+ ChartKind = Literal["run_pareto", "run_correlations"]
30
+
31
+ _SUPPORTED_KINDS: frozenset[str] = frozenset({"run_pareto", "run_correlations"})
32
+ _DEFAULT_FORMAT = "png"
33
+ _SUPPORTED_FORMATS: frozenset[str] = frozenset({"png", "svg"})
34
+
35
+ _MATPLOTLIB_INSTALL_MESSAGE = (
36
+ "Chart rendering requires matplotlib. "
37
+ "Install it with: pip install 'traigent[analytics]'"
38
+ )
39
+
40
+
41
+ class ChartRenderError(ValueError):
42
+ """Raised when a payload cannot be rendered into a chart."""
43
+
44
+
45
+ def _import_pyplot() -> Any:
46
+ """Import matplotlib's pyplot lazily with a non-interactive backend."""
47
+ try:
48
+ import matplotlib
49
+ except ImportError as exc: # pragma: no cover - covered by import guard test
50
+ raise ChartRenderError(_MATPLOTLIB_INSTALL_MESSAGE) from exc
51
+
52
+ # Force a headless backend so rendering works in agent/CI environments with
53
+ # no display. Set before pyplot is imported.
54
+ matplotlib.use("Agg", force=True)
55
+ import matplotlib.pyplot as plt
56
+
57
+ return plt
58
+
59
+
60
+ def _resolve_output_path(
61
+ output_path: str | Path | None,
62
+ *,
63
+ kind: str,
64
+ run_id: str | None,
65
+ fmt: str,
66
+ ) -> Path:
67
+ if output_path is not None:
68
+ path = Path(output_path).expanduser()
69
+ if path.suffix.lower().lstrip(".") not in _SUPPORTED_FORMATS:
70
+ raise ChartRenderError(
71
+ f"output_path must end in one of {sorted(_SUPPORTED_FORMATS)}: {path}"
72
+ )
73
+ return path
74
+
75
+ safe_run = "".join(
76
+ ch if ch.isalnum() or ch in {"-", "_"} else "_" for ch in (run_id or "run")
77
+ )
78
+ return Path.cwd() / f"{kind}.{safe_run}.{fmt}"
79
+
80
+
81
+ def _as_float(value: Any) -> float | None:
82
+ """Best-effort numeric coercion; returns None when not a finite number."""
83
+ if isinstance(value, bool):
84
+ return None
85
+ if isinstance(value, (int, float)):
86
+ result = float(value)
87
+ elif isinstance(value, str):
88
+ try:
89
+ result = float(value)
90
+ except ValueError:
91
+ return None
92
+ else:
93
+ return None
94
+ # Reject NaN/inf so matplotlib never plots a meaningless point.
95
+ if result != result or result in (float("inf"), float("-inf")):
96
+ return None
97
+ return result
98
+
99
+
100
+ def _require_mapping(payload: Any) -> dict[str, Any]:
101
+ if not isinstance(payload, dict):
102
+ raise ChartRenderError("payload must be a mapping (decoded JSON object).")
103
+ return payload
104
+
105
+
106
+ def _resolve_axis_metric_key(measures: Any, axis: str) -> str:
107
+ """Resolve a canonical axis name to the payload's actual metric key."""
108
+ if not isinstance(measures, dict):
109
+ return axis
110
+ resolved = measures.get(axis)
111
+ if isinstance(resolved, str) and resolved:
112
+ return resolved
113
+ return axis
114
+
115
+
116
+ def _render_pareto(plt: Any, payload: dict[str, Any]) -> Any:
117
+ """Plot a cost/quality scatter from a ``run_pareto`` payload.
118
+
119
+ Frontier points are emphasized (the knee is annotated); dominated points are
120
+ drawn faded. Axes are read straight from each config's ``metrics`` — nothing
121
+ is recomputed.
122
+ """
123
+ measures = payload.get("measures") or {}
124
+ quality_key = _resolve_axis_metric_key(measures, "quality")
125
+ cost_key = _resolve_axis_metric_key(measures, "cost")
126
+
127
+ fig, ax = plt.subplots(figsize=(7, 5))
128
+
129
+ frontier = payload.get("frontier") or []
130
+ dominated = payload.get("dominated_points") or payload.get("dominated") or []
131
+
132
+ plotted_any = False
133
+ knee_xy: tuple[float, float] | None = None
134
+
135
+ front_x: list[float] = []
136
+ front_y: list[float] = []
137
+ for point in frontier:
138
+ if not isinstance(point, dict):
139
+ continue
140
+ metrics = point.get("metrics") or {}
141
+ cost = _as_float(metrics.get(cost_key))
142
+ quality = _as_float(metrics.get(quality_key))
143
+ if cost is None or quality is None:
144
+ continue
145
+ front_x.append(cost)
146
+ front_y.append(quality)
147
+ plotted_any = True
148
+ if point.get("is_knee"):
149
+ knee_xy = (cost, quality)
150
+ label = point.get("config_id")
151
+ if label:
152
+ ax.annotate(
153
+ str(label),
154
+ (cost, quality),
155
+ textcoords="offset points",
156
+ xytext=(5, 5),
157
+ fontsize=7,
158
+ )
159
+
160
+ dom_x: list[float] = []
161
+ dom_y: list[float] = []
162
+ for point in dominated:
163
+ if not isinstance(point, dict):
164
+ continue
165
+ metrics = point.get("metrics") or {}
166
+ cost = _as_float(metrics.get(cost_key))
167
+ quality = _as_float(metrics.get(quality_key))
168
+ if cost is None or quality is None:
169
+ continue
170
+ dom_x.append(cost)
171
+ dom_y.append(quality)
172
+ plotted_any = True
173
+
174
+ if dom_x:
175
+ ax.scatter(dom_x, dom_y, c="#bbbbbb", marker="x", label="dominated", zorder=2)
176
+ if front_x:
177
+ # Sort frontier by cost so the connecting line reads left-to-right.
178
+ order = sorted(range(len(front_x)), key=lambda i: front_x[i])
179
+ sx = [front_x[i] for i in order]
180
+ sy = [front_y[i] for i in order]
181
+ ax.plot(sx, sy, color="#1f77b4", linewidth=1.0, alpha=0.6, zorder=3)
182
+ ax.scatter(
183
+ front_x, front_y, c="#1f77b4", marker="o", label="frontier", zorder=4
184
+ )
185
+ if knee_xy is not None:
186
+ ax.scatter(
187
+ [knee_xy[0]],
188
+ [knee_xy[1]],
189
+ facecolors="none",
190
+ edgecolors="#d62728",
191
+ s=180,
192
+ linewidths=2,
193
+ label="knee",
194
+ zorder=5,
195
+ )
196
+
197
+ if not plotted_any:
198
+ raise ChartRenderError(
199
+ "run_pareto payload had no plottable points "
200
+ f"(need frontier/dominated entries with metrics.{cost_key} "
201
+ f"and metrics.{quality_key})."
202
+ )
203
+
204
+ quality_meta = measures.get(quality_key) if isinstance(measures, dict) else None
205
+ cost_meta = measures.get(cost_key) if isinstance(measures, dict) else None
206
+ ax.set_xlabel(_axis_label("cost", cost_meta))
207
+ ax.set_ylabel(_axis_label("quality", quality_meta))
208
+ run_id = payload.get("run_id") or "run"
209
+ shape = payload.get("shape")
210
+ title = f"Pareto frontier — {run_id}"
211
+ if shape:
212
+ title = f"{title} ({shape})"
213
+ ax.set_title(title)
214
+ ax.legend(loc="best", fontsize=8)
215
+ ax.grid(True, linestyle=":", alpha=0.4)
216
+ fig.tight_layout()
217
+ return fig
218
+
219
+
220
+ def _axis_label(default: str, meta: Any) -> str:
221
+ if isinstance(meta, dict):
222
+ name = meta.get("label") or meta.get("name")
223
+ unit = meta.get("unit")
224
+ if name and unit:
225
+ return f"{name} ({unit})"
226
+ if name:
227
+ return str(name)
228
+ return default
229
+
230
+
231
+ def _render_correlations(plt: Any, payload: dict[str, Any]) -> Any:
232
+ """Plot a bar chart of measure correlations from a ``run_correlations`` payload.
233
+
234
+ Each bar is one ``measure_correlations`` entry's ``r`` value. Values are read
235
+ directly from the payload; nothing is recomputed.
236
+ """
237
+ correlations = payload.get("measure_correlations") or []
238
+ labels: list[str] = []
239
+ values: list[float] = []
240
+ for entry in correlations:
241
+ if not isinstance(entry, dict):
242
+ continue
243
+ r = _as_float(entry.get("r"))
244
+ if r is None:
245
+ continue
246
+ x = entry.get("x")
247
+ y = entry.get("y")
248
+ labels.append(f"{x}↔{y}" if x and y else str(entry.get("strength", "?")))
249
+ values.append(r)
250
+
251
+ if not values:
252
+ raise ChartRenderError(
253
+ "run_correlations payload had no plottable measure_correlations "
254
+ "entries with a numeric 'r'."
255
+ )
256
+
257
+ fig, ax = plt.subplots(figsize=(7, 5))
258
+ colors = ["#2ca02c" if v >= 0 else "#d62728" for v in values]
259
+ positions = list(range(len(values)))
260
+ ax.bar(positions, values, color=colors)
261
+ ax.set_xticks(positions)
262
+ ax.set_xticklabels(labels, rotation=30, ha="right", fontsize=8)
263
+ ax.set_ylabel("Pearson r")
264
+ ax.set_ylim(-1.05, 1.05)
265
+ ax.axhline(0.0, color="#333333", linewidth=0.8)
266
+ method = payload.get("method")
267
+ run_id = payload.get("run_id") or "run"
268
+ sample = payload.get("sample_size")
269
+ title = f"Measure correlations — {run_id}"
270
+ if method or sample is not None:
271
+ suffix = ", ".join(
272
+ part
273
+ for part in (
274
+ str(method) if method else None,
275
+ f"n={sample}" if sample is not None else None,
276
+ )
277
+ if part
278
+ )
279
+ title = f"{title} ({suffix})"
280
+ ax.set_title(title)
281
+ ax.grid(True, axis="y", linestyle=":", alpha=0.4)
282
+ fig.tight_layout()
283
+ return fig
284
+
285
+
286
+ def render_chart(
287
+ payload: dict[str, Any],
288
+ kind: ChartKind,
289
+ output_path: str | Path | None = None,
290
+ *,
291
+ fmt: str | None = None,
292
+ ) -> str:
293
+ """Render a canonical analytics payload to an image file and return its path.
294
+
295
+ Args:
296
+ payload: A backend-produced ``run_pareto`` or ``run_correlations``
297
+ document (the frozen v0 contract). Values are plotted as-is; this
298
+ function never recomputes analytics.
299
+ kind: ``"run_pareto"`` or ``"run_correlations"``.
300
+ output_path: Destination file. When ``None`` a name is derived from the
301
+ kind and ``run_id`` and written under the current working directory.
302
+ The extension (``.png`` / ``.svg``) determines the format.
303
+ fmt: Optional explicit format (``"png"`` or ``"svg"``) used only when
304
+ ``output_path`` is ``None``.
305
+
306
+ Returns:
307
+ The absolute path to the written image, as a string.
308
+
309
+ Raises:
310
+ ChartRenderError: If ``kind`` is unsupported, ``matplotlib`` is missing,
311
+ the format is unsupported, or the payload has no plottable data.
312
+ """
313
+ if kind not in _SUPPORTED_KINDS:
314
+ raise ChartRenderError(
315
+ f"Unsupported chart kind {kind!r}. "
316
+ f"Supported kinds: {sorted(_SUPPORTED_KINDS)}."
317
+ )
318
+ payload = _require_mapping(payload)
319
+
320
+ chosen_fmt = (fmt or _DEFAULT_FORMAT).lower().lstrip(".")
321
+ if chosen_fmt not in _SUPPORTED_FORMATS:
322
+ raise ChartRenderError(
323
+ f"Unsupported format {chosen_fmt!r}. "
324
+ f"Supported formats: {sorted(_SUPPORTED_FORMATS)}."
325
+ )
326
+
327
+ resolved = _resolve_output_path(
328
+ output_path,
329
+ kind=kind,
330
+ run_id=(
331
+ payload.get("run_id") if isinstance(payload.get("run_id"), str) else None
332
+ ),
333
+ fmt=chosen_fmt,
334
+ )
335
+ resolved.parent.mkdir(parents=True, exist_ok=True)
336
+
337
+ plt = _import_pyplot()
338
+ if kind == "run_pareto":
339
+ fig = _render_pareto(plt, payload)
340
+ else:
341
+ fig = _render_correlations(plt, payload)
342
+
343
+ try:
344
+ fig.savefig(str(resolved))
345
+ finally:
346
+ plt.close(fig)
347
+
348
+ logger.debug("Rendered %s chart to %s", kind, resolved)
349
+ return str(resolved.resolve())