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.
- {traigent-0.17.0.dev0/traigent.egg-info → traigent-0.18.0.dev0}/PKG-INFO +1 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/pyproject.toml +2 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/adapters/execution_adapter.py +16 -2
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/__init__.py +2 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/example_insights.py +3 -2
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/next_steps.py +3 -2
- traigent-0.18.0.dev0/traigent/analytics/optimization_plan.py +212 -0
- traigent-0.18.0.dev0/traigent/analytics/render.py +349 -0
- traigent-0.18.0.dev0/traigent/analytics_mcp/__init__.py +12 -0
- traigent-0.18.0.dev0/traigent/analytics_mcp/server.py +280 -0
- traigent-0.18.0.dev0/traigent/analytics_mcp/tools.py +454 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/parameter_ranges.py +12 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/types.py +9 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/main.py +4 -0
- traigent-0.18.0.dev0/traigent/cli/plan_command.py +225 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/sync_commands.py +10 -0
- traigent-0.18.0.dev0/traigent/cloud/analytics_auth.py +73 -0
- traigent-0.18.0.dev0/traigent/cloud/analytics_client.py +565 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/auth.py +16 -10
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_client.py +178 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/session_operations.py +3 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/sync_manager.py +204 -23
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/trial_operations.py +20 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/backend_config.py +62 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/project.py +6 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/providers.py +21 -12
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/backend_session_manager.py +3 -9
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cost_enforcement.py +12 -6
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/execution_policy_runtime.py +12 -3
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/mandatory_metrics.py +7 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/objectives.py +12 -5
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/optimized_function.py +121 -3
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/orchestrator.py +44 -20
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/result_selection.py +24 -16
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_lifecycle.py +48 -6
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_result_factory.py +45 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/base.py +102 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/local.py +21 -17
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/metrics.py +4 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/metrics_tracker.py +68 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/__main__.py +51 -13
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/framework_override.py +110 -16
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langchain/handler.py +146 -17
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/server.py +32 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/tools.py +31 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/base.py +20 -34
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/batch_optimizers.py +39 -18
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/grid.py +52 -9
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/random.py +100 -21
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/cost_calculator.py +141 -16
- traigent-0.18.0.dev0/traigent/utils/discrete_domains.py +232 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/insights.py +31 -9
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/objectives.py +14 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/optimization_logger.py +6 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0/traigent.egg-info}/PKG-INFO +1 -1
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/SOURCES.txt +9 -7
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/entry_points.txt +1 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/validators.py +67 -9
- traigent-0.17.0.dev0/traigent/cloud/event_manager.py +0 -551
- traigent-0.17.0.dev0/traigent/core/config_builder.py +0 -565
- traigent-0.17.0.dev0/traigent/core/llm_processor.py +0 -357
- traigent-0.17.0.dev0/traigent/core/refactoring_utils.py +0 -263
- traigent-0.17.0.dev0/traigent/integrations/llms/langchain/discovery.py +0 -311
- traigent-0.17.0.dev0/traigent/optimizers/service_registry.py +0 -924
- traigent-0.17.0.dev0/traigent/telemetry/__init__.py +0 -5
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CHANGELOG.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/COMMERCIAL-LICENSE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CONTRIBUTING.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/CONTRIBUTOR-LICENSING.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/DISCLAIMER.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/LICENSE +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/MANIFEST.in +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/NOTICE +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/SECURITY.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/LOCAL_CI_GATE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/SYNC_MAP.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/agent-skill.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/complete-function-specification.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/decorator-reference.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/enterprise-beta-api.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/interactive_optimizer.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/telemetry.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/api-reference/thread-pool-examples.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/ARCHITECTURE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/cost-architecture-validation.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/execution_mode_follow_up.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/integrations-inventory.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/plugin_architecture.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/project-structure.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/architecture/stop_conditions.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/composite-knob-ir.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/composite-knobs.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/concepts/guided-generation.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/ADDING_NEW_INTEGRATIONS.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/CODE_OF_CONDUCT.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/CONTRIBUTING.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/EXAMPLE_TEMPLATE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/SECURITY.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/aikido_triage.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/code_review_instructions.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/contributing/test-quality-guide.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/demos/DEMO_VIDEO_GUIDE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/demos/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/API_PATTERNS.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/LEARNING_ROADMAP.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/QUICK_REFERENCE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/START_HERE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/examples/TROUBLESHOOTING.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/fake-completion-tracking.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/feature_matrices/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/authentication.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/constraint-dsl.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/dataflow-detection.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/framework_override_enhanced_features.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/mcp-server.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/observability-spans.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/onboarding.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/prompt_management.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/recommendations.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/safety-gates.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/seamless_injection.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/strategy-presets.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/features/strict_metrics_nulls.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/GETTING_STARTED.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/installation.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/minimal-integration.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/portal-dev-laptop-agent.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/getting-started/testing.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/VSCODE_RESTART_GUIDE.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/evaluation.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/execution-mode-migration.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/execution-modes.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/js-bridge.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/llm_plugin_migration_guide.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/parallel-configuration.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/guides/secrets_management.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/hybrid-mode-api-contract.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/hybrid-mode-client-guide.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/azure_openai.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/bedrock.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/operations/google_gemini.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/security/trust_model.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/testing/CREATIVE_STRESS_TESTING.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/composite-knob-ir.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/composite-knobs.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/concepts/guided-generation.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/schema.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/tagging_tracking.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/traceability/taxonomy_reference.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/tvl/CONSTRAINT_EXPRESSIONS.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/README.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/agent_optimization.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/choosing_optimization_model.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/configuration-spaces.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/evaluation_guide.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/injection_modes.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/interactive_optimization.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/smart_optimization.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/user-guide/tuned_variables.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/docs/walkthrough.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-all.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-analytics.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-bayesian.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-chroma.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-dev.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-hybrid.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-integrations.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-security.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements-test.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/requirements/requirements.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/setup.cfg +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/_version.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/admin/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/config_mapper.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/executor.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/platforms.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/agents/specification_generator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/anomaly.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/cost_optimization.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/intelligence.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/meta_learning.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/predictive.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/analytics/scheduling.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/agent_inference.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/config_builder.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/config_space.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/constraint_builders.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/constraints.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/decorators.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/functions.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/parameter_validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/safety.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/strategy_presets.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/api/validation_protocol.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/auth_commands.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/detect_tvars_command.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/function_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/generate_config_command.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/hooks_commands.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/local_commands.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/next_steps_command.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/onboard_commands.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/optimization_validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/playbook_commands.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cli/validation_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/_aiohttp_compat.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/agent_dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/api_key_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/api_operations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/async_batch_transport.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_bridges.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_components.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/backend_synchronizer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/benchmark_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/billing.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/cloud_operations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/credential_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/credential_resolver.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/dataset_converter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/governance.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/integration_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/models.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/optimizer_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/password_auth_handler.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/privacy_operations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/production_mcp_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/remote_guidance.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/resilient_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/service.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/session_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/sessions.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/subset_selection.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/token_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/trial_tracker.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/url_security.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/cloud/validators.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/api_keys.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/ast_transformer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/context.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/feature_flags.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/models.yaml +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/parallel.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/runtime_injector.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/seamless_injection.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/tenant.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config/types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/agent_classifier.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/apply.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_catalog_entry_schema.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_observation_schema.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/schemas/tvar_value_recommendation_schema.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog/tvar_catalog.v1.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/catalog.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/llm_backend.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/pipeline.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/agent_type_catalog.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/benchmark_catalog.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/constraint_templates.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/presets/range_presets.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/recommendations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/benchmarks.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/objectives.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/safety_constraints.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/structural_constraints.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/tvar_ranges.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/subsystems/tvar_recommendations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/config_generator/types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/best_config_runtime.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cache_policy.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/ci_approval.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/config_state_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/constants.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/cost_estimator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/evaluator_wrapper.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/exception_handler.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/license.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/logger_facade.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/meta_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metadata_helpers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metric_registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/metrics_aggregator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/namespace.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/optimization_pipeline.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/orchestrator_helpers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/parallel_execution_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/progress_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/sample_budget.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/samplers/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/samplers/random_sampler.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/session_context.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/session_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stat_significance.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stop_condition_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/stop_conditions.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trace_env.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/tracing.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/trial_context.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/types_ext.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/utils.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core/workflow_trace_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/core_metrics/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/contracts.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/framework_param.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/effectuation/strategies/self_consistency.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluation/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog/metric_eval_catalog.v1.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog/schemas/metric_eval_catalog_entry_schema.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/catalog_loader.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/dataset_registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/hybrid_api.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/evaluators/recommendations.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/_bootstrap.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/_demo.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/anthropic.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/aws.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/azure.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/gcp.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/gemini.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/groq.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/litellm_any.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/manifest.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/openai.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/openrouter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/providers/qa_samples.jsonl +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/_env.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/quickstart/qa_samples.jsonl +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/examples/tutorial_bootstrap.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/backend_provider.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/example_synth.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/llm_provider.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/loop.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/models.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/options.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/prompt_rewriter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/artifacts.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/buffer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/document.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/edits.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/prompts.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/reflection.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/schedule.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/slow_update.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/splits.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/trainer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/skill_train/trainer_result.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/generation/validators.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/guaranteed_modes.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/installer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hooks/validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/http_transport.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/lifecycle.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/mcp_transport.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/protocol.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/hybrid/transport.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/activation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/base_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/batch_wrapper.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/bedrock_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/dspy_adapter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langchain/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/callback.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/langfuse/tracker.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/anthropic_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/azure_openai_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/base_llm_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/bedrock_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/cohere_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/gemini_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/huggingface_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/langchain_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/litellm_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/llamaindex_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/mistral_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/openai.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/llms/openai_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/mappings.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/anthropic_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/azure_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/cache.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/gemini_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/mistral_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/openai_discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/model_discovery/registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/mlflow.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/wandb.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/observability/workflow_traces.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/plugin_registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/providers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/handler.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/pydantic_ai/plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/message_coercion.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/mock_adapter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/parameter_normalizer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/response_wrapper.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/validation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/utils/version_compat.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/chromadb_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/pinecone_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/vector_stores/weaviate_plugin.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/integrations/wrappers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/batch.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/local.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/invokers/streaming.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/adapters.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/bindings.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/canonical.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/cascade.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/certificates.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/composites.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/kinds.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/patterns.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/resolution.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/resolver.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/runtime.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/signals.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/knobs/telemetry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/mcp/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/agent_metrics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/content_features.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/deepeval_metrics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/ragas_metrics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/metrics/registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/agent_spans.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/decorators.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/observability/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/cloud_optimizer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/interactive_optimizer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/remote.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/remote_services.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/optimizers/results.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/loader.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/model.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/scaffold.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/schemas/agent_playbook_schema.json +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/staleness.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/playbook/validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/plugins/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/plugins/registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/projects/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/prompts/dtos.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/providers/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/providers/validation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/py.typed +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/reporting/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/reporting/example_map.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/audit.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/helpers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/mfa.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/models.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/oidc.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/saml.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/sms.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/auth/totp.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/credentials.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/crypto_utils.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/deployment.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/encryption.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/enterprise.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/headers.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/input_validation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/jwt_validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/rate_limiter.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/redaction.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/session_manager.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/security/tenant.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/references/convergence-patterns.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-analyze-results/references/optimization-result-api.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/references/constraints.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-configuration-space/references/parameter-types.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/error-reference.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/logging-config.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-debugging/references/mock-mode.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/evaluation-options.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/execution-modes.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-decorator-setup/references/injection-modes.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/dspy.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/langchain.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-integrations/references/litellm.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/references/environment-variables.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-quickstart/references/installation-extras.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/SKILL.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/algorithms.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/cost-management.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/skills/traigent-run-optimization/references/parallel-config.md +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/storage/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/storage/local_storage.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/testing/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/traigent_client.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/traigent_integration.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/dataflow_strategy.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detection_strategies.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detection_types.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/detector.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/discovery.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/observation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tuned_variables/py.typed +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/__main__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/models.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/objectives.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/options.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/promotion_gate.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/registry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/spec_loader.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/spec_validator.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/tvl/statistics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/batch_optimizer_utils.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/batch_processing.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/callbacks.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/console.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/constraints.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/diagnostics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/env_config.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/error_handler.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/example_id.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/exceptions.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/file_versioning.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/function_identity.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/hashing.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/importance.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/incentives.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/langchain_interceptor.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/litellm_interceptor.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/llm_response_parsing.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/local_analytics.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/logging.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/multi_objective.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/numpy_compat.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/optimization_analyzer.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/persistence.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/reproducibility.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/results_table.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/retry.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/secure_path.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/url_security.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/user_prompts.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/utils/validation.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/visualization/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/visualization/plots.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/errors.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/server.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent/wrapper/service.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/dependency_links.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/requires.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent.egg-info/top_level.txt +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/__init__.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/base.py +0 -0
- {traigent-0.17.0.dev0 → traigent-0.18.0.dev0}/traigent_validation/plugins.py +0 -0
- {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.
|
|
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.
|
|
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 =
|
|
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"] =
|
|
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
|
|
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
|
|
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())
|