traigent 0.20.0__tar.gz → 0.21.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 (633) hide show
  1. {traigent-0.20.0 → traigent-0.21.0.dev0}/CHANGELOG.md +75 -0
  2. {traigent-0.20.0/traigent.egg-info → traigent-0.21.0.dev0}/PKG-INFO +2 -2
  3. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/telemetry.md +36 -1
  4. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/onboarding.md +1 -1
  5. {traigent-0.20.0 → traigent-0.21.0.dev0}/pyproject.toml +4 -2
  6. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-dev.txt +1 -1
  7. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/decorators.py +10 -4
  8. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/types.py +7 -0
  9. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/auth_commands.py +8 -6
  10. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/main.py +23 -24
  11. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/onboard_commands.py +1 -1
  12. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/analytics_client.py +93 -14
  13. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/api_operations.py +59 -7
  14. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/auth.py +193 -11
  15. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/backend_client.py +24 -8
  16. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/client.py +2 -0
  17. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/dataset_converter.py +11 -8
  18. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/optimizer_client.py +1 -0
  19. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/password_auth_handler.py +1 -1
  20. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/resilient_client.py +4 -1
  21. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/session_operations.py +8 -2
  22. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/sync_manager.py +280 -562
  23. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/token_manager.py +2 -2
  24. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/trial_operations.py +78 -25
  25. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/models.yaml +15 -2
  26. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/types.py +2 -0
  27. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/backend_session_manager.py +147 -21
  28. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/execution_policy_runtime.py +37 -0
  29. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/metadata_helpers.py +7 -6
  30. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/optimization_pipeline.py +3 -2
  31. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/optimized_function.py +62 -9
  32. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/orchestrator.py +198 -27
  33. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/session_types.py +11 -1
  34. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/base.py +98 -0
  35. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/local.py +253 -64
  36. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/metrics_tracker.py +12 -0
  37. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langfuse/client.py +2 -2
  38. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/anthropic_discovery.py +34 -21
  39. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/observability/workflow_traces.py +1 -1
  40. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/agent_spans.py +8 -10
  41. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/client.py +246 -85
  42. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/config.py +35 -2
  43. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/decorators.py +49 -22
  44. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/dtos.py +58 -44
  45. traigent-0.21.0.dev0/traigent/security/redaction.py +233 -0
  46. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/artifact_fingerprints.py +66 -33
  47. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/callbacks.py +74 -19
  48. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/cost_calculator.py +22 -3
  49. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/env_config.py +6 -0
  50. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/logging.py +4 -3
  51. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/optimization_logger.py +92 -9
  52. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/retry.py +25 -4
  53. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/validation.py +85 -1
  54. {traigent-0.20.0 → traigent-0.21.0.dev0/traigent.egg-info}/PKG-INFO +2 -2
  55. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent.egg-info/requires.txt +1 -1
  56. traigent-0.20.0/traigent/security/redaction.py +0 -91
  57. {traigent-0.20.0 → traigent-0.21.0.dev0}/COMMERCIAL-LICENSE.md +0 -0
  58. {traigent-0.20.0 → traigent-0.21.0.dev0}/CONTRIBUTING.md +0 -0
  59. {traigent-0.20.0 → traigent-0.21.0.dev0}/CONTRIBUTOR-LICENSING.md +0 -0
  60. {traigent-0.20.0 → traigent-0.21.0.dev0}/DISCLAIMER.md +0 -0
  61. {traigent-0.20.0 → traigent-0.21.0.dev0}/LICENSE +0 -0
  62. {traigent-0.20.0 → traigent-0.21.0.dev0}/MANIFEST.in +0 -0
  63. {traigent-0.20.0 → traigent-0.21.0.dev0}/NOTICE +0 -0
  64. {traigent-0.20.0 → traigent-0.21.0.dev0}/README.md +0 -0
  65. {traigent-0.20.0 → traigent-0.21.0.dev0}/SECURITY.md +0 -0
  66. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/LOCAL_CI_GATE.md +0 -0
  67. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/README.md +0 -0
  68. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/SYNC_MAP.md +0 -0
  69. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/agent-skill.md +0 -0
  70. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/complete-function-specification.md +0 -0
  71. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/decorator-reference.md +0 -0
  72. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/enterprise-beta-api.md +0 -0
  73. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/interactive_optimizer.md +0 -0
  74. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/api-reference/thread-pool-examples.md +0 -0
  75. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/ARCHITECTURE.md +0 -0
  76. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/cost-architecture-validation.md +0 -0
  77. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/execution_mode_follow_up.md +0 -0
  78. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/integrations-inventory.md +0 -0
  79. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/plugin_architecture.md +0 -0
  80. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/project-structure.md +0 -0
  81. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/architecture/stop_conditions.md +0 -0
  82. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/concepts/composite-knob-ir.md +0 -0
  83. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/concepts/composite-knobs.md +0 -0
  84. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/concepts/guided-generation.md +0 -0
  85. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/ADDING_NEW_INTEGRATIONS.md +0 -0
  86. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/CODE_OF_CONDUCT.md +0 -0
  87. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/CONTRIBUTING.md +0 -0
  88. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/EXAMPLE_TEMPLATE.md +0 -0
  89. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/README.md +0 -0
  90. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/SECURITY.md +0 -0
  91. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/aikido_triage.md +0 -0
  92. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/code_review_instructions.md +0 -0
  93. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/contributing/test-quality-guide.md +0 -0
  94. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/demos/DEMO_VIDEO_GUIDE.md +0 -0
  95. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/demos/README.md +0 -0
  96. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/API_PATTERNS.md +0 -0
  97. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/LEARNING_ROADMAP.md +0 -0
  98. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/QUICK_REFERENCE.md +0 -0
  99. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/README.md +0 -0
  100. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/START_HERE.md +0 -0
  101. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/examples/TROUBLESHOOTING.md +0 -0
  102. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/fake-completion-tracking.md +0 -0
  103. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/feature_matrices/README.md +0 -0
  104. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/README.md +0 -0
  105. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/authentication.md +0 -0
  106. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/constraint-dsl.md +0 -0
  107. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/dataflow-detection.md +0 -0
  108. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/framework_override_enhanced_features.md +0 -0
  109. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/mcp-server.md +0 -0
  110. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/observability-spans.md +0 -0
  111. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/prompt_management.md +0 -0
  112. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/recommendations.md +0 -0
  113. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/safety-gates.md +0 -0
  114. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/seamless_injection.md +0 -0
  115. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/strategy-presets.md +0 -0
  116. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/features/strict_metrics_nulls.md +0 -0
  117. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/GETTING_STARTED.md +0 -0
  118. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/README.md +0 -0
  119. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/installation.md +0 -0
  120. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/minimal-integration.md +0 -0
  121. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/portal-dev-laptop-agent.md +0 -0
  122. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/getting-started/testing.md +0 -0
  123. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/VSCODE_RESTART_GUIDE.md +0 -0
  124. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/evaluation.md +0 -0
  125. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/execution-mode-migration.md +0 -0
  126. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/execution-modes.md +0 -0
  127. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/js-bridge.md +0 -0
  128. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/llm_plugin_migration_guide.md +0 -0
  129. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/parallel-configuration.md +0 -0
  130. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/guides/secrets_management.md +0 -0
  131. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/hybrid-mode-api-contract.md +0 -0
  132. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/hybrid-mode-client-guide.md +0 -0
  133. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/operations/azure_openai.md +0 -0
  134. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/operations/bedrock.md +0 -0
  135. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/operations/google_gemini.md +0 -0
  136. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/security/trust_model.md +0 -0
  137. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/testing/CREATIVE_STRESS_TESTING.md +0 -0
  138. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/concepts/composite-knob-ir.md +0 -0
  139. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/concepts/composite-knobs.md +0 -0
  140. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/concepts/guided-generation.md +0 -0
  141. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/schema.md +0 -0
  142. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/tagging_tracking.md +0 -0
  143. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/traceability/taxonomy_reference.md +0 -0
  144. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/tvl/CONSTRAINT_EXPRESSIONS.md +0 -0
  145. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/README.md +0 -0
  146. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/agent_optimization.md +0 -0
  147. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/choosing_optimization_model.md +0 -0
  148. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/configuration-spaces.md +0 -0
  149. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/evaluation_guide.md +0 -0
  150. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/injection_modes.md +0 -0
  151. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/interactive_optimization.md +0 -0
  152. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/smart_optimization.md +0 -0
  153. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/user-guide/tuned_variables.md +0 -0
  154. {traigent-0.20.0 → traigent-0.21.0.dev0}/docs/walkthrough.md +0 -0
  155. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-all.txt +0 -0
  156. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-analytics.txt +0 -0
  157. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-bayesian.txt +0 -0
  158. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-chroma.txt +0 -0
  159. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-hybrid.txt +0 -0
  160. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-integrations.txt +0 -0
  161. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-security.txt +0 -0
  162. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements-test.txt +0 -0
  163. {traigent-0.20.0 → traigent-0.21.0.dev0}/requirements/requirements.txt +0 -0
  164. {traigent-0.20.0 → traigent-0.21.0.dev0}/setup.cfg +0 -0
  165. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/__init__.py +0 -0
  166. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/_version.py +0 -0
  167. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/adapters/execution_adapter.py +0 -0
  168. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/admin/__init__.py +0 -0
  169. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/admin/client.py +0 -0
  170. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/admin/config.py +0 -0
  171. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/admin/dtos.py +0 -0
  172. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/agents/__init__.py +0 -0
  173. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/agents/config_mapper.py +0 -0
  174. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/agents/executor.py +0 -0
  175. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/agents/platforms.py +0 -0
  176. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/agents/specification_generator.py +0 -0
  177. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/__init__.py +0 -0
  178. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/anomaly.py +0 -0
  179. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/cost_optimization.py +0 -0
  180. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/example_insights.py +0 -0
  181. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/intelligence.py +0 -0
  182. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/meta_learning.py +0 -0
  183. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/next_steps.py +0 -0
  184. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/optimization_plan.py +0 -0
  185. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/predictive.py +0 -0
  186. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/render.py +0 -0
  187. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics/scheduling.py +0 -0
  188. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics_mcp/__init__.py +0 -0
  189. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics_mcp/server.py +0 -0
  190. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/analytics_mcp/tools.py +0 -0
  191. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/__init__.py +0 -0
  192. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/agent_inference.py +0 -0
  193. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/config_builder.py +0 -0
  194. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/config_space.py +0 -0
  195. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/constraint_builders.py +0 -0
  196. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/constraints.py +0 -0
  197. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/functions.py +0 -0
  198. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/parameter_ranges.py +0 -0
  199. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/parameter_validator.py +0 -0
  200. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/safety.py +0 -0
  201. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/strategy_presets.py +0 -0
  202. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/api/validation_protocol.py +0 -0
  203. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/__init__.py +0 -0
  204. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/detect_tvars_command.py +0 -0
  205. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/function_discovery.py +0 -0
  206. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/generate_config_command.py +0 -0
  207. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/hooks_commands.py +0 -0
  208. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/local_commands.py +0 -0
  209. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/next_steps_command.py +0 -0
  210. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/optimization_validator.py +0 -0
  211. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/plan_command.py +0 -0
  212. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/playbook_commands.py +0 -0
  213. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/sync_commands.py +0 -0
  214. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cli/validation_types.py +0 -0
  215. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/__init__.py +0 -0
  216. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/_aiohttp_compat.py +0 -0
  217. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/agent_dtos.py +0 -0
  218. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/analytics_auth.py +0 -0
  219. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/api_key_manager.py +0 -0
  220. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/async_batch_transport.py +0 -0
  221. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/backend_bridges.py +0 -0
  222. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/backend_components.py +0 -0
  223. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/backend_synchronizer.py +0 -0
  224. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/benchmark_client.py +0 -0
  225. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/billing.py +0 -0
  226. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/cloud_operations.py +0 -0
  227. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/credential_manager.py +0 -0
  228. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/credential_resolver.py +0 -0
  229. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/dtos.py +0 -0
  230. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/governance.py +0 -0
  231. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/integration_manager.py +0 -0
  232. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/models.py +0 -0
  233. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/privacy_operations.py +0 -0
  234. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/production_mcp_client.py +0 -0
  235. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/remote_guidance.py +0 -0
  236. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/service.py +0 -0
  237. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/session_types.py +0 -0
  238. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/sessions.py +0 -0
  239. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/smart_pruning.py +0 -0
  240. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/subset_selection.py +0 -0
  241. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/trial_tracker.py +0 -0
  242. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/url_security.py +0 -0
  243. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/user_agent.py +0 -0
  244. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/cloud/validators.py +0 -0
  245. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/__init__.py +0 -0
  246. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/api_keys.py +0 -0
  247. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/ast_transformer.py +0 -0
  248. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/backend_config.py +0 -0
  249. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/context.py +0 -0
  250. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/feature_flags.py +0 -0
  251. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/parallel.py +0 -0
  252. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/project.py +0 -0
  253. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/provider_support.py +0 -0
  254. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/providers.py +0 -0
  255. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/runtime_injector.py +0 -0
  256. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config/tenant.py +0 -0
  257. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/__init__.py +0 -0
  258. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/agent_classifier.py +0 -0
  259. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/apply.py +0 -0
  260. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/catalog/schemas/tvar_catalog_entry_schema.json +0 -0
  261. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/catalog/schemas/tvar_observation_schema.json +0 -0
  262. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/catalog/schemas/tvar_value_recommendation_schema.json +0 -0
  263. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/catalog/tvar_catalog.v1.json +0 -0
  264. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/catalog.py +0 -0
  265. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/llm_backend.py +0 -0
  266. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/pipeline.py +0 -0
  267. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/presets/__init__.py +0 -0
  268. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/presets/agent_type_catalog.py +0 -0
  269. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/presets/benchmark_catalog.py +0 -0
  270. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/presets/constraint_templates.py +0 -0
  271. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/presets/range_presets.py +0 -0
  272. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/recommendations.py +0 -0
  273. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/__init__.py +0 -0
  274. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/benchmarks.py +0 -0
  275. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/objectives.py +0 -0
  276. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/safety_constraints.py +0 -0
  277. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/structural_constraints.py +0 -0
  278. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/tvar_ranges.py +0 -0
  279. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/subsystems/tvar_recommendations.py +0 -0
  280. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/config_generator/types.py +0 -0
  281. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/__init__.py +0 -0
  282. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/best_config_runtime.py +0 -0
  283. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/cache_policy.py +0 -0
  284. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/ci_approval.py +0 -0
  285. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/config_state_manager.py +0 -0
  286. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/constants.py +0 -0
  287. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/cost_enforcement.py +0 -0
  288. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/cost_estimator.py +0 -0
  289. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/evaluator_wrapper.py +0 -0
  290. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/exception_handler.py +0 -0
  291. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/license.py +0 -0
  292. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/logger_facade.py +0 -0
  293. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/mandatory_metrics.py +0 -0
  294. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/meta_types.py +0 -0
  295. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/metric_registry.py +0 -0
  296. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/metrics_aggregator.py +0 -0
  297. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/namespace.py +0 -0
  298. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/objectives.py +0 -0
  299. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/orchestrator_helpers.py +0 -0
  300. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/parallel_execution_manager.py +0 -0
  301. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/progress_manager.py +0 -0
  302. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/result_selection.py +0 -0
  303. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/sample_budget.py +0 -0
  304. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/samplers/__init__.py +0 -0
  305. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/samplers/random_sampler.py +0 -0
  306. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/session_context.py +0 -0
  307. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/stat_significance.py +0 -0
  308. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/stop_condition_manager.py +0 -0
  309. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/stop_conditions.py +0 -0
  310. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/trace_env.py +0 -0
  311. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/tracing.py +0 -0
  312. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/trial_context.py +0 -0
  313. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/trial_lifecycle.py +0 -0
  314. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/trial_result_factory.py +0 -0
  315. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/types.py +0 -0
  316. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/types_ext.py +0 -0
  317. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/utils.py +0 -0
  318. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core/workflow_trace_manager.py +0 -0
  319. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core_metrics/__init__.py +0 -0
  320. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core_metrics/client.py +0 -0
  321. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core_metrics/config.py +0 -0
  322. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/core_metrics/dtos.py +0 -0
  323. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/defaults.py +0 -0
  324. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/effectuation/__init__.py +0 -0
  325. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/effectuation/contracts.py +0 -0
  326. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/effectuation/strategies/__init__.py +0 -0
  327. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/effectuation/strategies/framework_param.py +0 -0
  328. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/effectuation/strategies/self_consistency.py +0 -0
  329. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluation/__init__.py +0 -0
  330. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluation/client.py +0 -0
  331. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluation/config.py +0 -0
  332. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluation/dtos.py +0 -0
  333. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/__init__.py +0 -0
  334. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/catalog/metric_eval_catalog.v1.json +0 -0
  335. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/catalog/schemas/metric_eval_catalog_entry_schema.json +0 -0
  336. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/catalog_loader.py +0 -0
  337. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/dataset_registry.py +0 -0
  338. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/hybrid_api.py +0 -0
  339. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/metrics.py +0 -0
  340. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/evaluators/recommendations.py +0 -0
  341. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/__init__.py +0 -0
  342. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/_portal.py +0 -0
  343. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/__init__.py +0 -0
  344. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/_bootstrap.py +0 -0
  345. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/_demo.py +0 -0
  346. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/anthropic.py +0 -0
  347. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/aws.py +0 -0
  348. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/azure.py +0 -0
  349. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/gcp.py +0 -0
  350. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/gemini.py +0 -0
  351. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/groq.py +0 -0
  352. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/litellm_any.py +0 -0
  353. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/manifest.json +0 -0
  354. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/openai.py +0 -0
  355. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/openrouter.py +0 -0
  356. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/providers/qa_samples.jsonl +0 -0
  357. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/quickstart/__init__.py +0 -0
  358. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/quickstart/__main__.py +0 -0
  359. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/quickstart/_env.py +0 -0
  360. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/quickstart/publish_and_verify.py +0 -0
  361. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/quickstart/qa_samples.jsonl +0 -0
  362. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/examples/tutorial_bootstrap.py +0 -0
  363. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/__init__.py +0 -0
  364. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/backend_provider.py +0 -0
  365. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/example_synth.py +0 -0
  366. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/llm_provider.py +0 -0
  367. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/loop.py +0 -0
  368. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/models.py +0 -0
  369. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/options.py +0 -0
  370. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/prompt_rewriter.py +0 -0
  371. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/__init__.py +0 -0
  372. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/_deterministic_indices.py +0 -0
  373. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/artifacts.py +0 -0
  374. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/buffer.py +0 -0
  375. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/document.py +0 -0
  376. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/edits.py +0 -0
  377. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/prompts.py +0 -0
  378. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/reflection.py +0 -0
  379. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/schedule.py +0 -0
  380. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/slow_update.py +0 -0
  381. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/splits.py +0 -0
  382. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/trainer.py +0 -0
  383. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/skill_train/trainer_result.py +0 -0
  384. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/generation/validators.py +0 -0
  385. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/guaranteed_modes.py +0 -0
  386. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hooks/__init__.py +0 -0
  387. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hooks/config.py +0 -0
  388. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hooks/installer.py +0 -0
  389. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hooks/validator.py +0 -0
  390. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/__init__.py +0 -0
  391. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/discovery.py +0 -0
  392. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/http_transport.py +0 -0
  393. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/lifecycle.py +0 -0
  394. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/mcp_transport.py +0 -0
  395. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/protocol.py +0 -0
  396. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/hybrid/transport.py +0 -0
  397. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/__init__.py +0 -0
  398. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/activation.py +0 -0
  399. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/base.py +0 -0
  400. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/base_plugin.py +0 -0
  401. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/bedrock_client.py +0 -0
  402. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/config.py +0 -0
  403. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/dspy_adapter.py +0 -0
  404. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/framework_override.py +0 -0
  405. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langchain/__init__.py +0 -0
  406. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langchain/handler.py +0 -0
  407. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langfuse/__init__.py +0 -0
  408. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langfuse/callback.py +0 -0
  409. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/langfuse/tracker.py +0 -0
  410. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/__init__.py +0 -0
  411. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/anthropic_plugin.py +0 -0
  412. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/azure_openai_plugin.py +0 -0
  413. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/base_llm_plugin.py +0 -0
  414. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/bedrock_plugin.py +0 -0
  415. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/cohere_plugin.py +0 -0
  416. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/gemini_plugin.py +0 -0
  417. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/huggingface_plugin.py +0 -0
  418. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/langchain/__init__.py +0 -0
  419. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/langchain/base.py +0 -0
  420. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/langchain_plugin.py +0 -0
  421. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/litellm_plugin.py +0 -0
  422. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/llamaindex_plugin.py +0 -0
  423. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/mistral_plugin.py +0 -0
  424. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/openai.py +0 -0
  425. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/llms/openai_plugin.py +0 -0
  426. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/mappings.py +0 -0
  427. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/__init__.py +0 -0
  428. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/azure_discovery.py +0 -0
  429. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/base.py +0 -0
  430. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/cache.py +0 -0
  431. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/gemini_discovery.py +0 -0
  432. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/mistral_discovery.py +0 -0
  433. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/openai_discovery.py +0 -0
  434. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/model_discovery/registry.py +0 -0
  435. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/observability/__init__.py +0 -0
  436. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/observability/mlflow.py +0 -0
  437. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/observability/wandb.py +0 -0
  438. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/plugin_registry.py +0 -0
  439. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/providers.py +0 -0
  440. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/pydantic_ai/__init__.py +0 -0
  441. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/pydantic_ai/_types.py +0 -0
  442. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/pydantic_ai/handler.py +0 -0
  443. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/pydantic_ai/plugin.py +0 -0
  444. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/__init__.py +0 -0
  445. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/discovery.py +0 -0
  446. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/message_coercion.py +0 -0
  447. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/mock_adapter.py +0 -0
  448. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/parameter_normalizer.py +0 -0
  449. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/response_wrapper.py +0 -0
  450. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/validation.py +0 -0
  451. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/utils/version_compat.py +0 -0
  452. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/vector_stores/__init__.py +0 -0
  453. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/vector_stores/base.py +0 -0
  454. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/vector_stores/chromadb_plugin.py +0 -0
  455. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/vector_stores/pinecone_plugin.py +0 -0
  456. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/vector_stores/weaviate_plugin.py +0 -0
  457. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/integrations/wrappers.py +0 -0
  458. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/invokers/__init__.py +0 -0
  459. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/invokers/base.py +0 -0
  460. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/invokers/batch.py +0 -0
  461. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/invokers/local.py +0 -0
  462. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/invokers/streaming.py +0 -0
  463. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/__init__.py +0 -0
  464. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/adapters.py +0 -0
  465. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/bindings.py +0 -0
  466. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/canonical.py +0 -0
  467. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/cascade.py +0 -0
  468. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/certificates.py +0 -0
  469. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/composites.py +0 -0
  470. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/kinds.py +0 -0
  471. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/patterns.py +0 -0
  472. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/resolution.py +0 -0
  473. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/resolver.py +0 -0
  474. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/runtime.py +0 -0
  475. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/signals.py +0 -0
  476. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/knobs/telemetry.py +0 -0
  477. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/mcp/__init__.py +0 -0
  478. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/mcp/server.py +0 -0
  479. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/mcp/tools.py +0 -0
  480. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/__init__.py +0 -0
  481. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/agent_metrics.py +0 -0
  482. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/content_features.py +0 -0
  483. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/deepeval_metrics.py +0 -0
  484. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/ragas_metrics.py +0 -0
  485. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/metrics/registry.py +0 -0
  486. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/observability/__init__.py +0 -0
  487. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/__init__.py +0 -0
  488. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/base.py +0 -0
  489. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/batch_optimizers.py +0 -0
  490. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/cloud_optimizer.py +0 -0
  491. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/grid.py +0 -0
  492. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/interactive_optimizer.py +0 -0
  493. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/random.py +0 -0
  494. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/registry.py +0 -0
  495. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/remote.py +0 -0
  496. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/remote_services.py +0 -0
  497. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/optimizers/results.py +0 -0
  498. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/__init__.py +0 -0
  499. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/loader.py +0 -0
  500. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/model.py +0 -0
  501. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/scaffold.py +0 -0
  502. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/schemas/agent_playbook_schema.json +0 -0
  503. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/staleness.py +0 -0
  504. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/playbook/validator.py +0 -0
  505. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/plugins/__init__.py +0 -0
  506. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/plugins/registry.py +0 -0
  507. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/projects/__init__.py +0 -0
  508. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/projects/client.py +0 -0
  509. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/projects/config.py +0 -0
  510. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/projects/dtos.py +0 -0
  511. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/prompts/__init__.py +0 -0
  512. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/prompts/client.py +0 -0
  513. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/prompts/config.py +0 -0
  514. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/prompts/dtos.py +0 -0
  515. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/providers/__init__.py +0 -0
  516. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/providers/validation.py +0 -0
  517. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/py.typed +0 -0
  518. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/reporting/__init__.py +0 -0
  519. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/reporting/example_map.py +0 -0
  520. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/__init__.py +0 -0
  521. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/audit.py +0 -0
  522. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/__init__.py +0 -0
  523. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/helpers.py +0 -0
  524. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/mfa.py +0 -0
  525. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/models.py +0 -0
  526. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/oidc.py +0 -0
  527. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/saml.py +0 -0
  528. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/sms.py +0 -0
  529. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/auth/totp.py +0 -0
  530. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/config.py +0 -0
  531. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/credentials.py +0 -0
  532. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/crypto_utils.py +0 -0
  533. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/deployment.py +0 -0
  534. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/encryption.py +0 -0
  535. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/enterprise.py +0 -0
  536. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/headers.py +0 -0
  537. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/input_validation.py +0 -0
  538. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/jwt_validator.py +0 -0
  539. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/rate_limiter.py +0 -0
  540. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/session_manager.py +0 -0
  541. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/security/tenant.py +0 -0
  542. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-analyze-results/SKILL.md +0 -0
  543. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-analyze-results/references/convergence-patterns.md +0 -0
  544. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-analyze-results/references/optimization-result-api.md +0 -0
  545. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-configuration-space/SKILL.md +0 -0
  546. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-configuration-space/references/constraints.md +0 -0
  547. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-configuration-space/references/parameter-types.md +0 -0
  548. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-debugging/SKILL.md +0 -0
  549. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-debugging/references/error-reference.md +0 -0
  550. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-debugging/references/logging-config.md +0 -0
  551. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-debugging/references/mock-mode.md +0 -0
  552. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-decorator-setup/SKILL.md +0 -0
  553. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-decorator-setup/references/evaluation-options.md +0 -0
  554. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-decorator-setup/references/execution-modes.md +0 -0
  555. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-decorator-setup/references/injection-modes.md +0 -0
  556. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-integrations/SKILL.md +0 -0
  557. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-integrations/references/dspy.md +0 -0
  558. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-integrations/references/langchain.md +0 -0
  559. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-integrations/references/litellm.md +0 -0
  560. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-quickstart/SKILL.md +0 -0
  561. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-quickstart/references/environment-variables.md +0 -0
  562. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-quickstart/references/installation-extras.md +0 -0
  563. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-run-optimization/SKILL.md +0 -0
  564. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-run-optimization/references/algorithms.md +0 -0
  565. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-run-optimization/references/cost-management.md +0 -0
  566. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/skills/traigent-run-optimization/references/parallel-config.md +0 -0
  567. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/storage/__init__.py +0 -0
  568. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/storage/local_storage.py +0 -0
  569. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/testing/__init__.py +0 -0
  570. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/traigent_client.py +0 -0
  571. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/traigent_integration.py +0 -0
  572. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/__init__.py +0 -0
  573. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/dataflow_strategy.py +0 -0
  574. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/detection_strategies.py +0 -0
  575. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/detection_types.py +0 -0
  576. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/detector.py +0 -0
  577. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/discovery.py +0 -0
  578. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/observation.py +0 -0
  579. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tuned_variables/py.typed +0 -0
  580. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/__init__.py +0 -0
  581. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/__main__.py +0 -0
  582. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/models.py +0 -0
  583. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/objectives.py +0 -0
  584. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/options.py +0 -0
  585. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/promotion_gate.py +0 -0
  586. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/registry.py +0 -0
  587. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/spec_loader.py +0 -0
  588. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/spec_validator.py +0 -0
  589. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/tvl/statistics.py +0 -0
  590. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/__init__.py +0 -0
  591. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/batch_optimizer_utils.py +0 -0
  592. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/batch_processing.py +0 -0
  593. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/console.py +0 -0
  594. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/constraints.py +0 -0
  595. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/diagnostics.py +0 -0
  596. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/discrete_domains.py +0 -0
  597. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/error_handler.py +0 -0
  598. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/example_id.py +0 -0
  599. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/exceptions.py +0 -0
  600. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/file_versioning.py +0 -0
  601. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/function_identity.py +0 -0
  602. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/hashing.py +0 -0
  603. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/importance.py +0 -0
  604. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/incentives.py +0 -0
  605. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/insights.py +0 -0
  606. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/langchain_interceptor.py +0 -0
  607. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/litellm_interceptor.py +0 -0
  608. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/llm_response_parsing.py +0 -0
  609. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/local_analytics.py +0 -0
  610. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/multi_objective.py +0 -0
  611. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/numpy_compat.py +0 -0
  612. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/objectives.py +0 -0
  613. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/optimization_analyzer.py +0 -0
  614. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/pagination.py +0 -0
  615. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/persistence.py +0 -0
  616. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/results_table.py +0 -0
  617. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/secure_path.py +0 -0
  618. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/utils/url_security.py +0 -0
  619. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/visualization/__init__.py +0 -0
  620. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/visualization/plots.py +0 -0
  621. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/wrapper/__init__.py +0 -0
  622. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/wrapper/errors.py +0 -0
  623. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/wrapper/server.py +0 -0
  624. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent/wrapper/service.py +0 -0
  625. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent.egg-info/SOURCES.txt +0 -0
  626. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent.egg-info/dependency_links.txt +0 -0
  627. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent.egg-info/entry_points.txt +0 -0
  628. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent.egg-info/top_level.txt +0 -0
  629. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent_validation/__init__.py +0 -0
  630. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent_validation/base.py +0 -0
  631. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent_validation/plugins.py +0 -0
  632. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent_validation/py.typed +0 -0
  633. {traigent-0.20.0 → traigent-0.21.0.dev0}/traigent_validation/validators.py +0 -0
