isa-model 0.4.0__py3-none-any.whl → 0.4.4__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.
Files changed (189) hide show
  1. isa_model/client.py +466 -43
  2. isa_model/core/cache/redis_cache.py +12 -3
  3. isa_model/core/config/config_manager.py +230 -3
  4. isa_model/core/config.py +90 -0
  5. isa_model/core/database/direct_db_client.py +114 -0
  6. isa_model/core/database/migration_manager.py +563 -0
  7. isa_model/core/database/migrations.py +21 -1
  8. isa_model/core/database/supabase_client.py +154 -19
  9. isa_model/core/dependencies.py +316 -0
  10. isa_model/core/discovery/__init__.py +19 -0
  11. isa_model/core/discovery/consul_discovery.py +190 -0
  12. isa_model/core/logging/__init__.py +54 -0
  13. isa_model/core/logging/influx_logger.py +523 -0
  14. isa_model/core/logging/loki_logger.py +160 -0
  15. isa_model/core/models/__init__.py +27 -18
  16. isa_model/core/models/config_models.py +625 -0
  17. isa_model/core/models/deployment_billing_tracker.py +430 -0
  18. isa_model/core/models/model_manager.py +35 -80
  19. isa_model/core/models/model_metadata.py +690 -0
  20. isa_model/core/models/model_repo.py +174 -18
  21. isa_model/core/models/system_models.py +857 -0
  22. isa_model/core/repositories/__init__.py +9 -0
  23. isa_model/core/repositories/config_repository.py +912 -0
  24. isa_model/core/services/intelligent_model_selector.py +399 -21
  25. isa_model/core/types.py +1 -0
  26. isa_model/deployment/__init__.py +5 -48
  27. isa_model/deployment/core/__init__.py +2 -31
  28. isa_model/deployment/core/deployment_manager.py +1278 -370
  29. isa_model/deployment/modal/__init__.py +8 -0
  30. isa_model/deployment/modal/config.py +136 -0
  31. isa_model/deployment/{services/auto_hf_modal_deployer.py → modal/deployer.py} +1 -1
  32. isa_model/deployment/modal/services/__init__.py +3 -0
  33. isa_model/deployment/modal/services/audio/__init__.py +1 -0
  34. isa_model/deployment/modal/services/embedding/__init__.py +1 -0
  35. isa_model/deployment/modal/services/llm/__init__.py +1 -0
  36. isa_model/deployment/modal/services/llm/isa_llm_service.py +424 -0
  37. isa_model/deployment/modal/services/video/__init__.py +1 -0
  38. isa_model/deployment/modal/services/vision/__init__.py +1 -0
  39. isa_model/deployment/models/org-org-acme-corp-tenant-a-service-llm-20250825-225822/tenant-a-service_modal_service.py +48 -0
  40. isa_model/deployment/models/org-test-org-123-prefix-test-service-llm-20250825-225822/prefix-test-service_modal_service.py +48 -0
  41. isa_model/deployment/models/test-llm-service-llm-20250825-204442/test-llm-service_modal_service.py +48 -0
  42. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-212906/test-monitoring-gpt2_modal_service.py +48 -0
  43. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-213009/test-monitoring-gpt2_modal_service.py +48 -0
  44. isa_model/deployment/storage/__init__.py +5 -0
  45. isa_model/deployment/storage/deployment_repository.py +824 -0
  46. isa_model/deployment/triton/__init__.py +10 -0
  47. isa_model/deployment/triton/config.py +196 -0
  48. isa_model/deployment/triton/configs/__init__.py +1 -0
  49. isa_model/deployment/triton/provider.py +512 -0
  50. isa_model/deployment/triton/scripts/__init__.py +1 -0
  51. isa_model/deployment/triton/templates/__init__.py +1 -0
  52. isa_model/inference/__init__.py +47 -1
  53. isa_model/inference/ai_factory.py +137 -10
  54. isa_model/inference/legacy_services/__init__.py +21 -0
  55. isa_model/inference/legacy_services/model_evaluation.py +637 -0
  56. isa_model/inference/legacy_services/model_service.py +573 -0
  57. isa_model/inference/legacy_services/model_serving.py +717 -0
  58. isa_model/inference/legacy_services/model_training.py +561 -0
  59. isa_model/inference/models/__init__.py +21 -0
  60. isa_model/inference/models/inference_config.py +551 -0
  61. isa_model/inference/models/inference_record.py +675 -0
  62. isa_model/inference/models/performance_models.py +714 -0
  63. isa_model/inference/repositories/__init__.py +9 -0
  64. isa_model/inference/repositories/inference_repository.py +828 -0
  65. isa_model/inference/services/audio/base_stt_service.py +184 -11
  66. isa_model/inference/services/audio/openai_stt_service.py +22 -6
  67. isa_model/inference/services/embedding/ollama_embed_service.py +15 -3
  68. isa_model/inference/services/embedding/resilient_embed_service.py +285 -0
  69. isa_model/inference/services/llm/__init__.py +10 -2
  70. isa_model/inference/services/llm/base_llm_service.py +335 -24
  71. isa_model/inference/services/llm/cerebras_llm_service.py +628 -0
  72. isa_model/inference/services/llm/helpers/llm_adapter.py +9 -4
  73. isa_model/inference/services/llm/helpers/llm_prompts.py +342 -0
  74. isa_model/inference/services/llm/helpers/llm_utils.py +321 -23
  75. isa_model/inference/services/llm/huggingface_llm_service.py +581 -0
  76. isa_model/inference/services/llm/ollama_llm_service.py +9 -2
  77. isa_model/inference/services/llm/openai_llm_service.py +33 -16
  78. isa_model/inference/services/llm/yyds_llm_service.py +8 -2
  79. isa_model/inference/services/vision/__init__.py +22 -1
  80. isa_model/inference/services/vision/helpers/image_utils.py +8 -5
  81. isa_model/inference/services/vision/isa_vision_service.py +65 -4
  82. isa_model/inference/services/vision/openai_vision_service.py +19 -10
  83. isa_model/inference/services/vision/vgg16_vision_service.py +257 -0
  84. isa_model/serving/api/cache_manager.py +245 -0
  85. isa_model/serving/api/dependencies/__init__.py +1 -0
  86. isa_model/serving/api/dependencies/auth.py +194 -0
  87. isa_model/serving/api/dependencies/database.py +139 -0
  88. isa_model/serving/api/error_handlers.py +284 -0
  89. isa_model/serving/api/fastapi_server.py +172 -22
  90. isa_model/serving/api/middleware/auth.py +8 -2
  91. isa_model/serving/api/middleware/security.py +23 -33
  92. isa_model/serving/api/middleware/tenant_context.py +414 -0
  93. isa_model/serving/api/routes/analytics.py +4 -1
  94. isa_model/serving/api/routes/config.py +645 -0
  95. isa_model/serving/api/routes/deployment_billing.py +315 -0
  96. isa_model/serving/api/routes/deployments.py +138 -2
  97. isa_model/serving/api/routes/gpu_gateway.py +440 -0
  98. isa_model/serving/api/routes/health.py +32 -12
  99. isa_model/serving/api/routes/inference_monitoring.py +486 -0
  100. isa_model/serving/api/routes/local_deployments.py +448 -0
  101. isa_model/serving/api/routes/tenants.py +575 -0
  102. isa_model/serving/api/routes/unified.py +680 -18
  103. isa_model/serving/api/routes/webhooks.py +479 -0
  104. isa_model/serving/api/startup.py +68 -54
  105. isa_model/utils/gpu_utils.py +311 -0
  106. {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/METADATA +71 -24
  107. isa_model-0.4.4.dist-info/RECORD +180 -0
  108. isa_model/core/security/secrets.py +0 -358
  109. isa_model/core/storage/hf_storage.py +0 -419
  110. isa_model/core/storage/minio_storage.py +0 -0
  111. isa_model/deployment/cloud/__init__.py +0 -9
  112. isa_model/deployment/cloud/modal/__init__.py +0 -10
  113. isa_model/deployment/core/deployment_config.py +0 -356
  114. isa_model/deployment/core/isa_deployment_service.py +0 -401
  115. isa_model/deployment/gpu_int8_ds8/app/server.py +0 -66
  116. isa_model/deployment/gpu_int8_ds8/scripts/test_client.py +0 -43
  117. isa_model/deployment/gpu_int8_ds8/scripts/test_client_os.py +0 -35
  118. isa_model/deployment/runtime/deployed_service.py +0 -338
  119. isa_model/deployment/services/__init__.py +0 -9
  120. isa_model/deployment/services/auto_deploy_vision_service.py +0 -538
  121. isa_model/deployment/services/model_service.py +0 -332
  122. isa_model/deployment/services/service_monitor.py +0 -356
  123. isa_model/deployment/services/service_registry.py +0 -527
  124. isa_model/eval/__init__.py +0 -92
  125. isa_model/eval/benchmarks/__init__.py +0 -27
  126. isa_model/eval/benchmarks/multimodal_datasets.py +0 -460
  127. isa_model/eval/benchmarks.py +0 -701
  128. isa_model/eval/config/__init__.py +0 -10
  129. isa_model/eval/config/evaluation_config.py +0 -108
  130. isa_model/eval/evaluators/__init__.py +0 -24
  131. isa_model/eval/evaluators/audio_evaluator.py +0 -727
  132. isa_model/eval/evaluators/base_evaluator.py +0 -503
  133. isa_model/eval/evaluators/embedding_evaluator.py +0 -742
  134. isa_model/eval/evaluators/llm_evaluator.py +0 -472
  135. isa_model/eval/evaluators/vision_evaluator.py +0 -564
  136. isa_model/eval/example_evaluation.py +0 -395
  137. isa_model/eval/factory.py +0 -798
  138. isa_model/eval/infrastructure/__init__.py +0 -24
  139. isa_model/eval/infrastructure/experiment_tracker.py +0 -466
  140. isa_model/eval/isa_benchmarks.py +0 -700
  141. isa_model/eval/isa_integration.py +0 -582
  142. isa_model/eval/metrics.py +0 -951
  143. isa_model/eval/tests/unit/test_basic.py +0 -396
  144. isa_model/serving/api/routes/evaluations.py +0 -579
  145. isa_model/training/__init__.py +0 -168
  146. isa_model/training/annotation/annotation_schema.py +0 -47
  147. isa_model/training/annotation/processors/annotation_processor.py +0 -126
  148. isa_model/training/annotation/storage/dataset_manager.py +0 -131
  149. isa_model/training/annotation/storage/dataset_schema.py +0 -44
  150. isa_model/training/annotation/tests/test_annotation_flow.py +0 -109
  151. isa_model/training/annotation/tests/test_minio copy.py +0 -113
  152. isa_model/training/annotation/tests/test_minio_upload.py +0 -43
  153. isa_model/training/annotation/views/annotation_controller.py +0 -158
  154. isa_model/training/cloud/__init__.py +0 -22
  155. isa_model/training/cloud/job_orchestrator.py +0 -402
  156. isa_model/training/cloud/runpod_trainer.py +0 -454
  157. isa_model/training/cloud/storage_manager.py +0 -482
  158. isa_model/training/core/__init__.py +0 -26
  159. isa_model/training/core/config.py +0 -181
  160. isa_model/training/core/dataset.py +0 -222
  161. isa_model/training/core/trainer.py +0 -720
  162. isa_model/training/core/utils.py +0 -213
  163. isa_model/training/examples/intelligent_training_example.py +0 -281
  164. isa_model/training/factory.py +0 -424
  165. isa_model/training/intelligent/__init__.py +0 -25
  166. isa_model/training/intelligent/decision_engine.py +0 -643
  167. isa_model/training/intelligent/intelligent_factory.py +0 -888
  168. isa_model/training/intelligent/knowledge_base.py +0 -751
  169. isa_model/training/intelligent/resource_optimizer.py +0 -839
  170. isa_model/training/intelligent/task_classifier.py +0 -576
  171. isa_model/training/storage/__init__.py +0 -24
  172. isa_model/training/storage/core_integration.py +0 -439
  173. isa_model/training/storage/training_repository.py +0 -552
  174. isa_model/training/storage/training_storage.py +0 -628
  175. isa_model-0.4.0.dist-info/RECORD +0 -182
  176. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_chatTTS_service.py +0 -0
  177. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_fish_service.py +0 -0
  178. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_openvoice_service.py +0 -0
  179. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_service_v2.py +0 -0
  180. /isa_model/deployment/{cloud/modal → modal/services/embedding}/isa_embed_rerank_service.py +0 -0
  181. /isa_model/deployment/{cloud/modal → modal/services/video}/isa_video_hunyuan_service.py +0 -0
  182. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ocr_service.py +0 -0
  183. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_qwen25_service.py +0 -0
  184. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_table_service.py +0 -0
  185. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service.py +0 -0
  186. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service_optimized.py +0 -0
  187. /isa_model/deployment/{services → modal/services/vision}/simple_auto_deploy_vision_service.py +0 -0
  188. {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/WHEEL +0 -0
  189. {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/top_level.txt +0 -0
@@ -1,439 +0,0 @@
1
- """
2
- Training-Core Integration Layer
3
-
4
- This module provides seamless integration between the training module
5
- and the core model management system, ensuring:
6
- - Trained models are automatically registered in Core ModelManager
7
- - Training costs are tracked through Core billing system
8
- - Model lifecycle is managed consistently
9
- - No duplication of model metadata
10
- """
11
-
12
- import logging
13
- from typing import Dict, Optional, Any, List
14
- from datetime import datetime
15
- from pathlib import Path
16
-
17
- try:
18
- from ...core.models.model_manager import ModelManager
19
- from ...core.models.model_repo import ModelType, ModelCapability
20
- from ...core.models.model_billing_tracker import ModelBillingTracker, ModelOperationType
21
- from ...core.models.model_statistics_tracker import ModelStatisticsTracker
22
- CORE_AVAILABLE = True
23
- except ImportError:
24
- CORE_AVAILABLE = False
25
-
26
- from .training_storage import TrainingStorage, TrainingJobRecord
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
-
31
- class CoreModelIntegration:
32
- """
33
- Integration layer between training and core model management.
34
-
35
- This class ensures that:
36
- 1. Trained models are registered in the core ModelManager
37
- 2. Training costs are tracked through the core billing system
38
- 3. Model metadata is kept consistent between training and core
39
- 4. Training metrics are available in the core statistics system
40
-
41
- Example:
42
- ```python
43
- integration = CoreModelIntegration()
44
-
45
- # After training completion
46
- integration.register_trained_model(
47
- job_record=training_job,
48
- model_path="/path/to/trained/model",
49
- performance_metrics={"accuracy": 0.95}
50
- )
51
-
52
- # This will:
53
- # 1. Register model in CoreModelManager
54
- # 2. Record training costs in billing tracker
55
- # 3. Update model statistics
56
- # 4. Link training job to core model record
57
- ```
58
- """
59
-
60
- def __init__(self,
61
- model_manager: Optional[ModelManager] = None,
62
- training_storage: Optional[TrainingStorage] = None):
63
- """
64
- Initialize core integration.
65
-
66
- Args:
67
- model_manager: Core model manager instance
68
- training_storage: Training storage instance
69
- """
70
- self.core_available = CORE_AVAILABLE
71
-
72
- if self.core_available:
73
- self.model_manager = model_manager or ModelManager()
74
- self.billing_tracker = self.model_manager.billing_tracker
75
- self.statistics_tracker = self.model_manager.statistics_tracker
76
- self.model_registry = self.model_manager.registry
77
- else:
78
- logger.warning("Core model management not available")
79
- self.model_manager = None
80
- self.billing_tracker = None
81
- self.statistics_tracker = None
82
- self.model_registry = None
83
-
84
- self.training_storage = training_storage or TrainingStorage()
85
-
86
- logger.info(f"Core integration initialized (Core available: {self.core_available})")
87
-
88
- def register_trained_model(
89
- self,
90
- job_record: TrainingJobRecord,
91
- model_path: str,
92
- performance_metrics: Optional[Dict[str, float]] = None,
93
- model_size_mb: Optional[float] = None
94
- ) -> Optional[str]:
95
- """
96
- Register a trained model in the core system.
97
-
98
- Args:
99
- job_record: Training job record
100
- model_path: Path to the trained model
101
- performance_metrics: Model performance metrics
102
- model_size_mb: Model size in MB
103
-
104
- Returns:
105
- Core model ID if successful, None otherwise
106
- """
107
- if not self.core_available:
108
- logger.warning("Core integration not available, skipping model registration")
109
- return None
110
-
111
- try:
112
- # Determine model type based on task
113
- model_type = self._get_model_type_from_task(job_record.task_type)
114
-
115
- # Determine capabilities
116
- capabilities = self._get_capabilities_from_task(job_record.task_type, job_record.domain)
117
-
118
- # Create model metadata
119
- model_metadata = {
120
- "base_model": job_record.base_model,
121
- "training_job_id": job_record.job_id,
122
- "task_type": job_record.task_type,
123
- "domain": job_record.domain,
124
- "dataset_source": job_record.dataset_source,
125
- "training_config": job_record.training_config,
126
- "performance_metrics": performance_metrics or {},
127
- "trained_at": job_record.completed_at.isoformat() if job_record.completed_at else None,
128
- "training_cost": sum(job_record.cost_breakdown.values()) if job_record.cost_breakdown else None,
129
- "model_size_mb": model_size_mb
130
- }
131
-
132
- # Generate model name
133
- model_name = self._generate_model_name(job_record)
134
-
135
- # Register model in core registry
136
- success = self.model_registry.register_model(
137
- model_id=model_name,
138
- model_type=model_type,
139
- capabilities=capabilities,
140
- metadata=model_metadata,
141
- local_path=model_path
142
- )
143
-
144
- if success:
145
- logger.info(f"Successfully registered trained model: {model_name}")
146
-
147
- # Update training job with core model ID
148
- self.training_storage.update_training_job(
149
- job_record.job_id,
150
- {"core_model_id": model_name}
151
- )
152
-
153
- # Record training costs
154
- self._record_training_costs(job_record, model_name)
155
-
156
- # Update statistics
157
- self._update_model_statistics(job_record, model_name, performance_metrics)
158
-
159
- return model_name
160
- else:
161
- logger.error("Failed to register model in core registry")
162
- return None
163
-
164
- except Exception as e:
165
- logger.error(f"Failed to register trained model: {e}")
166
- return None
167
-
168
- def sync_training_knowledge_to_core(self) -> bool:
169
- """
170
- Sync training knowledge base data to core model registry.
171
-
172
- This helps keep the core system updated with training capabilities
173
- and model information discovered through intelligent training.
174
-
175
- Returns:
176
- True if successful
177
- """
178
- if not self.core_available:
179
- return False
180
-
181
- try:
182
- # Import training knowledge base
183
- from ..intelligent.knowledge_base import KnowledgeBase
184
-
185
- kb = KnowledgeBase()
186
-
187
- # Sync model specifications
188
- synced_count = 0
189
- for model_name, model_spec in kb.models.items():
190
- try:
191
- # Convert training model spec to core format
192
- model_type = self._convert_model_type(model_spec.model_type)
193
- capabilities = self._convert_capabilities(model_spec.supported_tasks)
194
-
195
- metadata = {
196
- "source": "training_knowledge_base",
197
- "parameters": model_spec.parameters,
198
- "context_length": model_spec.context_length,
199
- "supported_tasks": model_spec.supported_tasks,
200
- "supported_domains": model_spec.supported_domains,
201
- "quality_score": model_spec.quality_score,
202
- "efficiency_score": model_spec.efficiency_score,
203
- "is_popular": model_spec.is_popular,
204
- "description": model_spec.description,
205
- "synced_at": datetime.now().isoformat()
206
- }
207
-
208
- # Only register if not already exists
209
- existing = self.model_registry.get_model_by_id(model_name)
210
- if not existing:
211
- success = self.model_registry.register_model(
212
- model_id=model_name,
213
- model_type=model_type,
214
- capabilities=capabilities,
215
- metadata=metadata
216
- )
217
- if success:
218
- synced_count += 1
219
-
220
- except Exception as e:
221
- logger.warning(f"Failed to sync model {model_name}: {e}")
222
- continue
223
-
224
- logger.info(f"Synced {synced_count} models from training knowledge base to core")
225
- return True
226
-
227
- except Exception as e:
228
- logger.error(f"Failed to sync training knowledge to core: {e}")
229
- return False
230
-
231
- def get_core_model_for_training(self, base_model: str) -> Optional[Dict[str, Any]]:
232
- """
233
- Get core model information for a base model used in training.
234
-
235
- Args:
236
- base_model: Base model identifier
237
-
238
- Returns:
239
- Core model information if available
240
- """
241
- if not self.core_available:
242
- return None
243
-
244
- try:
245
- return self.model_registry.get_model_by_id(base_model)
246
- except Exception as e:
247
- logger.error(f"Failed to get core model info for {base_model}: {e}")
248
- return None
249
-
250
- def get_training_history_for_model(self, model_id: str) -> List[TrainingJobRecord]:
251
- """
252
- Get training history for a specific model.
253
-
254
- Args:
255
- model_id: Model identifier
256
-
257
- Returns:
258
- List of training job records
259
- """
260
- try:
261
- # Search for training jobs that produced this model
262
- all_jobs = self.training_storage.list_training_jobs(limit=1000)
263
-
264
- model_training_jobs = []
265
- for job in all_jobs:
266
- # Check if this job produced the model
267
- if (hasattr(job, 'core_model_id') and job.core_model_id == model_id) or \
268
- job.base_model == model_id:
269
- model_training_jobs.append(job)
270
-
271
- return model_training_jobs
272
-
273
- except Exception as e:
274
- logger.error(f"Failed to get training history for model {model_id}: {e}")
275
- return []
276
-
277
- def calculate_model_training_cost(self, model_id: str) -> Optional[float]:
278
- """
279
- Calculate total training cost for a model.
280
-
281
- Args:
282
- model_id: Model identifier
283
-
284
- Returns:
285
- Total training cost in USD
286
- """
287
- try:
288
- training_jobs = self.get_training_history_for_model(model_id)
289
-
290
- total_cost = 0.0
291
- for job in training_jobs:
292
- if job.cost_breakdown:
293
- total_cost += sum(job.cost_breakdown.values())
294
-
295
- return total_cost if total_cost > 0 else None
296
-
297
- except Exception as e:
298
- logger.error(f"Failed to calculate training cost for model {model_id}: {e}")
299
- return None
300
-
301
- def _get_model_type_from_task(self, task_type: str) -> ModelType:
302
- """Convert training task type to core model type."""
303
- task_to_type_map = {
304
- "chat": ModelType.CHAT,
305
- "classification": ModelType.CLASSIFICATION,
306
- "generation": ModelType.GENERATION,
307
- "summarization": ModelType.SUMMARIZATION,
308
- "translation": ModelType.TRANSLATION,
309
- "code": ModelType.CODE_GENERATION,
310
- "image_generation": ModelType.IMAGE_GENERATION
311
- }
312
-
313
- return task_to_type_map.get(task_type, ModelType.CHAT)
314
-
315
- def _get_capabilities_from_task(self, task_type: str, domain: str) -> List[ModelCapability]:
316
- """Determine model capabilities from task and domain."""
317
- capabilities = []
318
-
319
- # Task-based capabilities
320
- if task_type in ["chat", "generation"]:
321
- capabilities.append(ModelCapability.TEXT_GENERATION)
322
- if task_type == "classification":
323
- capabilities.append(ModelCapability.TEXT_CLASSIFICATION)
324
- if task_type == "summarization":
325
- capabilities.append(ModelCapability.SUMMARIZATION)
326
- if task_type == "translation":
327
- capabilities.append(ModelCapability.TRANSLATION)
328
- if task_type == "code":
329
- capabilities.append(ModelCapability.CODE_GENERATION)
330
-
331
- # Domain-based capabilities
332
- if domain == "medical":
333
- capabilities.append(ModelCapability.DOMAIN_SPECIFIC)
334
- if domain in ["legal", "financial", "technical"]:
335
- capabilities.append(ModelCapability.DOMAIN_SPECIFIC)
336
-
337
- return capabilities
338
-
339
- def _generate_model_name(self, job_record: TrainingJobRecord) -> str:
340
- """Generate a unique model name for core registration."""
341
- base_name = job_record.base_model.split("/")[-1] if "/" in job_record.base_model else job_record.base_model
342
- timestamp = job_record.created_at.strftime("%Y%m%d_%H%M%S")
343
- task = job_record.task_type
344
- domain = job_record.domain
345
-
346
- return f"{base_name}_{task}_{domain}_{timestamp}"
347
-
348
- def _record_training_costs(self, job_record: TrainingJobRecord, model_name: str) -> None:
349
- """Record training costs in the core billing system."""
350
- if not self.billing_tracker or not job_record.cost_breakdown:
351
- return
352
-
353
- try:
354
- total_cost = sum(job_record.cost_breakdown.values())
355
-
356
- # Record training operation cost
357
- self.billing_tracker.record_operation(
358
- model_id=model_name,
359
- operation_type=ModelOperationType.TRAINING,
360
- cost=total_cost,
361
- metadata={
362
- "training_job_id": job_record.job_id,
363
- "base_model": job_record.base_model,
364
- "task_type": job_record.task_type,
365
- "cost_breakdown": job_record.cost_breakdown,
366
- "training_duration": str(job_record.completed_at - job_record.started_at) if job_record.completed_at and job_record.started_at else None
367
- }
368
- )
369
-
370
- logger.info(f"Recorded training cost ${total_cost:.2f} for model {model_name}")
371
-
372
- except Exception as e:
373
- logger.error(f"Failed to record training costs: {e}")
374
-
375
- def _update_model_statistics(
376
- self,
377
- job_record: TrainingJobRecord,
378
- model_name: str,
379
- performance_metrics: Optional[Dict[str, float]]
380
- ) -> None:
381
- """Update model statistics in the core system."""
382
- if not self.statistics_tracker:
383
- return
384
-
385
- try:
386
- # Record training completion
387
- self.statistics_tracker.record_usage(
388
- model_id=model_name,
389
- operation_type="training",
390
- metadata={
391
- "training_job_id": job_record.job_id,
392
- "task_type": job_record.task_type,
393
- "domain": job_record.domain,
394
- "performance_metrics": performance_metrics or {}
395
- }
396
- )
397
-
398
- logger.info(f"Updated statistics for model {model_name}")
399
-
400
- except Exception as e:
401
- logger.error(f"Failed to update model statistics: {e}")
402
-
403
- def _convert_model_type(self, training_model_type: str) -> ModelType:
404
- """Convert training model type to core model type."""
405
- type_map = {
406
- "llm": ModelType.CHAT,
407
- "sd": ModelType.IMAGE_GENERATION,
408
- "ml": ModelType.CLASSIFICATION
409
- }
410
-
411
- return type_map.get(training_model_type, ModelType.CHAT)
412
-
413
- def _convert_capabilities(self, supported_tasks: List[str]) -> List[ModelCapability]:
414
- """Convert training supported tasks to core capabilities."""
415
- capabilities = []
416
-
417
- for task in supported_tasks:
418
- if task in ["chat", "generation"]:
419
- capabilities.append(ModelCapability.TEXT_GENERATION)
420
- elif task == "classification":
421
- capabilities.append(ModelCapability.TEXT_CLASSIFICATION)
422
- elif task == "summarization":
423
- capabilities.append(ModelCapability.SUMMARIZATION)
424
- elif task == "translation":
425
- capabilities.append(ModelCapability.TRANSLATION)
426
- elif task == "code":
427
- capabilities.append(ModelCapability.CODE_GENERATION)
428
-
429
- return list(set(capabilities)) # Remove duplicates
430
-
431
- def get_integration_status(self) -> Dict[str, Any]:
432
- """Get status of core integration."""
433
- return {
434
- "core_available": self.core_available,
435
- "model_manager_connected": self.model_manager is not None,
436
- "billing_tracker_available": self.billing_tracker is not None,
437
- "statistics_tracker_available": self.statistics_tracker is not None,
438
- "training_storage_available": self.training_storage is not None
439
- }