attune-ai 2.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- attune/__init__.py +358 -0
- attune/adaptive/__init__.py +13 -0
- attune/adaptive/task_complexity.py +127 -0
- attune/agent_monitoring.py +414 -0
- attune/cache/__init__.py +117 -0
- attune/cache/base.py +166 -0
- attune/cache/dependency_manager.py +256 -0
- attune/cache/hash_only.py +251 -0
- attune/cache/hybrid.py +457 -0
- attune/cache/storage.py +285 -0
- attune/cache_monitor.py +356 -0
- attune/cache_stats.py +298 -0
- attune/cli/__init__.py +152 -0
- attune/cli/__main__.py +12 -0
- attune/cli/commands/__init__.py +1 -0
- attune/cli/commands/batch.py +264 -0
- attune/cli/commands/cache.py +248 -0
- attune/cli/commands/help.py +331 -0
- attune/cli/commands/info.py +140 -0
- attune/cli/commands/inspect.py +436 -0
- attune/cli/commands/inspection.py +57 -0
- attune/cli/commands/memory.py +48 -0
- attune/cli/commands/metrics.py +92 -0
- attune/cli/commands/orchestrate.py +184 -0
- attune/cli/commands/patterns.py +207 -0
- attune/cli/commands/profiling.py +202 -0
- attune/cli/commands/provider.py +98 -0
- attune/cli/commands/routing.py +285 -0
- attune/cli/commands/setup.py +96 -0
- attune/cli/commands/status.py +235 -0
- attune/cli/commands/sync.py +166 -0
- attune/cli/commands/tier.py +121 -0
- attune/cli/commands/utilities.py +114 -0
- attune/cli/commands/workflow.py +579 -0
- attune/cli/core.py +32 -0
- attune/cli/parsers/__init__.py +68 -0
- attune/cli/parsers/batch.py +118 -0
- attune/cli/parsers/cache.py +65 -0
- attune/cli/parsers/help.py +41 -0
- attune/cli/parsers/info.py +26 -0
- attune/cli/parsers/inspect.py +66 -0
- attune/cli/parsers/metrics.py +42 -0
- attune/cli/parsers/orchestrate.py +61 -0
- attune/cli/parsers/patterns.py +54 -0
- attune/cli/parsers/provider.py +40 -0
- attune/cli/parsers/routing.py +110 -0
- attune/cli/parsers/setup.py +42 -0
- attune/cli/parsers/status.py +47 -0
- attune/cli/parsers/sync.py +31 -0
- attune/cli/parsers/tier.py +33 -0
- attune/cli/parsers/workflow.py +77 -0
- attune/cli/utils/__init__.py +1 -0
- attune/cli/utils/data.py +242 -0
- attune/cli/utils/helpers.py +68 -0
- attune/cli_legacy.py +3957 -0
- attune/cli_minimal.py +1159 -0
- attune/cli_router.py +437 -0
- attune/cli_unified.py +814 -0
- attune/config/__init__.py +66 -0
- attune/config/xml_config.py +286 -0
- attune/config.py +545 -0
- attune/coordination.py +870 -0
- attune/core.py +1511 -0
- attune/core_modules/__init__.py +15 -0
- attune/cost_tracker.py +626 -0
- attune/dashboard/__init__.py +41 -0
- attune/dashboard/app.py +512 -0
- attune/dashboard/simple_server.py +435 -0
- attune/dashboard/standalone_server.py +547 -0
- attune/discovery.py +306 -0
- attune/emergence.py +306 -0
- attune/exceptions.py +123 -0
- attune/feedback_loops.py +373 -0
- attune/hot_reload/README.md +473 -0
- attune/hot_reload/__init__.py +62 -0
- attune/hot_reload/config.py +83 -0
- attune/hot_reload/integration.py +229 -0
- attune/hot_reload/reloader.py +298 -0
- attune/hot_reload/watcher.py +183 -0
- attune/hot_reload/websocket.py +177 -0
- attune/levels.py +577 -0
- attune/leverage_points.py +441 -0
- attune/logging_config.py +261 -0
- attune/mcp/__init__.py +10 -0
- attune/mcp/server.py +506 -0
- attune/memory/__init__.py +237 -0
- attune/memory/claude_memory.py +469 -0
- attune/memory/config.py +224 -0
- attune/memory/control_panel.py +1290 -0
- attune/memory/control_panel_support.py +145 -0
- attune/memory/cross_session.py +845 -0
- attune/memory/edges.py +179 -0
- attune/memory/encryption.py +159 -0
- attune/memory/file_session.py +770 -0
- attune/memory/graph.py +570 -0
- attune/memory/long_term.py +913 -0
- attune/memory/long_term_types.py +99 -0
- attune/memory/mixins/__init__.py +25 -0
- attune/memory/mixins/backend_init_mixin.py +249 -0
- attune/memory/mixins/capabilities_mixin.py +208 -0
- attune/memory/mixins/handoff_mixin.py +208 -0
- attune/memory/mixins/lifecycle_mixin.py +49 -0
- attune/memory/mixins/long_term_mixin.py +352 -0
- attune/memory/mixins/promotion_mixin.py +109 -0
- attune/memory/mixins/short_term_mixin.py +182 -0
- attune/memory/nodes.py +179 -0
- attune/memory/redis_bootstrap.py +540 -0
- attune/memory/security/__init__.py +31 -0
- attune/memory/security/audit_logger.py +932 -0
- attune/memory/security/pii_scrubber.py +640 -0
- attune/memory/security/secrets_detector.py +678 -0
- attune/memory/short_term.py +2192 -0
- attune/memory/simple_storage.py +302 -0
- attune/memory/storage/__init__.py +15 -0
- attune/memory/storage_backend.py +167 -0
- attune/memory/summary_index.py +583 -0
- attune/memory/types.py +446 -0
- attune/memory/unified.py +182 -0
- attune/meta_workflows/__init__.py +74 -0
- attune/meta_workflows/agent_creator.py +248 -0
- attune/meta_workflows/builtin_templates.py +567 -0
- attune/meta_workflows/cli_commands/__init__.py +56 -0
- attune/meta_workflows/cli_commands/agent_commands.py +321 -0
- attune/meta_workflows/cli_commands/analytics_commands.py +442 -0
- attune/meta_workflows/cli_commands/config_commands.py +232 -0
- attune/meta_workflows/cli_commands/memory_commands.py +182 -0
- attune/meta_workflows/cli_commands/template_commands.py +354 -0
- attune/meta_workflows/cli_commands/workflow_commands.py +382 -0
- attune/meta_workflows/cli_meta_workflows.py +59 -0
- attune/meta_workflows/form_engine.py +292 -0
- attune/meta_workflows/intent_detector.py +409 -0
- attune/meta_workflows/models.py +569 -0
- attune/meta_workflows/pattern_learner.py +738 -0
- attune/meta_workflows/plan_generator.py +384 -0
- attune/meta_workflows/session_context.py +397 -0
- attune/meta_workflows/template_registry.py +229 -0
- attune/meta_workflows/workflow.py +984 -0
- attune/metrics/__init__.py +12 -0
- attune/metrics/collector.py +31 -0
- attune/metrics/prompt_metrics.py +194 -0
- attune/models/__init__.py +172 -0
- attune/models/__main__.py +13 -0
- attune/models/adaptive_routing.py +437 -0
- attune/models/auth_cli.py +444 -0
- attune/models/auth_strategy.py +450 -0
- attune/models/cli.py +655 -0
- attune/models/empathy_executor.py +354 -0
- attune/models/executor.py +257 -0
- attune/models/fallback.py +762 -0
- attune/models/provider_config.py +282 -0
- attune/models/registry.py +472 -0
- attune/models/tasks.py +359 -0
- attune/models/telemetry/__init__.py +71 -0
- attune/models/telemetry/analytics.py +594 -0
- attune/models/telemetry/backend.py +196 -0
- attune/models/telemetry/data_models.py +431 -0
- attune/models/telemetry/storage.py +489 -0
- attune/models/token_estimator.py +420 -0
- attune/models/validation.py +280 -0
- attune/monitoring/__init__.py +52 -0
- attune/monitoring/alerts.py +946 -0
- attune/monitoring/alerts_cli.py +448 -0
- attune/monitoring/multi_backend.py +271 -0
- attune/monitoring/otel_backend.py +362 -0
- attune/optimization/__init__.py +19 -0
- attune/optimization/context_optimizer.py +272 -0
- attune/orchestration/__init__.py +67 -0
- attune/orchestration/agent_templates.py +707 -0
- attune/orchestration/config_store.py +499 -0
- attune/orchestration/execution_strategies.py +2111 -0
- attune/orchestration/meta_orchestrator.py +1168 -0
- attune/orchestration/pattern_learner.py +696 -0
- attune/orchestration/real_tools.py +931 -0
- attune/pattern_cache.py +187 -0
- attune/pattern_library.py +542 -0
- attune/patterns/debugging/all_patterns.json +81 -0
- attune/patterns/debugging/workflow_20260107_1770825e.json +77 -0
- attune/patterns/refactoring_memory.json +89 -0
- attune/persistence.py +564 -0
- attune/platform_utils.py +265 -0
- attune/plugins/__init__.py +28 -0
- attune/plugins/base.py +361 -0
- attune/plugins/registry.py +268 -0
- attune/project_index/__init__.py +32 -0
- attune/project_index/cli.py +335 -0
- attune/project_index/index.py +667 -0
- attune/project_index/models.py +504 -0
- attune/project_index/reports.py +474 -0
- attune/project_index/scanner.py +777 -0
- attune/project_index/scanner_parallel.py +291 -0
- attune/prompts/__init__.py +61 -0
- attune/prompts/config.py +77 -0
- attune/prompts/context.py +177 -0
- attune/prompts/parser.py +285 -0
- attune/prompts/registry.py +313 -0
- attune/prompts/templates.py +208 -0
- attune/redis_config.py +302 -0
- attune/redis_memory.py +799 -0
- attune/resilience/__init__.py +56 -0
- attune/resilience/circuit_breaker.py +256 -0
- attune/resilience/fallback.py +179 -0
- attune/resilience/health.py +300 -0
- attune/resilience/retry.py +209 -0
- attune/resilience/timeout.py +135 -0
- attune/routing/__init__.py +43 -0
- attune/routing/chain_executor.py +433 -0
- attune/routing/classifier.py +217 -0
- attune/routing/smart_router.py +234 -0
- attune/routing/workflow_registry.py +343 -0
- attune/scaffolding/README.md +589 -0
- attune/scaffolding/__init__.py +35 -0
- attune/scaffolding/__main__.py +14 -0
- attune/scaffolding/cli.py +240 -0
- attune/scaffolding/templates/base_wizard.py.jinja2 +121 -0
- attune/scaffolding/templates/coach_wizard.py.jinja2 +321 -0
- attune/scaffolding/templates/domain_wizard.py.jinja2 +408 -0
- attune/scaffolding/templates/linear_flow_wizard.py.jinja2 +203 -0
- attune/socratic/__init__.py +256 -0
- attune/socratic/ab_testing.py +958 -0
- attune/socratic/blueprint.py +533 -0
- attune/socratic/cli.py +703 -0
- attune/socratic/collaboration.py +1114 -0
- attune/socratic/domain_templates.py +924 -0
- attune/socratic/embeddings.py +738 -0
- attune/socratic/engine.py +794 -0
- attune/socratic/explainer.py +682 -0
- attune/socratic/feedback.py +772 -0
- attune/socratic/forms.py +629 -0
- attune/socratic/generator.py +732 -0
- attune/socratic/llm_analyzer.py +637 -0
- attune/socratic/mcp_server.py +702 -0
- attune/socratic/session.py +312 -0
- attune/socratic/storage.py +667 -0
- attune/socratic/success.py +730 -0
- attune/socratic/visual_editor.py +860 -0
- attune/socratic/web_ui.py +958 -0
- attune/telemetry/__init__.py +39 -0
- attune/telemetry/agent_coordination.py +475 -0
- attune/telemetry/agent_tracking.py +367 -0
- attune/telemetry/approval_gates.py +545 -0
- attune/telemetry/cli.py +1231 -0
- attune/telemetry/commands/__init__.py +14 -0
- attune/telemetry/commands/dashboard_commands.py +696 -0
- attune/telemetry/event_streaming.py +409 -0
- attune/telemetry/feedback_loop.py +567 -0
- attune/telemetry/usage_tracker.py +591 -0
- attune/templates.py +754 -0
- attune/test_generator/__init__.py +38 -0
- attune/test_generator/__main__.py +14 -0
- attune/test_generator/cli.py +234 -0
- attune/test_generator/generator.py +355 -0
- attune/test_generator/risk_analyzer.py +216 -0
- attune/test_generator/templates/unit_test.py.jinja2 +272 -0
- attune/tier_recommender.py +384 -0
- attune/tools.py +183 -0
- attune/trust/__init__.py +28 -0
- attune/trust/circuit_breaker.py +579 -0
- attune/trust_building.py +527 -0
- attune/validation/__init__.py +19 -0
- attune/validation/xml_validator.py +281 -0
- attune/vscode_bridge.py +173 -0
- attune/workflow_commands.py +780 -0
- attune/workflow_patterns/__init__.py +33 -0
- attune/workflow_patterns/behavior.py +249 -0
- attune/workflow_patterns/core.py +76 -0
- attune/workflow_patterns/output.py +99 -0
- attune/workflow_patterns/registry.py +255 -0
- attune/workflow_patterns/structural.py +288 -0
- attune/workflows/__init__.py +539 -0
- attune/workflows/autonomous_test_gen.py +1268 -0
- attune/workflows/base.py +2667 -0
- attune/workflows/batch_processing.py +342 -0
- attune/workflows/bug_predict.py +1084 -0
- attune/workflows/builder.py +273 -0
- attune/workflows/caching.py +253 -0
- attune/workflows/code_review.py +1048 -0
- attune/workflows/code_review_adapters.py +312 -0
- attune/workflows/code_review_pipeline.py +722 -0
- attune/workflows/config.py +645 -0
- attune/workflows/dependency_check.py +644 -0
- attune/workflows/document_gen/__init__.py +25 -0
- attune/workflows/document_gen/config.py +30 -0
- attune/workflows/document_gen/report_formatter.py +162 -0
- attune/workflows/document_gen/workflow.py +1426 -0
- attune/workflows/document_manager.py +216 -0
- attune/workflows/document_manager_README.md +134 -0
- attune/workflows/documentation_orchestrator.py +1205 -0
- attune/workflows/history.py +510 -0
- attune/workflows/keyboard_shortcuts/__init__.py +39 -0
- attune/workflows/keyboard_shortcuts/generators.py +391 -0
- attune/workflows/keyboard_shortcuts/parsers.py +416 -0
- attune/workflows/keyboard_shortcuts/prompts.py +295 -0
- attune/workflows/keyboard_shortcuts/schema.py +193 -0
- attune/workflows/keyboard_shortcuts/workflow.py +509 -0
- attune/workflows/llm_base.py +363 -0
- attune/workflows/manage_docs.py +87 -0
- attune/workflows/manage_docs_README.md +134 -0
- attune/workflows/manage_documentation.py +821 -0
- attune/workflows/new_sample_workflow1.py +149 -0
- attune/workflows/new_sample_workflow1_README.md +150 -0
- attune/workflows/orchestrated_health_check.py +849 -0
- attune/workflows/orchestrated_release_prep.py +600 -0
- attune/workflows/output.py +413 -0
- attune/workflows/perf_audit.py +863 -0
- attune/workflows/pr_review.py +762 -0
- attune/workflows/progress.py +785 -0
- attune/workflows/progress_server.py +322 -0
- attune/workflows/progressive/README 2.md +454 -0
- attune/workflows/progressive/README.md +454 -0
- attune/workflows/progressive/__init__.py +82 -0
- attune/workflows/progressive/cli.py +219 -0
- attune/workflows/progressive/core.py +488 -0
- attune/workflows/progressive/orchestrator.py +723 -0
- attune/workflows/progressive/reports.py +520 -0
- attune/workflows/progressive/telemetry.py +274 -0
- attune/workflows/progressive/test_gen.py +495 -0
- attune/workflows/progressive/workflow.py +589 -0
- attune/workflows/refactor_plan.py +694 -0
- attune/workflows/release_prep.py +895 -0
- attune/workflows/release_prep_crew.py +969 -0
- attune/workflows/research_synthesis.py +404 -0
- attune/workflows/routing.py +168 -0
- attune/workflows/secure_release.py +593 -0
- attune/workflows/security_adapters.py +297 -0
- attune/workflows/security_audit.py +1329 -0
- attune/workflows/security_audit_phase3.py +355 -0
- attune/workflows/seo_optimization.py +633 -0
- attune/workflows/step_config.py +234 -0
- attune/workflows/telemetry_mixin.py +269 -0
- attune/workflows/test5.py +125 -0
- attune/workflows/test5_README.md +158 -0
- attune/workflows/test_coverage_boost_crew.py +849 -0
- attune/workflows/test_gen/__init__.py +52 -0
- attune/workflows/test_gen/ast_analyzer.py +249 -0
- attune/workflows/test_gen/config.py +88 -0
- attune/workflows/test_gen/data_models.py +38 -0
- attune/workflows/test_gen/report_formatter.py +289 -0
- attune/workflows/test_gen/test_templates.py +381 -0
- attune/workflows/test_gen/workflow.py +655 -0
- attune/workflows/test_gen.py +54 -0
- attune/workflows/test_gen_behavioral.py +477 -0
- attune/workflows/test_gen_parallel.py +341 -0
- attune/workflows/test_lifecycle.py +526 -0
- attune/workflows/test_maintenance.py +627 -0
- attune/workflows/test_maintenance_cli.py +590 -0
- attune/workflows/test_maintenance_crew.py +840 -0
- attune/workflows/test_runner.py +622 -0
- attune/workflows/tier_tracking.py +531 -0
- attune/workflows/xml_enhanced_crew.py +285 -0
- attune_ai-2.0.0.dist-info/METADATA +1026 -0
- attune_ai-2.0.0.dist-info/RECORD +457 -0
- attune_ai-2.0.0.dist-info/WHEEL +5 -0
- attune_ai-2.0.0.dist-info/entry_points.txt +26 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE +201 -0
- attune_ai-2.0.0.dist-info/licenses/LICENSE_CHANGE_ANNOUNCEMENT.md +101 -0
- attune_ai-2.0.0.dist-info/top_level.txt +5 -0
- attune_healthcare/__init__.py +13 -0
- attune_healthcare/monitors/__init__.py +9 -0
- attune_healthcare/monitors/clinical_protocol_monitor.py +315 -0
- attune_healthcare/monitors/monitoring/__init__.py +44 -0
- attune_healthcare/monitors/monitoring/protocol_checker.py +300 -0
- attune_healthcare/monitors/monitoring/protocol_loader.py +214 -0
- attune_healthcare/monitors/monitoring/sensor_parsers.py +306 -0
- attune_healthcare/monitors/monitoring/trajectory_analyzer.py +389 -0
- attune_llm/README.md +553 -0
- attune_llm/__init__.py +28 -0
- attune_llm/agent_factory/__init__.py +53 -0
- attune_llm/agent_factory/adapters/__init__.py +85 -0
- attune_llm/agent_factory/adapters/autogen_adapter.py +312 -0
- attune_llm/agent_factory/adapters/crewai_adapter.py +483 -0
- attune_llm/agent_factory/adapters/haystack_adapter.py +298 -0
- attune_llm/agent_factory/adapters/langchain_adapter.py +362 -0
- attune_llm/agent_factory/adapters/langgraph_adapter.py +333 -0
- attune_llm/agent_factory/adapters/native.py +228 -0
- attune_llm/agent_factory/adapters/wizard_adapter.py +423 -0
- attune_llm/agent_factory/base.py +305 -0
- attune_llm/agent_factory/crews/__init__.py +67 -0
- attune_llm/agent_factory/crews/code_review.py +1113 -0
- attune_llm/agent_factory/crews/health_check.py +1262 -0
- attune_llm/agent_factory/crews/refactoring.py +1128 -0
- attune_llm/agent_factory/crews/security_audit.py +1018 -0
- attune_llm/agent_factory/decorators.py +287 -0
- attune_llm/agent_factory/factory.py +558 -0
- attune_llm/agent_factory/framework.py +193 -0
- attune_llm/agent_factory/memory_integration.py +328 -0
- attune_llm/agent_factory/resilient.py +320 -0
- attune_llm/agents_md/__init__.py +22 -0
- attune_llm/agents_md/loader.py +218 -0
- attune_llm/agents_md/parser.py +271 -0
- attune_llm/agents_md/registry.py +307 -0
- attune_llm/claude_memory.py +466 -0
- attune_llm/cli/__init__.py +8 -0
- attune_llm/cli/sync_claude.py +487 -0
- attune_llm/code_health.py +1313 -0
- attune_llm/commands/__init__.py +51 -0
- attune_llm/commands/context.py +375 -0
- attune_llm/commands/loader.py +301 -0
- attune_llm/commands/models.py +231 -0
- attune_llm/commands/parser.py +371 -0
- attune_llm/commands/registry.py +429 -0
- attune_llm/config/__init__.py +29 -0
- attune_llm/config/unified.py +291 -0
- attune_llm/context/__init__.py +22 -0
- attune_llm/context/compaction.py +455 -0
- attune_llm/context/manager.py +434 -0
- attune_llm/contextual_patterns.py +361 -0
- attune_llm/core.py +907 -0
- attune_llm/git_pattern_extractor.py +435 -0
- attune_llm/hooks/__init__.py +24 -0
- attune_llm/hooks/config.py +306 -0
- attune_llm/hooks/executor.py +289 -0
- attune_llm/hooks/registry.py +302 -0
- attune_llm/hooks/scripts/__init__.py +39 -0
- attune_llm/hooks/scripts/evaluate_session.py +201 -0
- attune_llm/hooks/scripts/first_time_init.py +285 -0
- attune_llm/hooks/scripts/pre_compact.py +207 -0
- attune_llm/hooks/scripts/session_end.py +183 -0
- attune_llm/hooks/scripts/session_start.py +163 -0
- attune_llm/hooks/scripts/suggest_compact.py +225 -0
- attune_llm/learning/__init__.py +30 -0
- attune_llm/learning/evaluator.py +438 -0
- attune_llm/learning/extractor.py +514 -0
- attune_llm/learning/storage.py +560 -0
- attune_llm/levels.py +227 -0
- attune_llm/pattern_confidence.py +414 -0
- attune_llm/pattern_resolver.py +272 -0
- attune_llm/pattern_summary.py +350 -0
- attune_llm/providers.py +967 -0
- attune_llm/routing/__init__.py +32 -0
- attune_llm/routing/model_router.py +362 -0
- attune_llm/security/IMPLEMENTATION_SUMMARY.md +413 -0
- attune_llm/security/PHASE2_COMPLETE.md +384 -0
- attune_llm/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- attune_llm/security/QUICK_REFERENCE.md +316 -0
- attune_llm/security/README.md +262 -0
- attune_llm/security/__init__.py +62 -0
- attune_llm/security/audit_logger.py +929 -0
- attune_llm/security/audit_logger_example.py +152 -0
- attune_llm/security/pii_scrubber.py +640 -0
- attune_llm/security/secrets_detector.py +678 -0
- attune_llm/security/secrets_detector_example.py +304 -0
- attune_llm/security/secure_memdocs.py +1192 -0
- attune_llm/security/secure_memdocs_example.py +278 -0
- attune_llm/session_status.py +745 -0
- attune_llm/state.py +246 -0
- attune_llm/utils/__init__.py +5 -0
- attune_llm/utils/tokens.py +349 -0
- attune_software/SOFTWARE_PLUGIN_README.md +57 -0
- attune_software/__init__.py +13 -0
- attune_software/cli/__init__.py +120 -0
- attune_software/cli/inspect.py +362 -0
- attune_software/cli.py +574 -0
- attune_software/plugin.py +188 -0
- workflow_scaffolding/__init__.py +11 -0
- workflow_scaffolding/__main__.py +12 -0
- workflow_scaffolding/cli.py +206 -0
- workflow_scaffolding/generator.py +265 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"""Prompt performance metrics tracking and analysis.
|
|
2
|
+
|
|
3
|
+
This module provides tools for tracking, analyzing, and optimizing
|
|
4
|
+
prompt performance across the Empathy Framework.
|
|
5
|
+
|
|
6
|
+
Copyright 2026 Smart-AI-Memory
|
|
7
|
+
Licensed under Fair Source License 0.9
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from attune.metrics.prompt_metrics import MetricsTracker, PromptMetrics
|
|
11
|
+
|
|
12
|
+
__all__ = ["MetricsTracker", "PromptMetrics"]
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"""Metrics collector stub (deprecated).
|
|
2
|
+
|
|
3
|
+
This module is a placeholder for legacy code compatibility.
|
|
4
|
+
The functionality has been moved to other modules.
|
|
5
|
+
|
|
6
|
+
Copyright 2025 Smart-AI-Memory
|
|
7
|
+
Licensed under Fair Source License 0.9
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class MetricsCollector:
|
|
12
|
+
"""Deprecated metrics collector class.
|
|
13
|
+
|
|
14
|
+
This class is maintained for backward compatibility but is deprecated.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(self, db_path: str | None = None):
|
|
18
|
+
"""Initialize metrics collector.
|
|
19
|
+
|
|
20
|
+
Args:
|
|
21
|
+
db_path: Path to database (deprecated parameter)
|
|
22
|
+
"""
|
|
23
|
+
self.db_path = db_path
|
|
24
|
+
|
|
25
|
+
def collect(self):
|
|
26
|
+
"""Collect metrics (deprecated)."""
|
|
27
|
+
return {}
|
|
28
|
+
|
|
29
|
+
def get_stats(self):
|
|
30
|
+
"""Get statistics (deprecated)."""
|
|
31
|
+
return {}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Prompt performance metrics tracking
|
|
2
|
+
|
|
3
|
+
Tracks token usage, latency, success rates, and other metrics for
|
|
4
|
+
XML-enhanced prompts to enable optimization and A/B testing.
|
|
5
|
+
|
|
6
|
+
Copyright 2026 Smart-AI-Memory
|
|
7
|
+
Licensed under Fair Source License 0.9
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import json
|
|
11
|
+
import logging
|
|
12
|
+
from dataclasses import asdict, dataclass
|
|
13
|
+
from datetime import datetime
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
|
|
17
|
+
from attune.config import _validate_file_path
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger(__name__)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class PromptMetrics:
|
|
24
|
+
"""Metrics for a single prompt execution.
|
|
25
|
+
|
|
26
|
+
Tracks comprehensive performance data for prompt optimization
|
|
27
|
+
and A/B testing.
|
|
28
|
+
|
|
29
|
+
Attributes:
|
|
30
|
+
timestamp: ISO format timestamp of execution
|
|
31
|
+
workflow: Workflow name (e.g., "code_review", "bug_predict")
|
|
32
|
+
agent_role: Role of the agent (e.g., "Code Reviewer")
|
|
33
|
+
task_description: Brief description of task (truncated to 100 chars)
|
|
34
|
+
model: Model name (e.g., "gpt-4", "claude-sonnet")
|
|
35
|
+
prompt_tokens: Number of input tokens
|
|
36
|
+
completion_tokens: Number of output tokens
|
|
37
|
+
total_tokens: Total tokens (input + output)
|
|
38
|
+
latency_ms: Execution time in milliseconds
|
|
39
|
+
retry_count: Number of retry attempts
|
|
40
|
+
parsing_success: Whether XML parsing succeeded
|
|
41
|
+
validation_success: Whether XML validation succeeded (None if not validated)
|
|
42
|
+
error_message: Error message if execution failed (None if successful)
|
|
43
|
+
xml_structure_used: Whether XML-enhanced prompts were used
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
timestamp: str
|
|
47
|
+
workflow: str
|
|
48
|
+
agent_role: str
|
|
49
|
+
task_description: str
|
|
50
|
+
model: str
|
|
51
|
+
prompt_tokens: int
|
|
52
|
+
completion_tokens: int
|
|
53
|
+
total_tokens: int
|
|
54
|
+
latency_ms: float
|
|
55
|
+
retry_count: int
|
|
56
|
+
parsing_success: bool
|
|
57
|
+
validation_success: bool | None
|
|
58
|
+
error_message: str | None
|
|
59
|
+
xml_structure_used: bool
|
|
60
|
+
|
|
61
|
+
def to_dict(self) -> dict:
|
|
62
|
+
"""Convert to dictionary for JSON serialization."""
|
|
63
|
+
return asdict(self)
|
|
64
|
+
|
|
65
|
+
@classmethod
|
|
66
|
+
def from_dict(cls, data: dict) -> "PromptMetrics":
|
|
67
|
+
"""Create from dictionary (deserialization)."""
|
|
68
|
+
return cls(**data)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class MetricsTracker:
|
|
72
|
+
"""Tracks and persists prompt metrics to disk.
|
|
73
|
+
|
|
74
|
+
Uses JSON Lines format for append-only writes and efficient reading.
|
|
75
|
+
Metrics are stored in .attune/prompt_metrics.json by default.
|
|
76
|
+
|
|
77
|
+
Usage:
|
|
78
|
+
tracker = MetricsTracker()
|
|
79
|
+
metric = PromptMetrics(...)
|
|
80
|
+
tracker.log_metric(metric)
|
|
81
|
+
|
|
82
|
+
summary = tracker.get_summary(workflow="code_review")
|
|
83
|
+
print(f"Avg tokens: {summary['avg_tokens']}")
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def __init__(self, metrics_file: str = ".attune/prompt_metrics.json"):
|
|
87
|
+
"""Initialize metrics tracker.
|
|
88
|
+
|
|
89
|
+
Args:
|
|
90
|
+
metrics_file: Path to metrics file (JSON Lines format)
|
|
91
|
+
"""
|
|
92
|
+
self.metrics_file = Path(metrics_file)
|
|
93
|
+
self.metrics_file.parent.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
|
|
95
|
+
# Create file if it doesn't exist
|
|
96
|
+
if not self.metrics_file.exists():
|
|
97
|
+
validated_path = _validate_file_path(str(self.metrics_file))
|
|
98
|
+
validated_path.write_text("")
|
|
99
|
+
|
|
100
|
+
def log_metric(self, metric: PromptMetrics) -> None:
|
|
101
|
+
"""Log a single metric to file (JSON Lines format).
|
|
102
|
+
|
|
103
|
+
Args:
|
|
104
|
+
metric: PromptMetrics instance to log
|
|
105
|
+
"""
|
|
106
|
+
try:
|
|
107
|
+
validated_path = _validate_file_path(str(self.metrics_file))
|
|
108
|
+
with open(validated_path, "a") as f:
|
|
109
|
+
f.write(json.dumps(metric.to_dict()) + "\n")
|
|
110
|
+
except (OSError, ValueError) as e:
|
|
111
|
+
logger.error(f"Failed to log metric: {e}")
|
|
112
|
+
|
|
113
|
+
def get_metrics(
|
|
114
|
+
self,
|
|
115
|
+
workflow: str | None = None,
|
|
116
|
+
start_date: datetime | None = None,
|
|
117
|
+
end_date: datetime | None = None,
|
|
118
|
+
) -> list[PromptMetrics]:
|
|
119
|
+
"""Retrieve metrics with optional filtering.
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
workflow: Filter by workflow name (None = all workflows)
|
|
123
|
+
start_date: Filter by start date (None = no lower bound)
|
|
124
|
+
end_date: Filter by end date (None = no upper bound)
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
List of PromptMetrics matching filters
|
|
128
|
+
"""
|
|
129
|
+
metrics: list[PromptMetrics] = []
|
|
130
|
+
|
|
131
|
+
try:
|
|
132
|
+
if not self.metrics_file.exists():
|
|
133
|
+
return metrics
|
|
134
|
+
|
|
135
|
+
with open(self.metrics_file) as f:
|
|
136
|
+
for line in f:
|
|
137
|
+
if line.strip():
|
|
138
|
+
data = json.loads(line)
|
|
139
|
+
metric = PromptMetrics.from_dict(data)
|
|
140
|
+
|
|
141
|
+
# Apply filters
|
|
142
|
+
if workflow and metric.workflow != workflow:
|
|
143
|
+
continue
|
|
144
|
+
|
|
145
|
+
metric_time = datetime.fromisoformat(metric.timestamp)
|
|
146
|
+
if start_date and metric_time < start_date:
|
|
147
|
+
continue
|
|
148
|
+
if end_date and metric_time > end_date:
|
|
149
|
+
continue
|
|
150
|
+
|
|
151
|
+
metrics.append(metric)
|
|
152
|
+
except Exception as e:
|
|
153
|
+
logger.error(f"Failed to read metrics: {e}")
|
|
154
|
+
|
|
155
|
+
return metrics
|
|
156
|
+
|
|
157
|
+
def get_summary(self, workflow: str | None = None) -> dict[str, Any]:
|
|
158
|
+
"""Get aggregated metrics summary.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
workflow: Filter by workflow name (None = all workflows)
|
|
162
|
+
|
|
163
|
+
Returns:
|
|
164
|
+
Dictionary with aggregated metrics:
|
|
165
|
+
- total_prompts: Total number of prompts
|
|
166
|
+
- avg_tokens: Average total tokens
|
|
167
|
+
- avg_latency_ms: Average latency in milliseconds
|
|
168
|
+
- success_rate: Ratio of successful parses
|
|
169
|
+
- retry_rate: Average retry count per prompt
|
|
170
|
+
"""
|
|
171
|
+
metrics = self.get_metrics(workflow=workflow)
|
|
172
|
+
|
|
173
|
+
if not metrics:
|
|
174
|
+
return {
|
|
175
|
+
"total_prompts": 0,
|
|
176
|
+
"avg_tokens": 0,
|
|
177
|
+
"avg_latency_ms": 0,
|
|
178
|
+
"success_rate": 0,
|
|
179
|
+
"retry_rate": 0,
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
total_prompts = len(metrics)
|
|
183
|
+
total_tokens = sum(m.total_tokens for m in metrics)
|
|
184
|
+
total_latency = sum(m.latency_ms for m in metrics)
|
|
185
|
+
successful = sum(1 for m in metrics if m.parsing_success)
|
|
186
|
+
retries = sum(m.retry_count for m in metrics)
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
"total_prompts": total_prompts,
|
|
190
|
+
"avg_tokens": total_tokens / total_prompts,
|
|
191
|
+
"avg_latency_ms": total_latency / total_prompts,
|
|
192
|
+
"success_rate": successful / total_prompts,
|
|
193
|
+
"retry_rate": retries / total_prompts,
|
|
194
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
"""Unified Model Registry for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Single source of truth for model configurations across:
|
|
4
|
+
- attune_llm.routing.ModelRouter
|
|
5
|
+
- src/attune/workflows.WorkflowConfig
|
|
6
|
+
- src/attune.cost_tracker
|
|
7
|
+
|
|
8
|
+
Copyright 2025 Smart-AI-Memory
|
|
9
|
+
Licensed under Fair Source License 0.9
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from .adaptive_routing import AdaptiveModelRouter, ModelPerformance
|
|
13
|
+
from .auth_strategy import (
|
|
14
|
+
AUTH_STRATEGY_FILE,
|
|
15
|
+
AuthMode,
|
|
16
|
+
AuthStrategy,
|
|
17
|
+
SubscriptionTier,
|
|
18
|
+
configure_auth_interactive,
|
|
19
|
+
count_lines_of_code,
|
|
20
|
+
get_auth_strategy,
|
|
21
|
+
get_module_size_category,
|
|
22
|
+
)
|
|
23
|
+
from .empathy_executor import EmpathyLLMExecutor
|
|
24
|
+
from .executor import ExecutionContext, LLMExecutor, LLMResponse, MockLLMExecutor
|
|
25
|
+
from .fallback import (
|
|
26
|
+
DEFAULT_FALLBACK_POLICY,
|
|
27
|
+
DEFAULT_RETRY_POLICY,
|
|
28
|
+
CircuitBreaker,
|
|
29
|
+
CircuitBreakerState,
|
|
30
|
+
FallbackPolicy,
|
|
31
|
+
FallbackStep,
|
|
32
|
+
FallbackStrategy,
|
|
33
|
+
ResilientExecutor,
|
|
34
|
+
RetryPolicy,
|
|
35
|
+
TierFallbackHelper,
|
|
36
|
+
)
|
|
37
|
+
from .provider_config import (
|
|
38
|
+
ProviderConfig,
|
|
39
|
+
ProviderMode,
|
|
40
|
+
configure_provider_cli,
|
|
41
|
+
configure_provider_interactive,
|
|
42
|
+
get_provider_config,
|
|
43
|
+
reset_provider_config,
|
|
44
|
+
set_provider_config,
|
|
45
|
+
)
|
|
46
|
+
from .registry import (
|
|
47
|
+
MODEL_REGISTRY,
|
|
48
|
+
ModelInfo,
|
|
49
|
+
ModelProvider,
|
|
50
|
+
ModelRegistry,
|
|
51
|
+
ModelTier,
|
|
52
|
+
get_all_models,
|
|
53
|
+
get_model,
|
|
54
|
+
get_pricing_for_model,
|
|
55
|
+
)
|
|
56
|
+
from .tasks import (
|
|
57
|
+
CAPABLE_TASKS,
|
|
58
|
+
CHEAP_TASKS,
|
|
59
|
+
PREMIUM_TASKS,
|
|
60
|
+
TASK_TIER_MAP,
|
|
61
|
+
TaskInfo,
|
|
62
|
+
TaskType,
|
|
63
|
+
get_all_tasks,
|
|
64
|
+
get_tasks_for_tier,
|
|
65
|
+
get_tier_for_task,
|
|
66
|
+
is_known_task,
|
|
67
|
+
normalize_task_type,
|
|
68
|
+
)
|
|
69
|
+
from .telemetry import (
|
|
70
|
+
AgentAssignmentRecord,
|
|
71
|
+
CoverageRecord,
|
|
72
|
+
FileTestRecord,
|
|
73
|
+
LLMCallRecord,
|
|
74
|
+
TaskRoutingRecord,
|
|
75
|
+
TelemetryAnalytics,
|
|
76
|
+
TelemetryBackend,
|
|
77
|
+
TelemetryStore,
|
|
78
|
+
TestExecutionRecord,
|
|
79
|
+
WorkflowRunRecord,
|
|
80
|
+
WorkflowStageRecord,
|
|
81
|
+
get_telemetry_store,
|
|
82
|
+
log_llm_call,
|
|
83
|
+
log_workflow_run,
|
|
84
|
+
)
|
|
85
|
+
from .validation import (
|
|
86
|
+
ConfigValidator,
|
|
87
|
+
ValidationError,
|
|
88
|
+
ValidationResult,
|
|
89
|
+
validate_config,
|
|
90
|
+
validate_yaml_file,
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
__all__ = [
|
|
94
|
+
"CAPABLE_TASKS",
|
|
95
|
+
"CHEAP_TASKS",
|
|
96
|
+
"DEFAULT_FALLBACK_POLICY",
|
|
97
|
+
"DEFAULT_RETRY_POLICY",
|
|
98
|
+
"MODEL_REGISTRY",
|
|
99
|
+
"PREMIUM_TASKS",
|
|
100
|
+
"TASK_TIER_MAP",
|
|
101
|
+
"AdaptiveModelRouter",
|
|
102
|
+
"AgentAssignmentRecord",
|
|
103
|
+
# Auth strategy exports
|
|
104
|
+
"AUTH_STRATEGY_FILE",
|
|
105
|
+
"AuthMode",
|
|
106
|
+
"AuthStrategy",
|
|
107
|
+
"CircuitBreaker",
|
|
108
|
+
"CircuitBreakerState",
|
|
109
|
+
"ConfigValidator",
|
|
110
|
+
"CoverageRecord",
|
|
111
|
+
"EmpathyLLMExecutor",
|
|
112
|
+
"ExecutionContext",
|
|
113
|
+
"FallbackPolicy",
|
|
114
|
+
"FallbackStep",
|
|
115
|
+
# Fallback exports
|
|
116
|
+
"FallbackStrategy",
|
|
117
|
+
# Telemetry exports
|
|
118
|
+
"FileTestRecord",
|
|
119
|
+
"LLMCallRecord",
|
|
120
|
+
# Executor exports
|
|
121
|
+
"LLMExecutor",
|
|
122
|
+
"LLMResponse",
|
|
123
|
+
"MockLLMExecutor",
|
|
124
|
+
"ModelInfo",
|
|
125
|
+
"ModelPerformance",
|
|
126
|
+
"ModelProvider",
|
|
127
|
+
# Registry exports
|
|
128
|
+
"ModelRegistry",
|
|
129
|
+
"ModelTier",
|
|
130
|
+
"ProviderConfig",
|
|
131
|
+
# Provider config exports
|
|
132
|
+
"ProviderMode",
|
|
133
|
+
"ResilientExecutor",
|
|
134
|
+
"RetryPolicy",
|
|
135
|
+
"SubscriptionTier",
|
|
136
|
+
"TaskInfo",
|
|
137
|
+
"TierFallbackHelper",
|
|
138
|
+
# Task exports
|
|
139
|
+
"TaskRoutingRecord",
|
|
140
|
+
"TaskType",
|
|
141
|
+
"TelemetryAnalytics",
|
|
142
|
+
"TelemetryBackend",
|
|
143
|
+
"TelemetryStore",
|
|
144
|
+
"TestExecutionRecord",
|
|
145
|
+
# Validation exports
|
|
146
|
+
"ValidationError",
|
|
147
|
+
"ValidationResult",
|
|
148
|
+
"WorkflowRunRecord",
|
|
149
|
+
"WorkflowStageRecord",
|
|
150
|
+
"configure_auth_interactive",
|
|
151
|
+
"configure_provider_cli",
|
|
152
|
+
"configure_provider_interactive",
|
|
153
|
+
"count_lines_of_code",
|
|
154
|
+
"get_all_models",
|
|
155
|
+
"get_all_tasks",
|
|
156
|
+
"get_auth_strategy",
|
|
157
|
+
"get_model",
|
|
158
|
+
"get_module_size_category",
|
|
159
|
+
"get_pricing_for_model",
|
|
160
|
+
"get_provider_config",
|
|
161
|
+
"get_tasks_for_tier",
|
|
162
|
+
"get_telemetry_store",
|
|
163
|
+
"get_tier_for_task",
|
|
164
|
+
"is_known_task",
|
|
165
|
+
"log_llm_call",
|
|
166
|
+
"log_workflow_run",
|
|
167
|
+
"normalize_task_type",
|
|
168
|
+
"reset_provider_config",
|
|
169
|
+
"set_provider_config",
|
|
170
|
+
"validate_config",
|
|
171
|
+
"validate_yaml_file",
|
|
172
|
+
]
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Enable running the models CLI as a module.
|
|
2
|
+
|
|
3
|
+
Usage:
|
|
4
|
+
python -m attune.models registry
|
|
5
|
+
python -m attune.models tasks
|
|
6
|
+
python -m attune.models validate config.yaml
|
|
7
|
+
python -m attune.models costs
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from .cli import main
|
|
11
|
+
|
|
12
|
+
if __name__ == "__main__":
|
|
13
|
+
exit(main())
|