scitex 2.0.0__py2.py3-none-any.whl → 2.1.0__py2.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.
- scitex/__init__.py +53 -15
- scitex/__main__.py +72 -26
- scitex/__version__.py +1 -1
- scitex/_sh.py +145 -23
- scitex/ai/__init__.py +30 -16
- scitex/ai/_gen_ai/_Anthropic.py +5 -7
- scitex/ai/_gen_ai/_BaseGenAI.py +2 -2
- scitex/ai/_gen_ai/_DeepSeek.py +10 -2
- scitex/ai/_gen_ai/_Google.py +2 -2
- scitex/ai/_gen_ai/_Llama.py +2 -2
- scitex/ai/_gen_ai/_OpenAI.py +2 -2
- scitex/ai/_gen_ai/_PARAMS.py +51 -65
- scitex/ai/_gen_ai/_Perplexity.py +2 -2
- scitex/ai/_gen_ai/__init__.py +25 -14
- scitex/ai/_gen_ai/_format_output_func.py +4 -4
- scitex/ai/classification/{classifier_server.py → Classifier.py} +5 -5
- scitex/ai/classification/CrossValidationExperiment.py +374 -0
- scitex/ai/classification/__init__.py +43 -4
- scitex/ai/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ai/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ai/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ai/classification/reporters/__init__.py +11 -0
- scitex/ai/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ai/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ai/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ai/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ai/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ai/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ai/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ai/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ai/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ai/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ai/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ai/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ai/classification/timeseries/__init__.py +39 -0
- scitex/ai/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ai/clustering/_umap.py +2 -2
- scitex/ai/feature_extraction/vit.py +1 -0
- scitex/ai/feature_selection/__init__.py +30 -0
- scitex/ai/feature_selection/feature_selection.py +364 -0
- scitex/ai/loss/multi_task_loss.py +1 -1
- scitex/ai/metrics/__init__.py +51 -4
- scitex/ai/metrics/_calc_bacc.py +61 -0
- scitex/ai/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ai/metrics/_calc_clf_report.py +78 -0
- scitex/ai/metrics/_calc_conf_mat.py +93 -0
- scitex/ai/metrics/_calc_feature_importance.py +183 -0
- scitex/ai/metrics/_calc_mcc.py +61 -0
- scitex/ai/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ai/metrics/_calc_roc_auc.py +110 -0
- scitex/ai/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ai/metrics/{silhoute_score_block.py → _calc_silhouette_score.py} +15 -8
- scitex/ai/metrics/_normalize_labels.py +83 -0
- scitex/ai/plt/__init__.py +47 -8
- scitex/ai/plt/{_conf_mat.py → _plot_conf_mat.py} +158 -87
- scitex/ai/plt/_plot_feature_importance.py +323 -0
- scitex/ai/plt/_plot_learning_curve.py +345 -0
- scitex/ai/plt/_plot_optuna_study.py +225 -0
- scitex/ai/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ai/plt/_plot_roc_curve.py +255 -0
- scitex/ai/training/{learning_curve_logger.py → _LearningCurveLogger.py} +197 -213
- scitex/ai/training/__init__.py +2 -2
- scitex/ai/utils/grid_search.py +3 -3
- scitex/benchmark/__init__.py +52 -0
- scitex/benchmark/benchmark.py +400 -0
- scitex/benchmark/monitor.py +370 -0
- scitex/benchmark/profiler.py +297 -0
- scitex/browser/__init__.py +48 -0
- scitex/browser/automation/CookieHandler.py +216 -0
- scitex/browser/automation/__init__.py +7 -0
- scitex/browser/collaboration/__init__.py +55 -0
- scitex/browser/collaboration/auth_helpers.py +94 -0
- scitex/browser/collaboration/collaborative_agent.py +136 -0
- scitex/browser/collaboration/credential_manager.py +188 -0
- scitex/browser/collaboration/interactive_panel.py +400 -0
- scitex/browser/collaboration/persistent_browser.py +170 -0
- scitex/browser/collaboration/shared_session.py +383 -0
- scitex/browser/collaboration/standard_interactions.py +246 -0
- scitex/browser/collaboration/visual_feedback.py +181 -0
- scitex/browser/core/BrowserMixin.py +326 -0
- scitex/browser/core/ChromeProfileManager.py +446 -0
- scitex/browser/core/__init__.py +9 -0
- scitex/browser/debugging/__init__.py +18 -0
- scitex/browser/debugging/_browser_logger.py +657 -0
- scitex/browser/debugging/_highlight_element.py +143 -0
- scitex/browser/debugging/_show_grid.py +154 -0
- scitex/browser/interaction/__init__.py +24 -0
- scitex/browser/interaction/click_center.py +149 -0
- scitex/browser/interaction/click_with_fallbacks.py +206 -0
- scitex/browser/interaction/close_popups.py +498 -0
- scitex/browser/interaction/fill_with_fallbacks.py +209 -0
- scitex/browser/pdf/__init__.py +14 -0
- scitex/browser/pdf/click_download_for_chrome_pdf_viewer.py +200 -0
- scitex/browser/pdf/detect_chrome_pdf_viewer.py +198 -0
- scitex/browser/remote/CaptchaHandler.py +434 -0
- scitex/browser/remote/ZenRowsAPIClient.py +347 -0
- scitex/browser/remote/ZenRowsBrowserManager.py +570 -0
- scitex/browser/remote/__init__.py +11 -0
- scitex/browser/stealth/HumanBehavior.py +344 -0
- scitex/browser/stealth/StealthManager.py +1008 -0
- scitex/browser/stealth/__init__.py +9 -0
- scitex/browser/template.py +122 -0
- scitex/capture/__init__.py +110 -0
- scitex/capture/__main__.py +25 -0
- scitex/capture/capture.py +848 -0
- scitex/capture/cli.py +233 -0
- scitex/capture/gif.py +344 -0
- scitex/capture/mcp_server.py +961 -0
- scitex/capture/session.py +70 -0
- scitex/capture/utils.py +705 -0
- scitex/cli/__init__.py +17 -0
- scitex/cli/cloud.py +447 -0
- scitex/cli/main.py +42 -0
- scitex/cli/scholar.py +280 -0
- scitex/context/_suppress_output.py +5 -3
- scitex/db/__init__.py +30 -3
- scitex/db/__main__.py +75 -0
- scitex/db/_check_health.py +381 -0
- scitex/db/_delete_duplicates.py +25 -386
- scitex/db/_inspect.py +335 -114
- scitex/db/_inspect_optimized.py +301 -0
- scitex/db/{_PostgreSQL.py → _postgresql/_PostgreSQL.py} +3 -3
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BackupMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BatchMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_BlobMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ConnectionMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_MaintenanceMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_QueryMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_SchemaMixin.py +1 -1
- scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TransactionMixin.py +1 -1
- scitex/db/_postgresql/__init__.py +6 -0
- scitex/db/_sqlite3/_SQLite3.py +210 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin.py +581 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ArrayMixin_v01-need-_hash-col.py +517 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_BatchMixin.py +1 -1
- scitex/db/_sqlite3/_SQLite3Mixins/_BlobMixin.py +281 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin.py +548 -0
- scitex/db/_sqlite3/_SQLite3Mixins/_ColumnMixin_v01-indentation-issues.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ConnectionMixin.py +29 -13
- scitex/db/_sqlite3/_SQLite3Mixins/_GitMixin.py +583 -0
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_ImportExportMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_IndexMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_MaintenanceMixin.py +2 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_QueryMixin.py +37 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_RowMixin.py +46 -6
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TableMixin.py +56 -10
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/_TransactionMixin.py +1 -1
- scitex/db/{_SQLite3Mixins → _sqlite3/_SQLite3Mixins}/__init__.py +14 -2
- scitex/db/_sqlite3/__init__.py +7 -0
- scitex/db/_sqlite3/_delete_duplicates.py +274 -0
- scitex/decorators/__init__.py +2 -0
- scitex/decorators/_cache_disk.py +13 -5
- scitex/decorators/_cache_disk_async.py +49 -0
- scitex/decorators/_deprecated.py +175 -10
- scitex/decorators/_timeout.py +1 -1
- scitex/dev/_analyze_code_flow.py +2 -2
- scitex/dict/_DotDict.py +73 -15
- scitex/dict/_DotDict_v01-not-handling-recursive-instantiations.py +442 -0
- scitex/dict/_DotDict_v02-not-serializing-Path-object.py +446 -0
- scitex/dict/__init__.py +2 -0
- scitex/dict/_flatten.py +27 -0
- scitex/dsp/_crop.py +2 -2
- scitex/dsp/_demo_sig.py +2 -2
- scitex/dsp/_detect_ripples.py +2 -2
- scitex/dsp/_hilbert.py +2 -2
- scitex/dsp/_listen.py +6 -6
- scitex/dsp/_modulation_index.py +2 -2
- scitex/dsp/_pac.py +1 -1
- scitex/dsp/_psd.py +2 -2
- scitex/dsp/_resample.py +2 -1
- scitex/dsp/_time.py +3 -2
- scitex/dsp/_wavelet.py +3 -2
- scitex/dsp/add_noise.py +2 -2
- scitex/dsp/example.py +1 -0
- scitex/dsp/filt.py +10 -9
- scitex/dsp/template.py +3 -2
- scitex/dsp/utils/_differential_bandpass_filters.py +1 -1
- scitex/dsp/utils/pac.py +2 -2
- scitex/dt/_normalize_timestamp.py +432 -0
- scitex/errors.py +572 -0
- scitex/gen/_DimHandler.py +2 -2
- scitex/gen/__init__.py +37 -7
- scitex/gen/_deprecated_close.py +80 -0
- scitex/gen/_deprecated_start.py +26 -0
- scitex/gen/_detect_environment.py +152 -0
- scitex/gen/_detect_notebook_path.py +169 -0
- scitex/gen/_embed.py +6 -2
- scitex/gen/_get_notebook_path.py +257 -0
- scitex/gen/_less.py +1 -1
- scitex/gen/_list_packages.py +2 -2
- scitex/gen/_norm.py +44 -9
- scitex/gen/_norm_cache.py +269 -0
- scitex/gen/_src.py +3 -5
- scitex/gen/_title_case.py +3 -3
- scitex/io/__init__.py +28 -6
- scitex/io/_glob.py +13 -7
- scitex/io/_load.py +108 -21
- scitex/io/_load_cache.py +303 -0
- scitex/io/_load_configs.py +40 -15
- scitex/io/{_H5Explorer.py → _load_modules/_H5Explorer.py} +80 -17
- scitex/io/_load_modules/_ZarrExplorer.py +114 -0
- scitex/io/_load_modules/_bibtex.py +207 -0
- scitex/io/_load_modules/_hdf5.py +53 -178
- scitex/io/_load_modules/_json.py +5 -3
- scitex/io/_load_modules/_pdf.py +871 -16
- scitex/io/_load_modules/_sqlite3.py +15 -0
- scitex/io/_load_modules/_txt.py +41 -12
- scitex/io/_load_modules/_yaml.py +4 -3
- scitex/io/_load_modules/_zarr.py +126 -0
- scitex/io/_save.py +429 -171
- scitex/io/_save_modules/__init__.py +6 -0
- scitex/io/_save_modules/_bibtex.py +194 -0
- scitex/io/_save_modules/_csv.py +8 -4
- scitex/io/_save_modules/_excel.py +174 -15
- scitex/io/_save_modules/_hdf5.py +251 -226
- scitex/io/_save_modules/_image.py +1 -3
- scitex/io/_save_modules/_json.py +49 -4
- scitex/io/_save_modules/_listed_dfs_as_csv.py +1 -3
- scitex/io/_save_modules/_listed_scalars_as_csv.py +1 -3
- scitex/io/_save_modules/_tex.py +277 -0
- scitex/io/_save_modules/_yaml.py +42 -3
- scitex/io/_save_modules/_zarr.py +160 -0
- scitex/io/utils/__init__.py +20 -0
- scitex/io/utils/h5_to_zarr.py +616 -0
- scitex/linalg/_geometric_median.py +6 -2
- scitex/{gen/_tee.py → logging/_Tee.py} +43 -84
- scitex/logging/__init__.py +122 -0
- scitex/logging/_config.py +158 -0
- scitex/logging/_context.py +103 -0
- scitex/logging/_formatters.py +128 -0
- scitex/logging/_handlers.py +64 -0
- scitex/logging/_levels.py +35 -0
- scitex/logging/_logger.py +163 -0
- scitex/logging/_print_capture.py +95 -0
- scitex/ml/__init__.py +69 -0
- scitex/{ai/genai/anthropic.py → ml/_gen_ai/_Anthropic.py} +13 -19
- scitex/{ai/genai/base_genai.py → ml/_gen_ai/_BaseGenAI.py} +5 -5
- scitex/{ai/genai/deepseek.py → ml/_gen_ai/_DeepSeek.py} +11 -16
- scitex/{ai/genai/google.py → ml/_gen_ai/_Google.py} +7 -15
- scitex/{ai/genai/groq.py → ml/_gen_ai/_Groq.py} +1 -8
- scitex/{ai/genai/llama.py → ml/_gen_ai/_Llama.py} +3 -16
- scitex/{ai/genai/openai.py → ml/_gen_ai/_OpenAI.py} +3 -3
- scitex/{ai/genai/params.py → ml/_gen_ai/_PARAMS.py} +51 -65
- scitex/{ai/genai/perplexity.py → ml/_gen_ai/_Perplexity.py} +3 -14
- scitex/ml/_gen_ai/__init__.py +43 -0
- scitex/{ai/genai/calc_cost.py → ml/_gen_ai/_calc_cost.py} +1 -1
- scitex/{ai/genai/format_output_func.py → ml/_gen_ai/_format_output_func.py} +4 -4
- scitex/{ai/genai/genai_factory.py → ml/_gen_ai/_genai_factory.py} +8 -8
- scitex/ml/activation/__init__.py +8 -0
- scitex/ml/activation/_define.py +11 -0
- scitex/{ai/classifier_server.py → ml/classification/Classifier.py} +5 -5
- scitex/ml/classification/CrossValidationExperiment.py +374 -0
- scitex/ml/classification/__init__.py +46 -0
- scitex/ml/classification/reporters/_BaseClassificationReporter.py +281 -0
- scitex/ml/classification/reporters/_ClassificationReporter.py +773 -0
- scitex/ml/classification/reporters/_MultiClassificationReporter.py +406 -0
- scitex/ml/classification/reporters/_SingleClassificationReporter.py +1834 -0
- scitex/ml/classification/reporters/__init__.py +11 -0
- scitex/ml/classification/reporters/reporter_utils/_Plotter.py +1028 -0
- scitex/ml/classification/reporters/reporter_utils/__init__.py +80 -0
- scitex/ml/classification/reporters/reporter_utils/aggregation.py +457 -0
- scitex/ml/classification/reporters/reporter_utils/data_models.py +313 -0
- scitex/ml/classification/reporters/reporter_utils/reporting.py +1056 -0
- scitex/ml/classification/reporters/reporter_utils/storage.py +221 -0
- scitex/ml/classification/reporters/reporter_utils/validation.py +395 -0
- scitex/ml/classification/timeseries/_TimeSeriesBlockingSplit.py +568 -0
- scitex/ml/classification/timeseries/_TimeSeriesCalendarSplit.py +688 -0
- scitex/ml/classification/timeseries/_TimeSeriesMetadata.py +139 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +1716 -0
- scitex/ml/classification/timeseries/_TimeSeriesSlidingWindowSplit_v01-not-using-n_splits.py +1685 -0
- scitex/ml/classification/timeseries/_TimeSeriesStrategy.py +84 -0
- scitex/ml/classification/timeseries/_TimeSeriesStratifiedSplit.py +610 -0
- scitex/ml/classification/timeseries/__init__.py +39 -0
- scitex/ml/classification/timeseries/_normalize_timestamp.py +436 -0
- scitex/ml/clustering/__init__.py +11 -0
- scitex/ml/clustering/_pca.py +115 -0
- scitex/ml/clustering/_umap.py +376 -0
- scitex/ml/feature_extraction/__init__.py +56 -0
- scitex/ml/feature_extraction/vit.py +149 -0
- scitex/ml/feature_selection/__init__.py +30 -0
- scitex/ml/feature_selection/feature_selection.py +364 -0
- scitex/ml/loss/_L1L2Losses.py +34 -0
- scitex/ml/loss/__init__.py +12 -0
- scitex/ml/loss/multi_task_loss.py +47 -0
- scitex/ml/metrics/__init__.py +56 -0
- scitex/ml/metrics/_calc_bacc.py +61 -0
- scitex/ml/metrics/_calc_bacc_from_conf_mat.py +38 -0
- scitex/ml/metrics/_calc_clf_report.py +78 -0
- scitex/ml/metrics/_calc_conf_mat.py +93 -0
- scitex/ml/metrics/_calc_feature_importance.py +183 -0
- scitex/ml/metrics/_calc_mcc.py +61 -0
- scitex/ml/metrics/_calc_pre_rec_auc.py +116 -0
- scitex/ml/metrics/_calc_roc_auc.py +110 -0
- scitex/ml/metrics/_calc_seizure_prediction_metrics.py +490 -0
- scitex/ml/metrics/_calc_silhouette_score.py +503 -0
- scitex/ml/metrics/_normalize_labels.py +83 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ml/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ml/optim/__init__.py +13 -0
- scitex/ml/optim/_get_set.py +31 -0
- scitex/ml/optim/_optimizers.py +71 -0
- scitex/ml/plt/__init__.py +60 -0
- scitex/ml/plt/_plot_conf_mat.py +663 -0
- scitex/ml/plt/_plot_feature_importance.py +323 -0
- scitex/ml/plt/_plot_learning_curve.py +345 -0
- scitex/ml/plt/_plot_optuna_study.py +225 -0
- scitex/ml/plt/_plot_pre_rec_curve.py +290 -0
- scitex/ml/plt/_plot_roc_curve.py +255 -0
- scitex/ml/sk/__init__.py +11 -0
- scitex/ml/sk/_clf.py +58 -0
- scitex/ml/sk/_to_sktime.py +100 -0
- scitex/ml/sklearn/__init__.py +26 -0
- scitex/ml/sklearn/clf.py +58 -0
- scitex/ml/sklearn/to_sktime.py +100 -0
- scitex/{ai/training/early_stopping.py → ml/training/_EarlyStopping.py} +1 -2
- scitex/{ai → ml/training}/_LearningCurveLogger.py +198 -242
- scitex/ml/training/__init__.py +7 -0
- scitex/ml/utils/__init__.py +22 -0
- scitex/ml/utils/_check_params.py +50 -0
- scitex/ml/utils/_default_dataset.py +46 -0
- scitex/ml/utils/_format_samples_for_sktime.py +26 -0
- scitex/ml/utils/_label_encoder.py +134 -0
- scitex/ml/utils/_merge_labels.py +22 -0
- scitex/ml/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ml/utils/_under_sample.py +51 -0
- scitex/ml/utils/_verify_n_gpus.py +16 -0
- scitex/ml/utils/grid_search.py +148 -0
- scitex/nn/_BNet.py +15 -9
- scitex/nn/_Filters.py +2 -2
- scitex/nn/_ModulationIndex.py +2 -2
- scitex/nn/_PAC.py +1 -1
- scitex/nn/_Spectrogram.py +12 -3
- scitex/nn/__init__.py +9 -10
- scitex/path/__init__.py +18 -0
- scitex/path/_clean.py +4 -0
- scitex/path/_find.py +9 -4
- scitex/path/_symlink.py +348 -0
- scitex/path/_version.py +4 -3
- scitex/pd/__init__.py +2 -0
- scitex/pd/_get_unique.py +99 -0
- scitex/plt/__init__.py +114 -5
- scitex/plt/_subplots/_AxesWrapper.py +1 -3
- scitex/plt/_subplots/_AxisWrapper.py +7 -3
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +47 -13
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +160 -2
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +26 -4
- scitex/plt/_subplots/_AxisWrapperMixins/_UnitAwareMixin.py +322 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +1 -0
- scitex/plt/_subplots/_FigWrapper.py +62 -6
- scitex/plt/_subplots/_export_as_csv.py +43 -27
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +5 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_annotate.py +81 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +20 -5
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +35 -18
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +15 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter.py +35 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +6 -4
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_text.py +60 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +1 -3
- scitex/plt/_subplots/_export_as_csv_formatters.py +56 -59
- scitex/plt/ax/_style/_hide_spines.py +1 -3
- scitex/plt/ax/_style/_rotate_labels.py +180 -76
- scitex/plt/ax/_style/_rotate_labels_v01.py +248 -0
- scitex/plt/ax/_style/_set_meta.py +11 -4
- scitex/plt/ax/_style/_set_supxyt.py +3 -3
- scitex/plt/ax/_style/_set_xyt.py +3 -3
- scitex/plt/ax/_style/_share_axes.py +2 -2
- scitex/plt/color/__init__.py +4 -4
- scitex/plt/color/{_get_colors_from_cmap.py → _get_colors_from_conf_matap.py} +7 -7
- scitex/plt/utils/_configure_mpl.py +99 -86
- scitex/plt/utils/_histogram_utils.py +1 -3
- scitex/plt/utils/_is_valid_axis.py +1 -3
- scitex/plt/utils/_scitex_config.py +1 -0
- scitex/repro/__init__.py +75 -0
- scitex/{reproduce → repro}/_gen_ID.py +1 -1
- scitex/{reproduce → repro}/_gen_timestamp.py +1 -1
- scitex/repro_rng/_RandomStateManager.py +590 -0
- scitex/repro_rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/repro_rng/__init__.py +39 -0
- scitex/reproduce/__init__.py +25 -13
- scitex/reproduce/_hash_array.py +22 -0
- scitex/resource/_get_processor_usages.py +4 -4
- scitex/resource/_get_specs.py +2 -2
- scitex/resource/_log_processor_usages.py +2 -2
- scitex/rng/_RandomStateManager.py +590 -0
- scitex/rng/_RandomStateManager_v01-no-verbose-options.py +414 -0
- scitex/rng/__init__.py +39 -0
- scitex/scholar/__init__.py +309 -19
- scitex/scholar/__main__.py +319 -0
- scitex/scholar/auth/ScholarAuthManager.py +308 -0
- scitex/scholar/auth/__init__.py +12 -0
- scitex/scholar/auth/core/AuthenticationGateway.py +473 -0
- scitex/scholar/auth/core/BrowserAuthenticator.py +386 -0
- scitex/scholar/auth/core/StrategyResolver.py +309 -0
- scitex/scholar/auth/core/__init__.py +16 -0
- scitex/scholar/auth/gateway/_OpenURLLinkFinder.py +120 -0
- scitex/scholar/auth/gateway/_OpenURLResolver.py +209 -0
- scitex/scholar/auth/gateway/__init__.py +38 -0
- scitex/scholar/auth/gateway/_resolve_functions.py +101 -0
- scitex/scholar/auth/providers/BaseAuthenticator.py +166 -0
- scitex/scholar/auth/providers/EZProxyAuthenticator.py +484 -0
- scitex/scholar/auth/providers/OpenAthensAuthenticator.py +619 -0
- scitex/scholar/auth/providers/ShibbolethAuthenticator.py +686 -0
- scitex/scholar/auth/providers/__init__.py +18 -0
- scitex/scholar/auth/session/AuthCacheManager.py +189 -0
- scitex/scholar/auth/session/SessionManager.py +159 -0
- scitex/scholar/auth/session/__init__.py +11 -0
- scitex/scholar/auth/sso/BaseSSOAutomator.py +373 -0
- scitex/scholar/auth/sso/OpenAthensSSOAutomator.py +378 -0
- scitex/scholar/auth/sso/SSOAutomator.py +180 -0
- scitex/scholar/auth/sso/UniversityOfMelbourneSSOAutomator.py +380 -0
- scitex/scholar/auth/sso/__init__.py +15 -0
- scitex/scholar/browser/ScholarBrowserManager.py +705 -0
- scitex/scholar/browser/__init__.py +38 -0
- scitex/scholar/browser/utils/__init__.py +13 -0
- scitex/scholar/browser/utils/click_and_wait.py +205 -0
- scitex/scholar/browser/utils/close_unwanted_pages.py +140 -0
- scitex/scholar/browser/utils/wait_redirects.py +732 -0
- scitex/scholar/config/PublisherRules.py +132 -0
- scitex/scholar/config/ScholarConfig.py +126 -0
- scitex/scholar/config/__init__.py +17 -0
- scitex/scholar/core/Paper.py +627 -0
- scitex/scholar/core/Papers.py +722 -0
- scitex/scholar/core/Scholar.py +1975 -0
- scitex/scholar/core/__init__.py +9 -0
- scitex/scholar/impact_factor/ImpactFactorEngine.py +204 -0
- scitex/scholar/impact_factor/__init__.py +20 -0
- scitex/scholar/impact_factor/estimation/ImpactFactorEstimationEngine.py +0 -0
- scitex/scholar/impact_factor/estimation/__init__.py +40 -0
- scitex/scholar/impact_factor/estimation/build_database.py +0 -0
- scitex/scholar/impact_factor/estimation/core/__init__.py +28 -0
- scitex/scholar/impact_factor/estimation/core/cache_manager.py +523 -0
- scitex/scholar/impact_factor/estimation/core/calculator.py +355 -0
- scitex/scholar/impact_factor/estimation/core/journal_matcher.py +428 -0
- scitex/scholar/integration/__init__.py +59 -0
- scitex/scholar/integration/base.py +502 -0
- scitex/scholar/integration/mendeley/__init__.py +22 -0
- scitex/scholar/integration/mendeley/exporter.py +166 -0
- scitex/scholar/integration/mendeley/importer.py +236 -0
- scitex/scholar/integration/mendeley/linker.py +79 -0
- scitex/scholar/integration/mendeley/mapper.py +212 -0
- scitex/scholar/integration/zotero/__init__.py +27 -0
- scitex/scholar/integration/zotero/__main__.py +264 -0
- scitex/scholar/integration/zotero/exporter.py +351 -0
- scitex/scholar/integration/zotero/importer.py +372 -0
- scitex/scholar/integration/zotero/linker.py +415 -0
- scitex/scholar/integration/zotero/mapper.py +286 -0
- scitex/scholar/metadata_engines/ScholarEngine.py +588 -0
- scitex/scholar/metadata_engines/__init__.py +21 -0
- scitex/scholar/metadata_engines/individual/ArXivEngine.py +397 -0
- scitex/scholar/metadata_engines/individual/CrossRefEngine.py +274 -0
- scitex/scholar/metadata_engines/individual/CrossRefLocalEngine.py +263 -0
- scitex/scholar/metadata_engines/individual/OpenAlexEngine.py +350 -0
- scitex/scholar/metadata_engines/individual/PubMedEngine.py +329 -0
- scitex/scholar/metadata_engines/individual/SemanticScholarEngine.py +438 -0
- scitex/scholar/metadata_engines/individual/URLDOIEngine.py +410 -0
- scitex/scholar/metadata_engines/individual/_BaseDOIEngine.py +487 -0
- scitex/scholar/metadata_engines/individual/__init__.py +7 -0
- scitex/scholar/metadata_engines/utils/_PubMedConverter.py +469 -0
- scitex/scholar/metadata_engines/utils/_URLDOIExtractor.py +283 -0
- scitex/scholar/metadata_engines/utils/__init__.py +30 -0
- scitex/scholar/metadata_engines/utils/_metadata2bibtex.py +103 -0
- scitex/scholar/metadata_engines/utils/_standardize_metadata.py +376 -0
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +579 -0
- scitex/scholar/pdf_download/__init__.py +5 -0
- scitex/scholar/pdf_download/strategies/__init__.py +38 -0
- scitex/scholar/pdf_download/strategies/chrome_pdf_viewer.py +376 -0
- scitex/scholar/pdf_download/strategies/direct_download.py +131 -0
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +167 -0
- scitex/scholar/pdf_download/strategies/manual_download_utils.py +996 -0
- scitex/scholar/pdf_download/strategies/response_body.py +207 -0
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +364 -0
- scitex/scholar/pipelines/ScholarPipelineParallel.py +478 -0
- scitex/scholar/pipelines/ScholarPipelineSingle.py +767 -0
- scitex/scholar/pipelines/__init__.py +49 -0
- scitex/scholar/storage/BibTeXHandler.py +1018 -0
- scitex/scholar/storage/PaperIO.py +468 -0
- scitex/scholar/storage/ScholarLibrary.py +182 -0
- scitex/scholar/storage/_DeduplicationManager.py +548 -0
- scitex/scholar/storage/_LibraryCacheManager.py +724 -0
- scitex/scholar/storage/_LibraryManager.py +1835 -0
- scitex/scholar/storage/__init__.py +28 -0
- scitex/scholar/url_finder/ScholarURLFinder.py +379 -0
- scitex/scholar/url_finder/__init__.py +7 -0
- scitex/scholar/url_finder/strategies/__init__.py +33 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_direct_links.py +261 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_dropdown.py +67 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_href.py +204 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_navigation.py +256 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_publisher_patterns.py +165 -0
- scitex/scholar/url_finder/strategies/find_pdf_urls_by_zotero_translators.py +163 -0
- scitex/scholar/url_finder/strategies/find_supplementary_urls_by_href.py +70 -0
- scitex/scholar/utils/__init__.py +22 -0
- scitex/scholar/utils/bibtex/__init__.py +9 -0
- scitex/scholar/utils/bibtex/_parse_bibtex.py +71 -0
- scitex/scholar/utils/cleanup/__init__.py +8 -0
- scitex/scholar/utils/cleanup/_cleanup_scholar_processes.py +96 -0
- scitex/scholar/utils/cleanup/cleanup_old_extractions.py +117 -0
- scitex/scholar/utils/text/_TextNormalizer.py +407 -0
- scitex/scholar/utils/text/__init__.py +9 -0
- scitex/scholar/zotero/__init__.py +38 -0
- scitex/session/__init__.py +51 -0
- scitex/session/_lifecycle.py +736 -0
- scitex/session/_manager.py +102 -0
- scitex/session/template.py +122 -0
- scitex/stats/__init__.py +30 -26
- scitex/stats/correct/__init__.py +21 -0
- scitex/stats/correct/_correct_bonferroni.py +551 -0
- scitex/stats/correct/_correct_fdr.py +634 -0
- scitex/stats/correct/_correct_holm.py +548 -0
- scitex/stats/correct/_correct_sidak.py +499 -0
- scitex/stats/descriptive/__init__.py +85 -0
- scitex/stats/descriptive/_circular.py +540 -0
- scitex/stats/descriptive/_describe.py +219 -0
- scitex/stats/descriptive/_nan.py +518 -0
- scitex/stats/descriptive/_real.py +189 -0
- scitex/stats/effect_sizes/__init__.py +41 -0
- scitex/stats/effect_sizes/_cliffs_delta.py +325 -0
- scitex/stats/effect_sizes/_cohens_d.py +342 -0
- scitex/stats/effect_sizes/_epsilon_squared.py +315 -0
- scitex/stats/effect_sizes/_eta_squared.py +302 -0
- scitex/stats/effect_sizes/_prob_superiority.py +296 -0
- scitex/stats/posthoc/__init__.py +19 -0
- scitex/stats/posthoc/_dunnett.py +463 -0
- scitex/stats/posthoc/_games_howell.py +383 -0
- scitex/stats/posthoc/_tukey_hsd.py +367 -0
- scitex/stats/power/__init__.py +19 -0
- scitex/stats/power/_power.py +433 -0
- scitex/stats/template.py +119 -0
- scitex/stats/utils/__init__.py +62 -0
- scitex/stats/utils/_effect_size.py +985 -0
- scitex/stats/utils/_formatters.py +270 -0
- scitex/stats/utils/_normalizers.py +927 -0
- scitex/stats/utils/_power.py +433 -0
- scitex/stats_v01/_EffectSizeCalculator.py +488 -0
- scitex/stats_v01/_StatisticalValidator.py +411 -0
- scitex/stats_v01/__init__.py +60 -0
- scitex/stats_v01/_additional_tests.py +415 -0
- scitex/{stats → stats_v01}/_p2stars.py +19 -5
- scitex/stats_v01/_two_sample_tests.py +141 -0
- scitex/stats_v01/desc/__init__.py +83 -0
- scitex/stats_v01/desc/_circular.py +540 -0
- scitex/stats_v01/desc/_describe.py +219 -0
- scitex/stats_v01/desc/_nan.py +518 -0
- scitex/{stats/desc/_nan.py → stats_v01/desc/_nan_v01-20250920_145731.py} +23 -12
- scitex/stats_v01/desc/_real.py +189 -0
- scitex/stats_v01/tests/__corr_test_optimized.py +221 -0
- scitex/stats_v01/tests/_corr_test_optimized.py +179 -0
- scitex/str/__init__.py +1 -3
- scitex/str/_clean_path.py +6 -2
- scitex/str/_latex_fallback.py +267 -160
- scitex/str/_parse.py +44 -36
- scitex/str/_printc.py +1 -3
- scitex/template/__init__.py +87 -0
- scitex/template/_create_project.py +267 -0
- scitex/template/create_pip_project.py +80 -0
- scitex/template/create_research.py +80 -0
- scitex/template/create_singularity.py +80 -0
- scitex/units.py +291 -0
- scitex/utils/_compress_hdf5.py +14 -3
- scitex/utils/_email.py +21 -2
- scitex/utils/_grid.py +6 -4
- scitex/utils/_notify.py +13 -10
- scitex/utils/_verify_scitex_format.py +589 -0
- scitex/utils/_verify_scitex_format_v01.py +370 -0
- scitex/utils/template.py +122 -0
- scitex/web/_search_pubmed.py +62 -16
- scitex-2.1.0.dist-info/LICENSE +21 -0
- scitex-2.1.0.dist-info/METADATA +677 -0
- scitex-2.1.0.dist-info/RECORD +919 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/WHEEL +1 -1
- scitex-2.1.0.dist-info/entry_points.txt +3 -0
- scitex/ai/__Classifiers.py +0 -101
- scitex/ai/classification/classification_reporter.py +0 -1137
- scitex/ai/classification/classifiers.py +0 -101
- scitex/ai/classification_reporter.py +0 -1161
- scitex/ai/genai/__init__.py +0 -277
- scitex/ai/genai/anthropic_provider.py +0 -320
- scitex/ai/genai/anthropic_refactored.py +0 -109
- scitex/ai/genai/auth_manager.py +0 -200
- scitex/ai/genai/base_provider.py +0 -291
- scitex/ai/genai/chat_history.py +0 -307
- scitex/ai/genai/cost_tracker.py +0 -276
- scitex/ai/genai/deepseek_provider.py +0 -251
- scitex/ai/genai/google_provider.py +0 -228
- scitex/ai/genai/groq_provider.py +0 -248
- scitex/ai/genai/image_processor.py +0 -250
- scitex/ai/genai/llama_provider.py +0 -214
- scitex/ai/genai/mock_provider.py +0 -127
- scitex/ai/genai/model_registry.py +0 -304
- scitex/ai/genai/openai_provider.py +0 -293
- scitex/ai/genai/perplexity_provider.py +0 -205
- scitex/ai/genai/provider_base.py +0 -302
- scitex/ai/genai/provider_factory.py +0 -370
- scitex/ai/genai/response_handler.py +0 -235
- scitex/ai/layer/_Pass.py +0 -21
- scitex/ai/layer/__init__.py +0 -10
- scitex/ai/layer/_switch.py +0 -8
- scitex/ai/metrics/_bACC.py +0 -51
- scitex/ai/plt/_learning_curve.py +0 -194
- scitex/ai/plt/_optuna_study.py +0 -111
- scitex/ai/plt/aucs/__init__.py +0 -2
- scitex/ai/plt/aucs/example.py +0 -60
- scitex/ai/plt/aucs/pre_rec_auc.py +0 -223
- scitex/ai/plt/aucs/roc_auc.py +0 -246
- scitex/ai/sampling/undersample.py +0 -29
- scitex/db/_SQLite3.py +0 -2136
- scitex/db/_SQLite3Mixins/_BlobMixin.py +0 -229
- scitex/gen/_close.py +0 -222
- scitex/gen/_start.py +0 -451
- scitex/general/__init__.py +0 -5
- scitex/io/_load_modules/_db.py +0 -24
- scitex/life/__init__.py +0 -10
- scitex/life/_monitor_rain.py +0 -49
- scitex/reproduce/_fix_seeds.py +0 -45
- scitex/res/__init__.py +0 -5
- scitex/scholar/_local_search.py +0 -454
- scitex/scholar/_paper.py +0 -244
- scitex/scholar/_pdf_downloader.py +0 -325
- scitex/scholar/_search.py +0 -393
- scitex/scholar/_vector_search.py +0 -370
- scitex/scholar/_web_sources.py +0 -457
- scitex/stats/desc/__init__.py +0 -40
- scitex-2.0.0.dist-info/METADATA +0 -307
- scitex-2.0.0.dist-info/RECORD +0 -572
- scitex-2.0.0.dist-info/licenses/LICENSE +0 -7
- /scitex/ai/{act → activation}/__init__.py +0 -0
- /scitex/ai/{act → activation}/_define.py +0 -0
- /scitex/ai/{early_stopping.py → training/_EarlyStopping.py} +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_ImportExportMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_IndexMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_RowMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/_TableMixin.py +0 -0
- /scitex/db/{_PostgreSQLMixins → _postgresql/_PostgreSQLMixins}/__init__.py +0 -0
- /scitex/{stats → stats_v01}/_calc_partial_corr.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/_corr_test_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_describe_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_multiple_corrections.py +0 -0
- /scitex/{stats → stats_v01}/_nan_stats.py +0 -0
- /scitex/{stats → stats_v01}/_p2stars_wrapper.py +0 -0
- /scitex/{stats → stats_v01}/_statistical_tests.py +0 -0
- /scitex/{stats/desc/_describe.py → stats_v01/desc/_describe_v01-20250920_145731.py} +0 -0
- /scitex/{stats/desc/_real.py → stats_v01/desc/_real_v01-20250920_145731.py} +0 -0
- /scitex/{stats → stats_v01}/multiple/__init__.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_bonferroni_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_fdr_correction.py +0 -0
- /scitex/{stats → stats_v01}/multiple/_multicompair.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_multi.py +0 -0
- /scitex/{stats → stats_v01}/tests/__corr_test_single.py +0 -0
- /scitex/{stats → stats_v01}/tests/__init__.py +0 -0
- /scitex/{stats → stats_v01}/tests/_brunner_munzel_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_nocorrelation_test.py +0 -0
- /scitex/{stats → stats_v01}/tests/_smirnov_grubbs.py +0 -0
- {scitex-2.0.0.dist-info → scitex-2.1.0.dist-info}/top_level.txt +0 -0
scitex/ai/genai/provider_base.py
DELETED
|
@@ -1,302 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
# Time-stamp: "2024-11-15 12:00:00"
|
|
4
|
-
# Author: Yusuke Watanabe (ywatanabe@alumni.u-tokyo.ac.jp)
|
|
5
|
-
|
|
6
|
-
"""
|
|
7
|
-
Provider base implementation using composition pattern.
|
|
8
|
-
|
|
9
|
-
This module provides the concrete base class that combines all components
|
|
10
|
-
to implement the provider interface.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
import warnings
|
|
14
|
-
from dataclasses import dataclass
|
|
15
|
-
from typing import Any, Dict, Iterator, List, Optional, Union
|
|
16
|
-
|
|
17
|
-
from .auth_manager import AuthManager
|
|
18
|
-
from .base_provider import BaseProvider
|
|
19
|
-
from .chat_history import ChatHistory
|
|
20
|
-
from .cost_tracker import CostTracker, TokenUsage
|
|
21
|
-
from .image_processor import ImageProcessor
|
|
22
|
-
from .model_registry import ModelInfo, ModelRegistry
|
|
23
|
-
from .response_handler import ResponseHandler
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
@dataclass
|
|
27
|
-
class ProviderConfig:
|
|
28
|
-
"""Configuration for provider initialization."""
|
|
29
|
-
|
|
30
|
-
api_key: Optional[str] = None
|
|
31
|
-
model: str = "gpt-3.5-turbo"
|
|
32
|
-
system_prompt: Optional[str] = None
|
|
33
|
-
stream: bool = False
|
|
34
|
-
seed: Optional[int] = None
|
|
35
|
-
max_tokens: Optional[int] = None
|
|
36
|
-
temperature: float = 0.0
|
|
37
|
-
n_draft: int = 1
|
|
38
|
-
kwargs: Optional[Dict[str, Any]] = None
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class ProviderBase(BaseProvider):
|
|
42
|
-
"""
|
|
43
|
-
Base implementation using composition pattern.
|
|
44
|
-
|
|
45
|
-
This class combines all components to provide a complete implementation
|
|
46
|
-
of the provider interface. Concrete providers should inherit from this
|
|
47
|
-
class and implement provider-specific methods.
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
def __init__(
|
|
51
|
-
self,
|
|
52
|
-
provider_name: str,
|
|
53
|
-
config: ProviderConfig,
|
|
54
|
-
auth_manager: Optional[AuthManager] = None,
|
|
55
|
-
model_registry: Optional[ModelRegistry] = None,
|
|
56
|
-
chat_history: Optional[ChatHistory] = None,
|
|
57
|
-
cost_tracker: Optional[CostTracker] = None,
|
|
58
|
-
response_handler: Optional[ResponseHandler] = None,
|
|
59
|
-
image_processor: Optional[ImageProcessor] = None,
|
|
60
|
-
):
|
|
61
|
-
"""Initialize provider with components."""
|
|
62
|
-
self.provider_name = provider_name
|
|
63
|
-
self.config = config
|
|
64
|
-
|
|
65
|
-
# Initialize components
|
|
66
|
-
self.auth_manager = auth_manager or AuthManager()
|
|
67
|
-
self.model_registry = model_registry or ModelRegistry()
|
|
68
|
-
self.chat_history = chat_history or ChatHistory()
|
|
69
|
-
self.cost_tracker = cost_tracker or CostTracker()
|
|
70
|
-
self.response_handler = response_handler or ResponseHandler()
|
|
71
|
-
self.image_processor = image_processor or ImageProcessor()
|
|
72
|
-
|
|
73
|
-
# Get and validate API key
|
|
74
|
-
self.api_key = self.auth_manager.get_api_key(provider_name, config.api_key)
|
|
75
|
-
|
|
76
|
-
# Initialize provider-specific attributes
|
|
77
|
-
self.model = config.model
|
|
78
|
-
self.system_prompt = config.system_prompt
|
|
79
|
-
self.stream = config.stream
|
|
80
|
-
self.seed = config.seed
|
|
81
|
-
self.max_tokens = config.max_tokens
|
|
82
|
-
self.temperature = config.temperature
|
|
83
|
-
self.n_draft = config.n_draft
|
|
84
|
-
self.kwargs = config.kwargs or {}
|
|
85
|
-
|
|
86
|
-
# Get model info
|
|
87
|
-
self.model_info = self._get_model_info()
|
|
88
|
-
|
|
89
|
-
def _get_model_info(self) -> ModelInfo:
|
|
90
|
-
"""Get model information from registry."""
|
|
91
|
-
model_info = self.model_registry.get_model_info(self.model)
|
|
92
|
-
if not model_info:
|
|
93
|
-
# Create default model info if not found
|
|
94
|
-
model_info = ModelInfo(
|
|
95
|
-
name=self.model,
|
|
96
|
-
provider=self.provider_name,
|
|
97
|
-
max_tokens=4096, # Default
|
|
98
|
-
supports_images=False,
|
|
99
|
-
supports_streaming=True,
|
|
100
|
-
)
|
|
101
|
-
warnings.warn(
|
|
102
|
-
f"Model {self.model} not found in registry. Using defaults.",
|
|
103
|
-
UserWarning,
|
|
104
|
-
)
|
|
105
|
-
return model_info
|
|
106
|
-
|
|
107
|
-
def call(
|
|
108
|
-
self,
|
|
109
|
-
messages: Union[str, List[Dict[str, Any]]],
|
|
110
|
-
**kwargs: Any,
|
|
111
|
-
) -> Union[str, Iterator[str]]:
|
|
112
|
-
"""
|
|
113
|
-
Main method to interact with the AI provider.
|
|
114
|
-
|
|
115
|
-
Parameters
|
|
116
|
-
----------
|
|
117
|
-
messages : Union[str, List[Dict[str, Any]]]
|
|
118
|
-
Input messages or prompt
|
|
119
|
-
**kwargs : Any
|
|
120
|
-
Additional parameters for the API call
|
|
121
|
-
|
|
122
|
-
Returns
|
|
123
|
-
-------
|
|
124
|
-
Union[str, Iterator[str]]
|
|
125
|
-
Response text or streaming iterator
|
|
126
|
-
"""
|
|
127
|
-
# Merge kwargs with instance kwargs
|
|
128
|
-
call_kwargs = {**self.kwargs, **kwargs}
|
|
129
|
-
|
|
130
|
-
# Process messages
|
|
131
|
-
processed_messages = self._process_messages(messages)
|
|
132
|
-
|
|
133
|
-
# Add system prompt if provided
|
|
134
|
-
if self.system_prompt:
|
|
135
|
-
processed_messages = self._add_system_prompt(processed_messages)
|
|
136
|
-
|
|
137
|
-
# Process images if present
|
|
138
|
-
processed_messages = self._process_images_in_messages(processed_messages)
|
|
139
|
-
|
|
140
|
-
# Store messages in history
|
|
141
|
-
for msg in processed_messages:
|
|
142
|
-
if msg["role"] != "system":
|
|
143
|
-
self.chat_history.add_message(msg["role"], msg["content"])
|
|
144
|
-
|
|
145
|
-
# Ensure alternating messages
|
|
146
|
-
self.chat_history.ensure_alternating()
|
|
147
|
-
|
|
148
|
-
# Make API call (to be implemented by concrete providers)
|
|
149
|
-
response = self._make_api_call(processed_messages, **call_kwargs)
|
|
150
|
-
|
|
151
|
-
# Handle response based on stream mode
|
|
152
|
-
if self.stream:
|
|
153
|
-
return self._handle_streaming_response(response)
|
|
154
|
-
else:
|
|
155
|
-
return self._handle_static_response(response)
|
|
156
|
-
|
|
157
|
-
def _process_messages(
|
|
158
|
-
self, messages: Union[str, List[Dict[str, Any]]]
|
|
159
|
-
) -> List[Dict[str, Any]]:
|
|
160
|
-
"""Process input messages into standard format."""
|
|
161
|
-
if isinstance(messages, str):
|
|
162
|
-
return [{"role": "user", "content": messages}]
|
|
163
|
-
return messages
|
|
164
|
-
|
|
165
|
-
def _add_system_prompt(
|
|
166
|
-
self, messages: List[Dict[str, Any]]
|
|
167
|
-
) -> List[Dict[str, Any]]:
|
|
168
|
-
"""Add system prompt to messages."""
|
|
169
|
-
if messages and messages[0]["role"] == "system":
|
|
170
|
-
# Replace existing system prompt
|
|
171
|
-
messages[0]["content"] = self.system_prompt
|
|
172
|
-
else:
|
|
173
|
-
# Insert system prompt at beginning
|
|
174
|
-
messages.insert(0, {"role": "system", "content": self.system_prompt})
|
|
175
|
-
return messages
|
|
176
|
-
|
|
177
|
-
def _process_images_in_messages(
|
|
178
|
-
self, messages: List[Dict[str, Any]]
|
|
179
|
-
) -> List[Dict[str, Any]]:
|
|
180
|
-
"""Process images in messages if model supports it."""
|
|
181
|
-
if not self.model_info.supports_images:
|
|
182
|
-
return messages
|
|
183
|
-
|
|
184
|
-
processed_messages = []
|
|
185
|
-
for msg in messages:
|
|
186
|
-
if isinstance(msg.get("content"), list):
|
|
187
|
-
# Process multimodal content
|
|
188
|
-
processed_content = []
|
|
189
|
-
for item in msg["content"]:
|
|
190
|
-
if item.get("type") == "image" and "path" in item:
|
|
191
|
-
# Process image file
|
|
192
|
-
image_data = self.image_processor.process_image(
|
|
193
|
-
item["path"], max_size=item.get("max_size", 2048)
|
|
194
|
-
)
|
|
195
|
-
processed_content.append(
|
|
196
|
-
{
|
|
197
|
-
"type": "image",
|
|
198
|
-
"data": image_data["data"],
|
|
199
|
-
"mime_type": image_data["mime_type"],
|
|
200
|
-
}
|
|
201
|
-
)
|
|
202
|
-
else:
|
|
203
|
-
processed_content.append(item)
|
|
204
|
-
|
|
205
|
-
processed_messages.append(
|
|
206
|
-
{
|
|
207
|
-
"role": msg["role"],
|
|
208
|
-
"content": processed_content,
|
|
209
|
-
}
|
|
210
|
-
)
|
|
211
|
-
else:
|
|
212
|
-
processed_messages.append(msg)
|
|
213
|
-
|
|
214
|
-
return processed_messages
|
|
215
|
-
|
|
216
|
-
def _handle_static_response(self, response: Any) -> str:
|
|
217
|
-
"""Handle static response from API."""
|
|
218
|
-
result = self.response_handler.handle_static_response(
|
|
219
|
-
response, self.provider_name
|
|
220
|
-
)
|
|
221
|
-
|
|
222
|
-
# Track usage
|
|
223
|
-
if result.usage:
|
|
224
|
-
self.cost_tracker.track_usage(
|
|
225
|
-
self.model,
|
|
226
|
-
TokenUsage(
|
|
227
|
-
input_tokens=result.usage.input_tokens,
|
|
228
|
-
output_tokens=result.usage.output_tokens,
|
|
229
|
-
),
|
|
230
|
-
)
|
|
231
|
-
|
|
232
|
-
# Add to history
|
|
233
|
-
self.chat_history.add_message("assistant", result.content)
|
|
234
|
-
|
|
235
|
-
return result.content
|
|
236
|
-
|
|
237
|
-
def _handle_streaming_response(self, response: Any) -> Iterator[str]:
|
|
238
|
-
"""Handle streaming response from API."""
|
|
239
|
-
full_content = []
|
|
240
|
-
total_usage = TokenUsage()
|
|
241
|
-
|
|
242
|
-
for chunk in self.response_handler.handle_streaming_response(
|
|
243
|
-
response, self.provider_name
|
|
244
|
-
):
|
|
245
|
-
if chunk.content:
|
|
246
|
-
full_content.append(chunk.content)
|
|
247
|
-
yield chunk.content
|
|
248
|
-
|
|
249
|
-
if chunk.usage:
|
|
250
|
-
total_usage.input_tokens += chunk.usage.input_tokens
|
|
251
|
-
total_usage.output_tokens += chunk.usage.output_tokens
|
|
252
|
-
|
|
253
|
-
# Track total usage
|
|
254
|
-
if total_usage.input_tokens > 0 or total_usage.output_tokens > 0:
|
|
255
|
-
self.cost_tracker.track_usage(self.model, total_usage)
|
|
256
|
-
|
|
257
|
-
# Add complete response to history
|
|
258
|
-
complete_content = "".join(full_content)
|
|
259
|
-
if complete_content:
|
|
260
|
-
self.chat_history.add_message("assistant", complete_content)
|
|
261
|
-
|
|
262
|
-
def _make_api_call(self, messages: List[Dict[str, Any]], **kwargs: Any) -> Any:
|
|
263
|
-
"""
|
|
264
|
-
Make API call to the provider.
|
|
265
|
-
|
|
266
|
-
This method must be implemented by concrete providers.
|
|
267
|
-
"""
|
|
268
|
-
raise NotImplementedError(
|
|
269
|
-
f"{self.__class__.__name__} must implement _make_api_call"
|
|
270
|
-
)
|
|
271
|
-
|
|
272
|
-
def get_usage_stats(self) -> Dict[str, Any]:
|
|
273
|
-
"""Get usage statistics."""
|
|
274
|
-
return self.cost_tracker.get_usage_stats()
|
|
275
|
-
|
|
276
|
-
def reset_usage_stats(self) -> None:
|
|
277
|
-
"""Reset usage statistics."""
|
|
278
|
-
self.cost_tracker.reset()
|
|
279
|
-
|
|
280
|
-
def clear_history(self) -> None:
|
|
281
|
-
"""Clear chat history."""
|
|
282
|
-
self.chat_history.clear()
|
|
283
|
-
|
|
284
|
-
def get_history(self) -> List[Dict[str, str]]:
|
|
285
|
-
"""Get chat history."""
|
|
286
|
-
return self.chat_history.get_messages()
|
|
287
|
-
|
|
288
|
-
def set_system_prompt(self, prompt: str) -> None:
|
|
289
|
-
"""Update system prompt."""
|
|
290
|
-
self.system_prompt = prompt
|
|
291
|
-
|
|
292
|
-
def __repr__(self) -> str:
|
|
293
|
-
"""String representation."""
|
|
294
|
-
return (
|
|
295
|
-
f"{self.__class__.__name__}("
|
|
296
|
-
f"provider={self.provider_name}, "
|
|
297
|
-
f"model={self.model}, "
|
|
298
|
-
f"stream={self.stream})"
|
|
299
|
-
)
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
## EOF
|
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
# Time-stamp: "2024-11-15 12:00:00"
|
|
4
|
-
# Author: Yusuke Watanabe (ywatanabe@alumni.u-tokyo.ac.jp)
|
|
5
|
-
|
|
6
|
-
"""
|
|
7
|
-
Factory for creating AI provider instances.
|
|
8
|
-
|
|
9
|
-
This module provides a factory pattern for instantiating different AI providers
|
|
10
|
-
with consistent configuration.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from enum import Enum
|
|
14
|
-
from typing import Any, Dict, Optional, Type, Union
|
|
15
|
-
import os
|
|
16
|
-
|
|
17
|
-
from .base_provider import BaseProvider, Provider
|
|
18
|
-
from .provider_base import ProviderConfig
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class ProviderRegistry:
|
|
22
|
-
"""Registry for managing AI providers and their aliases."""
|
|
23
|
-
|
|
24
|
-
def __init__(self):
|
|
25
|
-
"""Initialize the registry with provider storage and aliases."""
|
|
26
|
-
self._providers: Dict[Provider, Type[BaseProvider]] = {}
|
|
27
|
-
self._aliases: Dict[str, Provider] = {
|
|
28
|
-
# OpenAI aliases
|
|
29
|
-
"openai": Provider.OPENAI,
|
|
30
|
-
"gpt": Provider.OPENAI,
|
|
31
|
-
"gpt-3": Provider.OPENAI,
|
|
32
|
-
"gpt-3.5": Provider.OPENAI,
|
|
33
|
-
"gpt-4": Provider.OPENAI,
|
|
34
|
-
"gpt-4o": Provider.OPENAI,
|
|
35
|
-
"o1": Provider.OPENAI,
|
|
36
|
-
# Anthropic aliases
|
|
37
|
-
"anthropic": Provider.ANTHROPIC,
|
|
38
|
-
"claude": Provider.ANTHROPIC,
|
|
39
|
-
"claude-2": Provider.ANTHROPIC,
|
|
40
|
-
"claude-3": Provider.ANTHROPIC,
|
|
41
|
-
"claude-3-opus": Provider.ANTHROPIC,
|
|
42
|
-
"claude-3-sonnet": Provider.ANTHROPIC,
|
|
43
|
-
"claude-3-haiku": Provider.ANTHROPIC,
|
|
44
|
-
# Google aliases
|
|
45
|
-
"google": Provider.GOOGLE,
|
|
46
|
-
"gemini": Provider.GOOGLE,
|
|
47
|
-
"bard": Provider.GOOGLE,
|
|
48
|
-
"bison": Provider.GOOGLE,
|
|
49
|
-
"palm": Provider.GOOGLE,
|
|
50
|
-
# Groq aliases
|
|
51
|
-
"groq": Provider.GROQ,
|
|
52
|
-
"mixtral": Provider.GROQ,
|
|
53
|
-
"llama": Provider.GROQ,
|
|
54
|
-
"llama2": Provider.GROQ,
|
|
55
|
-
"llama3": Provider.GROQ,
|
|
56
|
-
# Perplexity aliases
|
|
57
|
-
"perplexity": Provider.PERPLEXITY,
|
|
58
|
-
"pplx": Provider.PERPLEXITY,
|
|
59
|
-
# DeepSeek aliases
|
|
60
|
-
"deepseek": Provider.DEEPSEEK,
|
|
61
|
-
"deepseek-coder": Provider.DEEPSEEK,
|
|
62
|
-
"deepseek-chat": Provider.DEEPSEEK,
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
def register(self, provider: Provider, provider_class: Type[BaseProvider]) -> None:
|
|
66
|
-
"""
|
|
67
|
-
Register a provider implementation.
|
|
68
|
-
|
|
69
|
-
Parameters
|
|
70
|
-
----------
|
|
71
|
-
provider : Provider
|
|
72
|
-
Provider enum value
|
|
73
|
-
provider_class : Type[BaseProvider]
|
|
74
|
-
Provider implementation class
|
|
75
|
-
"""
|
|
76
|
-
self._providers[provider] = provider_class
|
|
77
|
-
|
|
78
|
-
def get(self, provider: Provider) -> Type[BaseProvider]:
|
|
79
|
-
"""
|
|
80
|
-
Get a registered provider class.
|
|
81
|
-
|
|
82
|
-
Parameters
|
|
83
|
-
----------
|
|
84
|
-
provider : Provider
|
|
85
|
-
Provider enum value
|
|
86
|
-
|
|
87
|
-
Returns
|
|
88
|
-
-------
|
|
89
|
-
Type[BaseProvider]
|
|
90
|
-
Provider implementation class
|
|
91
|
-
|
|
92
|
-
Raises
|
|
93
|
-
------
|
|
94
|
-
ValueError
|
|
95
|
-
If provider is not registered
|
|
96
|
-
"""
|
|
97
|
-
if provider not in self._providers:
|
|
98
|
-
raise ValueError(f"Provider {provider} is not registered")
|
|
99
|
-
return self._providers[provider]
|
|
100
|
-
|
|
101
|
-
def resolve_provider(self, provider_or_model: str) -> Provider:
|
|
102
|
-
"""
|
|
103
|
-
Resolve a provider from a string or model name.
|
|
104
|
-
|
|
105
|
-
Parameters
|
|
106
|
-
----------
|
|
107
|
-
provider_or_model : str
|
|
108
|
-
Provider name, alias, or model name
|
|
109
|
-
|
|
110
|
-
Returns
|
|
111
|
-
-------
|
|
112
|
-
Provider
|
|
113
|
-
Resolved provider enum value
|
|
114
|
-
|
|
115
|
-
Raises
|
|
116
|
-
------
|
|
117
|
-
ValueError
|
|
118
|
-
If provider cannot be resolved
|
|
119
|
-
"""
|
|
120
|
-
provider_lower = provider_or_model.lower()
|
|
121
|
-
|
|
122
|
-
# Direct provider name match
|
|
123
|
-
for p in Provider:
|
|
124
|
-
if p.value == provider_lower:
|
|
125
|
-
return p
|
|
126
|
-
|
|
127
|
-
# Alias match
|
|
128
|
-
if provider_lower in self._aliases:
|
|
129
|
-
return self._aliases[provider_lower]
|
|
130
|
-
|
|
131
|
-
# Try to infer from model name patterns
|
|
132
|
-
model_patterns = {
|
|
133
|
-
Provider.OPENAI: [
|
|
134
|
-
"gpt-",
|
|
135
|
-
"o1-",
|
|
136
|
-
"text-davinci",
|
|
137
|
-
"text-curie",
|
|
138
|
-
"text-babbage",
|
|
139
|
-
"text-ada",
|
|
140
|
-
],
|
|
141
|
-
Provider.ANTHROPIC: ["claude-"],
|
|
142
|
-
Provider.GOOGLE: ["gemini-", "palm-", "bison"],
|
|
143
|
-
Provider.GROQ: ["mixtral-", "llama-"],
|
|
144
|
-
Provider.PERPLEXITY: ["pplx-", "perplexity-"],
|
|
145
|
-
Provider.DEEPSEEK: ["deepseek-"],
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
for provider, patterns in model_patterns.items():
|
|
149
|
-
if any(provider_lower.startswith(pattern) for pattern in patterns):
|
|
150
|
-
return provider
|
|
151
|
-
|
|
152
|
-
raise ValueError(f"Cannot resolve provider from: {provider_or_model}")
|
|
153
|
-
|
|
154
|
-
def list_providers(self) -> list[Provider]:
|
|
155
|
-
"""
|
|
156
|
-
List registered providers.
|
|
157
|
-
|
|
158
|
-
Returns
|
|
159
|
-
-------
|
|
160
|
-
list[Provider]
|
|
161
|
-
List of registered provider enums
|
|
162
|
-
"""
|
|
163
|
-
return list(self._providers.keys())
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
# Global registry instance
|
|
167
|
-
_registry = ProviderRegistry()
|
|
168
|
-
|
|
169
|
-
# Auto-register providers when they're imported
|
|
170
|
-
_auto_register_called = False
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
def _auto_register():
|
|
174
|
-
"""Auto-register available provider implementations."""
|
|
175
|
-
global _auto_register_called
|
|
176
|
-
if _auto_register_called:
|
|
177
|
-
return
|
|
178
|
-
_auto_register_called = True
|
|
179
|
-
|
|
180
|
-
# Try to import and register providers
|
|
181
|
-
try:
|
|
182
|
-
# Import providers here to trigger their registration
|
|
183
|
-
# Each provider module should register itself when imported
|
|
184
|
-
from . import mock_provider # For testing
|
|
185
|
-
from . import anthropic_provider
|
|
186
|
-
from . import openai_provider
|
|
187
|
-
from . import google_provider
|
|
188
|
-
from . import groq_provider
|
|
189
|
-
from . import perplexity_provider
|
|
190
|
-
from . import deepseek_provider
|
|
191
|
-
from . import llama_provider
|
|
192
|
-
except ImportError as e:
|
|
193
|
-
# Log import errors but continue
|
|
194
|
-
import warnings
|
|
195
|
-
|
|
196
|
-
warnings.warn(f"Failed to import some providers: {e}")
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
class ModelRegistry:
|
|
200
|
-
"""Registry for model information."""
|
|
201
|
-
|
|
202
|
-
@staticmethod
|
|
203
|
-
def get_models_for_provider(provider: str) -> list[str]:
|
|
204
|
-
"""Get available models for a provider."""
|
|
205
|
-
# This would be implemented with actual model data
|
|
206
|
-
return []
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
# Module-level convenience functions
|
|
210
|
-
def register_provider(name: str, provider_class: Type[BaseProvider]) -> None:
|
|
211
|
-
"""
|
|
212
|
-
Register a provider implementation.
|
|
213
|
-
|
|
214
|
-
Parameters
|
|
215
|
-
----------
|
|
216
|
-
name : str
|
|
217
|
-
Provider name
|
|
218
|
-
provider_class : Type[BaseProvider]
|
|
219
|
-
Provider implementation class
|
|
220
|
-
"""
|
|
221
|
-
provider = _registry.resolve_provider(name)
|
|
222
|
-
_registry.register(provider, provider_class)
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
def create_provider(
|
|
226
|
-
provider: str,
|
|
227
|
-
api_key: Optional[str] = None,
|
|
228
|
-
model: str = "gpt-3.5-turbo",
|
|
229
|
-
system_prompt: Optional[str] = None,
|
|
230
|
-
stream: bool = False,
|
|
231
|
-
seed: Optional[int] = None,
|
|
232
|
-
max_tokens: Optional[int] = None,
|
|
233
|
-
temperature: float = 0.0,
|
|
234
|
-
n_draft: int = 1,
|
|
235
|
-
**kwargs: Any,
|
|
236
|
-
) -> BaseProvider:
|
|
237
|
-
"""
|
|
238
|
-
Create a provider instance.
|
|
239
|
-
|
|
240
|
-
Parameters
|
|
241
|
-
----------
|
|
242
|
-
provider : str
|
|
243
|
-
Provider name, alias, or model name
|
|
244
|
-
api_key : Optional[str]
|
|
245
|
-
API key for authentication
|
|
246
|
-
model : str
|
|
247
|
-
Model name to use
|
|
248
|
-
system_prompt : Optional[str]
|
|
249
|
-
System prompt to prepend to messages
|
|
250
|
-
stream : bool
|
|
251
|
-
Whether to stream responses
|
|
252
|
-
seed : Optional[int]
|
|
253
|
-
Random seed for reproducibility
|
|
254
|
-
max_tokens : Optional[int]
|
|
255
|
-
Maximum tokens in response
|
|
256
|
-
temperature : float
|
|
257
|
-
Sampling temperature
|
|
258
|
-
n_draft : int
|
|
259
|
-
Number of drafts to generate
|
|
260
|
-
**kwargs : Any
|
|
261
|
-
Additional provider-specific parameters
|
|
262
|
-
|
|
263
|
-
Returns
|
|
264
|
-
-------
|
|
265
|
-
BaseProvider
|
|
266
|
-
Provider instance
|
|
267
|
-
"""
|
|
268
|
-
# Auto-register providers
|
|
269
|
-
_auto_register()
|
|
270
|
-
|
|
271
|
-
# Resolve provider
|
|
272
|
-
provider_enum = _registry.resolve_provider(provider)
|
|
273
|
-
|
|
274
|
-
# Get provider class
|
|
275
|
-
provider_class = _registry.get(provider_enum)
|
|
276
|
-
|
|
277
|
-
# Create configuration
|
|
278
|
-
config = ProviderConfig(
|
|
279
|
-
api_key=api_key,
|
|
280
|
-
model=model,
|
|
281
|
-
system_prompt=system_prompt,
|
|
282
|
-
stream=stream,
|
|
283
|
-
seed=seed,
|
|
284
|
-
max_tokens=max_tokens,
|
|
285
|
-
temperature=temperature,
|
|
286
|
-
n_draft=n_draft,
|
|
287
|
-
kwargs=kwargs,
|
|
288
|
-
)
|
|
289
|
-
|
|
290
|
-
# Instantiate provider
|
|
291
|
-
return provider_class(config)
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
def GenAI(
|
|
295
|
-
api_key: Optional[str] = None,
|
|
296
|
-
model: str = "gpt-3.5-turbo",
|
|
297
|
-
system_prompt: Optional[str] = None,
|
|
298
|
-
stream: bool = False,
|
|
299
|
-
seed: Optional[int] = None,
|
|
300
|
-
max_tokens: Optional[int] = None,
|
|
301
|
-
temperature: float = 0.0,
|
|
302
|
-
n_draft: int = 1,
|
|
303
|
-
provider: Optional[str] = None,
|
|
304
|
-
**kwargs: Any,
|
|
305
|
-
) -> BaseProvider:
|
|
306
|
-
"""
|
|
307
|
-
Create an AI provider instance (backward compatibility).
|
|
308
|
-
|
|
309
|
-
This function maintains backward compatibility with the old API.
|
|
310
|
-
If provider is not specified, it infers from the model name.
|
|
311
|
-
|
|
312
|
-
Parameters
|
|
313
|
-
----------
|
|
314
|
-
api_key : Optional[str]
|
|
315
|
-
API key for authentication
|
|
316
|
-
model : str
|
|
317
|
-
Model name to use
|
|
318
|
-
system_prompt : Optional[str]
|
|
319
|
-
System prompt to prepend to messages
|
|
320
|
-
stream : bool
|
|
321
|
-
Whether to stream responses
|
|
322
|
-
seed : Optional[int]
|
|
323
|
-
Random seed for reproducibility
|
|
324
|
-
max_tokens : Optional[int]
|
|
325
|
-
Maximum tokens in response
|
|
326
|
-
temperature : float
|
|
327
|
-
Sampling temperature
|
|
328
|
-
n_draft : int
|
|
329
|
-
Number of drafts to generate
|
|
330
|
-
provider : Optional[str]
|
|
331
|
-
Provider name (if not specified, inferred from model)
|
|
332
|
-
**kwargs : Any
|
|
333
|
-
Additional provider-specific parameters
|
|
334
|
-
|
|
335
|
-
Returns
|
|
336
|
-
-------
|
|
337
|
-
BaseProvider
|
|
338
|
-
Provider instance
|
|
339
|
-
"""
|
|
340
|
-
# If provider is explicitly specified, use it
|
|
341
|
-
if provider:
|
|
342
|
-
return create_provider(
|
|
343
|
-
provider=provider,
|
|
344
|
-
api_key=api_key,
|
|
345
|
-
model=model,
|
|
346
|
-
system_prompt=system_prompt,
|
|
347
|
-
stream=stream,
|
|
348
|
-
seed=seed,
|
|
349
|
-
max_tokens=max_tokens,
|
|
350
|
-
temperature=temperature,
|
|
351
|
-
n_draft=n_draft,
|
|
352
|
-
**kwargs,
|
|
353
|
-
)
|
|
354
|
-
|
|
355
|
-
# Otherwise, try to infer from model name
|
|
356
|
-
return create_provider(
|
|
357
|
-
provider=model, # Let resolve_provider handle it
|
|
358
|
-
api_key=api_key,
|
|
359
|
-
model=model,
|
|
360
|
-
system_prompt=system_prompt,
|
|
361
|
-
stream=stream,
|
|
362
|
-
seed=seed,
|
|
363
|
-
max_tokens=max_tokens,
|
|
364
|
-
temperature=temperature,
|
|
365
|
-
n_draft=n_draft,
|
|
366
|
-
**kwargs,
|
|
367
|
-
)
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
## EOF
|