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
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, MultimodalEvaluator, EvaluationResult
20
- from .infrastructure import ExperimentTracker, create_experiment_tracker
21
- from .config import EvaluationConfig
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=None, # Will use AI factory
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: