isa-model 0.4.0__py3-none-any.whl → 0.4.3__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 (199) 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 +40 -17
  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/storage/hf_storage.py +1 -1
  26. isa_model/core/types.py +1 -0
  27. isa_model/deployment/__init__.py +5 -48
  28. isa_model/deployment/core/__init__.py +2 -31
  29. isa_model/deployment/core/deployment_manager.py +1278 -370
  30. isa_model/deployment/local/__init__.py +31 -0
  31. isa_model/deployment/local/config.py +248 -0
  32. isa_model/deployment/local/gpu_gateway.py +607 -0
  33. isa_model/deployment/local/health_checker.py +428 -0
  34. isa_model/deployment/local/provider.py +586 -0
  35. isa_model/deployment/local/tensorrt_service.py +621 -0
  36. isa_model/deployment/local/transformers_service.py +644 -0
  37. isa_model/deployment/local/vllm_service.py +527 -0
  38. isa_model/deployment/modal/__init__.py +8 -0
  39. isa_model/deployment/modal/config.py +136 -0
  40. isa_model/deployment/{services/auto_hf_modal_deployer.py → modal/deployer.py} +1 -1
  41. isa_model/deployment/modal/services/__init__.py +3 -0
  42. isa_model/deployment/modal/services/audio/__init__.py +1 -0
  43. isa_model/deployment/modal/services/embedding/__init__.py +1 -0
  44. isa_model/deployment/modal/services/llm/__init__.py +1 -0
  45. isa_model/deployment/modal/services/llm/isa_llm_service.py +424 -0
  46. isa_model/deployment/modal/services/video/__init__.py +1 -0
  47. isa_model/deployment/modal/services/vision/__init__.py +1 -0
  48. isa_model/deployment/models/org-org-acme-corp-tenant-a-service-llm-20250825-225822/tenant-a-service_modal_service.py +48 -0
  49. isa_model/deployment/models/org-test-org-123-prefix-test-service-llm-20250825-225822/prefix-test-service_modal_service.py +48 -0
  50. isa_model/deployment/models/test-llm-service-llm-20250825-204442/test-llm-service_modal_service.py +48 -0
  51. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-212906/test-monitoring-gpt2_modal_service.py +48 -0
  52. isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-213009/test-monitoring-gpt2_modal_service.py +48 -0
  53. isa_model/deployment/storage/__init__.py +5 -0
  54. isa_model/deployment/storage/deployment_repository.py +824 -0
  55. isa_model/deployment/triton/__init__.py +10 -0
  56. isa_model/deployment/triton/config.py +196 -0
  57. isa_model/deployment/triton/configs/__init__.py +1 -0
  58. isa_model/deployment/triton/provider.py +512 -0
  59. isa_model/deployment/triton/scripts/__init__.py +1 -0
  60. isa_model/deployment/triton/templates/__init__.py +1 -0
  61. isa_model/inference/__init__.py +47 -1
  62. isa_model/inference/ai_factory.py +137 -10
  63. isa_model/inference/legacy_services/__init__.py +21 -0
  64. isa_model/inference/legacy_services/model_evaluation.py +637 -0
  65. isa_model/inference/legacy_services/model_service.py +573 -0
  66. isa_model/inference/legacy_services/model_serving.py +717 -0
  67. isa_model/inference/legacy_services/model_training.py +561 -0
  68. isa_model/inference/models/__init__.py +21 -0
  69. isa_model/inference/models/inference_config.py +551 -0
  70. isa_model/inference/models/inference_record.py +675 -0
  71. isa_model/inference/models/performance_models.py +714 -0
  72. isa_model/inference/repositories/__init__.py +9 -0
  73. isa_model/inference/repositories/inference_repository.py +828 -0
  74. isa_model/inference/services/audio/base_stt_service.py +184 -11
  75. isa_model/inference/services/audio/openai_stt_service.py +22 -6
  76. isa_model/inference/services/custom_model_manager.py +277 -0
  77. isa_model/inference/services/embedding/ollama_embed_service.py +15 -3
  78. isa_model/inference/services/embedding/resilient_embed_service.py +285 -0
  79. isa_model/inference/services/llm/__init__.py +10 -2
  80. isa_model/inference/services/llm/base_llm_service.py +335 -24
  81. isa_model/inference/services/llm/cerebras_llm_service.py +628 -0
  82. isa_model/inference/services/llm/helpers/llm_adapter.py +9 -4
  83. isa_model/inference/services/llm/helpers/llm_prompts.py +342 -0
  84. isa_model/inference/services/llm/helpers/llm_utils.py +321 -23
  85. isa_model/inference/services/llm/huggingface_llm_service.py +581 -0
  86. isa_model/inference/services/llm/local_llm_service.py +747 -0
  87. isa_model/inference/services/llm/ollama_llm_service.py +9 -2
  88. isa_model/inference/services/llm/openai_llm_service.py +33 -16
  89. isa_model/inference/services/llm/yyds_llm_service.py +8 -2
  90. isa_model/inference/services/vision/__init__.py +22 -1
  91. isa_model/inference/services/vision/blip_vision_service.py +359 -0
  92. isa_model/inference/services/vision/helpers/image_utils.py +8 -5
  93. isa_model/inference/services/vision/isa_vision_service.py +65 -4
  94. isa_model/inference/services/vision/openai_vision_service.py +19 -10
  95. isa_model/inference/services/vision/vgg16_vision_service.py +257 -0
  96. isa_model/serving/api/cache_manager.py +245 -0
  97. isa_model/serving/api/dependencies/__init__.py +1 -0
  98. isa_model/serving/api/dependencies/auth.py +194 -0
  99. isa_model/serving/api/dependencies/database.py +139 -0
  100. isa_model/serving/api/error_handlers.py +284 -0
  101. isa_model/serving/api/fastapi_server.py +172 -22
  102. isa_model/serving/api/middleware/auth.py +8 -2
  103. isa_model/serving/api/middleware/security.py +23 -33
  104. isa_model/serving/api/middleware/tenant_context.py +414 -0
  105. isa_model/serving/api/routes/analytics.py +4 -1
  106. isa_model/serving/api/routes/config.py +645 -0
  107. isa_model/serving/api/routes/deployment_billing.py +315 -0
  108. isa_model/serving/api/routes/deployments.py +138 -2
  109. isa_model/serving/api/routes/gpu_gateway.py +440 -0
  110. isa_model/serving/api/routes/health.py +32 -12
  111. isa_model/serving/api/routes/inference_monitoring.py +486 -0
  112. isa_model/serving/api/routes/local_deployments.py +448 -0
  113. isa_model/serving/api/routes/tenants.py +575 -0
  114. isa_model/serving/api/routes/unified.py +680 -18
  115. isa_model/serving/api/routes/webhooks.py +479 -0
  116. isa_model/serving/api/startup.py +68 -54
  117. isa_model/utils/gpu_utils.py +311 -0
  118. {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/METADATA +66 -24
  119. isa_model-0.4.3.dist-info/RECORD +193 -0
  120. isa_model/core/storage/minio_storage.py +0 -0
  121. isa_model/deployment/cloud/__init__.py +0 -9
  122. isa_model/deployment/cloud/modal/__init__.py +0 -10
  123. isa_model/deployment/core/deployment_config.py +0 -356
  124. isa_model/deployment/core/isa_deployment_service.py +0 -401
  125. isa_model/deployment/gpu_int8_ds8/app/server.py +0 -66
  126. isa_model/deployment/gpu_int8_ds8/scripts/test_client.py +0 -43
  127. isa_model/deployment/gpu_int8_ds8/scripts/test_client_os.py +0 -35
  128. isa_model/deployment/runtime/deployed_service.py +0 -338
  129. isa_model/deployment/services/__init__.py +0 -9
  130. isa_model/deployment/services/auto_deploy_vision_service.py +0 -538
  131. isa_model/deployment/services/model_service.py +0 -332
  132. isa_model/deployment/services/service_monitor.py +0 -356
  133. isa_model/deployment/services/service_registry.py +0 -527
  134. isa_model/eval/__init__.py +0 -92
  135. isa_model/eval/benchmarks/__init__.py +0 -27
  136. isa_model/eval/benchmarks/multimodal_datasets.py +0 -460
  137. isa_model/eval/benchmarks.py +0 -701
  138. isa_model/eval/config/__init__.py +0 -10
  139. isa_model/eval/config/evaluation_config.py +0 -108
  140. isa_model/eval/evaluators/__init__.py +0 -24
  141. isa_model/eval/evaluators/audio_evaluator.py +0 -727
  142. isa_model/eval/evaluators/base_evaluator.py +0 -503
  143. isa_model/eval/evaluators/embedding_evaluator.py +0 -742
  144. isa_model/eval/evaluators/llm_evaluator.py +0 -472
  145. isa_model/eval/evaluators/vision_evaluator.py +0 -564
  146. isa_model/eval/example_evaluation.py +0 -395
  147. isa_model/eval/factory.py +0 -798
  148. isa_model/eval/infrastructure/__init__.py +0 -24
  149. isa_model/eval/infrastructure/experiment_tracker.py +0 -466
  150. isa_model/eval/isa_benchmarks.py +0 -700
  151. isa_model/eval/isa_integration.py +0 -582
  152. isa_model/eval/metrics.py +0 -951
  153. isa_model/eval/tests/unit/test_basic.py +0 -396
  154. isa_model/serving/api/routes/evaluations.py +0 -579
  155. isa_model/training/__init__.py +0 -168
  156. isa_model/training/annotation/annotation_schema.py +0 -47
  157. isa_model/training/annotation/processors/annotation_processor.py +0 -126
  158. isa_model/training/annotation/storage/dataset_manager.py +0 -131
  159. isa_model/training/annotation/storage/dataset_schema.py +0 -44
  160. isa_model/training/annotation/tests/test_annotation_flow.py +0 -109
  161. isa_model/training/annotation/tests/test_minio copy.py +0 -113
  162. isa_model/training/annotation/tests/test_minio_upload.py +0 -43
  163. isa_model/training/annotation/views/annotation_controller.py +0 -158
  164. isa_model/training/cloud/__init__.py +0 -22
  165. isa_model/training/cloud/job_orchestrator.py +0 -402
  166. isa_model/training/cloud/runpod_trainer.py +0 -454
  167. isa_model/training/cloud/storage_manager.py +0 -482
  168. isa_model/training/core/__init__.py +0 -26
  169. isa_model/training/core/config.py +0 -181
  170. isa_model/training/core/dataset.py +0 -222
  171. isa_model/training/core/trainer.py +0 -720
  172. isa_model/training/core/utils.py +0 -213
  173. isa_model/training/examples/intelligent_training_example.py +0 -281
  174. isa_model/training/factory.py +0 -424
  175. isa_model/training/intelligent/__init__.py +0 -25
  176. isa_model/training/intelligent/decision_engine.py +0 -643
  177. isa_model/training/intelligent/intelligent_factory.py +0 -888
  178. isa_model/training/intelligent/knowledge_base.py +0 -751
  179. isa_model/training/intelligent/resource_optimizer.py +0 -839
  180. isa_model/training/intelligent/task_classifier.py +0 -576
  181. isa_model/training/storage/__init__.py +0 -24
  182. isa_model/training/storage/core_integration.py +0 -439
  183. isa_model/training/storage/training_repository.py +0 -552
  184. isa_model/training/storage/training_storage.py +0 -628
  185. isa_model-0.4.0.dist-info/RECORD +0 -182
  186. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_chatTTS_service.py +0 -0
  187. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_fish_service.py +0 -0
  188. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_openvoice_service.py +0 -0
  189. /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_service_v2.py +0 -0
  190. /isa_model/deployment/{cloud/modal → modal/services/embedding}/isa_embed_rerank_service.py +0 -0
  191. /isa_model/deployment/{cloud/modal → modal/services/video}/isa_video_hunyuan_service.py +0 -0
  192. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ocr_service.py +0 -0
  193. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_qwen25_service.py +0 -0
  194. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_table_service.py +0 -0
  195. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service.py +0 -0
  196. /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service_optimized.py +0 -0
  197. /isa_model/deployment/{services → modal/services/vision}/simple_auto_deploy_vision_service.py +0 -0
  198. {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/WHEEL +0 -0
  199. {isa_model-0.4.0.dist-info → isa_model-0.4.3.dist-info}/top_level.txt +0 -0
@@ -1,168 +0,0 @@
1
- """
2
- ISA Model Training Module
3
-
4
- Provides unified training capabilities for AI models including:
5
- - Local training with SFT (Supervised Fine-Tuning)
6
- - Cloud training on RunPod
7
- - Model evaluation and management
8
- - HuggingFace integration
9
- - 🧠 Intelligent training with AI-powered optimization
10
-
11
- Example usage:
12
- ```python
13
- from isa_model.training import TrainingFactory, train_gemma
14
-
15
- # Quick Gemma training
16
- model_path = train_gemma(
17
- dataset_path="tatsu-lab/alpaca",
18
- model_size="4b",
19
- num_epochs=3
20
- )
21
-
22
- # Advanced training with custom configuration
23
- factory = TrainingFactory()
24
- model_path = factory.train_model(
25
- model_name="google/gemma-2-4b-it",
26
- dataset_path="your-dataset.json",
27
- use_lora=True,
28
- batch_size=4,
29
- num_epochs=3
30
- )
31
-
32
- # 🧠 Intelligent training with natural language
33
- from isa_model.training import IntelligentTrainingFactory
34
-
35
- intelligent_factory = IntelligentTrainingFactory()
36
- recommendation = intelligent_factory.analyze_training_request(
37
- "Train a customer service chatbot for medical domain",
38
- dataset_path="medical_dialogues.json",
39
- quality_target="high",
40
- budget_limit=200.0
41
- )
42
- model_path = intelligent_factory.train_with_recommendation(recommendation)
43
- ```
44
- """
45
-
46
- # Import the new clean factory
47
- from .factory import TrainingFactory, train_gemma
48
-
49
- # Import core components
50
- from .core import (
51
- TrainingConfig,
52
- LoRAConfig,
53
- DatasetConfig,
54
- BaseTrainer,
55
- SFTTrainer,
56
- TrainingUtils,
57
- DatasetManager,
58
- RunPodConfig,
59
- StorageConfig,
60
- JobConfig
61
- )
62
-
63
- # Import cloud training components
64
- from .cloud import (
65
- TrainingJobOrchestrator
66
- )
67
-
68
- # Import intelligent training components (optional)
69
- try:
70
- from .intelligent import (
71
- IntelligentTrainingFactory,
72
- IntelligentDecisionEngine,
73
- TaskClassifier,
74
- KnowledgeBase,
75
- ResourceOptimizer,
76
- TrainingRequest,
77
- TrainingRecommendation
78
- )
79
- INTELLIGENT_AVAILABLE = True
80
- except ImportError as e:
81
- INTELLIGENT_AVAILABLE = False
82
- # Create placeholder classes for graceful degradation
83
- class IntelligentTrainingFactory:
84
- def __init__(self, *args, **kwargs):
85
- raise ImportError("Intelligent training features not available. Please install required dependencies.")
86
-
87
- class IntelligentDecisionEngine:
88
- def __init__(self, *args, **kwargs):
89
- raise ImportError("Intelligent training features not available.")
90
-
91
- class TaskClassifier:
92
- def __init__(self, *args, **kwargs):
93
- raise ImportError("Intelligent training features not available.")
94
-
95
- class KnowledgeBase:
96
- def __init__(self, *args, **kwargs):
97
- raise ImportError("Intelligent training features not available.")
98
-
99
- class ResourceOptimizer:
100
- def __init__(self, *args, **kwargs):
101
- raise ImportError("Intelligent training features not available.")
102
-
103
- class TrainingRequest:
104
- def __init__(self, *args, **kwargs):
105
- raise ImportError("Intelligent training features not available.")
106
-
107
- class TrainingRecommendation:
108
- def __init__(self, *args, **kwargs):
109
- raise ImportError("Intelligent training features not available.")
110
-
111
- __all__ = [
112
- # Main factory
113
- 'TrainingFactory',
114
- 'train_gemma',
115
-
116
- # Core components
117
- 'TrainingConfig',
118
- 'LoRAConfig',
119
- 'DatasetConfig',
120
- 'BaseTrainer',
121
- 'SFTTrainer',
122
- 'TrainingUtils',
123
- 'DatasetManager',
124
-
125
- # Cloud components
126
- 'RunPodConfig',
127
- 'StorageConfig',
128
- 'JobConfig',
129
- 'TrainingJobOrchestrator',
130
-
131
- # Intelligent training components
132
- 'IntelligentTrainingFactory',
133
- 'IntelligentDecisionEngine',
134
- 'TaskClassifier',
135
- 'KnowledgeBase',
136
- 'ResourceOptimizer',
137
- 'TrainingRequest',
138
- 'TrainingRecommendation',
139
- 'INTELLIGENT_AVAILABLE',
140
-
141
- # Training storage components (optional)
142
- 'TrainingStorage',
143
- 'TrainingRepository',
144
- 'CoreModelIntegration'
145
- ]
146
-
147
- # Import training storage components (optional)
148
- try:
149
- from .storage import (
150
- TrainingStorage,
151
- TrainingRepository,
152
- CoreModelIntegration
153
- )
154
- STORAGE_AVAILABLE = True
155
- except ImportError:
156
- STORAGE_AVAILABLE = False
157
- # Create placeholder classes for graceful degradation
158
- class TrainingStorage:
159
- def __init__(self, *args, **kwargs):
160
- raise ImportError("Training storage features not available.")
161
-
162
- class TrainingRepository:
163
- def __init__(self, *args, **kwargs):
164
- raise ImportError("Training repository features not available.")
165
-
166
- class CoreModelIntegration:
167
- def __init__(self, *args, **kwargs):
168
- raise ImportError("Core model integration features not available.")
@@ -1,47 +0,0 @@
1
- # app/services/llm_model/tracing/annotation/annotation_schema.py
2
- from enum import Enum
3
- from pydantic import BaseModel, Field
4
- from typing import Dict, Any, List, Optional
5
- from datetime import datetime
6
-
7
- class AnnotationType(str, Enum):
8
- ACCURACY = "accuracy"
9
- HELPFULNESS = "helpfulness"
10
- TOXICITY = "toxicity"
11
- CUSTOM = "custom"
12
-
13
- class RatingScale(int, Enum):
14
- POOR = 1
15
- FAIR = 2
16
- GOOD = 3
17
- EXCELLENT = 4
18
-
19
- class AnnotationAspects(BaseModel):
20
- factually_correct: bool = True
21
- relevant: bool = True
22
- harmful: bool = False
23
- biased: bool = False
24
- complete: bool = True
25
- efficient: bool = True
26
-
27
- class BetterResponse(BaseModel):
28
- content: str
29
- reason: Optional[str]
30
- metadata: Optional[Dict[str, Any]] = {}
31
-
32
- class AnnotationFeedback(BaseModel):
33
- rating: RatingScale
34
- category: AnnotationType
35
- aspects: AnnotationAspects
36
- better_response: Optional[BetterResponse]
37
- comment: Optional[str]
38
- metadata: Optional[Dict[str, Any]] = {}
39
- is_selected_for_training: bool = False
40
-
41
- class ItemAnnotation(BaseModel):
42
- item_id: str
43
- feedback: Optional[AnnotationFeedback]
44
- status: str = "pending"
45
- annotated_at: Optional[datetime]
46
- annotator_id: Optional[str]
47
- training_status: Optional[str] = None
@@ -1,126 +0,0 @@
1
- from typing import Dict, Any, List
2
- from datetime import datetime
3
- from app.config.config_manager import config_manager
4
- from app.services.training.llm_model.annotation.annotation_schema import AnnotationFeedback, RatingScale, AnnotationAspects
5
- from bson.objectid import ObjectId
6
- from app.services.training.llm_model.annotation.storage.dataset_manager import DatasetManager
7
-
8
- class AnnotationProcessor:
9
- def __init__(self):
10
- self.logger = config_manager.get_logger(__name__)
11
- self.dataset_manager = DatasetManager()
12
- self.batch_size = 1000 # Configure as needed
13
-
14
- async def process_queue(self) -> None:
15
- """Process pending items and create datasets"""
16
- db = await config_manager.get_db('mongodb')
17
- queue = db['training_queue']
18
-
19
- # Process SFT items
20
- sft_items = await self._get_pending_items("sft")
21
- if len(sft_items) >= self.batch_size:
22
- await self._create_sft_dataset(sft_items)
23
-
24
- # Process RLHF items
25
- rlhf_items = await self._get_pending_items("rlhf")
26
- if len(rlhf_items) >= self.batch_size:
27
- await self._create_rlhf_dataset(rlhf_items)
28
-
29
- async def _create_sft_dataset(self, items: List[Dict[str, Any]]):
30
- """Create and upload SFT dataset"""
31
- dataset = await self.dataset_manager.create_dataset(
32
- name=f"sft_dataset_v{datetime.now().strftime('%Y%m%d')}",
33
- type="sft",
34
- version=datetime.now().strftime("%Y%m%d"),
35
- source_annotations=[item["annotation_id"] for item in items]
36
- )
37
-
38
- formatted_data = [
39
- await self._process_sft_item(item)
40
- for item in items
41
- ]
42
-
43
- await self.dataset_manager.upload_dataset_file(
44
- dataset.id,
45
- formatted_data
46
- )
47
-
48
- async def _process_sft_item(self, item: Dict[str, Any]) -> Dict[str, Any]:
49
- """Process item for SFT dataset generation
50
- Format follows HF conversation format for SFT training
51
- """
52
- db = await config_manager.get_db('mongodb')
53
- annotations = db['annotations']
54
-
55
- # Get full annotation context
56
- annotation = await annotations.find_one({"_id": ObjectId(item["annotation_id"])})
57
- target_item = next(i for i in annotation["items"] if i["item_id"] == item["item_id"])
58
-
59
- # Format as conversation
60
- messages = [
61
- {
62
- "role": "system",
63
- "content": "You are a helpful AI assistant that provides accurate and relevant information."
64
- },
65
- {
66
- "role": "user",
67
- "content": target_item["input"]["messages"][0]["content"]
68
- },
69
- {
70
- "role": "assistant",
71
- "content": target_item["output"]["content"]
72
- }
73
- ]
74
-
75
- return {
76
- "messages": messages,
77
- "metadata": {
78
- "rating": item["feedback"]["rating"],
79
- "aspects": item["feedback"]["aspects"],
80
- "category": item["feedback"]["category"]
81
- }
82
- }
83
-
84
- async def _process_rlhf_item(self, item: Dict[str, Any]) -> Dict[str, Any]:
85
- """Process item for RLHF dataset generation
86
- Format follows preference pairs structure for RLHF training
87
- """
88
- db = await config_manager.get_db('mongodb')
89
- annotations = db['annotations']
90
-
91
- # Get full annotation context
92
- annotation = await annotations.find_one({"_id": ObjectId(item["annotation_id"])})
93
- target_item = next(i for i in annotation["items"] if i["item_id"] == item["item_id"])
94
-
95
- # Format as preference pairs
96
- return {
97
- "prompt": target_item["input"]["messages"][0]["content"],
98
- "chosen": item["feedback"]["better_response"]["content"],
99
- "rejected": target_item["output"]["content"],
100
- "metadata": {
101
- "reason": item["feedback"]["better_response"]["reason"],
102
- "category": item["feedback"]["category"]
103
- }
104
- }
105
-
106
- async def get_training_data(
107
- self,
108
- data_type: str,
109
- limit: int = 1000
110
- ) -> List[Dict[str, Any]]:
111
- """Retrieve formatted training data"""
112
- db = await config_manager.get_db('mongodb')
113
- training_data = db['training_data']
114
-
115
- data = await training_data.find(
116
- {"type": data_type}
117
- ).limit(limit).to_list(length=limit)
118
-
119
- if data_type == "sft":
120
- return [item["data"]["messages"] for item in data]
121
- else: # rlhf
122
- return [{
123
- "prompt": item["data"]["prompt"],
124
- "chosen": item["data"]["chosen"],
125
- "rejected": item["data"]["rejected"]
126
- } for item in data]
@@ -1,131 +0,0 @@
1
- # app/services/llm_model/annotation/dataset/dataset_manager.py
2
- from typing import Dict, Any, List
3
- from datetime import datetime
4
- import json
5
- import io
6
- from app.config.config_manager import config_manager
7
- from .dataset_schema import Dataset, DatasetType, DatasetStatus, DatasetFiles, DatasetStats
8
- from bson import ObjectId
9
-
10
- class DatasetManager:
11
- def __init__(self):
12
- self.logger = config_manager.get_logger(__name__)
13
- self.minio_client = None
14
- self.bucket_name = "training-datasets"
15
-
16
- async def _ensure_minio_client(self):
17
- if not self.minio_client:
18
- self.minio_client = await config_manager.get_storage_client()
19
-
20
- async def create_dataset(
21
- self,
22
- name: str,
23
- type: DatasetType,
24
- version: str,
25
- source_annotations: List[str]
26
- ) -> Dataset:
27
- """Create a new dataset record"""
28
- db = await config_manager.get_db('mongodb')
29
- collection = db['training_datasets']
30
-
31
- dataset = Dataset(
32
- name=name,
33
- type=type,
34
- version=version,
35
- storage_path=f"datasets/{type.value}/{version}",
36
- files=DatasetFiles(
37
- train="train.jsonl",
38
- eval=None,
39
- test=None
40
- ),
41
- stats=DatasetStats(
42
- total_examples=0,
43
- avg_length=0.0,
44
- num_conversations=0,
45
- additional_metrics={}
46
- ),
47
- source_annotations=source_annotations,
48
- created_at=datetime.utcnow(),
49
- status=DatasetStatus.PENDING,
50
- metadata={}
51
- )
52
-
53
- result = await collection.insert_one(dataset.dict(exclude={'id'}))
54
- return Dataset(**{**dataset.dict(), '_id': result.inserted_id})
55
-
56
- async def upload_dataset_file(
57
- self,
58
- dataset_id: str,
59
- data: List[Dict[str, Any]],
60
- file_type: str = "train"
61
- ) -> bool:
62
- """Upload dataset to MinIO"""
63
- try:
64
- await self._ensure_minio_client()
65
- db = await config_manager.get_db('mongodb')
66
-
67
- object_id = ObjectId(dataset_id)
68
- dataset = await db['training_datasets'].find_one({"_id": object_id})
69
-
70
- if not dataset:
71
- self.logger.error(f"Dataset not found with id: {dataset_id}")
72
- return False
73
-
74
- # Convert to JSONL
75
- buffer = io.StringIO()
76
- for item in data:
77
- buffer.write(json.dumps(item) + "\n")
78
-
79
- storage_path = dataset['storage_path'].rstrip('/')
80
- file_path = f"{storage_path}/{file_type}.jsonl"
81
-
82
- buffer_value = buffer.getvalue().encode()
83
-
84
- self.logger.debug(f"Uploading to MinIO path: {file_path}")
85
-
86
- self.minio_client.put_object(
87
- self.bucket_name,
88
- file_path,
89
- io.BytesIO(buffer_value),
90
- len(buffer_value)
91
- )
92
-
93
- avg_length = sum(len(str(item)) for item in data) / len(data) if data else 0
94
-
95
- await db['training_datasets'].update_one(
96
- {"_id": object_id},
97
- {
98
- "$set": {
99
- f"files.{file_type}": f"{file_type}.jsonl",
100
- "stats.total_examples": len(data),
101
- "stats.avg_length": avg_length,
102
- "stats.num_conversations": len(data),
103
- "status": DatasetStatus.READY
104
- }
105
- }
106
- )
107
-
108
- return True
109
-
110
- except Exception as e:
111
- self.logger.error(f"Failed to upload dataset: {e}")
112
- return False
113
-
114
- async def get_dataset_info(self, dataset_id: str) -> Dict[str, Any]:
115
- """Get dataset information"""
116
- try:
117
- db = await config_manager.get_db('mongodb')
118
- object_id = ObjectId(dataset_id) # Convert string ID to ObjectId
119
- dataset = await db['training_datasets'].find_one({"_id": object_id})
120
-
121
- if not dataset:
122
- self.logger.error(f"Dataset not found with id: {dataset_id}")
123
- return None
124
-
125
- # Convert ObjectId to string for JSON serialization
126
- dataset['_id'] = str(dataset['_id'])
127
- return dataset
128
-
129
- except Exception as e:
130
- self.logger.error(f"Failed to get dataset info: {e}")
131
- return None
@@ -1,44 +0,0 @@
1
- # app/services/llm_model/annotation/dataset/dataset_schema.py
2
- from enum import Enum
3
- from pydantic import BaseModel, Field
4
- from typing import Dict, List, Optional
5
- from datetime import datetime
6
- from bson import ObjectId
7
-
8
- class DatasetType(str, Enum):
9
- SFT = "sft"
10
- RLHF = "rlhf"
11
-
12
- class DatasetStatus(str, Enum):
13
- PENDING = "pending"
14
- PROCESSING = "processing"
15
- READY = "ready"
16
- ERROR = "error"
17
-
18
- class DatasetFiles(BaseModel):
19
- train: str
20
- eval: Optional[str]
21
- test: Optional[str]
22
-
23
- class DatasetStats(BaseModel):
24
- total_examples: int
25
- avg_length: Optional[float]
26
- num_conversations: Optional[int]
27
- additional_metrics: Optional[Dict] = {}
28
-
29
- class Dataset(BaseModel):
30
- id: Optional[ObjectId] = Field(None, alias="_id")
31
- name: str
32
- type: DatasetType
33
- version: str
34
- storage_path: str
35
- files: DatasetFiles
36
- stats: DatasetStats
37
- source_annotations: List[str]
38
- created_at: datetime
39
- status: DatasetStatus
40
- metadata: Optional[Dict] = {}
41
-
42
- class Config:
43
- arbitrary_types_allowed = True
44
- populate_by_name = True
@@ -1,109 +0,0 @@
1
- # test_annotation_flow.py
2
- import os
3
- os.environ["ENV"] = "local"
4
-
5
- import asyncio
6
- from datetime import datetime
7
- from bson import ObjectId
8
- from app.services.llm_model.annotation.views.annotation_controller import AnnotationController
9
- from app.services.llm_model.annotation.processors.annotation_processor import AnnotationProcessor
10
- from app.services.llm_model.annotation.annotation_schema import (
11
- AnnotationFeedback,
12
- RatingScale,
13
- AnnotationType,
14
- AnnotationAspects,
15
- BetterResponse
16
- )
17
- from app.config.config_manager import config_manager
18
-
19
- async def setup_test_data():
20
- """Setup initial test data in MongoDB"""
21
- db = await config_manager.get_db('mongodb')
22
-
23
- # Create a test annotation
24
- test_annotation = {
25
- "_id": ObjectId(),
26
- "project_name": "test_project",
27
- "items": [{
28
- "item_id": "test_item_1",
29
- "input": {
30
- "messages": [{
31
- "role": "user",
32
- "content": "What is the capital of France?"
33
- }]
34
- },
35
- "output": {
36
- "content": "The capital of France is Paris."
37
- },
38
- "status": "pending"
39
- }],
40
- "created_at": datetime.utcnow().isoformat()
41
- }
42
-
43
- await db['annotations'].insert_one(test_annotation)
44
- return test_annotation
45
-
46
- async def test_annotation_flow():
47
- """Test the complete annotation flow"""
48
- try:
49
- # Initialize controllers
50
- annotation_controller = AnnotationController()
51
- annotation_processor = AnnotationProcessor()
52
-
53
- # Setup test data
54
- test_data = await setup_test_data()
55
- annotation_id = str(test_data["_id"])
56
- item_id = test_data["items"][0]["item_id"]
57
-
58
- print("1. Created test annotation")
59
-
60
- # Create test feedback
61
- feedback = AnnotationFeedback(
62
- rating=RatingScale.EXCELLENT,
63
- category=AnnotationType.ACCURACY,
64
- aspects=AnnotationAspects(
65
- factually_correct=True,
66
- relevant=True,
67
- harmful=False,
68
- biased=False,
69
- complete=True,
70
- efficient=True
71
- ),
72
- better_response=BetterResponse(
73
- content="Paris is the capital city of France, known for its iconic Eiffel Tower.",
74
- reason="Added more context and detail"
75
- ),
76
- comment="Good response, but could be more detailed"
77
- )
78
-
79
- # Submit annotation
80
- result = await annotation_controller.submit_annotation(
81
- annotation_id=annotation_id,
82
- item_id=item_id,
83
- feedback=feedback,
84
- annotator_id="test_annotator"
85
- )
86
-
87
- print("2. Submitted annotation:", result)
88
-
89
- # Process annotation queue
90
- await annotation_processor.process_queue()
91
- print("3. Processed annotation queue")
92
-
93
- # Verify dataset creation
94
- db = await config_manager.get_db('mongodb')
95
- datasets = await db['training_datasets'].find().to_list(length=10)
96
-
97
- print("\nCreated Datasets:")
98
- for dataset in datasets:
99
- print(f"- {dataset['name']} ({dataset['type']})")
100
- print(f" Status: {dataset['status']}")
101
- print(f" Examples: {dataset['stats']['total_examples']}")
102
-
103
- except Exception as e:
104
- print(f"Error during test: {e}")
105
-
106
- if __name__ == "__main__":
107
- # Run the test
108
- print("Starting annotation flow test...")
109
- asyncio.run(test_annotation_flow())