empathy-framework 3.7.0__py3-none-any.whl → 3.8.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.
- coach_wizards/code_reviewer_README.md +60 -0
- coach_wizards/code_reviewer_wizard.py +180 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/METADATA +148 -11
- empathy_framework-3.8.0.dist-info/RECORD +333 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/top_level.txt +5 -1
- empathy_healthcare_plugin/monitors/__init__.py +9 -0
- empathy_healthcare_plugin/monitors/clinical_protocol_monitor.py +315 -0
- empathy_healthcare_plugin/monitors/monitoring/__init__.py +44 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_checker.py +300 -0
- empathy_healthcare_plugin/monitors/monitoring/protocol_loader.py +214 -0
- empathy_healthcare_plugin/monitors/monitoring/sensor_parsers.py +306 -0
- empathy_healthcare_plugin/monitors/monitoring/trajectory_analyzer.py +389 -0
- empathy_llm_toolkit/agent_factory/__init__.py +53 -0
- empathy_llm_toolkit/agent_factory/adapters/__init__.py +85 -0
- empathy_llm_toolkit/agent_factory/adapters/autogen_adapter.py +312 -0
- empathy_llm_toolkit/agent_factory/adapters/crewai_adapter.py +454 -0
- empathy_llm_toolkit/agent_factory/adapters/haystack_adapter.py +298 -0
- empathy_llm_toolkit/agent_factory/adapters/langchain_adapter.py +362 -0
- empathy_llm_toolkit/agent_factory/adapters/langgraph_adapter.py +333 -0
- empathy_llm_toolkit/agent_factory/adapters/native.py +228 -0
- empathy_llm_toolkit/agent_factory/adapters/wizard_adapter.py +426 -0
- empathy_llm_toolkit/agent_factory/base.py +305 -0
- empathy_llm_toolkit/agent_factory/crews/__init__.py +67 -0
- empathy_llm_toolkit/agent_factory/crews/code_review.py +1113 -0
- empathy_llm_toolkit/agent_factory/crews/health_check.py +1246 -0
- empathy_llm_toolkit/agent_factory/crews/refactoring.py +1128 -0
- empathy_llm_toolkit/agent_factory/crews/security_audit.py +1018 -0
- empathy_llm_toolkit/agent_factory/decorators.py +286 -0
- empathy_llm_toolkit/agent_factory/factory.py +558 -0
- empathy_llm_toolkit/agent_factory/framework.py +192 -0
- empathy_llm_toolkit/agent_factory/memory_integration.py +324 -0
- empathy_llm_toolkit/agent_factory/resilient.py +320 -0
- empathy_llm_toolkit/cli/__init__.py +8 -0
- empathy_llm_toolkit/cli/sync_claude.py +487 -0
- empathy_llm_toolkit/code_health.py +150 -3
- empathy_llm_toolkit/config/__init__.py +29 -0
- empathy_llm_toolkit/config/unified.py +295 -0
- empathy_llm_toolkit/routing/__init__.py +32 -0
- empathy_llm_toolkit/routing/model_router.py +362 -0
- empathy_llm_toolkit/security/IMPLEMENTATION_SUMMARY.md +413 -0
- empathy_llm_toolkit/security/PHASE2_COMPLETE.md +384 -0
- empathy_llm_toolkit/security/PHASE2_SECRETS_DETECTOR_COMPLETE.md +271 -0
- empathy_llm_toolkit/security/QUICK_REFERENCE.md +316 -0
- empathy_llm_toolkit/security/README.md +262 -0
- empathy_llm_toolkit/security/__init__.py +62 -0
- empathy_llm_toolkit/security/audit_logger.py +929 -0
- empathy_llm_toolkit/security/audit_logger_example.py +152 -0
- empathy_llm_toolkit/security/pii_scrubber.py +640 -0
- empathy_llm_toolkit/security/secrets_detector.py +678 -0
- empathy_llm_toolkit/security/secrets_detector_example.py +304 -0
- empathy_llm_toolkit/security/secure_memdocs.py +1192 -0
- empathy_llm_toolkit/security/secure_memdocs_example.py +278 -0
- empathy_llm_toolkit/wizards/__init__.py +38 -0
- empathy_llm_toolkit/wizards/base_wizard.py +364 -0
- empathy_llm_toolkit/wizards/customer_support_wizard.py +190 -0
- empathy_llm_toolkit/wizards/healthcare_wizard.py +362 -0
- empathy_llm_toolkit/wizards/patient_assessment_README.md +64 -0
- empathy_llm_toolkit/wizards/patient_assessment_wizard.py +193 -0
- empathy_llm_toolkit/wizards/technology_wizard.py +194 -0
- empathy_os/__init__.py +52 -52
- empathy_os/adaptive/__init__.py +13 -0
- empathy_os/adaptive/task_complexity.py +127 -0
- empathy_os/cache/__init__.py +117 -0
- empathy_os/cache/base.py +166 -0
- empathy_os/cache/dependency_manager.py +253 -0
- empathy_os/cache/hash_only.py +248 -0
- empathy_os/cache/hybrid.py +390 -0
- empathy_os/cache/storage.py +282 -0
- empathy_os/cli.py +118 -8
- empathy_os/cli_unified.py +121 -1
- empathy_os/config/__init__.py +63 -0
- empathy_os/config/xml_config.py +239 -0
- empathy_os/config.py +2 -1
- empathy_os/dashboard/__init__.py +15 -0
- empathy_os/dashboard/server.py +743 -0
- empathy_os/memory/__init__.py +195 -0
- empathy_os/memory/claude_memory.py +466 -0
- empathy_os/memory/config.py +224 -0
- empathy_os/memory/control_panel.py +1298 -0
- empathy_os/memory/edges.py +179 -0
- empathy_os/memory/graph.py +567 -0
- empathy_os/memory/long_term.py +1194 -0
- empathy_os/memory/nodes.py +179 -0
- empathy_os/memory/redis_bootstrap.py +540 -0
- empathy_os/memory/security/__init__.py +31 -0
- empathy_os/memory/security/audit_logger.py +930 -0
- empathy_os/memory/security/pii_scrubber.py +640 -0
- empathy_os/memory/security/secrets_detector.py +678 -0
- empathy_os/memory/short_term.py +2119 -0
- empathy_os/memory/storage/__init__.py +15 -0
- empathy_os/memory/summary_index.py +583 -0
- empathy_os/memory/unified.py +619 -0
- empathy_os/metrics/__init__.py +12 -0
- empathy_os/metrics/prompt_metrics.py +190 -0
- empathy_os/models/__init__.py +136 -0
- empathy_os/models/__main__.py +13 -0
- empathy_os/models/cli.py +655 -0
- empathy_os/models/empathy_executor.py +354 -0
- empathy_os/models/executor.py +252 -0
- empathy_os/models/fallback.py +671 -0
- empathy_os/models/provider_config.py +563 -0
- empathy_os/models/registry.py +382 -0
- empathy_os/models/tasks.py +302 -0
- empathy_os/models/telemetry.py +548 -0
- empathy_os/models/token_estimator.py +378 -0
- empathy_os/models/validation.py +274 -0
- empathy_os/monitoring/__init__.py +52 -0
- empathy_os/monitoring/alerts.py +23 -0
- empathy_os/monitoring/alerts_cli.py +268 -0
- empathy_os/monitoring/multi_backend.py +271 -0
- empathy_os/monitoring/otel_backend.py +363 -0
- empathy_os/optimization/__init__.py +19 -0
- empathy_os/optimization/context_optimizer.py +272 -0
- empathy_os/plugins/__init__.py +28 -0
- empathy_os/plugins/base.py +361 -0
- empathy_os/plugins/registry.py +268 -0
- empathy_os/project_index/__init__.py +30 -0
- empathy_os/project_index/cli.py +335 -0
- empathy_os/project_index/crew_integration.py +430 -0
- empathy_os/project_index/index.py +425 -0
- empathy_os/project_index/models.py +501 -0
- empathy_os/project_index/reports.py +473 -0
- empathy_os/project_index/scanner.py +538 -0
- empathy_os/prompts/__init__.py +61 -0
- empathy_os/prompts/config.py +77 -0
- empathy_os/prompts/context.py +177 -0
- empathy_os/prompts/parser.py +285 -0
- empathy_os/prompts/registry.py +313 -0
- empathy_os/prompts/templates.py +208 -0
- empathy_os/resilience/__init__.py +56 -0
- empathy_os/resilience/circuit_breaker.py +256 -0
- empathy_os/resilience/fallback.py +179 -0
- empathy_os/resilience/health.py +300 -0
- empathy_os/resilience/retry.py +209 -0
- empathy_os/resilience/timeout.py +135 -0
- empathy_os/routing/__init__.py +43 -0
- empathy_os/routing/chain_executor.py +433 -0
- empathy_os/routing/classifier.py +217 -0
- empathy_os/routing/smart_router.py +234 -0
- empathy_os/routing/wizard_registry.py +307 -0
- empathy_os/trust/__init__.py +28 -0
- empathy_os/trust/circuit_breaker.py +579 -0
- empathy_os/validation/__init__.py +19 -0
- empathy_os/validation/xml_validator.py +281 -0
- empathy_os/wizard_factory_cli.py +170 -0
- empathy_os/workflows/__init__.py +360 -0
- empathy_os/workflows/base.py +1660 -0
- empathy_os/workflows/bug_predict.py +962 -0
- empathy_os/workflows/code_review.py +960 -0
- empathy_os/workflows/code_review_adapters.py +310 -0
- empathy_os/workflows/code_review_pipeline.py +720 -0
- empathy_os/workflows/config.py +600 -0
- empathy_os/workflows/dependency_check.py +648 -0
- empathy_os/workflows/document_gen.py +1069 -0
- empathy_os/workflows/documentation_orchestrator.py +1205 -0
- empathy_os/workflows/health_check.py +679 -0
- empathy_os/workflows/keyboard_shortcuts/__init__.py +39 -0
- empathy_os/workflows/keyboard_shortcuts/generators.py +386 -0
- empathy_os/workflows/keyboard_shortcuts/parsers.py +414 -0
- empathy_os/workflows/keyboard_shortcuts/prompts.py +295 -0
- empathy_os/workflows/keyboard_shortcuts/schema.py +193 -0
- empathy_os/workflows/keyboard_shortcuts/workflow.py +505 -0
- empathy_os/workflows/manage_documentation.py +804 -0
- empathy_os/workflows/new_sample_workflow1.py +146 -0
- empathy_os/workflows/new_sample_workflow1_README.md +150 -0
- empathy_os/workflows/perf_audit.py +687 -0
- empathy_os/workflows/pr_review.py +748 -0
- empathy_os/workflows/progress.py +445 -0
- empathy_os/workflows/progress_server.py +322 -0
- empathy_os/workflows/refactor_plan.py +693 -0
- empathy_os/workflows/release_prep.py +808 -0
- empathy_os/workflows/research_synthesis.py +404 -0
- empathy_os/workflows/secure_release.py +585 -0
- empathy_os/workflows/security_adapters.py +297 -0
- empathy_os/workflows/security_audit.py +1046 -0
- empathy_os/workflows/step_config.py +234 -0
- empathy_os/workflows/test5.py +125 -0
- empathy_os/workflows/test5_README.md +158 -0
- empathy_os/workflows/test_gen.py +1855 -0
- empathy_os/workflows/test_lifecycle.py +526 -0
- empathy_os/workflows/test_maintenance.py +626 -0
- empathy_os/workflows/test_maintenance_cli.py +590 -0
- empathy_os/workflows/test_maintenance_crew.py +821 -0
- empathy_os/workflows/xml_enhanced_crew.py +285 -0
- empathy_software_plugin/cli/__init__.py +120 -0
- empathy_software_plugin/cli/inspect.py +362 -0
- empathy_software_plugin/cli.py +3 -1
- empathy_software_plugin/wizards/__init__.py +42 -0
- empathy_software_plugin/wizards/advanced_debugging_wizard.py +392 -0
- empathy_software_plugin/wizards/agent_orchestration_wizard.py +511 -0
- empathy_software_plugin/wizards/ai_collaboration_wizard.py +503 -0
- empathy_software_plugin/wizards/ai_context_wizard.py +441 -0
- empathy_software_plugin/wizards/ai_documentation_wizard.py +503 -0
- empathy_software_plugin/wizards/base_wizard.py +288 -0
- empathy_software_plugin/wizards/book_chapter_wizard.py +519 -0
- empathy_software_plugin/wizards/code_review_wizard.py +606 -0
- empathy_software_plugin/wizards/debugging/__init__.py +50 -0
- empathy_software_plugin/wizards/debugging/bug_risk_analyzer.py +414 -0
- empathy_software_plugin/wizards/debugging/config_loaders.py +442 -0
- empathy_software_plugin/wizards/debugging/fix_applier.py +469 -0
- empathy_software_plugin/wizards/debugging/language_patterns.py +383 -0
- empathy_software_plugin/wizards/debugging/linter_parsers.py +470 -0
- empathy_software_plugin/wizards/debugging/verification.py +369 -0
- empathy_software_plugin/wizards/enhanced_testing_wizard.py +537 -0
- empathy_software_plugin/wizards/memory_enhanced_debugging_wizard.py +816 -0
- empathy_software_plugin/wizards/multi_model_wizard.py +501 -0
- empathy_software_plugin/wizards/pattern_extraction_wizard.py +422 -0
- empathy_software_plugin/wizards/pattern_retriever_wizard.py +400 -0
- empathy_software_plugin/wizards/performance/__init__.py +9 -0
- empathy_software_plugin/wizards/performance/bottleneck_detector.py +221 -0
- empathy_software_plugin/wizards/performance/profiler_parsers.py +278 -0
- empathy_software_plugin/wizards/performance/trajectory_analyzer.py +429 -0
- empathy_software_plugin/wizards/performance_profiling_wizard.py +305 -0
- empathy_software_plugin/wizards/prompt_engineering_wizard.py +425 -0
- empathy_software_plugin/wizards/rag_pattern_wizard.py +461 -0
- empathy_software_plugin/wizards/security/__init__.py +32 -0
- empathy_software_plugin/wizards/security/exploit_analyzer.py +290 -0
- empathy_software_plugin/wizards/security/owasp_patterns.py +241 -0
- empathy_software_plugin/wizards/security/vulnerability_scanner.py +604 -0
- empathy_software_plugin/wizards/security_analysis_wizard.py +322 -0
- empathy_software_plugin/wizards/security_learning_wizard.py +740 -0
- empathy_software_plugin/wizards/tech_debt_wizard.py +726 -0
- empathy_software_plugin/wizards/testing/__init__.py +27 -0
- empathy_software_plugin/wizards/testing/coverage_analyzer.py +459 -0
- empathy_software_plugin/wizards/testing/quality_analyzer.py +531 -0
- empathy_software_plugin/wizards/testing/test_suggester.py +533 -0
- empathy_software_plugin/wizards/testing_wizard.py +274 -0
- hot_reload/README.md +473 -0
- hot_reload/__init__.py +62 -0
- hot_reload/config.py +84 -0
- hot_reload/integration.py +228 -0
- hot_reload/reloader.py +298 -0
- hot_reload/watcher.py +179 -0
- hot_reload/websocket.py +176 -0
- scaffolding/README.md +589 -0
- scaffolding/__init__.py +35 -0
- scaffolding/__main__.py +14 -0
- scaffolding/cli.py +240 -0
- test_generator/__init__.py +38 -0
- test_generator/__main__.py +14 -0
- test_generator/cli.py +226 -0
- test_generator/generator.py +325 -0
- test_generator/risk_analyzer.py +216 -0
- workflow_patterns/__init__.py +33 -0
- workflow_patterns/behavior.py +249 -0
- workflow_patterns/core.py +76 -0
- workflow_patterns/output.py +99 -0
- workflow_patterns/registry.py +255 -0
- workflow_patterns/structural.py +288 -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
- agents/code_inspection/patterns/inspection/recurring_B112.json +0 -18
- agents/code_inspection/patterns/inspection/recurring_F541.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_FORMAT.json +0 -25
- agents/code_inspection/patterns/inspection/recurring_bug_20250822_def456.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20250915_abc123.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_3c5b9951.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_97c0f72f.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a0871d53.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_20251212_a9b6ec41.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_bug_null_001.json +0 -16
- agents/code_inspection/patterns/inspection/recurring_builtin.json +0 -16
- agents/compliance_anticipation_agent.py +0 -1422
- agents/compliance_db.py +0 -339
- agents/epic_integration_wizard.py +0 -530
- agents/notifications.py +0 -291
- agents/trust_building_behaviors.py +0 -872
- empathy_framework-3.7.0.dist-info/RECORD +0 -105
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/WHEEL +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/entry_points.txt +0 -0
- {empathy_framework-3.7.0.dist-info → empathy_framework-3.8.0.dist-info}/licenses/LICENSE +0 -0
- /empathy_os/{monitoring.py → agent_monitoring.py} +0 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
"""Unified Model Registry - Single Source of Truth
|
|
2
|
+
|
|
3
|
+
This module provides a centralized model configuration that is consumed by:
|
|
4
|
+
- empathy_llm_toolkit.routing.ModelRouter (via compatibility properties)
|
|
5
|
+
- src/empathy_os/workflows.config.WorkflowConfig
|
|
6
|
+
- src/empathy_os.cost_tracker
|
|
7
|
+
|
|
8
|
+
Pricing is stored in per-million tokens (industry standard) with computed
|
|
9
|
+
properties for per-1k compatibility with legacy code.
|
|
10
|
+
|
|
11
|
+
Copyright 2025 Smart-AI-Memory
|
|
12
|
+
Licensed under Fair Source License 0.9
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
from dataclasses import dataclass
|
|
16
|
+
from enum import Enum
|
|
17
|
+
from typing import Any
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class ModelTier(Enum):
|
|
21
|
+
"""Model tier classification for routing.
|
|
22
|
+
|
|
23
|
+
CHEAP: Fast, low-cost models for simple tasks (~$0.15-1.00/M input)
|
|
24
|
+
CAPABLE: Balanced models for most development work (~$2.50-3.00/M input)
|
|
25
|
+
PREMIUM: Highest capability for complex reasoning (~$15.00/M input)
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
CHEAP = "cheap"
|
|
29
|
+
CAPABLE = "capable"
|
|
30
|
+
PREMIUM = "premium"
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class ModelProvider(Enum):
|
|
34
|
+
"""Supported model providers."""
|
|
35
|
+
|
|
36
|
+
ANTHROPIC = "anthropic"
|
|
37
|
+
OPENAI = "openai"
|
|
38
|
+
GOOGLE = "google"
|
|
39
|
+
OLLAMA = "ollama"
|
|
40
|
+
HYBRID = "hybrid"
|
|
41
|
+
CUSTOM = "custom"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@dataclass(frozen=True)
|
|
45
|
+
class ModelInfo:
|
|
46
|
+
"""Unified model information - single source of truth.
|
|
47
|
+
|
|
48
|
+
Pricing is stored in per-million tokens format. Use the cost_per_1k_*
|
|
49
|
+
properties for compatibility with code expecting per-1k pricing.
|
|
50
|
+
|
|
51
|
+
Attributes:
|
|
52
|
+
id: Model identifier (e.g., "claude-3-5-haiku-20241022")
|
|
53
|
+
provider: Provider name (e.g., "anthropic")
|
|
54
|
+
tier: Tier level (e.g., "cheap")
|
|
55
|
+
input_cost_per_million: Input token cost per million tokens
|
|
56
|
+
output_cost_per_million: Output token cost per million tokens
|
|
57
|
+
max_tokens: Maximum output tokens
|
|
58
|
+
supports_vision: Whether model supports vision/images
|
|
59
|
+
supports_tools: Whether model supports tool/function calling
|
|
60
|
+
|
|
61
|
+
"""
|
|
62
|
+
|
|
63
|
+
id: str
|
|
64
|
+
provider: str
|
|
65
|
+
tier: str
|
|
66
|
+
input_cost_per_million: float
|
|
67
|
+
output_cost_per_million: float
|
|
68
|
+
max_tokens: int = 4096
|
|
69
|
+
supports_vision: bool = False
|
|
70
|
+
supports_tools: bool = True
|
|
71
|
+
|
|
72
|
+
# Compatibility properties for toolkit (per-1k pricing)
|
|
73
|
+
@property
|
|
74
|
+
def model_id(self) -> str:
|
|
75
|
+
"""Alias for id - compatibility with ModelRouter.ModelConfig."""
|
|
76
|
+
return self.id
|
|
77
|
+
|
|
78
|
+
@property
|
|
79
|
+
def name(self) -> str:
|
|
80
|
+
"""Alias for id - compatibility with WorkflowConfig.ModelConfig."""
|
|
81
|
+
return self.id
|
|
82
|
+
|
|
83
|
+
@property
|
|
84
|
+
def cost_per_1k_input(self) -> float:
|
|
85
|
+
"""Input cost per 1k tokens - for ModelRouter compatibility."""
|
|
86
|
+
return self.input_cost_per_million / 1000
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
def cost_per_1k_output(self) -> float:
|
|
90
|
+
"""Output cost per 1k tokens - for ModelRouter compatibility."""
|
|
91
|
+
return self.output_cost_per_million / 1000
|
|
92
|
+
|
|
93
|
+
def to_router_config(self) -> dict[str, Any]:
|
|
94
|
+
"""Convert to ModelRouter.ModelConfig compatible dict."""
|
|
95
|
+
return {
|
|
96
|
+
"model_id": self.id,
|
|
97
|
+
"cost_per_1k_input": self.cost_per_1k_input,
|
|
98
|
+
"cost_per_1k_output": self.cost_per_1k_output,
|
|
99
|
+
"max_tokens": self.max_tokens,
|
|
100
|
+
"supports_tools": self.supports_tools,
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
def to_workflow_config(self) -> dict[str, Any]:
|
|
104
|
+
"""Convert to WorkflowConfig.ModelConfig compatible dict."""
|
|
105
|
+
return {
|
|
106
|
+
"name": self.id,
|
|
107
|
+
"provider": self.provider,
|
|
108
|
+
"tier": self.tier,
|
|
109
|
+
"input_cost_per_million": self.input_cost_per_million,
|
|
110
|
+
"output_cost_per_million": self.output_cost_per_million,
|
|
111
|
+
"max_tokens": self.max_tokens,
|
|
112
|
+
"supports_vision": self.supports_vision,
|
|
113
|
+
"supports_tools": self.supports_tools,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
def to_cost_tracker_pricing(self) -> dict[str, float]:
|
|
117
|
+
"""Convert to cost_tracker MODEL_PRICING format."""
|
|
118
|
+
return {
|
|
119
|
+
"input": self.input_cost_per_million,
|
|
120
|
+
"output": self.output_cost_per_million,
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
# =============================================================================
|
|
125
|
+
# MODEL REGISTRY - Single Source of Truth
|
|
126
|
+
# =============================================================================
|
|
127
|
+
# All model configurations are defined here. Other modules should import
|
|
128
|
+
# from this registry rather than defining their own model configs.
|
|
129
|
+
|
|
130
|
+
MODEL_REGISTRY: dict[str, dict[str, ModelInfo]] = {
|
|
131
|
+
# -------------------------------------------------------------------------
|
|
132
|
+
# Anthropic Claude Models
|
|
133
|
+
# -------------------------------------------------------------------------
|
|
134
|
+
"anthropic": {
|
|
135
|
+
"cheap": ModelInfo(
|
|
136
|
+
id="claude-3-5-haiku-20241022",
|
|
137
|
+
provider="anthropic",
|
|
138
|
+
tier="cheap",
|
|
139
|
+
input_cost_per_million=0.80,
|
|
140
|
+
output_cost_per_million=4.00,
|
|
141
|
+
max_tokens=8192,
|
|
142
|
+
supports_vision=False,
|
|
143
|
+
supports_tools=True,
|
|
144
|
+
),
|
|
145
|
+
"capable": ModelInfo(
|
|
146
|
+
id="claude-sonnet-4-20250514",
|
|
147
|
+
provider="anthropic",
|
|
148
|
+
tier="capable",
|
|
149
|
+
input_cost_per_million=3.00,
|
|
150
|
+
output_cost_per_million=15.00,
|
|
151
|
+
max_tokens=8192,
|
|
152
|
+
supports_vision=True,
|
|
153
|
+
supports_tools=True,
|
|
154
|
+
),
|
|
155
|
+
"premium": ModelInfo(
|
|
156
|
+
id="claude-opus-4-5-20251101",
|
|
157
|
+
provider="anthropic",
|
|
158
|
+
tier="premium",
|
|
159
|
+
input_cost_per_million=15.00,
|
|
160
|
+
output_cost_per_million=75.00,
|
|
161
|
+
max_tokens=8192,
|
|
162
|
+
supports_vision=True,
|
|
163
|
+
supports_tools=True,
|
|
164
|
+
),
|
|
165
|
+
},
|
|
166
|
+
# -------------------------------------------------------------------------
|
|
167
|
+
# OpenAI Models
|
|
168
|
+
# -------------------------------------------------------------------------
|
|
169
|
+
"openai": {
|
|
170
|
+
"cheap": ModelInfo(
|
|
171
|
+
id="gpt-4o-mini",
|
|
172
|
+
provider="openai",
|
|
173
|
+
tier="cheap",
|
|
174
|
+
input_cost_per_million=0.15,
|
|
175
|
+
output_cost_per_million=0.60,
|
|
176
|
+
max_tokens=4096,
|
|
177
|
+
supports_vision=False,
|
|
178
|
+
supports_tools=True,
|
|
179
|
+
),
|
|
180
|
+
"capable": ModelInfo(
|
|
181
|
+
id="gpt-4o",
|
|
182
|
+
provider="openai",
|
|
183
|
+
tier="capable",
|
|
184
|
+
input_cost_per_million=2.50,
|
|
185
|
+
output_cost_per_million=10.00,
|
|
186
|
+
max_tokens=4096,
|
|
187
|
+
supports_vision=True,
|
|
188
|
+
supports_tools=True,
|
|
189
|
+
),
|
|
190
|
+
"premium": ModelInfo(
|
|
191
|
+
id="o1",
|
|
192
|
+
provider="openai",
|
|
193
|
+
tier="premium",
|
|
194
|
+
input_cost_per_million=15.00,
|
|
195
|
+
output_cost_per_million=60.00,
|
|
196
|
+
max_tokens=32768,
|
|
197
|
+
supports_vision=False,
|
|
198
|
+
supports_tools=False, # o1 doesn't support tools yet
|
|
199
|
+
),
|
|
200
|
+
},
|
|
201
|
+
# -------------------------------------------------------------------------
|
|
202
|
+
# Google Gemini Models
|
|
203
|
+
# Key feature: Massive context windows (1M-2M tokens)
|
|
204
|
+
# Model recommendations by tier:
|
|
205
|
+
# cheap: gemini-2.0-flash-exp (1M context, fast, very cheap)
|
|
206
|
+
# capable: gemini-1.5-pro (2M context, excellent for large codebases)
|
|
207
|
+
# premium: gemini-2.5-pro (Google's most capable reasoning model)
|
|
208
|
+
# -------------------------------------------------------------------------
|
|
209
|
+
"google": {
|
|
210
|
+
"cheap": ModelInfo(
|
|
211
|
+
id="gemini-2.0-flash-exp",
|
|
212
|
+
provider="google",
|
|
213
|
+
tier="cheap",
|
|
214
|
+
input_cost_per_million=0.10,
|
|
215
|
+
output_cost_per_million=0.40,
|
|
216
|
+
max_tokens=8192,
|
|
217
|
+
supports_vision=True,
|
|
218
|
+
supports_tools=True,
|
|
219
|
+
),
|
|
220
|
+
"capable": ModelInfo(
|
|
221
|
+
id="gemini-1.5-pro",
|
|
222
|
+
provider="google",
|
|
223
|
+
tier="capable",
|
|
224
|
+
input_cost_per_million=1.25,
|
|
225
|
+
output_cost_per_million=5.00,
|
|
226
|
+
max_tokens=8192,
|
|
227
|
+
supports_vision=True,
|
|
228
|
+
supports_tools=True,
|
|
229
|
+
),
|
|
230
|
+
"premium": ModelInfo(
|
|
231
|
+
id="gemini-2.5-pro",
|
|
232
|
+
provider="google",
|
|
233
|
+
tier="premium",
|
|
234
|
+
input_cost_per_million=1.25,
|
|
235
|
+
output_cost_per_million=10.00,
|
|
236
|
+
max_tokens=8192,
|
|
237
|
+
supports_vision=True,
|
|
238
|
+
supports_tools=True,
|
|
239
|
+
),
|
|
240
|
+
},
|
|
241
|
+
# -------------------------------------------------------------------------
|
|
242
|
+
# Ollama (Local) Models - Zero cost
|
|
243
|
+
# Model recommendations by tier:
|
|
244
|
+
# cheap: Small, fast models (3B params) - llama3.2:3b
|
|
245
|
+
# capable: Mid-size models (8B params) - llama3.1:8b
|
|
246
|
+
# premium: Large models (70B params) - llama3.1:70b
|
|
247
|
+
# Users need to pull models: ollama pull llama3.2:3b llama3.1:8b llama3.1:70b
|
|
248
|
+
# -------------------------------------------------------------------------
|
|
249
|
+
"ollama": {
|
|
250
|
+
"cheap": ModelInfo(
|
|
251
|
+
id="llama3.2:3b",
|
|
252
|
+
provider="ollama",
|
|
253
|
+
tier="cheap",
|
|
254
|
+
input_cost_per_million=0.0,
|
|
255
|
+
output_cost_per_million=0.0,
|
|
256
|
+
max_tokens=4096,
|
|
257
|
+
supports_vision=False,
|
|
258
|
+
supports_tools=True,
|
|
259
|
+
),
|
|
260
|
+
"capable": ModelInfo(
|
|
261
|
+
id="llama3.1:8b",
|
|
262
|
+
provider="ollama",
|
|
263
|
+
tier="capable",
|
|
264
|
+
input_cost_per_million=0.0,
|
|
265
|
+
output_cost_per_million=0.0,
|
|
266
|
+
max_tokens=8192,
|
|
267
|
+
supports_vision=False,
|
|
268
|
+
supports_tools=True,
|
|
269
|
+
),
|
|
270
|
+
"premium": ModelInfo(
|
|
271
|
+
id="llama3.1:70b",
|
|
272
|
+
provider="ollama",
|
|
273
|
+
tier="premium",
|
|
274
|
+
input_cost_per_million=0.0,
|
|
275
|
+
output_cost_per_million=0.0,
|
|
276
|
+
max_tokens=8192,
|
|
277
|
+
supports_vision=False,
|
|
278
|
+
supports_tools=True,
|
|
279
|
+
),
|
|
280
|
+
},
|
|
281
|
+
# -------------------------------------------------------------------------
|
|
282
|
+
# Hybrid - Mix of best models from different providers
|
|
283
|
+
# -------------------------------------------------------------------------
|
|
284
|
+
"hybrid": {
|
|
285
|
+
"cheap": ModelInfo(
|
|
286
|
+
id="gpt-4o-mini", # OpenAI - cheapest per token
|
|
287
|
+
provider="openai",
|
|
288
|
+
tier="cheap",
|
|
289
|
+
input_cost_per_million=0.15,
|
|
290
|
+
output_cost_per_million=0.60,
|
|
291
|
+
max_tokens=4096,
|
|
292
|
+
supports_vision=False,
|
|
293
|
+
supports_tools=True,
|
|
294
|
+
),
|
|
295
|
+
"capable": ModelInfo(
|
|
296
|
+
id="claude-sonnet-4-20250514", # Anthropic - best reasoning
|
|
297
|
+
provider="anthropic",
|
|
298
|
+
tier="capable",
|
|
299
|
+
input_cost_per_million=3.00,
|
|
300
|
+
output_cost_per_million=15.00,
|
|
301
|
+
max_tokens=8192,
|
|
302
|
+
supports_vision=True,
|
|
303
|
+
supports_tools=True,
|
|
304
|
+
),
|
|
305
|
+
"premium": ModelInfo(
|
|
306
|
+
id="claude-opus-4-5-20251101", # Anthropic - best overall
|
|
307
|
+
provider="anthropic",
|
|
308
|
+
tier="premium",
|
|
309
|
+
input_cost_per_million=15.00,
|
|
310
|
+
output_cost_per_million=75.00,
|
|
311
|
+
max_tokens=8192,
|
|
312
|
+
supports_vision=True,
|
|
313
|
+
supports_tools=True,
|
|
314
|
+
),
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
|
|
319
|
+
# =============================================================================
|
|
320
|
+
# HELPER FUNCTIONS
|
|
321
|
+
# =============================================================================
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
def get_model(provider: str, tier: str) -> ModelInfo | None:
|
|
325
|
+
"""Get model info for a provider/tier combination.
|
|
326
|
+
|
|
327
|
+
Args:
|
|
328
|
+
provider: Provider name (anthropic, openai, ollama, hybrid)
|
|
329
|
+
tier: Tier level (cheap, capable, premium)
|
|
330
|
+
|
|
331
|
+
Returns:
|
|
332
|
+
ModelInfo if found, None otherwise
|
|
333
|
+
|
|
334
|
+
"""
|
|
335
|
+
provider_models = MODEL_REGISTRY.get(provider.lower())
|
|
336
|
+
if provider_models is None:
|
|
337
|
+
return None
|
|
338
|
+
return provider_models.get(tier.lower())
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
def get_all_models() -> dict[str, dict[str, ModelInfo]]:
|
|
342
|
+
"""Get the complete model registry."""
|
|
343
|
+
return MODEL_REGISTRY
|
|
344
|
+
|
|
345
|
+
|
|
346
|
+
def get_pricing_for_model(model_id: str) -> dict[str, float] | None:
|
|
347
|
+
"""Get pricing for a model by its ID.
|
|
348
|
+
|
|
349
|
+
Args:
|
|
350
|
+
model_id: Model identifier (e.g., "claude-3-5-haiku-20241022")
|
|
351
|
+
|
|
352
|
+
Returns:
|
|
353
|
+
Dict with 'input' and 'output' keys (per-million pricing), or None
|
|
354
|
+
|
|
355
|
+
"""
|
|
356
|
+
for provider_models in MODEL_REGISTRY.values():
|
|
357
|
+
for model_info in provider_models.values():
|
|
358
|
+
if model_info.id == model_id:
|
|
359
|
+
return model_info.to_cost_tracker_pricing()
|
|
360
|
+
return None
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
def get_supported_providers() -> list[str]:
|
|
364
|
+
"""Get list of supported provider names."""
|
|
365
|
+
return list(MODEL_REGISTRY.keys())
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
def get_tiers() -> list[str]:
|
|
369
|
+
"""Get list of available tiers."""
|
|
370
|
+
return [tier.value for tier in ModelTier]
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
# =============================================================================
|
|
374
|
+
# TIER PRICING (for backward compatibility with cost_tracker)
|
|
375
|
+
# =============================================================================
|
|
376
|
+
# These are tier-level pricing aliases for when specific model isn't known
|
|
377
|
+
|
|
378
|
+
TIER_PRICING: dict[str, dict[str, float]] = {
|
|
379
|
+
"cheap": {"input": 0.80, "output": 4.00}, # Haiku 3.5 pricing
|
|
380
|
+
"capable": {"input": 3.00, "output": 15.00}, # Sonnet 4 pricing
|
|
381
|
+
"premium": {"input": 15.00, "output": 75.00}, # Opus 4.5 pricing
|
|
382
|
+
}
|
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
"""Shared Task-Type Schema for Empathy Framework
|
|
2
|
+
|
|
3
|
+
Provides a unified vocabulary for task types across:
|
|
4
|
+
- empathy_llm_toolkit.routing.ModelRouter
|
|
5
|
+
- src/empathy_os/workflows.WorkflowBase
|
|
6
|
+
- empathy_software_plugin.wizards.MultiModelWizard
|
|
7
|
+
|
|
8
|
+
This module defines:
|
|
9
|
+
- TaskType enum with canonical task names
|
|
10
|
+
- Task-to-tier mappings
|
|
11
|
+
- Task normalization and lookup functions
|
|
12
|
+
|
|
13
|
+
Copyright 2025 Smart-AI-Memory
|
|
14
|
+
Licensed under Fair Source License 0.9
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from dataclasses import dataclass
|
|
18
|
+
from enum import Enum
|
|
19
|
+
|
|
20
|
+
from .registry import ModelTier
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TaskType(Enum):
|
|
24
|
+
"""Canonical task types for model routing.
|
|
25
|
+
|
|
26
|
+
Tasks are organized by their typical tier:
|
|
27
|
+
- CHEAP tier: Simple, fast tasks
|
|
28
|
+
- CAPABLE tier: Standard development work
|
|
29
|
+
- PREMIUM tier: Complex reasoning and coordination
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
# =========================================================================
|
|
33
|
+
# CHEAP TIER TASKS (~$0.15-1.00/M input)
|
|
34
|
+
# Fast models for simple, well-defined tasks
|
|
35
|
+
# =========================================================================
|
|
36
|
+
SUMMARIZE = "summarize"
|
|
37
|
+
CLASSIFY = "classify"
|
|
38
|
+
TRIAGE = "triage"
|
|
39
|
+
MATCH_PATTERN = "match_pattern"
|
|
40
|
+
EXTRACT_TOPICS = "extract_topics"
|
|
41
|
+
LINT_CHECK = "lint_check"
|
|
42
|
+
FORMAT_CODE = "format_code"
|
|
43
|
+
SIMPLE_QA = "simple_qa"
|
|
44
|
+
CATEGORIZE = "categorize"
|
|
45
|
+
|
|
46
|
+
# =========================================================================
|
|
47
|
+
# CAPABLE TIER TASKS (~$2.50-3.00/M input)
|
|
48
|
+
# Balanced models for standard development work
|
|
49
|
+
# =========================================================================
|
|
50
|
+
GENERATE_CODE = "generate_code"
|
|
51
|
+
FIX_BUG = "fix_bug"
|
|
52
|
+
REVIEW_SECURITY = "review_security"
|
|
53
|
+
ANALYZE_PERFORMANCE = "analyze_performance"
|
|
54
|
+
WRITE_TESTS = "write_tests"
|
|
55
|
+
REFACTOR = "refactor"
|
|
56
|
+
EXPLAIN_CODE = "explain_code"
|
|
57
|
+
DOCUMENT_CODE = "document_code"
|
|
58
|
+
ANALYZE_ERROR = "analyze_error"
|
|
59
|
+
SUGGEST_FIX = "suggest_fix"
|
|
60
|
+
|
|
61
|
+
# =========================================================================
|
|
62
|
+
# PREMIUM TIER TASKS (~$15.00/M input)
|
|
63
|
+
# Highest capability for complex reasoning
|
|
64
|
+
# =========================================================================
|
|
65
|
+
COORDINATE = "coordinate"
|
|
66
|
+
SYNTHESIZE_RESULTS = "synthesize_results"
|
|
67
|
+
ARCHITECTURAL_DECISION = "architectural_decision"
|
|
68
|
+
NOVEL_PROBLEM = "novel_problem"
|
|
69
|
+
FINAL_REVIEW = "final_review"
|
|
70
|
+
COMPLEX_REASONING = "complex_reasoning"
|
|
71
|
+
MULTI_STEP_PLANNING = "multi_step_planning"
|
|
72
|
+
CRITICAL_DECISION = "critical_decision"
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass(frozen=True)
|
|
76
|
+
class TaskInfo:
|
|
77
|
+
"""Information about a task type."""
|
|
78
|
+
|
|
79
|
+
task_type: TaskType
|
|
80
|
+
tier: ModelTier
|
|
81
|
+
description: str
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
# =============================================================================
|
|
85
|
+
# TASK-TO-TIER MAPPINGS
|
|
86
|
+
# =============================================================================
|
|
87
|
+
|
|
88
|
+
# Cheap tier tasks
|
|
89
|
+
CHEAP_TASKS: frozenset[str] = frozenset(
|
|
90
|
+
[
|
|
91
|
+
TaskType.SUMMARIZE.value,
|
|
92
|
+
TaskType.CLASSIFY.value,
|
|
93
|
+
TaskType.TRIAGE.value,
|
|
94
|
+
TaskType.MATCH_PATTERN.value,
|
|
95
|
+
TaskType.EXTRACT_TOPICS.value,
|
|
96
|
+
TaskType.LINT_CHECK.value,
|
|
97
|
+
TaskType.FORMAT_CODE.value,
|
|
98
|
+
TaskType.SIMPLE_QA.value,
|
|
99
|
+
TaskType.CATEGORIZE.value,
|
|
100
|
+
],
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
# Capable tier tasks
|
|
104
|
+
CAPABLE_TASKS: frozenset[str] = frozenset(
|
|
105
|
+
[
|
|
106
|
+
TaskType.GENERATE_CODE.value,
|
|
107
|
+
TaskType.FIX_BUG.value,
|
|
108
|
+
TaskType.REVIEW_SECURITY.value,
|
|
109
|
+
TaskType.ANALYZE_PERFORMANCE.value,
|
|
110
|
+
TaskType.WRITE_TESTS.value,
|
|
111
|
+
TaskType.REFACTOR.value,
|
|
112
|
+
TaskType.EXPLAIN_CODE.value,
|
|
113
|
+
TaskType.DOCUMENT_CODE.value,
|
|
114
|
+
TaskType.ANALYZE_ERROR.value,
|
|
115
|
+
TaskType.SUGGEST_FIX.value,
|
|
116
|
+
],
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
# Premium tier tasks
|
|
120
|
+
PREMIUM_TASKS: frozenset[str] = frozenset(
|
|
121
|
+
[
|
|
122
|
+
TaskType.COORDINATE.value,
|
|
123
|
+
TaskType.SYNTHESIZE_RESULTS.value,
|
|
124
|
+
TaskType.ARCHITECTURAL_DECISION.value,
|
|
125
|
+
TaskType.NOVEL_PROBLEM.value,
|
|
126
|
+
TaskType.FINAL_REVIEW.value,
|
|
127
|
+
TaskType.COMPLEX_REASONING.value,
|
|
128
|
+
TaskType.MULTI_STEP_PLANNING.value,
|
|
129
|
+
TaskType.CRITICAL_DECISION.value,
|
|
130
|
+
],
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
# Complete mapping for lookup
|
|
134
|
+
TASK_TIER_MAP: dict[str, ModelTier] = {
|
|
135
|
+
**dict.fromkeys(CHEAP_TASKS, ModelTier.CHEAP),
|
|
136
|
+
**dict.fromkeys(CAPABLE_TASKS, ModelTier.CAPABLE),
|
|
137
|
+
**dict.fromkeys(PREMIUM_TASKS, ModelTier.PREMIUM),
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
# =============================================================================
|
|
142
|
+
# HELPER FUNCTIONS
|
|
143
|
+
# =============================================================================
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def normalize_task_type(task_type: str) -> str:
|
|
147
|
+
"""Normalize a task type string for lookup.
|
|
148
|
+
|
|
149
|
+
Converts to lowercase and normalizes separators to underscores.
|
|
150
|
+
|
|
151
|
+
Args:
|
|
152
|
+
task_type: Task type string (e.g., "Fix-Bug", "fix bug", "FIX_BUG")
|
|
153
|
+
|
|
154
|
+
Returns:
|
|
155
|
+
Normalized task type (e.g., "fix_bug")
|
|
156
|
+
|
|
157
|
+
"""
|
|
158
|
+
return task_type.lower().replace("-", "_").replace(" ", "_")
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def get_tier_for_task(task_type: str | TaskType) -> ModelTier:
|
|
162
|
+
"""Get the appropriate tier for a task type.
|
|
163
|
+
|
|
164
|
+
Args:
|
|
165
|
+
task_type: Task type string or TaskType enum
|
|
166
|
+
|
|
167
|
+
Returns:
|
|
168
|
+
ModelTier for the task (defaults to CAPABLE for unknown tasks)
|
|
169
|
+
|
|
170
|
+
Example:
|
|
171
|
+
>>> get_tier_for_task("summarize")
|
|
172
|
+
ModelTier.CHEAP
|
|
173
|
+
>>> get_tier_for_task("fix_bug")
|
|
174
|
+
ModelTier.CAPABLE
|
|
175
|
+
>>> get_tier_for_task("coordinate")
|
|
176
|
+
ModelTier.PREMIUM
|
|
177
|
+
>>> get_tier_for_task("unknown_task")
|
|
178
|
+
ModelTier.CAPABLE
|
|
179
|
+
|
|
180
|
+
"""
|
|
181
|
+
# Handle TaskType enum
|
|
182
|
+
if isinstance(task_type, TaskType):
|
|
183
|
+
task_str = task_type.value
|
|
184
|
+
else:
|
|
185
|
+
task_str = normalize_task_type(task_type)
|
|
186
|
+
|
|
187
|
+
# Lookup in mapping
|
|
188
|
+
return TASK_TIER_MAP.get(task_str, ModelTier.CAPABLE)
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
def get_tasks_for_tier(tier: ModelTier) -> list[str]:
|
|
192
|
+
"""Get all task types for a given tier.
|
|
193
|
+
|
|
194
|
+
Args:
|
|
195
|
+
tier: ModelTier to get tasks for
|
|
196
|
+
|
|
197
|
+
Returns:
|
|
198
|
+
List of task type strings
|
|
199
|
+
|
|
200
|
+
"""
|
|
201
|
+
if tier == ModelTier.CHEAP:
|
|
202
|
+
return list(CHEAP_TASKS)
|
|
203
|
+
if tier == ModelTier.CAPABLE:
|
|
204
|
+
return list(CAPABLE_TASKS)
|
|
205
|
+
if tier == ModelTier.PREMIUM:
|
|
206
|
+
return list(PREMIUM_TASKS)
|
|
207
|
+
return []
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
def get_all_tasks() -> dict[str, list[str]]:
|
|
211
|
+
"""Get all known task types organized by tier.
|
|
212
|
+
|
|
213
|
+
Returns:
|
|
214
|
+
Dict mapping tier name to list of task types
|
|
215
|
+
|
|
216
|
+
"""
|
|
217
|
+
return {
|
|
218
|
+
"cheap": list(CHEAP_TASKS),
|
|
219
|
+
"capable": list(CAPABLE_TASKS),
|
|
220
|
+
"premium": list(PREMIUM_TASKS),
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
def is_known_task(task_type: str) -> bool:
|
|
225
|
+
"""Check if a task type is known/defined.
|
|
226
|
+
|
|
227
|
+
Args:
|
|
228
|
+
task_type: Task type string
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
True if task is defined, False otherwise
|
|
232
|
+
|
|
233
|
+
"""
|
|
234
|
+
normalized = normalize_task_type(task_type)
|
|
235
|
+
return normalized in TASK_TIER_MAP
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
# =============================================================================
|
|
239
|
+
# TASK INFO REGISTRY
|
|
240
|
+
# =============================================================================
|
|
241
|
+
# Detailed information about each task type
|
|
242
|
+
|
|
243
|
+
TASK_INFO: dict[TaskType, TaskInfo] = {
|
|
244
|
+
# Cheap tasks
|
|
245
|
+
TaskType.SUMMARIZE: TaskInfo(
|
|
246
|
+
TaskType.SUMMARIZE,
|
|
247
|
+
ModelTier.CHEAP,
|
|
248
|
+
"Summarize text or code into concise form",
|
|
249
|
+
),
|
|
250
|
+
TaskType.CLASSIFY: TaskInfo(
|
|
251
|
+
TaskType.CLASSIFY,
|
|
252
|
+
ModelTier.CHEAP,
|
|
253
|
+
"Classify input into predefined categories",
|
|
254
|
+
),
|
|
255
|
+
TaskType.TRIAGE: TaskInfo(
|
|
256
|
+
TaskType.TRIAGE,
|
|
257
|
+
ModelTier.CHEAP,
|
|
258
|
+
"Quick assessment and prioritization",
|
|
259
|
+
),
|
|
260
|
+
TaskType.SIMPLE_QA: TaskInfo(
|
|
261
|
+
TaskType.SIMPLE_QA,
|
|
262
|
+
ModelTier.CHEAP,
|
|
263
|
+
"Answer simple, factual questions",
|
|
264
|
+
),
|
|
265
|
+
# Capable tasks
|
|
266
|
+
TaskType.GENERATE_CODE: TaskInfo(
|
|
267
|
+
TaskType.GENERATE_CODE,
|
|
268
|
+
ModelTier.CAPABLE,
|
|
269
|
+
"Generate new code from requirements",
|
|
270
|
+
),
|
|
271
|
+
TaskType.FIX_BUG: TaskInfo(
|
|
272
|
+
TaskType.FIX_BUG,
|
|
273
|
+
ModelTier.CAPABLE,
|
|
274
|
+
"Identify and fix bugs in code",
|
|
275
|
+
),
|
|
276
|
+
TaskType.REVIEW_SECURITY: TaskInfo(
|
|
277
|
+
TaskType.REVIEW_SECURITY,
|
|
278
|
+
ModelTier.CAPABLE,
|
|
279
|
+
"Review code for security vulnerabilities",
|
|
280
|
+
),
|
|
281
|
+
TaskType.WRITE_TESTS: TaskInfo(
|
|
282
|
+
TaskType.WRITE_TESTS,
|
|
283
|
+
ModelTier.CAPABLE,
|
|
284
|
+
"Write unit or integration tests",
|
|
285
|
+
),
|
|
286
|
+
# Premium tasks
|
|
287
|
+
TaskType.COORDINATE: TaskInfo(
|
|
288
|
+
TaskType.COORDINATE,
|
|
289
|
+
ModelTier.PREMIUM,
|
|
290
|
+
"Coordinate multi-agent workflows",
|
|
291
|
+
),
|
|
292
|
+
TaskType.ARCHITECTURAL_DECISION: TaskInfo(
|
|
293
|
+
TaskType.ARCHITECTURAL_DECISION,
|
|
294
|
+
ModelTier.PREMIUM,
|
|
295
|
+
"Make complex architectural decisions",
|
|
296
|
+
),
|
|
297
|
+
TaskType.COMPLEX_REASONING: TaskInfo(
|
|
298
|
+
TaskType.COMPLEX_REASONING,
|
|
299
|
+
ModelTier.PREMIUM,
|
|
300
|
+
"Handle complex multi-step reasoning",
|
|
301
|
+
),
|
|
302
|
+
}
|