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.
- isa_model/__init__.py +1 -1
- isa_model/client.py +732 -565
- isa_model/core/cache/redis_cache.py +401 -0
- isa_model/core/config/config_manager.py +53 -10
- isa_model/core/config.py +1 -1
- isa_model/core/database/__init__.py +1 -0
- isa_model/core/database/migrations.py +277 -0
- isa_model/core/database/supabase_client.py +123 -0
- isa_model/core/models/__init__.py +37 -0
- isa_model/core/models/model_billing_tracker.py +60 -88
- isa_model/core/models/model_manager.py +36 -18
- isa_model/core/models/model_repo.py +44 -38
- isa_model/core/models/model_statistics_tracker.py +234 -0
- isa_model/core/models/model_storage.py +0 -1
- isa_model/core/models/model_version_manager.py +959 -0
- isa_model/core/pricing_manager.py +2 -249
- isa_model/core/resilience/circuit_breaker.py +366 -0
- isa_model/core/security/secrets.py +358 -0
- isa_model/core/services/__init__.py +2 -4
- isa_model/core/services/intelligent_model_selector.py +101 -370
- isa_model/core/storage/hf_storage.py +1 -1
- isa_model/core/types.py +7 -0
- isa_model/deployment/cloud/modal/isa_audio_chatTTS_service.py +520 -0
- isa_model/deployment/cloud/modal/isa_audio_fish_service.py +0 -0
- isa_model/deployment/cloud/modal/isa_audio_openvoice_service.py +758 -0
- isa_model/deployment/cloud/modal/isa_audio_service_v2.py +1044 -0
- isa_model/deployment/cloud/modal/isa_embed_rerank_service.py +296 -0
- isa_model/deployment/cloud/modal/isa_video_hunyuan_service.py +423 -0
- isa_model/deployment/cloud/modal/isa_vision_ocr_service.py +519 -0
- isa_model/deployment/cloud/modal/isa_vision_qwen25_service.py +709 -0
- isa_model/deployment/cloud/modal/isa_vision_table_service.py +467 -323
- isa_model/deployment/cloud/modal/isa_vision_ui_service.py +607 -180
- isa_model/deployment/cloud/modal/isa_vision_ui_service_optimized.py +660 -0
- isa_model/deployment/core/deployment_manager.py +6 -4
- isa_model/deployment/services/auto_hf_modal_deployer.py +894 -0
- isa_model/eval/benchmarks/__init__.py +27 -0
- isa_model/eval/benchmarks/multimodal_datasets.py +460 -0
- isa_model/eval/benchmarks.py +244 -12
- isa_model/eval/evaluators/__init__.py +8 -2
- isa_model/eval/evaluators/audio_evaluator.py +727 -0
- isa_model/eval/evaluators/embedding_evaluator.py +742 -0
- isa_model/eval/evaluators/vision_evaluator.py +564 -0
- isa_model/eval/example_evaluation.py +395 -0
- isa_model/eval/factory.py +272 -5
- isa_model/eval/isa_benchmarks.py +700 -0
- isa_model/eval/isa_integration.py +582 -0
- isa_model/eval/metrics.py +159 -6
- isa_model/eval/tests/unit/test_basic.py +396 -0
- isa_model/inference/ai_factory.py +44 -8
- isa_model/inference/services/audio/__init__.py +21 -0
- isa_model/inference/services/audio/base_realtime_service.py +225 -0
- isa_model/inference/services/audio/isa_tts_service.py +0 -0
- isa_model/inference/services/audio/openai_realtime_service.py +320 -124
- isa_model/inference/services/audio/openai_stt_service.py +32 -6
- isa_model/inference/services/base_service.py +17 -1
- isa_model/inference/services/embedding/__init__.py +13 -0
- isa_model/inference/services/embedding/base_embed_service.py +111 -8
- isa_model/inference/services/embedding/isa_embed_service.py +305 -0
- isa_model/inference/services/embedding/openai_embed_service.py +2 -4
- isa_model/inference/services/embedding/tests/test_embedding.py +222 -0
- isa_model/inference/services/img/__init__.py +2 -2
- isa_model/inference/services/img/base_image_gen_service.py +24 -7
- isa_model/inference/services/img/replicate_image_gen_service.py +84 -422
- isa_model/inference/services/img/services/replicate_face_swap.py +193 -0
- isa_model/inference/services/img/services/replicate_flux.py +226 -0
- isa_model/inference/services/img/services/replicate_flux_kontext.py +219 -0
- isa_model/inference/services/img/services/replicate_sticker_maker.py +249 -0
- isa_model/inference/services/img/tests/test_img_client.py +297 -0
- isa_model/inference/services/llm/base_llm_service.py +30 -6
- isa_model/inference/services/llm/helpers/llm_adapter.py +63 -9
- isa_model/inference/services/llm/ollama_llm_service.py +2 -1
- isa_model/inference/services/llm/openai_llm_service.py +652 -55
- isa_model/inference/services/llm/yyds_llm_service.py +2 -1
- isa_model/inference/services/vision/__init__.py +5 -5
- isa_model/inference/services/vision/base_vision_service.py +118 -185
- isa_model/inference/services/vision/helpers/image_utils.py +11 -5
- isa_model/inference/services/vision/isa_vision_service.py +573 -0
- isa_model/inference/services/vision/tests/test_ocr_client.py +284 -0
- isa_model/serving/api/fastapi_server.py +88 -16
- isa_model/serving/api/middleware/auth.py +311 -0
- isa_model/serving/api/middleware/security.py +278 -0
- isa_model/serving/api/routes/analytics.py +486 -0
- isa_model/serving/api/routes/deployments.py +339 -0
- isa_model/serving/api/routes/evaluations.py +579 -0
- isa_model/serving/api/routes/logs.py +430 -0
- isa_model/serving/api/routes/settings.py +582 -0
- isa_model/serving/api/routes/unified.py +324 -165
- isa_model/serving/api/startup.py +304 -0
- isa_model/serving/modal_proxy_server.py +249 -0
- isa_model/training/__init__.py +100 -6
- isa_model/training/core/__init__.py +4 -1
- isa_model/training/examples/intelligent_training_example.py +281 -0
- isa_model/training/intelligent/__init__.py +25 -0
- isa_model/training/intelligent/decision_engine.py +643 -0
- isa_model/training/intelligent/intelligent_factory.py +888 -0
- isa_model/training/intelligent/knowledge_base.py +751 -0
- isa_model/training/intelligent/resource_optimizer.py +839 -0
- isa_model/training/intelligent/task_classifier.py +576 -0
- isa_model/training/storage/__init__.py +24 -0
- isa_model/training/storage/core_integration.py +439 -0
- isa_model/training/storage/training_repository.py +552 -0
- isa_model/training/storage/training_storage.py +628 -0
- {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/METADATA +13 -1
- isa_model-0.4.0.dist-info/RECORD +182 -0
- isa_model/deployment/cloud/modal/isa_vision_doc_service.py +0 -766
- isa_model/deployment/cloud/modal/register_models.py +0 -321
- isa_model/inference/adapter/unified_api.py +0 -248
- isa_model/inference/services/helpers/stacked_config.py +0 -148
- isa_model/inference/services/img/flux_professional_service.py +0 -603
- isa_model/inference/services/img/helpers/base_stacked_service.py +0 -274
- isa_model/inference/services/others/table_transformer_service.py +0 -61
- isa_model/inference/services/vision/doc_analysis_service.py +0 -640
- isa_model/inference/services/vision/helpers/base_stacked_service.py +0 -274
- isa_model/inference/services/vision/ui_analysis_service.py +0 -823
- isa_model/scripts/inference_tracker.py +0 -283
- isa_model/scripts/mlflow_manager.py +0 -379
- isa_model/scripts/model_registry.py +0 -465
- isa_model/scripts/register_models.py +0 -370
- isa_model/scripts/register_models_with_embeddings.py +0 -510
- isa_model/scripts/start_mlflow.py +0 -95
- isa_model/scripts/training_tracker.py +0 -257
- isa_model-0.3.9.dist-info/RECORD +0 -138
- {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/WHEEL +0 -0
- {isa_model-0.3.9.dist-info → isa_model-0.4.0.dist-info}/top_level.txt +0 -0
isa_model/eval/factory.py
CHANGED
@@ -16,9 +16,45 @@ from typing import Optional, Dict, Any, List, Union, Callable
|
|
16
16
|
from pathlib import Path
|
17
17
|
import json
|
18
18
|
|
19
|
-
from .evaluators import LLMEvaluator, VisionEvaluator,
|
20
|
-
from .
|
21
|
-
|
19
|
+
from .evaluators import LLMEvaluator, VisionEvaluator, AudioEvaluator, EmbeddingEvaluator, EvaluationResult
|
20
|
+
from .isa_integration import ISAModelInterface
|
21
|
+
try:
|
22
|
+
from .infrastructure import ExperimentTracker, create_experiment_tracker
|
23
|
+
EXPERIMENT_TRACKING_AVAILABLE = True
|
24
|
+
except ImportError:
|
25
|
+
EXPERIMENT_TRACKING_AVAILABLE = False
|
26
|
+
logger.warning("Experiment tracking not available")
|
27
|
+
|
28
|
+
try:
|
29
|
+
from .config import EvaluationConfig
|
30
|
+
CONFIG_AVAILABLE = True
|
31
|
+
except ImportError:
|
32
|
+
CONFIG_AVAILABLE = False
|
33
|
+
# Create a simple config class
|
34
|
+
class EvaluationConfig:
|
35
|
+
def __init__(self):
|
36
|
+
self.batch_size = 16
|
37
|
+
self.output_dir = "./evaluation_results"
|
38
|
+
self.default_temperature = 0.7
|
39
|
+
self.default_max_tokens = 512
|
40
|
+
self.max_concurrent_evaluations = 3
|
41
|
+
|
42
|
+
def to_dict(self):
|
43
|
+
return {
|
44
|
+
"batch_size": self.batch_size,
|
45
|
+
"output_dir": self.output_dir,
|
46
|
+
"default_temperature": self.default_temperature,
|
47
|
+
"default_max_tokens": self.default_max_tokens,
|
48
|
+
"max_concurrent_evaluations": self.max_concurrent_evaluations
|
49
|
+
}
|
50
|
+
|
51
|
+
@classmethod
|
52
|
+
def from_dict(cls, config_dict):
|
53
|
+
config = cls()
|
54
|
+
for key, value in config_dict.items():
|
55
|
+
if hasattr(config, key):
|
56
|
+
setattr(config, key, value)
|
57
|
+
return config
|
22
58
|
|
23
59
|
logger = logging.getLogger(__name__)
|
24
60
|
|
@@ -103,19 +139,37 @@ class EvaluationFactory:
|
|
103
139
|
|
104
140
|
# Initialize experiment tracker
|
105
141
|
self.experiment_tracker = None
|
106
|
-
if experiment_tracking:
|
142
|
+
if experiment_tracking and EXPERIMENT_TRACKING_AVAILABLE:
|
107
143
|
try:
|
108
144
|
self.experiment_tracker = create_experiment_tracker(**experiment_tracking)
|
109
145
|
logger.info(f"Initialized experiment tracking: {experiment_tracking['type']}")
|
110
146
|
except Exception as e:
|
111
147
|
logger.warning(f"Failed to initialize experiment tracking: {e}")
|
112
148
|
|
149
|
+
# Initialize ISA Model interface
|
150
|
+
self.isa_interface = ISAModelInterface()
|
151
|
+
|
113
152
|
# Initialize evaluators
|
114
153
|
self.llm_evaluator = LLMEvaluator(
|
115
154
|
config=self.config.to_dict(),
|
116
155
|
experiment_tracker=self.experiment_tracker
|
117
156
|
)
|
118
157
|
|
158
|
+
self.vision_evaluator = VisionEvaluator(
|
159
|
+
config=self.config.to_dict(),
|
160
|
+
experiment_tracker=self.experiment_tracker
|
161
|
+
)
|
162
|
+
|
163
|
+
self.audio_evaluator = AudioEvaluator(
|
164
|
+
config=self.config.to_dict(),
|
165
|
+
experiment_tracker=self.experiment_tracker
|
166
|
+
)
|
167
|
+
|
168
|
+
self.embedding_evaluator = EmbeddingEvaluator(
|
169
|
+
config=self.config.to_dict(),
|
170
|
+
experiment_tracker=self.experiment_tracker
|
171
|
+
)
|
172
|
+
|
119
173
|
# State tracking
|
120
174
|
self._active_evaluations: Dict[str, asyncio.Task] = {}
|
121
175
|
|
@@ -171,7 +225,7 @@ class EvaluationFactory:
|
|
171
225
|
|
172
226
|
# Run evaluation
|
173
227
|
result = await self.llm_evaluator.evaluate(
|
174
|
-
model_interface=
|
228
|
+
model_interface=self.isa_interface,
|
175
229
|
dataset=dataset,
|
176
230
|
dataset_name=dataset_name,
|
177
231
|
model_name=f"{provider}:{model_name}",
|
@@ -329,6 +383,219 @@ class EvaluationFactory:
|
|
329
383
|
|
330
384
|
return results
|
331
385
|
|
386
|
+
async def evaluate_vision(self,
|
387
|
+
dataset: List[Dict[str, Any]],
|
388
|
+
task_type: str = "ocr",
|
389
|
+
model_name: str = "gpt-4.1-mini",
|
390
|
+
save_results: bool = True,
|
391
|
+
experiment_name: Optional[str] = None) -> EvaluationResult:
|
392
|
+
"""
|
393
|
+
Evaluate vision model on image tasks.
|
394
|
+
|
395
|
+
Args:
|
396
|
+
dataset: Vision dataset with images and expected outputs
|
397
|
+
task_type: Vision task type (ocr, table, ui, vqa, caption)
|
398
|
+
model_name: Vision model name
|
399
|
+
save_results: Whether to save results
|
400
|
+
experiment_name: Custom experiment name
|
401
|
+
|
402
|
+
Returns:
|
403
|
+
Vision evaluation results
|
404
|
+
"""
|
405
|
+
# Configure vision evaluator
|
406
|
+
self.vision_evaluator.config.update({
|
407
|
+
"task_type": task_type,
|
408
|
+
"model_name": model_name
|
409
|
+
})
|
410
|
+
|
411
|
+
experiment_name = experiment_name or f"vision_{task_type}_{model_name}"
|
412
|
+
|
413
|
+
result = await self.vision_evaluator.evaluate(
|
414
|
+
model_interface=self.isa_interface,
|
415
|
+
dataset=dataset,
|
416
|
+
dataset_name=f"vision_{task_type}",
|
417
|
+
model_name=model_name
|
418
|
+
)
|
419
|
+
|
420
|
+
if save_results:
|
421
|
+
await self._save_results(result, experiment_name)
|
422
|
+
|
423
|
+
return result
|
424
|
+
|
425
|
+
async def evaluate_audio(self,
|
426
|
+
dataset: List[Dict[str, Any]],
|
427
|
+
task_type: str = "stt",
|
428
|
+
model_name: str = "isa_audio_sota_service",
|
429
|
+
save_results: bool = True,
|
430
|
+
experiment_name: Optional[str] = None) -> EvaluationResult:
|
431
|
+
"""
|
432
|
+
Evaluate audio model on speech tasks.
|
433
|
+
|
434
|
+
Args:
|
435
|
+
dataset: Audio dataset with audio files and expected outputs
|
436
|
+
task_type: Audio task type (stt, emotion, diarization)
|
437
|
+
model_name: Audio model name
|
438
|
+
save_results: Whether to save results
|
439
|
+
experiment_name: Custom experiment name
|
440
|
+
|
441
|
+
Returns:
|
442
|
+
Audio evaluation results
|
443
|
+
"""
|
444
|
+
# Configure audio evaluator
|
445
|
+
self.audio_evaluator.config.update({
|
446
|
+
"task_type": task_type,
|
447
|
+
"model_name": model_name
|
448
|
+
})
|
449
|
+
|
450
|
+
experiment_name = experiment_name or f"audio_{task_type}_{model_name}"
|
451
|
+
|
452
|
+
result = await self.audio_evaluator.evaluate(
|
453
|
+
model_interface=self.isa_interface,
|
454
|
+
dataset=dataset,
|
455
|
+
dataset_name=f"audio_{task_type}",
|
456
|
+
model_name=model_name
|
457
|
+
)
|
458
|
+
|
459
|
+
if save_results:
|
460
|
+
await self._save_results(result, experiment_name)
|
461
|
+
|
462
|
+
return result
|
463
|
+
|
464
|
+
async def evaluate_embedding(self,
|
465
|
+
dataset: List[Dict[str, Any]],
|
466
|
+
task_type: str = "similarity",
|
467
|
+
model_name: str = "text-embedding-3-small",
|
468
|
+
save_results: bool = True,
|
469
|
+
experiment_name: Optional[str] = None) -> EvaluationResult:
|
470
|
+
"""
|
471
|
+
Evaluate embedding model on semantic tasks.
|
472
|
+
|
473
|
+
Args:
|
474
|
+
dataset: Embedding dataset with text and expected outputs
|
475
|
+
task_type: Embedding task type (similarity, retrieval, reranking)
|
476
|
+
model_name: Embedding model name
|
477
|
+
save_results: Whether to save results
|
478
|
+
experiment_name: Custom experiment name
|
479
|
+
|
480
|
+
Returns:
|
481
|
+
Embedding evaluation results
|
482
|
+
"""
|
483
|
+
# Configure embedding evaluator
|
484
|
+
self.embedding_evaluator.config.update({
|
485
|
+
"task_type": task_type,
|
486
|
+
"model_name": model_name
|
487
|
+
})
|
488
|
+
|
489
|
+
experiment_name = experiment_name or f"embedding_{task_type}_{model_name}"
|
490
|
+
|
491
|
+
result = await self.embedding_evaluator.evaluate(
|
492
|
+
model_interface=self.isa_interface,
|
493
|
+
dataset=dataset,
|
494
|
+
dataset_name=f"embedding_{task_type}",
|
495
|
+
model_name=model_name
|
496
|
+
)
|
497
|
+
|
498
|
+
if save_results:
|
499
|
+
await self._save_results(result, experiment_name)
|
500
|
+
|
501
|
+
return result
|
502
|
+
|
503
|
+
async def compare_models(self,
|
504
|
+
models: List[Dict[str, str]],
|
505
|
+
dataset_path: Optional[str] = None,
|
506
|
+
dataset: Optional[List[Dict[str, Any]]] = None,
|
507
|
+
evaluator_type: str = "llm",
|
508
|
+
benchmark_name: Optional[str] = None,
|
509
|
+
metrics: Optional[List[str]] = None,
|
510
|
+
save_results: bool = True,
|
511
|
+
experiment_name: Optional[str] = None) -> Dict[str, EvaluationResult]:
|
512
|
+
"""
|
513
|
+
Compare multiple models on the same evaluation task.
|
514
|
+
|
515
|
+
Args:
|
516
|
+
models: List of model configs [{"name": "gpt-4", "provider": "openai"}, ...]
|
517
|
+
dataset_path: Path to evaluation dataset
|
518
|
+
dataset: Direct dataset input
|
519
|
+
evaluator_type: Type of evaluator (llm, vision, audio, embedding)
|
520
|
+
benchmark_name: Benchmark name (alternative to dataset)
|
521
|
+
metrics: Metrics to compute
|
522
|
+
save_results: Whether to save comparison results
|
523
|
+
experiment_name: Custom experiment name
|
524
|
+
|
525
|
+
Returns:
|
526
|
+
Dictionary mapping model names to evaluation results
|
527
|
+
"""
|
528
|
+
results = {}
|
529
|
+
|
530
|
+
# Load dataset if needed
|
531
|
+
if dataset is None and dataset_path:
|
532
|
+
dataset = self._load_dataset(dataset_path)
|
533
|
+
|
534
|
+
# Run evaluations concurrently (with concurrency limits)
|
535
|
+
semaphore = asyncio.Semaphore(self.config.max_concurrent_evaluations)
|
536
|
+
|
537
|
+
async def evaluate_single_model(model_config: Dict[str, str]) -> tuple:
|
538
|
+
async with semaphore:
|
539
|
+
model_name = model_config["name"]
|
540
|
+
provider = model_config.get("provider", "openai")
|
541
|
+
|
542
|
+
if evaluator_type == "llm":
|
543
|
+
if benchmark_name:
|
544
|
+
result = await self.run_benchmark(
|
545
|
+
model_name=model_name,
|
546
|
+
provider=provider,
|
547
|
+
benchmark_name=benchmark_name,
|
548
|
+
save_results=False
|
549
|
+
)
|
550
|
+
else:
|
551
|
+
result = await self.evaluate_llm(
|
552
|
+
model_name=model_name,
|
553
|
+
provider=provider,
|
554
|
+
dataset=dataset,
|
555
|
+
metrics=metrics,
|
556
|
+
save_results=False
|
557
|
+
)
|
558
|
+
elif evaluator_type == "vision":
|
559
|
+
result = await self.evaluate_vision(
|
560
|
+
dataset=dataset,
|
561
|
+
model_name=model_name,
|
562
|
+
save_results=False
|
563
|
+
)
|
564
|
+
elif evaluator_type == "audio":
|
565
|
+
result = await self.evaluate_audio(
|
566
|
+
dataset=dataset,
|
567
|
+
model_name=model_name,
|
568
|
+
save_results=False
|
569
|
+
)
|
570
|
+
elif evaluator_type == "embedding":
|
571
|
+
result = await self.evaluate_embedding(
|
572
|
+
dataset=dataset,
|
573
|
+
model_name=model_name,
|
574
|
+
save_results=False
|
575
|
+
)
|
576
|
+
else:
|
577
|
+
raise ValueError(f"Unknown evaluator type: {evaluator_type}")
|
578
|
+
|
579
|
+
return f"{provider}:{model_name}", result
|
580
|
+
|
581
|
+
# Execute all evaluations
|
582
|
+
tasks = [evaluate_single_model(model) for model in models]
|
583
|
+
evaluation_results = await asyncio.gather(*tasks)
|
584
|
+
|
585
|
+
# Collect results
|
586
|
+
for model_id, result in evaluation_results:
|
587
|
+
results[model_id] = result
|
588
|
+
|
589
|
+
# Generate comparison report
|
590
|
+
comparison_report = self._generate_comparison_report(results)
|
591
|
+
|
592
|
+
# Save results if requested
|
593
|
+
if save_results:
|
594
|
+
experiment_name = experiment_name or f"model_comparison_{evaluator_type}_{len(models)}_models"
|
595
|
+
await self._save_comparison_results(results, comparison_report, experiment_name)
|
596
|
+
|
597
|
+
return results
|
598
|
+
|
332
599
|
def _load_dataset(self, dataset_path: str) -> List[Dict[str, Any]]:
|
333
600
|
"""Load dataset from file."""
|
334
601
|
with open(dataset_path, 'r', encoding='utf-8') as f:
|