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.
- isa_model/client.py +466 -43
- isa_model/core/cache/redis_cache.py +12 -3
- isa_model/core/config/config_manager.py +230 -3
- isa_model/core/config.py +90 -0
- isa_model/core/database/direct_db_client.py +114 -0
- isa_model/core/database/migration_manager.py +563 -0
- isa_model/core/database/migrations.py +21 -1
- isa_model/core/database/supabase_client.py +154 -19
- isa_model/core/dependencies.py +316 -0
- isa_model/core/discovery/__init__.py +19 -0
- isa_model/core/discovery/consul_discovery.py +190 -0
- isa_model/core/logging/__init__.py +54 -0
- isa_model/core/logging/influx_logger.py +523 -0
- isa_model/core/logging/loki_logger.py +160 -0
- isa_model/core/models/__init__.py +27 -18
- isa_model/core/models/config_models.py +625 -0
- isa_model/core/models/deployment_billing_tracker.py +430 -0
- isa_model/core/models/model_manager.py +35 -80
- isa_model/core/models/model_metadata.py +690 -0
- isa_model/core/models/model_repo.py +174 -18
- isa_model/core/models/system_models.py +857 -0
- isa_model/core/repositories/__init__.py +9 -0
- isa_model/core/repositories/config_repository.py +912 -0
- isa_model/core/services/intelligent_model_selector.py +399 -21
- isa_model/core/types.py +1 -0
- isa_model/deployment/__init__.py +5 -48
- isa_model/deployment/core/__init__.py +2 -31
- isa_model/deployment/core/deployment_manager.py +1278 -370
- isa_model/deployment/modal/__init__.py +8 -0
- isa_model/deployment/modal/config.py +136 -0
- isa_model/deployment/{services/auto_hf_modal_deployer.py → modal/deployer.py} +1 -1
- isa_model/deployment/modal/services/__init__.py +3 -0
- isa_model/deployment/modal/services/audio/__init__.py +1 -0
- isa_model/deployment/modal/services/embedding/__init__.py +1 -0
- isa_model/deployment/modal/services/llm/__init__.py +1 -0
- isa_model/deployment/modal/services/llm/isa_llm_service.py +424 -0
- isa_model/deployment/modal/services/video/__init__.py +1 -0
- isa_model/deployment/modal/services/vision/__init__.py +1 -0
- isa_model/deployment/models/org-org-acme-corp-tenant-a-service-llm-20250825-225822/tenant-a-service_modal_service.py +48 -0
- isa_model/deployment/models/org-test-org-123-prefix-test-service-llm-20250825-225822/prefix-test-service_modal_service.py +48 -0
- isa_model/deployment/models/test-llm-service-llm-20250825-204442/test-llm-service_modal_service.py +48 -0
- isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-212906/test-monitoring-gpt2_modal_service.py +48 -0
- isa_model/deployment/models/test-monitoring-gpt2-llm-20250825-213009/test-monitoring-gpt2_modal_service.py +48 -0
- isa_model/deployment/storage/__init__.py +5 -0
- isa_model/deployment/storage/deployment_repository.py +824 -0
- isa_model/deployment/triton/__init__.py +10 -0
- isa_model/deployment/triton/config.py +196 -0
- isa_model/deployment/triton/configs/__init__.py +1 -0
- isa_model/deployment/triton/provider.py +512 -0
- isa_model/deployment/triton/scripts/__init__.py +1 -0
- isa_model/deployment/triton/templates/__init__.py +1 -0
- isa_model/inference/__init__.py +47 -1
- isa_model/inference/ai_factory.py +137 -10
- isa_model/inference/legacy_services/__init__.py +21 -0
- isa_model/inference/legacy_services/model_evaluation.py +637 -0
- isa_model/inference/legacy_services/model_service.py +573 -0
- isa_model/inference/legacy_services/model_serving.py +717 -0
- isa_model/inference/legacy_services/model_training.py +561 -0
- isa_model/inference/models/__init__.py +21 -0
- isa_model/inference/models/inference_config.py +551 -0
- isa_model/inference/models/inference_record.py +675 -0
- isa_model/inference/models/performance_models.py +714 -0
- isa_model/inference/repositories/__init__.py +9 -0
- isa_model/inference/repositories/inference_repository.py +828 -0
- isa_model/inference/services/audio/base_stt_service.py +184 -11
- isa_model/inference/services/audio/openai_stt_service.py +22 -6
- isa_model/inference/services/embedding/ollama_embed_service.py +15 -3
- isa_model/inference/services/embedding/resilient_embed_service.py +285 -0
- isa_model/inference/services/llm/__init__.py +10 -2
- isa_model/inference/services/llm/base_llm_service.py +335 -24
- isa_model/inference/services/llm/cerebras_llm_service.py +628 -0
- isa_model/inference/services/llm/helpers/llm_adapter.py +9 -4
- isa_model/inference/services/llm/helpers/llm_prompts.py +342 -0
- isa_model/inference/services/llm/helpers/llm_utils.py +321 -23
- isa_model/inference/services/llm/huggingface_llm_service.py +581 -0
- isa_model/inference/services/llm/ollama_llm_service.py +9 -2
- isa_model/inference/services/llm/openai_llm_service.py +33 -16
- isa_model/inference/services/llm/yyds_llm_service.py +8 -2
- isa_model/inference/services/vision/__init__.py +22 -1
- isa_model/inference/services/vision/helpers/image_utils.py +8 -5
- isa_model/inference/services/vision/isa_vision_service.py +65 -4
- isa_model/inference/services/vision/openai_vision_service.py +19 -10
- isa_model/inference/services/vision/vgg16_vision_service.py +257 -0
- isa_model/serving/api/cache_manager.py +245 -0
- isa_model/serving/api/dependencies/__init__.py +1 -0
- isa_model/serving/api/dependencies/auth.py +194 -0
- isa_model/serving/api/dependencies/database.py +139 -0
- isa_model/serving/api/error_handlers.py +284 -0
- isa_model/serving/api/fastapi_server.py +172 -22
- isa_model/serving/api/middleware/auth.py +8 -2
- isa_model/serving/api/middleware/security.py +23 -33
- isa_model/serving/api/middleware/tenant_context.py +414 -0
- isa_model/serving/api/routes/analytics.py +4 -1
- isa_model/serving/api/routes/config.py +645 -0
- isa_model/serving/api/routes/deployment_billing.py +315 -0
- isa_model/serving/api/routes/deployments.py +138 -2
- isa_model/serving/api/routes/gpu_gateway.py +440 -0
- isa_model/serving/api/routes/health.py +32 -12
- isa_model/serving/api/routes/inference_monitoring.py +486 -0
- isa_model/serving/api/routes/local_deployments.py +448 -0
- isa_model/serving/api/routes/tenants.py +575 -0
- isa_model/serving/api/routes/unified.py +680 -18
- isa_model/serving/api/routes/webhooks.py +479 -0
- isa_model/serving/api/startup.py +68 -54
- isa_model/utils/gpu_utils.py +311 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/METADATA +71 -24
- isa_model-0.4.4.dist-info/RECORD +180 -0
- isa_model/core/security/secrets.py +0 -358
- isa_model/core/storage/hf_storage.py +0 -419
- isa_model/core/storage/minio_storage.py +0 -0
- isa_model/deployment/cloud/__init__.py +0 -9
- isa_model/deployment/cloud/modal/__init__.py +0 -10
- isa_model/deployment/core/deployment_config.py +0 -356
- isa_model/deployment/core/isa_deployment_service.py +0 -401
- isa_model/deployment/gpu_int8_ds8/app/server.py +0 -66
- isa_model/deployment/gpu_int8_ds8/scripts/test_client.py +0 -43
- isa_model/deployment/gpu_int8_ds8/scripts/test_client_os.py +0 -35
- isa_model/deployment/runtime/deployed_service.py +0 -338
- isa_model/deployment/services/__init__.py +0 -9
- isa_model/deployment/services/auto_deploy_vision_service.py +0 -538
- isa_model/deployment/services/model_service.py +0 -332
- isa_model/deployment/services/service_monitor.py +0 -356
- isa_model/deployment/services/service_registry.py +0 -527
- isa_model/eval/__init__.py +0 -92
- isa_model/eval/benchmarks/__init__.py +0 -27
- isa_model/eval/benchmarks/multimodal_datasets.py +0 -460
- isa_model/eval/benchmarks.py +0 -701
- isa_model/eval/config/__init__.py +0 -10
- isa_model/eval/config/evaluation_config.py +0 -108
- isa_model/eval/evaluators/__init__.py +0 -24
- isa_model/eval/evaluators/audio_evaluator.py +0 -727
- isa_model/eval/evaluators/base_evaluator.py +0 -503
- isa_model/eval/evaluators/embedding_evaluator.py +0 -742
- isa_model/eval/evaluators/llm_evaluator.py +0 -472
- isa_model/eval/evaluators/vision_evaluator.py +0 -564
- isa_model/eval/example_evaluation.py +0 -395
- isa_model/eval/factory.py +0 -798
- isa_model/eval/infrastructure/__init__.py +0 -24
- isa_model/eval/infrastructure/experiment_tracker.py +0 -466
- isa_model/eval/isa_benchmarks.py +0 -700
- isa_model/eval/isa_integration.py +0 -582
- isa_model/eval/metrics.py +0 -951
- isa_model/eval/tests/unit/test_basic.py +0 -396
- isa_model/serving/api/routes/evaluations.py +0 -579
- isa_model/training/__init__.py +0 -168
- isa_model/training/annotation/annotation_schema.py +0 -47
- isa_model/training/annotation/processors/annotation_processor.py +0 -126
- isa_model/training/annotation/storage/dataset_manager.py +0 -131
- isa_model/training/annotation/storage/dataset_schema.py +0 -44
- isa_model/training/annotation/tests/test_annotation_flow.py +0 -109
- isa_model/training/annotation/tests/test_minio copy.py +0 -113
- isa_model/training/annotation/tests/test_minio_upload.py +0 -43
- isa_model/training/annotation/views/annotation_controller.py +0 -158
- isa_model/training/cloud/__init__.py +0 -22
- isa_model/training/cloud/job_orchestrator.py +0 -402
- isa_model/training/cloud/runpod_trainer.py +0 -454
- isa_model/training/cloud/storage_manager.py +0 -482
- isa_model/training/core/__init__.py +0 -26
- isa_model/training/core/config.py +0 -181
- isa_model/training/core/dataset.py +0 -222
- isa_model/training/core/trainer.py +0 -720
- isa_model/training/core/utils.py +0 -213
- isa_model/training/examples/intelligent_training_example.py +0 -281
- isa_model/training/factory.py +0 -424
- isa_model/training/intelligent/__init__.py +0 -25
- isa_model/training/intelligent/decision_engine.py +0 -643
- isa_model/training/intelligent/intelligent_factory.py +0 -888
- isa_model/training/intelligent/knowledge_base.py +0 -751
- isa_model/training/intelligent/resource_optimizer.py +0 -839
- isa_model/training/intelligent/task_classifier.py +0 -576
- isa_model/training/storage/__init__.py +0 -24
- isa_model/training/storage/core_integration.py +0 -439
- isa_model/training/storage/training_repository.py +0 -552
- isa_model/training/storage/training_storage.py +0 -628
- isa_model-0.4.0.dist-info/RECORD +0 -182
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_chatTTS_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_fish_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_openvoice_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/audio}/isa_audio_service_v2.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/embedding}/isa_embed_rerank_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/video}/isa_video_hunyuan_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ocr_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_qwen25_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_table_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service.py +0 -0
- /isa_model/deployment/{cloud/modal → modal/services/vision}/isa_vision_ui_service_optimized.py +0 -0
- /isa_model/deployment/{services → modal/services/vision}/simple_auto_deploy_vision_service.py +0 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/WHEEL +0 -0
- {isa_model-0.4.0.dist-info → isa_model-0.4.4.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,190 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
"""
|
3
|
+
Consul Service Discovery Client for Model Service
|
4
|
+
Provides service discovery capabilities to find other services via Consul
|
5
|
+
"""
|
6
|
+
|
7
|
+
import logging
|
8
|
+
import os
|
9
|
+
from typing import Optional, List, Dict, Any
|
10
|
+
import consul
|
11
|
+
import random
|
12
|
+
|
13
|
+
logger = logging.getLogger(__name__)
|
14
|
+
|
15
|
+
|
16
|
+
class ConsulServiceDiscovery:
|
17
|
+
"""Consul service discovery client for Model service"""
|
18
|
+
|
19
|
+
def __init__(self, consul_host: str = None, consul_port: int = None):
|
20
|
+
"""Initialize Consul client for service discovery"""
|
21
|
+
self.consul_host = consul_host or os.getenv("CONSUL_HOST", "localhost")
|
22
|
+
self.consul_port = consul_port or int(os.getenv("CONSUL_PORT", "8500"))
|
23
|
+
|
24
|
+
try:
|
25
|
+
self._consul = consul.Consul(host=self.consul_host, port=self.consul_port)
|
26
|
+
# Test connection
|
27
|
+
self._consul.agent.self()
|
28
|
+
logger.info(f"Connected to Consul at {self.consul_host}:{self.consul_port}")
|
29
|
+
except Exception as e:
|
30
|
+
logger.error(f"Failed to connect to Consul: {e}")
|
31
|
+
self._consul = None
|
32
|
+
|
33
|
+
def get_service_url(self, service_name: str, default_url: Optional[str] = None) -> Optional[str]:
|
34
|
+
"""
|
35
|
+
Get service URL from Consul by service name
|
36
|
+
|
37
|
+
Args:
|
38
|
+
service_name: Name of the service to discover (e.g., 'mcp', 'agent')
|
39
|
+
default_url: Fallback URL if service not found or Consul unavailable
|
40
|
+
|
41
|
+
Returns:
|
42
|
+
Service URL (http://host:port) or default_url if not found
|
43
|
+
"""
|
44
|
+
if not self._consul:
|
45
|
+
logger.warning(f"Consul not available, using default URL for {service_name}")
|
46
|
+
return default_url
|
47
|
+
|
48
|
+
try:
|
49
|
+
# Get healthy service instances
|
50
|
+
_, services = self._consul.health.service(service_name, passing=True)
|
51
|
+
|
52
|
+
if not services:
|
53
|
+
logger.warning(f"No healthy instances found for service '{service_name}'")
|
54
|
+
return default_url
|
55
|
+
|
56
|
+
# Use random selection for load balancing
|
57
|
+
service = random.choice(services)
|
58
|
+
service_info = service['Service']
|
59
|
+
address = service_info.get('Address', 'localhost')
|
60
|
+
port = service_info.get('Port', 80)
|
61
|
+
|
62
|
+
# Build service URL
|
63
|
+
service_url = f"http://{address}:{port}"
|
64
|
+
logger.info(f"Discovered service '{service_name}' at {service_url}")
|
65
|
+
return service_url
|
66
|
+
|
67
|
+
except Exception as e:
|
68
|
+
logger.error(f"Failed to discover service '{service_name}': {e}")
|
69
|
+
return default_url
|
70
|
+
|
71
|
+
def discover_all_instances(self, service_name: str) -> List[Dict[str, Any]]:
|
72
|
+
"""
|
73
|
+
Discover all healthy instances of a service
|
74
|
+
|
75
|
+
Args:
|
76
|
+
service_name: Name of the service to discover
|
77
|
+
|
78
|
+
Returns:
|
79
|
+
List of service instances with their details
|
80
|
+
"""
|
81
|
+
if not self._consul:
|
82
|
+
return []
|
83
|
+
|
84
|
+
try:
|
85
|
+
_, services = self._consul.health.service(service_name, passing=True)
|
86
|
+
|
87
|
+
instances = []
|
88
|
+
for service in services:
|
89
|
+
service_info = service['Service']
|
90
|
+
instances.append({
|
91
|
+
'id': service_info.get('ID'),
|
92
|
+
'name': service_info.get('Service'),
|
93
|
+
'address': service_info.get('Address'),
|
94
|
+
'port': service_info.get('Port'),
|
95
|
+
'tags': service_info.get('Tags', []),
|
96
|
+
'url': f"http://{service_info.get('Address')}:{service_info.get('Port')}"
|
97
|
+
})
|
98
|
+
|
99
|
+
return instances
|
100
|
+
|
101
|
+
except Exception as e:
|
102
|
+
logger.error(f"Failed to discover instances for '{service_name}': {e}")
|
103
|
+
return []
|
104
|
+
|
105
|
+
def resolve_service_url(self, url: str) -> str:
|
106
|
+
"""
|
107
|
+
Resolve service URL - supports consul:// URLs for service discovery
|
108
|
+
|
109
|
+
Args:
|
110
|
+
url: URL to resolve (can be consul://service_name/path or regular URL)
|
111
|
+
|
112
|
+
Returns:
|
113
|
+
Resolved URL with actual service address
|
114
|
+
"""
|
115
|
+
if not url or not url.startswith("consul://"):
|
116
|
+
return url
|
117
|
+
|
118
|
+
# Parse consul URL: consul://service_name/path
|
119
|
+
parts = url.replace("consul://", "").split("/", 1)
|
120
|
+
service_name = parts[0]
|
121
|
+
path = "/" + parts[1] if len(parts) > 1 else ""
|
122
|
+
|
123
|
+
# Default URLs for common services
|
124
|
+
defaults = {
|
125
|
+
"mcp": os.getenv("MCP_BASE_URL", "http://localhost:8081"),
|
126
|
+
"agent": os.getenv("AGENT_URL", "http://localhost:8080"),
|
127
|
+
"auth": os.getenv("AUTH_SERVICE_URL", "http://localhost:8202"),
|
128
|
+
"storage": os.getenv("STORAGE_SERVICE_URL", "http://localhost:8109"),
|
129
|
+
"redis": os.getenv("REDIS_URL", "redis://localhost:6379")
|
130
|
+
}
|
131
|
+
|
132
|
+
# Discover service URL
|
133
|
+
discovered_url = self.get_service_url(service_name, defaults.get(service_name))
|
134
|
+
if discovered_url:
|
135
|
+
return discovered_url + path
|
136
|
+
|
137
|
+
# Fallback to original URL if discovery fails
|
138
|
+
return url
|
139
|
+
|
140
|
+
def is_available(self) -> bool:
|
141
|
+
"""Check if Consul connection is available"""
|
142
|
+
if not self._consul:
|
143
|
+
return False
|
144
|
+
|
145
|
+
try:
|
146
|
+
self._consul.agent.self()
|
147
|
+
return True
|
148
|
+
except:
|
149
|
+
return False
|
150
|
+
|
151
|
+
|
152
|
+
# Global instance for singleton pattern
|
153
|
+
_discovery_instance = None
|
154
|
+
|
155
|
+
|
156
|
+
def get_consul_discovery() -> ConsulServiceDiscovery:
|
157
|
+
"""Get global Consul discovery instance (singleton)"""
|
158
|
+
global _discovery_instance
|
159
|
+
if _discovery_instance is None:
|
160
|
+
_discovery_instance = ConsulServiceDiscovery()
|
161
|
+
return _discovery_instance
|
162
|
+
|
163
|
+
|
164
|
+
def discover_service(service_name: str, default_url: Optional[str] = None) -> Optional[str]:
|
165
|
+
"""
|
166
|
+
Convenient function to discover service URL
|
167
|
+
|
168
|
+
Args:
|
169
|
+
service_name: Name of the service to discover
|
170
|
+
default_url: Fallback URL if discovery fails
|
171
|
+
|
172
|
+
Returns:
|
173
|
+
Service URL or default_url
|
174
|
+
"""
|
175
|
+
discovery = get_consul_discovery()
|
176
|
+
return discovery.get_service_url(service_name, default_url)
|
177
|
+
|
178
|
+
|
179
|
+
def resolve_url(url: str) -> str:
|
180
|
+
"""
|
181
|
+
Resolve URL with Consul service discovery support
|
182
|
+
|
183
|
+
Args:
|
184
|
+
url: URL to resolve (supports consul:// prefix)
|
185
|
+
|
186
|
+
Returns:
|
187
|
+
Resolved URL with actual service address
|
188
|
+
"""
|
189
|
+
discovery = get_consul_discovery()
|
190
|
+
return discovery.resolve_service_url(url)
|
@@ -0,0 +1,54 @@
|
|
1
|
+
"""
|
2
|
+
Logging module for ISA Model
|
3
|
+
|
4
|
+
Provides comprehensive logging capabilities including:
|
5
|
+
- Loki-based centralized application logging (via loki_logger)
|
6
|
+
- InfluxDB-based inference metrics logging (via influx_logger)
|
7
|
+
- Real-time monitoring and alerting
|
8
|
+
|
9
|
+
Architecture:
|
10
|
+
- Loki: General application logs (INFO, WARNING, ERROR, DEBUG)
|
11
|
+
- InfluxDB: Inference metrics (tokens, costs, performance data)
|
12
|
+
"""
|
13
|
+
|
14
|
+
# InfluxDB inference metrics logging
|
15
|
+
from .influx_logger import (
|
16
|
+
InfluxInferenceLogger,
|
17
|
+
InferenceLogEntry,
|
18
|
+
get_inference_logger,
|
19
|
+
generate_request_id
|
20
|
+
)
|
21
|
+
|
22
|
+
# Loki centralized application logging
|
23
|
+
from .loki_logger import (
|
24
|
+
setup_logger,
|
25
|
+
app_logger,
|
26
|
+
api_logger,
|
27
|
+
client_logger,
|
28
|
+
inference_logger,
|
29
|
+
training_logger,
|
30
|
+
eval_logger,
|
31
|
+
db_logger,
|
32
|
+
deployment_logger,
|
33
|
+
model_logger,
|
34
|
+
)
|
35
|
+
|
36
|
+
__all__ = [
|
37
|
+
# InfluxDB inference logging
|
38
|
+
'InfluxInferenceLogger',
|
39
|
+
'InferenceLogEntry',
|
40
|
+
'get_inference_logger',
|
41
|
+
'generate_request_id',
|
42
|
+
|
43
|
+
# Loki application logging
|
44
|
+
'setup_logger',
|
45
|
+
'app_logger',
|
46
|
+
'api_logger',
|
47
|
+
'client_logger',
|
48
|
+
'inference_logger',
|
49
|
+
'training_logger',
|
50
|
+
'eval_logger',
|
51
|
+
'db_logger',
|
52
|
+
'deployment_logger',
|
53
|
+
'model_logger',
|
54
|
+
]
|