@@ -6,6 +6,81 @@ Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.21.0] - 2026-07-07
10
+
11
+ Observability hardening release. Enterprise-grade privacy posture for the
12
+ `@observe` instrumentation plus latency/usage accuracy fixes across the
13
+ SDK, backend, and portal.
14
+
15
+ ### Changed
16
+
17
+ - **BREAKING (behavioral): `@observe` is now metadata-only by default.** The
18
+ decorator and `ObserveContext` no longer send function arguments or return
19
+ values to the observability backend by default — only span metadata (name,
20
+ type, timing, tags, session/environment, and token/cost fields you pass).
21
+ To restore raw input/output capture, opt in per span with
22
+ `@observe(..., content_mode="record")` or globally with
23
+ `TRAIGENT_OBSERVABILITY_CONTENT=record`. Use `content_mode="redacted"` to
24
+ emit redaction placeholders. This closes an egress path where prompt/response
25
+ content left the process by default. **Migration:** if you relied on seeing
26
+ prompts/outputs in the dashboard, set `content_mode="record"` on those spans
27
+ (only for spans whose I/O is safe to store).
28
+ - Recorded span latency now measures only the wrapped function body. Previously
29
+ the span start was stamped before SDK trace-setup work, so transport/setup
30
+ overhead (tens of ms) was misattributed to application latency.
31
+ - Token and cost usage fields are nullable end-to-end (SDK DTO → backend schema
32
+ and model → portal). Unknown usage now renders as `—` instead of a misleading
33
+ `0` / `$0.0000`; a measured zero still renders as `0`. Completed generation
34
+ spans with no usage log a one-time warning rather than implying auto-capture.
35
+
36
+ ### Fixed
37
+
38
+ - Observability transport no longer blocks the calling application thread on
39
+ batch-size flushes: sends run on a daemon flush thread, and payload
40
+ redaction/serialization happen before acquiring the transport lock. An age
41
+ timer stays armed as a backstop so a tail item is never stranded if the flush
42
+ thread is in its death window when the next item arrives.
43
+ - Telemetry drops (queue full, oversized/non-serializable payloads, closed
44
+ transport, failed batches) are no longer silent: each updates stats/errors and
45
+ emits a `health_callback` event.
46
+ - Unknown `ENVIRONMENT`/`TRAIGENT_ENV` labels now log a warning (without leaking
47
+ the raw value) instead of being silently ignored; a missing `session_id`
48
+ renders as `—`.
49
+
50
+ ## [0.20.1] - 2026-07-06
51
+
52
+ Patch release for the managed optimization dispatch fix wave and adjacent
53
+ SDK honesty/hardening fixes shipped on develop after 0.20.0.
54
+
55
+ ### Changed
56
+ - Named smart optimization for managed-backend users now binds supported
57
+ algorithm names (`bayesian`, `tpe`, `optuna`, `optuna_tpe`, and
58
+ `optuna_random`) to the typed backend Optuna strategy and serializes
59
+ `optimization_strategy` on session creation. Unsupported smart names such
60
+ as `nsga2` and `cmaes` now fail before backend session creation with a
61
+ capability message instead of creating an orphaned session or returning a
62
+ misleading zero-trial result. (#1758, #1752)
63
+
64
+ ### Fixed
65
+ - Dict-input evaluation now warns when metadata-only parameters are defaulted
66
+ instead of silently accepting the defaulted shape. (#1756, #1746)
67
+ - Local run-log persistence preserves trial/configuration fidelity and keeps
68
+ orchestrator builder compatibility. (#1757, #1747, #1748)
69
+ - CLI algorithm/model surfaces now match public behavior and remove unsourced
70
+ Claude model guesses. (#1759, #1751)
71
+ - Callback failures derived from `BaseException` are contained without
72
+ breaking optimization control flow. (#1760, #1749)
73
+ - Objective reporting now honestly records unmatched objective metrics instead
74
+ of implying a measurement exists. (#1761, #1691)
75
+ - API-key validation failures are classified as auth/permission failures rather
76
+ than generic backend/network errors. (#1762, #1754)
77
+ - Prior unreleased develop fixes since 0.20.0: public onboarding skills repo
78
+ selection (#1737, #1623), early-stop decorator propagation (#1739, #1692),
79
+ unpriceable OpenRouter cost handling (#1740, #1597), redaction fail-open
80
+ tightening (#1742, #1649, #1650), exact ruff pin extraction in preflight
81
+ (#1743, #1550), analytics insight value validation (#1744, #1662), and
82
+ companion error message threading (#1745, #1885).
83
+
9
84
  ## [0.20.0] - 2026-07-05
10
85
 
11
86
  Fail-closed hardening release. A systematic silent-failure audit of the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: traigent
3
- Version: 0.20.0
3
+ Version: 0.21.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
@@ -121,7 +121,7 @@ Requires-Dist: types-PyYAML>=6.0.0; extra == "dev"
121
121
  Requires-Dist: types-requests>=2.31.0; extra == "dev"
122
122
  Requires-Dist: types-bleach>=6.0.0; extra == "dev"
123
123
  Requires-Dist: pre-commit>=3.0.0; extra == "dev"
124
- Requires-Dist: ruff>=0.1.0; extra == "dev"
124
+ Requires-Dist: ruff==0.15.12; extra == "dev"
125
125
  Requires-Dist: bandit>=1.7.0; extra == "dev"
126
126
  Requires-Dist: hypothesis>=6.100.0; extra == "dev"
127
127
  Provides-Extra: docs
@@ -41,7 +41,8 @@ During optimization runs, Traigent collects:
41
41
  ### What is NOT Collected
42
42
 
43
43
  Outside tuned configuration values explicitly sent on the default portal-backed
44
- path, Traigent does **not** collect:
44
+ path, and outside observability content you explicitly opt into recording,
45
+ Traigent does **not** collect:
45
46
 
46
47
  - **User prompts or inputs**
47
48
  - **LLM responses or outputs**
@@ -88,6 +89,39 @@ Use `TRAIGENT_DISABLE_TELEMETRY=true` for SDK telemetry opt-out, effective
88
89
  values on privacy-mode submissions, and `offline=True` for zero Traigent backend
89
90
  egress.
90
91
 
92
+ ### `@observe` Content Egress
93
+
94
+ The `@observe` decorator and `ObserveContext` are metadata-only by default. They
95
+ can send trace names, observation names, status, timing, tags, environment,
96
+ release, IDs, explicit metadata, and token/cost fields you pass, but they omit
97
+ function arguments, explicit context `input_data`, return values, and output data
98
+ unless you opt in.
99
+
100
+ To send prompt/output content for observability, opt in explicitly:
101
+
102
+ ```python
103
+ @observe("llm-call", content_mode="record")
104
+ def call_model(prompt: str) -> str:
105
+ ...
106
+ ```
107
+
108
+ Alternatively set `TRAIGENT_OBSERVABILITY_CONTENT=record`. The supported content
109
+ modes are:
110
+
111
+ - `metadata` (default): omit input and output content
112
+ - `redacted`: send `{"redacted": true}` placeholders for input and output
113
+ - `record`: send captured input and output content
114
+
115
+ `redact_input=True` and `redact_output=True` force redaction placeholders for the
116
+ corresponding side even when `content_mode="record"`. The transport still applies
117
+ pattern-based secret scrubbing before send, but that scrubber is a final safety
118
+ net, not the content-egress policy.
119
+
120
+ `@observe(observation_type=GENERATION)` does not estimate LangChain or provider
121
+ token usage from prompts. Pass measured `input_tokens`, `output_tokens`,
122
+ `total_tokens`, or `cost_usd` from the provider response when recording
123
+ generation spans; otherwise usage is reported as unknown, not zero.
124
+
91
125
  ### OpenTelemetry Tracing
92
126
 
93
127
  OpenTelemetry tracing is opt-in and uses a separate flag from telemetry
@@ -179,6 +213,7 @@ The following values are recognized as "opt-out" (case-insensitive):
179
213
  - `"true"`
180
214
  - `"1"`
181
215
  - `"yes"`
216
+ - `"on"`
182
217
 
183
218
  Any other value (including unset) means telemetry is enabled.
184
219
 
@@ -20,7 +20,7 @@ In a terminal, onboarding can offer to:
20
20
 
21
21
  - add `traigent[integrations]` to the project
22
22
  - start device login unless `--no-login` is set
23
- - install Traigent agent skills through `npx skills add Traigent/agents-skills`
23
+ - install Traigent agent skills through `npx skills add Traigent/traigent-skills`
24
24
  - register MCP for detected agents when `traigent mcp --help` succeeds
25
25
  - run the packaged mock quickstart
26
26
  - print the first prompt for the detected coding agent
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "traigent"
7
- version = "0.20.0"
7
+ version = "0.21.0.dev0"
8
8
  authors = [
9
9
  {name = "Traigent Team", email = "opensource@traigent.ai"},
10
10
  ]
@@ -177,7 +177,9 @@ dev = [
177
177
  "types-requests>=2.31.0",
178
178
  "types-bleach>=6.0.0",
179
179
  "pre-commit>=3.0.0",
180
- "ruff>=0.1.0",
180
+ "ruff==0.15.12", # Exact pin (issue #1550): CI preflight installs this exact
181
+ # version so an unrelated ruff release can't retroactively fail PRs on
182
+ # pre-existing lint debt. Bump deliberately, in the same PR as any fix-up.
181
183
  "bandit>=1.7.0",
182
184
  "hypothesis>=6.100.0", # Property-based testing for validation logic
183
185
  ]
@@ -18,7 +18,7 @@ isort>=5.10.0
18
18
  flake8>=5.0.0
19
19
  mypy>=1.0.0
20
20
  pre-commit>=3.0.0
21
- ruff>=0.1.0
21
+ ruff==0.15.12
22
22
 
23
23
  # Visualization
24
24
  matplotlib>=3.5.0
@@ -701,10 +701,16 @@ _OPTIMIZE_DEFAULTS: dict[str, Any] = {
701
701
  "execution": None,
702
702
  "mock": None,
703
703
  "max_trials": DEFAULT_MAX_TRIALS,
704
- # Early stopping parameters
705
- "plateau_window": None, # Stop if no improvement for N trials
706
- "plateau_epsilon": None, # Improvement threshold for plateau detection
707
- "semantic_saturation": None, # Opt-in semantic saturation stop condition config
704
+ # NOTE: plateau_window / plateau_epsilon / semantic_saturation are
705
+ # intentionally NOT listed here (issue #1692). They are early-stop
706
+ # runtime-override keys (see _ALLOWED_RUNTIME_OVERRIDE_KEYS) that must
707
+ # flow through `combined_runtime_overrides` -> `_decorator_runtime_overrides`
708
+ # -> the orchestrator's stop-condition config, both at decoration time and
709
+ # at call time. Adding them to _OPTIMIZE_DEFAULTS pulls them into
710
+ # _DIRECT_OPTION_KEYS, which reroutes decorator-time values into the dead
711
+ # `combined_settings` bucket (nothing ever reads combined_settings[...]
712
+ # for these keys) instead of `combined_runtime_overrides`, silently
713
+ # no-op'ing early stopping when configured on the decorator.
708
714
  # Multi-agent configuration
709
715
  "agents": None, # Explicit agent definitions
710
716
  "agent_prefixes": None, # Prefix-based agent inference
@@ -727,6 +727,11 @@ class OptimizationResult:
727
727
  # Stop reason - why the optimization stopped (see class docstring for values)
728
728
  stop_reason: StopReason | None = None
729
729
 
730
+ # Selection reason for no-winner or fail-closed terminal results. This is
731
+ # distinct from stop_reason: stop_reason explains why execution stopped,
732
+ # while reason_code explains why result selection did not produce a winner.
733
+ reason_code: str | None = None
734
+
730
735
  # Run identification and cloud link
731
736
  experiment_id: str | None = None
732
737
  cloud_url: str | None = None
@@ -781,6 +786,8 @@ class OptimizationResult:
781
786
  @property
782
787
  def success_rate(self) -> float:
783
788
  """Calculate trial success rate."""
789
+ if "OBJECTIVE_UNMATCHED" in self.warning_codes:
790
+ return 0.0
784
791
  if not self.trials:
785
792
  return 0.0
786
793
  return len(self.successful_trials) / len(self.trials)
@@ -503,7 +503,8 @@ class TraigentAuthCLI:
503
503
 
504
504
  try:
505
505
  async with aiohttp.ClientSession(
506
- timeout=aiohttp.ClientTimeout(total=15)
506
+ timeout=aiohttp.ClientTimeout(total=15),
507
+ trust_env=True,
507
508
  ) as session:
508
509
  async with session.post(url, headers=headers) as response:
509
510
  response_text = await response.text()
@@ -896,7 +897,7 @@ class TraigentAuthCLI:
896
897
  return False
897
898
 
898
899
  try:
899
- async with aiohttp.ClientSession() as session:
900
+ async with aiohttp.ClientSession(trust_env=True) as session:
900
901
  authorization = await self._start_device_authorization(session)
901
902
  self._display_device_authorization(authorization)
902
903
  credentials = await self._poll_device_token(
@@ -1026,7 +1027,7 @@ class TraigentAuthCLI:
1026
1027
 
1027
1028
  console.print(f"[dim]POST {login_url}[/dim]")
1028
1029
 
1029
- async with aiohttp.ClientSession() as session:
1030
+ async with aiohttp.ClientSession(trust_env=True) as session:
1030
1031
  async with session.post(
1031
1032
  login_url,
1032
1033
  json={"email": email, "password": password},
@@ -1113,7 +1114,7 @@ class TraigentAuthCLI:
1113
1114
  console.print(f"\n[dim]POST {api_key_url}[/dim]")
1114
1115
  console.print(f"[dim]Creating API key: {key_name}[/dim]")
1115
1116
 
1116
- async with aiohttp.ClientSession() as session:
1117
+ async with aiohttp.ClientSession(trust_env=True) as session:
1117
1118
  async with session.post(
1118
1119
  api_key_url,
1119
1120
  json=key_payload,
@@ -1446,7 +1447,7 @@ class TraigentAuthCLI:
1446
1447
  try:
1447
1448
  import aiohttp
1448
1449
 
1449
- async with aiohttp.ClientSession():
1450
+ async with aiohttp.ClientSession(trust_env=True):
1450
1451
  # Backend may not expose a revoke endpoint yet; placeholder for future call.
1451
1452
  pass # Silently continue if revocation fails
1452
1453
  except Exception as e:
@@ -1985,7 +1986,8 @@ async def _check_api_key(backend_api_url: str, key: str) -> bool:
1985
1986
 
1986
1987
  try:
1987
1988
  async with aiohttp.ClientSession(
1988
- timeout=aiohttp.ClientTimeout(total=15)
1989
+ timeout=aiohttp.ClientTimeout(total=15),
1990
+ trust_env=True,
1989
1991
  ) as session:
1990
1992
  async with session.post(
1991
1993
  url,
@@ -15,7 +15,6 @@ from rich.table import Table
15
15
 
16
16
  from traigent import get_version_info
17
17
  from traigent.api.functions import (
18
- get_available_strategies,
19
18
  list_recommendation_agent_types,
20
19
  recommend_configuration_space,
21
20
  )
@@ -32,6 +31,7 @@ from traigent.cli.auth_commands import auth
32
31
  from traigent.cli.hooks_commands import hooks
33
32
  from traigent.cli.local_commands import register_local_commands
34
33
  from traigent.cli.sync_commands import register_sync_command
34
+ from traigent.config.types import accepted_algorithm_values
35
35
  from traigent.evaluators import (
36
36
  list_eval_recommendation_task_types,
37
37
  recommend_evaluator,
@@ -508,34 +508,33 @@ def info() -> None:
508
508
 
509
509
  @cli.command()
510
510
  def algorithms() -> None:
511
- """List available optimization algorithms."""
512
- strategies = get_available_strategies()
511
+ """List public optimization algorithms accepted by SDK validation."""
513
512
 
514
513
  console.print("\n[bold blue]Available Optimization Algorithms[/bold blue]\n")
515
514
 
516
- for name, info in strategies.items():
517
- console.print(f"[bold green]{info['name']}[/bold green] ([cyan]{name}[/cyan])")
518
- console.print(f" {info['description']}")
519
- console.print(f" Best for: {info['best_for']}")
520
-
521
- # Capabilities
522
- capabilities = []
523
- if info["supports_continuous"]:
524
- capabilities.append("continuous")
525
- if info["supports_categorical"]:
526
- capabilities.append("categorical")
527
- if info["deterministic"]:
528
- capabilities.append("deterministic")
529
-
530
- console.print(f" Supports: {', '.join(capabilities)}")
515
+ table = Table(show_header=True, header_style=_TABLE_HEADER_STYLE)
516
+ table.add_column("Algorithm", style="cyan")
517
+ table.add_column("Availability")
518
+ table.add_column("Notes")
519
+
520
+ for name in accepted_algorithm_values():
521
+ if name == "auto":
522
+ availability = "[green]connected[/green]"
523
+ notes = "Default cloud smart optimizer/TPE path when authenticated."
524
+ elif name in {"grid", "random"}:
525
+ availability = "[green]local[/green]"
526
+ notes = "Runs in-process; can sync results when authenticated."
527
+ else:
528
+ availability = "[yellow]connected[/yellow]"
529
+ notes = "Accepted public smart name; routed through Traigent cloud."
531
530
 
532
- # Parameters
533
- if info["parameters"]:
534
- console.print(" Parameters:")
535
- for param, desc in info["parameters"].items():
536
- console.print(f" • {param}: {desc}")
531
+ table.add_row(name, availability, notes)
537
532
 
538
- console.print()
533
+ console.print(table)
534
+ console.print(
535
+ "\n[dim]Runtime-only registry names are intentionally omitted here because "
536
+ "they are not accepted by public SDK validation.[/dim]"
537
+ )
539
538
 
540
539
 
541
540
  @cli.command("recommend")
@@ -33,7 +33,7 @@ FIRST_PROMPT_TOOL_LINE: dict[AgentName, str] = {
33
33
  }
34
34
  PLAN_JSON_BEGIN = "BEGIN_TRAIGENT_ONBOARD_PLAN_JSON"
35
35
  PLAN_JSON_END = "END_TRAIGENT_ONBOARD_PLAN_JSON"
36
- SKILLS_COMMAND = ["npx", "skills", "add", "Traigent/agents-skills"]
36
+ SKILLS_COMMAND = ["npx", "skills", "add", "Traigent/traigent-skills"]
37
37
  AUTH_STATUS_COMMAND = ["traigent", "auth", "status"]
38
38
 
39
39
 
@@ -127,6 +127,8 @@ _RUN_EXAMPLE_INSIGHTS_REQUIRED_KEYS = frozenset(
127
127
  }
128
128
  )
129
129
  _EXAMPLE_INSIGHT_REF_PATTERN = re.compile(r"^exref_[0-9a-f]{16}$")
130
+ _EXAMPLE_INSIGHT_MAX_SAFE_EXAMPLE_REFS = 50
131
+ _EXAMPLE_INSIGHTS_DATASET_QUALITIES = frozenset({"low", "medium", "high"})
130
132
  _EXAMPLE_INSIGHT_REVIEW_PRIORITIES = frozenset({"critical", "high", "medium", "low"})
131
133
  _EXAMPLE_INSIGHT_DIFFICULTY_BUCKETS = frozenset({"low", "medium", "high", "unknown"})
132
134
  _EXAMPLE_INSIGHT_SUSPICIOUS_FLAGS = frozenset(
@@ -277,7 +279,13 @@ def _project_aggregate(data: Any, keys: frozenset[str], *, what: str) -> dict[st
277
279
  Unknown nested keys can carry proprietary signals or raw backend state.
278
280
  This function is the nested-aggregate counterpart of the per-row construction
279
281
  in :func:`_project_example_insight_row`: both rebuild output by allowlist so
280
- nothing unknown can pass through regardless of what the backend sends.
282
+ nothing unknown can pass through regardless of what the backend sends. Note
283
+ that this allowlists by *key* only — callers whose values carry a specific
284
+ contract (e.g. ``summary.dataset_quality``, ``cohorts[].safe_example_refs``)
285
+ must additionally validate those values themselves (see
286
+ :func:`_project_example_insights_summary` and
287
+ :func:`_project_example_insights_cohort`); an unvalidated value allowlisted
288
+ by key alone could still smuggle raw/proprietary content through.
281
289
  """
282
290
  if not isinstance(data, dict):
283
291
  raise AnalyticsClientError(
@@ -286,6 +294,81 @@ def _project_aggregate(data: Any, keys: frozenset[str], *, what: str) -> dict[st
286
294
  return {k: v for k, v in data.items() if k in keys}
287
295
 
288
296
 
297
+ def _assert_allowed_string(value: Any, allowed: frozenset[str], *, what: str) -> str:
298
+ """Validate that ``value`` is one of a fixed set of enum strings.
299
+
300
+ Mirrors the JS SDK's ``assertAllowedString`` (traigent-js analytics-client.ts)
301
+ used to close the same value-validation gap for cross-SDK parity.
302
+ """
303
+ if not isinstance(value, str) or value not in allowed:
304
+ raise AnalyticsClientError(
305
+ f"Malformed example insights response: {what} must be one of: "
306
+ f"{', '.join(sorted(allowed))}."
307
+ )
308
+ return value
309
+
310
+
311
+ def _assert_safe_example_refs(value: Any, *, what: str) -> list[str]:
312
+ """Validate a cohort's ``safe_example_refs`` list.
313
+
314
+ Each element must be an opaque ``exref_`` reference matching the backend
315
+ contract (``run_analytics_service._safe_example_refs``), and the list must
316
+ not exceed the backend's cap. Mirrors the JS SDK's
317
+ ``assertSafeExampleRefs`` for cross-SDK parity (Traigent#1662).
318
+ """
319
+ if not isinstance(value, list):
320
+ raise AnalyticsClientError(
321
+ f"Malformed example insights response: {what} must be a list."
322
+ )
323
+ if len(value) > _EXAMPLE_INSIGHT_MAX_SAFE_EXAMPLE_REFS:
324
+ raise AnalyticsClientError(
325
+ f"Malformed example insights response: {what} must contain at most "
326
+ f"{_EXAMPLE_INSIGHT_MAX_SAFE_EXAMPLE_REFS} refs."
327
+ )
328
+ for ref in value:
329
+ if not isinstance(ref, str) or not _EXAMPLE_INSIGHT_REF_PATTERN.match(ref):
330
+ raise AnalyticsClientError(
331
+ f"Malformed example insights response: {what} must only contain "
332
+ "refs matching ^exref_[0-9a-f]{16}$."
333
+ )
334
+ return list(value)
335
+
336
+
337
+ def _project_example_insights_summary(data: Any) -> dict[str, Any]:
338
+ """Project + value-validate the ``summary`` aggregate.
339
+
340
+ ``dataset_quality`` is required and must be one of the backend's frozen
341
+ ``Literal["low", "medium", "high"]`` enum values; a backend regression
342
+ emitting a raw/unexpected value must fail closed rather than pass through.
343
+ """
344
+ summary = _project_aggregate(data, _EXAMPLE_INSIGHTS_SUMMARY_KEYS, what="summary")
345
+ summary["dataset_quality"] = _assert_allowed_string(
346
+ summary.get("dataset_quality"),
347
+ _EXAMPLE_INSIGHTS_DATASET_QUALITIES,
348
+ what="summary.dataset_quality",
349
+ )
350
+ return summary
351
+
352
+
353
+ def _project_example_insights_cohort(cohort: Any, *, index: int) -> dict[str, Any]:
354
+ """Project + value-validate one ``cohorts[]`` aggregate.
355
+
356
+ ``safe_example_refs`` is optional per cohort, but when present each element
357
+ must be a well-formed opaque ref within the backend's cap — a backend
358
+ regression placing raw prompt text/emails in this list must not pass
359
+ through the SDK.
360
+ """
361
+ projected = _project_aggregate(
362
+ cohort, _EXAMPLE_INSIGHTS_COHORT_KEYS, what=f"cohorts[{index}]"
363
+ )
364
+ if "safe_example_refs" in projected:
365
+ projected["safe_example_refs"] = _assert_safe_example_refs(
366
+ projected["safe_example_refs"],
367
+ what=f"cohorts[{index}].safe_example_refs",
368
+ )
369
+ return projected
370
+
371
+
289
372
  def _quote_segment(value: str, *, field: str) -> str:
290
373
  """URL-encode a path segment, rejecting empty values up front.
291
374
 
@@ -687,9 +770,13 @@ class BackendAnalyticsClient:
687
770
  from projected safe fields so raw signals cannot pass through even on a
688
771
  backend regression. ``summary``, ``cohorts``, ``recommendations``, and
689
772
  ``redactions`` are backend-redacted, templated, canary-enforced safe
690
- aggregate guidance and are forwarded as-is. This reader deliberately
691
- allowlists by construction, unlike the other thin pass-through readers in
692
- this module, because it is the IP-sensitive per-example endpoint.
773
+ aggregate guidance, projected by key allowlist. ``summary.dataset_quality``
774
+ and ``cohorts[].safe_example_refs`` additionally get per-value shape
775
+ validation (enum / opaque-ref-pattern + length cap): a backend regression
776
+ placing raw content in those two value families must fail closed rather
777
+ than pass through (Traigent#1662). This reader deliberately allowlists by
778
+ construction, unlike the other thin pass-through readers in this module,
779
+ because it is the IP-sensitive per-example endpoint.
693
780
  """
694
781
  path = (
695
782
  "/api/v1/analytics/runs/"
@@ -729,21 +816,13 @@ class BackendAnalyticsClient:
729
816
  return {
730
817
  "run_id": payload["run_id"],
731
818
  "privacy_mode": payload["privacy_mode"],
732
- "summary": _project_aggregate(
733
- payload["summary"],
734
- _EXAMPLE_INSIGHTS_SUMMARY_KEYS,
735
- what="summary",
736
- ),
819
+ "summary": _project_example_insights_summary(payload["summary"]),
737
820
  "example_rows": [
738
821
  _project_example_insight_row(row, index=index)
739
822
  for index, row in enumerate(rows)
740
823
  ],
741
824
  "cohorts": [
742
- _project_aggregate(
743
- cohort,
744
- _EXAMPLE_INSIGHTS_COHORT_KEYS,
745
- what=f"cohorts[{i}]",
746
- )
825
+ _project_example_insights_cohort(cohort, index=i)
747
826
  for i, cohort in enumerate(cohorts_raw)
748
827
  ],
749
828
  "recommendations": [