isa-model 0.3.9__py3-none-any.whl → 0.4.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.
Files changed (124) hide show
  1. isa_model/__init__.py +1 -1
  2. isa_model/client.py +732 -565
  3. isa_model/core/cache/redis_cache.py +401 -0
  4. isa_model/core/config/config_manager.py +53 -10
  5. isa_model/core/config.py +1 -1
  6. isa_model/core/database/__init__.py +1 -0
  7. isa_model/core/database/migrations.py +277 -0
  8. isa_model/core/database/supabase_client.py +123 -0
  9. isa_model/core/models/__init__.py +37 -0
  10. isa_model/core/models/model_billing_tracker.py +60 -88
  11. isa_model/core/models/model_manager.py +36 -18
  12. isa_model/core/models/model_repo.py +44 -38
  13. isa_model/core/models/model_statistics_tracker.py +234 -0
  14. isa_model/core/models/model_storage.py +0 -1
  15. isa_model/core/models/model_version_manager.py +959 -0
  16. isa_model/core/pricing_manager.py +2 -249
  17. isa_model/core/resilience/circuit_breaker.py +366 -0
  18. isa_model/core/security/secrets.py +358 -0
  19. isa_model/core/services/__init__.py +2 -4
  20. isa_model/core/services/intelligent_model_selector.py +101 -370
  21. isa_model/core/storage/hf_storage.py +1 -1
  22. isa_model/core/types.py +7 -0
  23. isa_model/deployment/cloud/modal/isa_audio_chatTTS_service.py +520 -0
  24. isa_model/deployment/cloud/modal/isa_audio_fish_service.py +0 -0
  25. isa_model/deployment/cloud/modal/isa_audio_openvoice_service.py +758 -0
  26. isa_model/deployment/cloud/modal/isa_audio_service_v2.py +1044 -0
  27. isa_model/deployment/cloud/modal/isa_embed_rerank_service.py +296 -0
  28. isa_model/deployment/cloud/modal/isa_video_hunyuan_service.py +423 -0
  29. isa_model/deployment/cloud/modal/isa_vision_ocr_service.py +519 -0
  30. isa_model/deployment/cloud/modal/isa_vision_qwen25_service.py +709 -0
  31. isa_model/deployment/cloud/modal/isa_vision_table_service.py +467 -323
  32. isa_model/deployment/cloud/modal/isa_vision_ui_service.py +607 -180
  33. isa_model/deployment/cloud/modal/isa_vision_ui_service_optimized.py +660 -0
  34. isa_model/deployment/core/deployment_manager.py +6 -4
  35. isa_model/deployment/services/auto_hf_modal_deployer.py +894 -0
  36. isa_model/eval/benchmarks/__init__.py +27 -0
  37. isa_model/eval/benchmarks/multimodal_datasets.py +460 -0
  38. isa_model/eval/benchmarks.py +244 -12
  39. isa_model/eval/evaluators/__init__.py +8 -2
  40. isa_model/eval/evaluators/audio_evaluator.py +727 -0
  41. isa_model/eval/evaluators/embedding_evaluator.py +742 -0
  42. isa_model/eval/evaluators/vision_evaluator.py +564 -0
  43. isa_model/eval/example_evaluation.py +395 -0
  44. isa_model/eval/factory.py +272 -5
  45. isa_model/eval/isa_benchmarks.py +700 -0
  46. isa_model/eval/isa_integration.py +582 -0
  47. isa_model/eval/metrics.py +159 -6
  48. isa_model/eval/tests/unit/test_basic.py +396 -0
  49. isa_model/inference/ai_factory.py +44 -8
  50. isa_model/inference/services/audio/__init__.py +21 -0
  51. isa_model/inference/services/audio/base_realtime_service.py +225 -0
  52. isa_model/inference/services/audio/isa_tts_service.py +0 -0
  53. isa_model/inference/services/audio/openai_realtime_service.py +320 -124
  54. isa_model/inference/services/audio/openai_stt_service.py +32 -6
  55. isa_model/inference/services/base_service.py +17 -1
  56. isa_model/inference/services/embedding/__init__.py +13 -0
  57. isa_model/inference/services/embedding/base_embed_service.py +111 -8
  58. isa_model/inference/services/embedding/isa_embed_service.py +305 -0
  59. isa_model/inference/services/embedding/openai_embed_service.py +2 -4
  60. isa_model/inference/services/embedding/tests/test_embedding.py +222 -0
  61. isa_model/inference/services/img/__init__.py +2 -2
  62. isa_model/inference/services/img/base_image_gen_service.py +24 -7
  63. isa_model/inference/services/img/replicate_image_gen_service.py +84 -422
  64. isa_model/inference/services/img/services/replicate_face_swap.py +193 -0
  65. isa_model/inference/services/img/services/replicate_flux.py +226 -0
  66. isa_model/inference/services/img/services/replicate_flux_kontext.py +219 -0
  67. isa_model/inference/services/img/services/replicate_sticker_maker.py +249 -0
  68. isa_model/inference/services/img/tests/test_img_client.py +297 -0
  69. isa_model/inference/services/llm/base_llm_service.py +30 -6
  70. isa_model/inference/services/llm/helpers/llm_adapter.py +63 -9
  71. isa_model/inference/services/llm/ollama_llm_service.py +2 -1
  72. isa_model/inference/services/llm/openai_llm_service.py +652 -55
  73. isa_model/inference/services/llm/yyds_llm_service.py +2 -1
  74. isa_model/inference/services/vision/__init__.py +5 -5
  75. isa_model/inference/services/vision/base_vision_service.py +118 -185
  76. isa_model/inference/services/vision/helpers/image_utils.py +11 -5
  77. isa_model/inference/services/vision/isa_vision_service.py +573 -0
  78. isa_model/inference/services/vision/tests/test_ocr_client.py +284 -0
  79. isa_model/serving/api/fastapi_server.py +88 -16
  80. isa_model/serving/api/middleware/auth.py +311 -0
  81. isa_model/serving/api/middleware/security.py +278 -0
  82. isa_model/serving/api/routes/analytics.py +486 -0
  83. isa_model/serving/api/routes/deployments.py +339 -0
  84. isa_model/serving/api/routes/evaluations.py +579 -0
  85. isa_model/serving/api/routes/logs.py +430 -0
  86. isa_model/serving/api/routes/settings.py +582 -0
  87. isa_model/serving/api/routes/unified.py +324 -165
  88. isa_model/serving/api/startup.py +304 -0
  89. isa_model/serving/modal_proxy_server.py +249 -0
  90. isa_model/training/__init__.py +100 -6
  91. isa_model/training/core/__init__.py +4 -1
  92. isa_model/training/examples/intelligent_training_example.py +281 -0
  93. isa_model/training/intelligent/__init__.py +25 -0
  94. isa_model/training/intelligent/decision_engine.py +643 -0
  95. isa_model/training/intelligent/intelligent_factory.py +888 -0
  96. isa_model/training/intelligent/knowledge_base.py +751 -0
  97. isa_model/training/intelligent/resource_optimizer.py +839 -0
  98. isa_model/training/intelligent/task_classifier.py +576 -0
  99. isa_model/training/storage/__init__.py +24 -0
  100. isa_model/training/storage/core_integration.py +439 -0
  101. isa_model/training/storage/training_repository.py +552 -0
  102. isa_model/training/storage/training_storage.py +628 -0
  103. {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/METADATA +13 -1
  104. isa_model-0.4.0.dist-info/RECORD +182 -0
  105. isa_model/deployment/cloud/modal/isa_vision_doc_service.py +0 -766
  106. isa_model/deployment/cloud/modal/register_models.py +0 -321
  107. isa_model/inference/adapter/unified_api.py +0 -248
  108. isa_model/inference/services/helpers/stacked_config.py +0 -148
  109. isa_model/inference/services/img/flux_professional_service.py +0 -603
  110. isa_model/inference/services/img/helpers/base_stacked_service.py +0 -274
  111. isa_model/inference/services/others/table_transformer_service.py +0 -61
  112. isa_model/inference/services/vision/doc_analysis_service.py +0 -640
  113. isa_model/inference/services/vision/helpers/base_stacked_service.py +0 -274
  114. isa_model/inference/services/vision/ui_analysis_service.py +0 -823
  115. isa_model/scripts/inference_tracker.py +0 -283
  116. isa_model/scripts/mlflow_manager.py +0 -379
  117. isa_model/scripts/model_registry.py +0 -465
  118. isa_model/scripts/register_models.py +0 -370
  119. isa_model/scripts/register_models_with_embeddings.py +0 -510
  120. isa_model/scripts/start_mlflow.py +0 -95
  121. isa_model/scripts/training_tracker.py +0 -257
  122. isa_model-0.3.9.dist-info/RECORD +0 -138
  123. {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/WHEEL +0 -0
  124. {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,304 @@
1
+ """
2
+ Server Startup Initialization for ISA Model
3
+
4
+ Handles automatic initialization of:
5
+ - Database migrations
6
+ - Model registry population
7
+ - Embedding generation
8
+ - System validation
9
+ """
10
+
11
+ import logging
12
+ import asyncio
13
+ from typing import Dict, Any
14
+ import json
15
+ import psycopg2
16
+ import os
17
+
18
+ from ...core.config.config_manager import ConfigManager
19
+ from ...core.database.migrations import run_environment_migrations
20
+ from ...core.models.model_repo import ModelRegistry
21
+ from ...core.types import ModelType, ModelCapability
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+ class StartupInitializer:
26
+ """Handles server startup initialization"""
27
+
28
+ def __init__(self):
29
+ self.config_manager = ConfigManager()
30
+
31
+ async def initialize_system(self):
32
+ """Run complete system initialization"""
33
+ logger.info("🚀 Starting ISA Model system initialization...")
34
+
35
+ try:
36
+ # 1. Run database migrations
37
+ await self._run_migrations()
38
+
39
+ # 2. Populate model registry
40
+ await self._populate_models()
41
+
42
+ # 3. Generate embeddings
43
+ await self._generate_embeddings()
44
+
45
+ # 4. Validate system
46
+ await self._validate_system()
47
+
48
+ logger.info("✅ System initialization completed successfully!")
49
+
50
+ except Exception as e:
51
+ logger.error(f"❌ System initialization failed: {e}")
52
+ raise
53
+
54
+ async def _run_migrations(self):
55
+ """Run database migrations"""
56
+ logger.info("📋 Running database migrations...")
57
+
58
+ try:
59
+ success = run_environment_migrations()
60
+ if success:
61
+ logger.info("✅ Database migrations completed")
62
+ else:
63
+ raise Exception("Database migrations failed")
64
+ except Exception as e:
65
+ logger.error(f"❌ Migration error: {e}")
66
+ raise
67
+
68
+ async def _populate_models(self):
69
+ """Populate model registry with all configured models"""
70
+ logger.info("📚 Populating model registry...")
71
+
72
+ try:
73
+ registry = ModelRegistry()
74
+
75
+ # Get all configured models
76
+ all_models = self.config_manager.model_definitions
77
+
78
+ if not all_models:
79
+ logger.warning("⚠️ No models configured in providers")
80
+ return
81
+
82
+ registered_count = 0
83
+
84
+ for model_id, model_data in all_models.items():
85
+ try:
86
+ # Check if already registered
87
+ existing = registry.get_model_info(model_id)
88
+ if existing:
89
+ logger.debug(f"Model {model_id} already registered, skipping")
90
+ continue
91
+
92
+ # Map model type
93
+ model_type_str = model_data.get('type', 'llm')
94
+ model_type = self._map_model_type(model_type_str)
95
+
96
+ # Map capabilities
97
+ capabilities = self._map_capabilities(model_data.get('capabilities', []))
98
+
99
+ # Get provider
100
+ provider = model_data.get('provider', 'unknown')
101
+
102
+ # Register the model
103
+ success = registry.register_model(
104
+ model_id=model_id,
105
+ model_type=model_type,
106
+ capabilities=capabilities,
107
+ metadata=model_data,
108
+ provider=provider
109
+ )
110
+
111
+ if success:
112
+ registered_count += 1
113
+ logger.debug(f"Registered {model_id} ({provider})")
114
+ else:
115
+ logger.warning(f"Failed to register {model_id}")
116
+
117
+ except Exception as e:
118
+ logger.error(f"Error registering {model_id}: {e}")
119
+ continue
120
+
121
+ logger.info(f"✅ Model registry populated: {registered_count}/{len(all_models)} models")
122
+
123
+ except Exception as e:
124
+ logger.error(f"❌ Model population error: {e}")
125
+ raise
126
+
127
+ async def _generate_embeddings(self):
128
+ """Generate embeddings for all registered models using OpenAI embedding service"""
129
+ logger.info("🧠 Generating model embeddings with OpenAI embedding service...")
130
+
131
+ try:
132
+ # Initialize embedding service
133
+ from ...inference.ai_factory import AIFactory
134
+ factory = AIFactory.get_instance()
135
+ embedding_service = factory.get_embed("text-embedding-3-small", "openai")
136
+
137
+ if not embedding_service:
138
+ logger.warning("⚠️ Could not initialize embedding service, skipping embedding generation")
139
+ return
140
+
141
+ # Get all registered models
142
+ registry = ModelRegistry()
143
+ models = registry.list_models()
144
+
145
+ if not models:
146
+ logger.warning("⚠️ No models found in registry")
147
+ return
148
+
149
+ # Check existing embeddings using Supabase client
150
+ supabase_client = registry.supabase_client
151
+ existing_result = supabase_client.table("model_embeddings").select("model_id").execute()
152
+ existing_embeddings = {row['model_id'] for row in existing_result.data}
153
+
154
+ logger.info(f"Found {len(existing_embeddings)} existing embeddings")
155
+
156
+ processed = 0
157
+
158
+ for model_id, model_data in models.items():
159
+ try:
160
+ # Skip if embedding already exists
161
+ if model_id in existing_embeddings:
162
+ logger.debug(f"Embedding already exists for {model_id}, skipping")
163
+ continue
164
+
165
+ provider = model_data.get('provider', 'unknown')
166
+ model_type = model_data.get('type', 'llm')
167
+ metadata = model_data.get('metadata', {})
168
+
169
+ # Create searchable text from model information (same logic as intelligent_model_selector)
170
+ description = metadata.get('description', '')
171
+ specialized_tasks = metadata.get('specialized_tasks', [])
172
+
173
+ # Combine all text for embedding
174
+ search_text = f"{model_id} {provider} model. "
175
+ if description:
176
+ search_text += f"{description} "
177
+ if specialized_tasks:
178
+ search_text += f"Specialized for: {', '.join(specialized_tasks)}"
179
+
180
+ # Generate embedding using OpenAI service
181
+ logger.debug(f"Generating embedding for {model_id}...")
182
+ embedding = await embedding_service.create_text_embedding(search_text)
183
+
184
+ # Store embedding in database
185
+ embedding_data = {
186
+ 'model_id': model_id,
187
+ 'provider': provider,
188
+ 'description': search_text,
189
+ 'embedding': embedding
190
+ }
191
+
192
+ result = supabase_client.table('model_embeddings').insert(embedding_data).execute()
193
+
194
+ if result.data:
195
+ processed += 1
196
+ logger.debug(f"Stored embedding for {model_id}")
197
+ else:
198
+ logger.warning(f"Failed to store embedding for {model_id}")
199
+
200
+ except Exception as e:
201
+ logger.error(f"Error creating embedding for {model_id}: {e}")
202
+ continue
203
+
204
+ logger.info(f"✅ Generated {processed}/{len(models)} new embeddings")
205
+
206
+ # Close embedding service
207
+ await embedding_service.close()
208
+
209
+ except Exception as e:
210
+ logger.error(f"❌ Embedding generation error: {e}")
211
+ raise
212
+
213
+ async def _validate_system(self):
214
+ """Validate system is working correctly"""
215
+ logger.info("🔍 Validating system...")
216
+
217
+ try:
218
+ registry = ModelRegistry()
219
+ stats = registry.get_stats()
220
+
221
+ logger.info(f"📊 System validation results:")
222
+ logger.info(f" Models: {stats['total_models']}")
223
+ logger.info(f" By type: {stats['models_by_type']}")
224
+ logger.info(f" By capability: {stats['models_by_capability']}")
225
+
226
+ if stats['total_models'] == 0:
227
+ raise Exception("No models found in registry")
228
+
229
+ # Initialize and test intelligent selector
230
+ try:
231
+ from ...core.services.intelligent_model_selector import get_model_selector
232
+ selector = await get_model_selector()
233
+
234
+ # Test basic functionality
235
+ available_models = await selector.get_available_models()
236
+ logger.info(f" Available models for selection: {len(available_models)}")
237
+
238
+ except Exception as e:
239
+ logger.warning(f"⚠️ Intelligent selector initialization failed: {e}")
240
+
241
+ logger.info("✅ System validation completed")
242
+
243
+ except Exception as e:
244
+ logger.error(f"❌ System validation error: {e}")
245
+ raise
246
+
247
+ def _map_model_type(self, model_type_str: str) -> ModelType:
248
+ """Map string model type to enum"""
249
+ mapping = {
250
+ 'llm': ModelType.LLM,
251
+ 'embedding': ModelType.EMBEDDING,
252
+ 'rerank': ModelType.RERANK,
253
+ 'image': ModelType.IMAGE,
254
+ 'audio': ModelType.AUDIO,
255
+ 'video': ModelType.VIDEO,
256
+ 'vision': ModelType.VISION,
257
+ 'omni': ModelType.LLM # Omni models are treated as LLM for now
258
+ }
259
+ return mapping.get(model_type_str.lower(), ModelType.LLM)
260
+
261
+ def _map_capabilities(self, capabilities_list: list) -> list:
262
+ """Map capability strings to enums"""
263
+ mapping = {
264
+ 'text_generation': ModelCapability.TEXT_GENERATION,
265
+ 'chat': ModelCapability.CHAT,
266
+ 'embedding': ModelCapability.EMBEDDING,
267
+ 'reranking': ModelCapability.RERANKING,
268
+ 'reasoning': ModelCapability.REASONING,
269
+ 'image_generation': ModelCapability.IMAGE_GENERATION,
270
+ 'image_analysis': ModelCapability.IMAGE_ANALYSIS,
271
+ 'audio_transcription': ModelCapability.AUDIO_TRANSCRIPTION,
272
+ 'audio_realtime': ModelCapability.AUDIO_REALTIME,
273
+ 'speech_to_text': ModelCapability.SPEECH_TO_TEXT,
274
+ 'text_to_speech': ModelCapability.TEXT_TO_SPEECH,
275
+ 'conversation': ModelCapability.CONVERSATION,
276
+ 'image_understanding': ModelCapability.IMAGE_UNDERSTANDING,
277
+ 'ui_detection': ModelCapability.UI_DETECTION,
278
+ 'ocr': ModelCapability.OCR,
279
+ 'table_detection': ModelCapability.TABLE_DETECTION,
280
+ 'table_structure_recognition': ModelCapability.TABLE_STRUCTURE_RECOGNITION
281
+ }
282
+
283
+ result = []
284
+ for cap in capabilities_list:
285
+ if cap in mapping:
286
+ result.append(mapping[cap])
287
+ else:
288
+ # Log unmapped capabilities for debugging
289
+ logger.warning(f"Unknown capability '{cap}' - skipping")
290
+
291
+ # Default to text generation if no capabilities
292
+ if not result:
293
+ result = [ModelCapability.TEXT_GENERATION]
294
+
295
+ return result
296
+
297
+
298
+
299
+ # Global initializer instance
300
+ startup_initializer = StartupInitializer()
301
+
302
+ async def run_startup_initialization():
303
+ """Main startup initialization function"""
304
+ await startup_initializer.initialize_system()
@@ -0,0 +1,249 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Modal Services Proxy Server (Port 8082)
4
+
5
+ This server acts as a proxy to Modal services, providing a unified interface
6
+ for all Modal-deployed AI services like vision, audio, embedding, etc.
7
+ """
8
+
9
+ import os
10
+ import logging
11
+ import uvicorn
12
+ import httpx
13
+ import asyncio
14
+ from fastapi import FastAPI, HTTPException, Request, Depends
15
+ from fastapi.middleware.cors import CORSMiddleware
16
+ from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
17
+ from typing import Dict, Any, Optional
18
+ import json
19
+
20
+ # Configure logging
21
+ logging.basicConfig(level=logging.INFO)
22
+ logger = logging.getLogger(__name__)
23
+
24
+ app = FastAPI(
25
+ title="isA Model Modal Proxy",
26
+ description="Proxy server for Modal-deployed AI services",
27
+ version="1.0.0"
28
+ )
29
+
30
+ # CORS middleware
31
+ app.add_middleware(
32
+ CORSMiddleware,
33
+ allow_origins=["*"],
34
+ allow_credentials=True,
35
+ allow_methods=["*"],
36
+ allow_headers=["*"],
37
+ )
38
+
39
+ # Security
40
+ security = HTTPBearer()
41
+
42
+ # Configuration
43
+ MODAL_SERVICES = {
44
+ "vision": os.getenv("MODAL_VISION_URL", ""),
45
+ "audio": os.getenv("MODAL_AUDIO_URL", ""),
46
+ "embedding": os.getenv("MODAL_EMBED_URL", ""),
47
+ "image_gen": os.getenv("MODAL_IMAGE_GEN_URL", "")
48
+ }
49
+
50
+ API_KEY = os.getenv("API_KEY", "")
51
+ REQUEST_TIMEOUT = int(os.getenv("MODAL_TIMEOUT", "120"))
52
+
53
+
54
+ def verify_api_key(credentials: HTTPAuthorizationCredentials = Depends(security)):
55
+ """Verify API key if configured"""
56
+ if API_KEY and credentials.credentials != API_KEY:
57
+ raise HTTPException(
58
+ status_code=401,
59
+ detail="Invalid API key"
60
+ )
61
+ return credentials.credentials
62
+
63
+
64
+ @app.get("/health")
65
+ async def health_check():
66
+ """Health check endpoint"""
67
+ # Test connectivity to Modal services
68
+ service_status = {}
69
+ async with httpx.AsyncClient(timeout=5.0) as client:
70
+ for service_name, service_url in MODAL_SERVICES.items():
71
+ if service_url:
72
+ try:
73
+ response = await client.get(f"{service_url}/health", timeout=5.0)
74
+ service_status[service_name] = "healthy" if response.status_code == 200 else "unhealthy"
75
+ except Exception:
76
+ service_status[service_name] = "unreachable"
77
+ else:
78
+ service_status[service_name] = "not_configured"
79
+
80
+ return {
81
+ "status": "healthy",
82
+ "service": "modal-proxy",
83
+ "port": 8082,
84
+ "modal_services": service_status
85
+ }
86
+
87
+
88
+ @app.get("/services")
89
+ async def list_services():
90
+ """List available Modal services"""
91
+ return {
92
+ "available_services": list(MODAL_SERVICES.keys()),
93
+ "service_urls": {k: v for k, v in MODAL_SERVICES.items() if v},
94
+ "total_services": len([v for v in MODAL_SERVICES.values() if v])
95
+ }
96
+
97
+
98
+ @app.post("/modal/{service_name}/{endpoint:path}")
99
+ async def proxy_modal_service(
100
+ service_name: str,
101
+ endpoint: str,
102
+ request: Request,
103
+ api_key: str = Depends(verify_api_key)
104
+ ):
105
+ """Proxy requests to specific Modal service"""
106
+
107
+ # Validate service name
108
+ if service_name not in MODAL_SERVICES:
109
+ raise HTTPException(
110
+ status_code=404,
111
+ detail=f"Service '{service_name}' not found. Available: {list(MODAL_SERVICES.keys())}"
112
+ )
113
+
114
+ service_url = MODAL_SERVICES[service_name]
115
+ if not service_url:
116
+ raise HTTPException(
117
+ status_code=503,
118
+ detail=f"Service '{service_name}' not configured"
119
+ )
120
+
121
+ try:
122
+ # Get request body
123
+ body = await request.body()
124
+
125
+ # Prepare headers (exclude host and content-length)
126
+ headers = {}
127
+ for key, value in request.headers.items():
128
+ if key.lower() not in ['host', 'content-length']:
129
+ headers[key] = value
130
+
131
+ # Make request to Modal service
132
+ target_url = f"{service_url}/{endpoint}"
133
+
134
+ async with httpx.AsyncClient(timeout=REQUEST_TIMEOUT) as client:
135
+ response = await client.request(
136
+ method=request.method,
137
+ url=target_url,
138
+ headers=headers,
139
+ content=body,
140
+ params=dict(request.query_params)
141
+ )
142
+
143
+ # Return response
144
+ return response.json() if response.headers.get('content-type', '').startswith('application/json') else response.text
145
+
146
+ except httpx.TimeoutException:
147
+ logger.error(f"Timeout calling Modal service {service_name} at {endpoint}")
148
+ raise HTTPException(
149
+ status_code=504,
150
+ detail=f"Modal service '{service_name}' timeout"
151
+ )
152
+ except httpx.RequestError as e:
153
+ logger.error(f"Request error calling Modal service {service_name}: {e}")
154
+ raise HTTPException(
155
+ status_code=503,
156
+ detail=f"Modal service '{service_name}' unavailable: {str(e)}"
157
+ )
158
+ except Exception as e:
159
+ logger.error(f"Unexpected error calling Modal service {service_name}: {e}")
160
+ raise HTTPException(
161
+ status_code=500,
162
+ detail=f"Internal error: {str(e)}"
163
+ )
164
+
165
+
166
+ @app.get("/modal/{service_name}/{endpoint:path}")
167
+ async def proxy_modal_service_get(
168
+ service_name: str,
169
+ endpoint: str,
170
+ request: Request,
171
+ api_key: str = Depends(verify_api_key)
172
+ ):
173
+ """Proxy GET requests to Modal services"""
174
+ return await proxy_modal_service(service_name, endpoint, request, api_key)
175
+
176
+
177
+ # Convenience endpoints for common services
178
+ @app.post("/vision/{endpoint:path}")
179
+ async def vision_service(
180
+ endpoint: str,
181
+ request: Request,
182
+ api_key: str = Depends(verify_api_key)
183
+ ):
184
+ """Direct access to vision service"""
185
+ return await proxy_modal_service("vision", endpoint, request, api_key)
186
+
187
+
188
+ @app.post("/audio/{endpoint:path}")
189
+ async def audio_service(
190
+ endpoint: str,
191
+ request: Request,
192
+ api_key: str = Depends(verify_api_key)
193
+ ):
194
+ """Direct access to audio service"""
195
+ return await proxy_modal_service("audio", endpoint, request, api_key)
196
+
197
+
198
+ @app.post("/embedding/{endpoint:path}")
199
+ async def embedding_service(
200
+ endpoint: str,
201
+ request: Request,
202
+ api_key: str = Depends(verify_api_key)
203
+ ):
204
+ """Direct access to embedding service"""
205
+ return await proxy_modal_service("embedding", endpoint, request, api_key)
206
+
207
+
208
+ @app.post("/image-gen/{endpoint:path}")
209
+ async def image_gen_service(
210
+ endpoint: str,
211
+ request: Request,
212
+ api_key: str = Depends(verify_api_key)
213
+ ):
214
+ """Direct access to image generation service"""
215
+ return await proxy_modal_service("image_gen", endpoint, request, api_key)
216
+
217
+
218
+ # Error handlers
219
+ @app.exception_handler(404)
220
+ async def not_found_handler(request: Request, exc: HTTPException):
221
+ return {
222
+ "error": "Not Found",
223
+ "detail": "The requested endpoint was not found",
224
+ "available_endpoints": [
225
+ "/health",
226
+ "/services",
227
+ "/modal/{service_name}/{endpoint}",
228
+ "/vision/{endpoint}",
229
+ "/audio/{endpoint}",
230
+ "/embedding/{endpoint}",
231
+ "/image-gen/{endpoint}"
232
+ ]
233
+ }
234
+
235
+
236
+ if __name__ == "__main__":
237
+ port = int(os.getenv("PORT", "8082"))
238
+ workers = int(os.getenv("WORKERS", "1"))
239
+
240
+ logger.info(f"Starting Modal Proxy Server on port {port}")
241
+ logger.info(f"Configured Modal services: {list(MODAL_SERVICES.keys())}")
242
+
243
+ uvicorn.run(
244
+ app,
245
+ host="0.0.0.0",
246
+ port=port,
247
+ workers=workers,
248
+ log_level="info"
249
+ )
@@ -6,6 +6,7 @@ Provides unified training capabilities for AI models including:
6
6
  - Cloud training on RunPod
7
7
  - Model evaluation and management
8
8
  - HuggingFace integration
9
+ - 🧠 Intelligent training with AI-powered optimization
9
10
 
10
11
  Example usage:
11
12
  ```python
@@ -27,6 +28,18 @@ Example usage:
27
28
  batch_size=4,
28
29
  num_epochs=3
29
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)
30
43
  ```
31
44
  """
32
45
 
@@ -41,17 +54,60 @@ from .core import (
41
54
  BaseTrainer,
42
55
  SFTTrainer,
43
56
  TrainingUtils,
44
- DatasetManager
57
+ DatasetManager,
58
+ RunPodConfig,
59
+ StorageConfig,
60
+ JobConfig
45
61
  )
46
62
 
47
63
  # Import cloud training components
48
64
  from .cloud import (
49
- RunPodConfig,
50
- StorageConfig,
51
- JobConfig,
52
65
  TrainingJobOrchestrator
53
66
  )
54
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
+
55
111
  __all__ = [
56
112
  # Main factory
57
113
  'TrainingFactory',
@@ -70,5 +126,43 @@ __all__ = [
70
126
  'RunPodConfig',
71
127
  'StorageConfig',
72
128
  'JobConfig',
73
- 'TrainingJobOrchestrator'
74
- ]
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.")