scitex 2.0.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 +73 -0
- scitex/__main__.py +89 -0
- scitex/__version__.py +14 -0
- scitex/_sh.py +59 -0
- scitex/ai/_LearningCurveLogger.py +583 -0
- scitex/ai/__Classifiers.py +101 -0
- scitex/ai/__init__.py +55 -0
- scitex/ai/_gen_ai/_Anthropic.py +173 -0
- scitex/ai/_gen_ai/_BaseGenAI.py +336 -0
- scitex/ai/_gen_ai/_DeepSeek.py +175 -0
- scitex/ai/_gen_ai/_Google.py +161 -0
- scitex/ai/_gen_ai/_Groq.py +97 -0
- scitex/ai/_gen_ai/_Llama.py +142 -0
- scitex/ai/_gen_ai/_OpenAI.py +230 -0
- scitex/ai/_gen_ai/_PARAMS.py +565 -0
- scitex/ai/_gen_ai/_Perplexity.py +191 -0
- scitex/ai/_gen_ai/__init__.py +32 -0
- scitex/ai/_gen_ai/_calc_cost.py +78 -0
- scitex/ai/_gen_ai/_format_output_func.py +183 -0
- scitex/ai/_gen_ai/_genai_factory.py +71 -0
- scitex/ai/act/__init__.py +8 -0
- scitex/ai/act/_define.py +11 -0
- scitex/ai/classification/__init__.py +7 -0
- scitex/ai/classification/classification_reporter.py +1137 -0
- scitex/ai/classification/classifier_server.py +131 -0
- scitex/ai/classification/classifiers.py +101 -0
- scitex/ai/classification_reporter.py +1161 -0
- scitex/ai/classifier_server.py +131 -0
- scitex/ai/clustering/__init__.py +11 -0
- scitex/ai/clustering/_pca.py +115 -0
- scitex/ai/clustering/_umap.py +376 -0
- scitex/ai/early_stopping.py +149 -0
- scitex/ai/feature_extraction/__init__.py +56 -0
- scitex/ai/feature_extraction/vit.py +148 -0
- scitex/ai/genai/__init__.py +277 -0
- scitex/ai/genai/anthropic.py +177 -0
- scitex/ai/genai/anthropic_provider.py +320 -0
- scitex/ai/genai/anthropic_refactored.py +109 -0
- scitex/ai/genai/auth_manager.py +200 -0
- scitex/ai/genai/base_genai.py +336 -0
- scitex/ai/genai/base_provider.py +291 -0
- scitex/ai/genai/calc_cost.py +78 -0
- scitex/ai/genai/chat_history.py +307 -0
- scitex/ai/genai/cost_tracker.py +276 -0
- scitex/ai/genai/deepseek.py +188 -0
- scitex/ai/genai/deepseek_provider.py +251 -0
- scitex/ai/genai/format_output_func.py +183 -0
- scitex/ai/genai/genai_factory.py +71 -0
- scitex/ai/genai/google.py +169 -0
- scitex/ai/genai/google_provider.py +228 -0
- scitex/ai/genai/groq.py +104 -0
- scitex/ai/genai/groq_provider.py +248 -0
- scitex/ai/genai/image_processor.py +250 -0
- scitex/ai/genai/llama.py +155 -0
- scitex/ai/genai/llama_provider.py +214 -0
- scitex/ai/genai/mock_provider.py +127 -0
- scitex/ai/genai/model_registry.py +304 -0
- scitex/ai/genai/openai.py +230 -0
- scitex/ai/genai/openai_provider.py +293 -0
- scitex/ai/genai/params.py +565 -0
- scitex/ai/genai/perplexity.py +202 -0
- scitex/ai/genai/perplexity_provider.py +205 -0
- scitex/ai/genai/provider_base.py +302 -0
- scitex/ai/genai/provider_factory.py +370 -0
- scitex/ai/genai/response_handler.py +235 -0
- scitex/ai/layer/_Pass.py +21 -0
- scitex/ai/layer/__init__.py +10 -0
- scitex/ai/layer/_switch.py +8 -0
- scitex/ai/loss/_L1L2Losses.py +34 -0
- scitex/ai/loss/__init__.py +12 -0
- scitex/ai/loss/multi_task_loss.py +47 -0
- scitex/ai/metrics/__init__.py +9 -0
- scitex/ai/metrics/_bACC.py +51 -0
- scitex/ai/metrics/silhoute_score_block.py +496 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/__init__.py +0 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/__init__.py +3 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger.py +207 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger2020.py +238 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/ranger913A.py +215 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/ranger/rangerqh.py +184 -0
- scitex/ai/optim/Ranger_Deep_Learning_Optimizer/setup.py +24 -0
- scitex/ai/optim/__init__.py +13 -0
- scitex/ai/optim/_get_set.py +31 -0
- scitex/ai/optim/_optimizers.py +71 -0
- scitex/ai/plt/__init__.py +21 -0
- scitex/ai/plt/_conf_mat.py +592 -0
- scitex/ai/plt/_learning_curve.py +194 -0
- scitex/ai/plt/_optuna_study.py +111 -0
- scitex/ai/plt/aucs/__init__.py +2 -0
- scitex/ai/plt/aucs/example.py +60 -0
- scitex/ai/plt/aucs/pre_rec_auc.py +223 -0
- scitex/ai/plt/aucs/roc_auc.py +246 -0
- scitex/ai/sampling/undersample.py +29 -0
- scitex/ai/sk/__init__.py +11 -0
- scitex/ai/sk/_clf.py +58 -0
- scitex/ai/sk/_to_sktime.py +100 -0
- scitex/ai/sklearn/__init__.py +26 -0
- scitex/ai/sklearn/clf.py +58 -0
- scitex/ai/sklearn/to_sktime.py +100 -0
- scitex/ai/training/__init__.py +7 -0
- scitex/ai/training/early_stopping.py +150 -0
- scitex/ai/training/learning_curve_logger.py +555 -0
- scitex/ai/utils/__init__.py +22 -0
- scitex/ai/utils/_check_params.py +50 -0
- scitex/ai/utils/_default_dataset.py +46 -0
- scitex/ai/utils/_format_samples_for_sktime.py +26 -0
- scitex/ai/utils/_label_encoder.py +134 -0
- scitex/ai/utils/_merge_labels.py +22 -0
- scitex/ai/utils/_sliding_window_data_augmentation.py +11 -0
- scitex/ai/utils/_under_sample.py +51 -0
- scitex/ai/utils/_verify_n_gpus.py +16 -0
- scitex/ai/utils/grid_search.py +148 -0
- scitex/context/__init__.py +9 -0
- scitex/context/_suppress_output.py +38 -0
- scitex/db/_BaseMixins/_BaseBackupMixin.py +30 -0
- scitex/db/_BaseMixins/_BaseBatchMixin.py +31 -0
- scitex/db/_BaseMixins/_BaseBlobMixin.py +81 -0
- scitex/db/_BaseMixins/_BaseConnectionMixin.py +43 -0
- scitex/db/_BaseMixins/_BaseImportExportMixin.py +39 -0
- scitex/db/_BaseMixins/_BaseIndexMixin.py +29 -0
- scitex/db/_BaseMixins/_BaseMaintenanceMixin.py +33 -0
- scitex/db/_BaseMixins/_BaseQueryMixin.py +52 -0
- scitex/db/_BaseMixins/_BaseRowMixin.py +32 -0
- scitex/db/_BaseMixins/_BaseSchemaMixin.py +44 -0
- scitex/db/_BaseMixins/_BaseTableMixin.py +66 -0
- scitex/db/_BaseMixins/_BaseTransactionMixin.py +52 -0
- scitex/db/_BaseMixins/__init__.py +30 -0
- scitex/db/_PostgreSQL.py +126 -0
- scitex/db/_PostgreSQLMixins/_BackupMixin.py +166 -0
- scitex/db/_PostgreSQLMixins/_BatchMixin.py +82 -0
- scitex/db/_PostgreSQLMixins/_BlobMixin.py +231 -0
- scitex/db/_PostgreSQLMixins/_ConnectionMixin.py +92 -0
- scitex/db/_PostgreSQLMixins/_ImportExportMixin.py +59 -0
- scitex/db/_PostgreSQLMixins/_IndexMixin.py +64 -0
- scitex/db/_PostgreSQLMixins/_MaintenanceMixin.py +175 -0
- scitex/db/_PostgreSQLMixins/_QueryMixin.py +108 -0
- scitex/db/_PostgreSQLMixins/_RowMixin.py +75 -0
- scitex/db/_PostgreSQLMixins/_SchemaMixin.py +126 -0
- scitex/db/_PostgreSQLMixins/_TableMixin.py +176 -0
- scitex/db/_PostgreSQLMixins/_TransactionMixin.py +57 -0
- scitex/db/_PostgreSQLMixins/__init__.py +34 -0
- scitex/db/_SQLite3.py +2136 -0
- scitex/db/_SQLite3Mixins/_BatchMixin.py +243 -0
- scitex/db/_SQLite3Mixins/_BlobMixin.py +229 -0
- scitex/db/_SQLite3Mixins/_ConnectionMixin.py +108 -0
- scitex/db/_SQLite3Mixins/_ImportExportMixin.py +80 -0
- scitex/db/_SQLite3Mixins/_IndexMixin.py +32 -0
- scitex/db/_SQLite3Mixins/_MaintenanceMixin.py +176 -0
- scitex/db/_SQLite3Mixins/_QueryMixin.py +83 -0
- scitex/db/_SQLite3Mixins/_RowMixin.py +75 -0
- scitex/db/_SQLite3Mixins/_TableMixin.py +183 -0
- scitex/db/_SQLite3Mixins/_TransactionMixin.py +71 -0
- scitex/db/_SQLite3Mixins/__init__.py +30 -0
- scitex/db/__init__.py +14 -0
- scitex/db/_delete_duplicates.py +397 -0
- scitex/db/_inspect.py +163 -0
- scitex/decorators/__init__.py +54 -0
- scitex/decorators/_auto_order.py +172 -0
- scitex/decorators/_batch_fn.py +127 -0
- scitex/decorators/_cache_disk.py +32 -0
- scitex/decorators/_cache_mem.py +12 -0
- scitex/decorators/_combined.py +98 -0
- scitex/decorators/_converters.py +282 -0
- scitex/decorators/_deprecated.py +26 -0
- scitex/decorators/_not_implemented.py +30 -0
- scitex/decorators/_numpy_fn.py +86 -0
- scitex/decorators/_pandas_fn.py +121 -0
- scitex/decorators/_preserve_doc.py +19 -0
- scitex/decorators/_signal_fn.py +95 -0
- scitex/decorators/_timeout.py +55 -0
- scitex/decorators/_torch_fn.py +136 -0
- scitex/decorators/_wrap.py +39 -0
- scitex/decorators/_xarray_fn.py +88 -0
- scitex/dev/__init__.py +15 -0
- scitex/dev/_analyze_code_flow.py +284 -0
- scitex/dev/_reload.py +59 -0
- scitex/dict/_DotDict.py +442 -0
- scitex/dict/__init__.py +18 -0
- scitex/dict/_listed_dict.py +42 -0
- scitex/dict/_pop_keys.py +36 -0
- scitex/dict/_replace.py +13 -0
- scitex/dict/_safe_merge.py +62 -0
- scitex/dict/_to_str.py +32 -0
- scitex/dsp/__init__.py +72 -0
- scitex/dsp/_crop.py +122 -0
- scitex/dsp/_demo_sig.py +331 -0
- scitex/dsp/_detect_ripples.py +212 -0
- scitex/dsp/_ensure_3d.py +18 -0
- scitex/dsp/_hilbert.py +78 -0
- scitex/dsp/_listen.py +702 -0
- scitex/dsp/_misc.py +30 -0
- scitex/dsp/_mne.py +32 -0
- scitex/dsp/_modulation_index.py +79 -0
- scitex/dsp/_pac.py +319 -0
- scitex/dsp/_psd.py +102 -0
- scitex/dsp/_resample.py +65 -0
- scitex/dsp/_time.py +36 -0
- scitex/dsp/_transform.py +68 -0
- scitex/dsp/_wavelet.py +212 -0
- scitex/dsp/add_noise.py +111 -0
- scitex/dsp/example.py +253 -0
- scitex/dsp/filt.py +155 -0
- scitex/dsp/norm.py +18 -0
- scitex/dsp/params.py +51 -0
- scitex/dsp/reference.py +43 -0
- scitex/dsp/template.py +25 -0
- scitex/dsp/utils/__init__.py +15 -0
- scitex/dsp/utils/_differential_bandpass_filters.py +120 -0
- scitex/dsp/utils/_ensure_3d.py +18 -0
- scitex/dsp/utils/_ensure_even_len.py +10 -0
- scitex/dsp/utils/_zero_pad.py +48 -0
- scitex/dsp/utils/filter.py +408 -0
- scitex/dsp/utils/pac.py +177 -0
- scitex/dt/__init__.py +8 -0
- scitex/dt/_linspace.py +130 -0
- scitex/etc/__init__.py +15 -0
- scitex/etc/wait_key.py +34 -0
- scitex/gen/_DimHandler.py +196 -0
- scitex/gen/_TimeStamper.py +244 -0
- scitex/gen/__init__.py +95 -0
- scitex/gen/_alternate_kwarg.py +13 -0
- scitex/gen/_cache.py +11 -0
- scitex/gen/_check_host.py +34 -0
- scitex/gen/_ci.py +12 -0
- scitex/gen/_close.py +222 -0
- scitex/gen/_embed.py +78 -0
- scitex/gen/_inspect_module.py +257 -0
- scitex/gen/_is_ipython.py +12 -0
- scitex/gen/_less.py +48 -0
- scitex/gen/_list_packages.py +139 -0
- scitex/gen/_mat2py.py +88 -0
- scitex/gen/_norm.py +170 -0
- scitex/gen/_paste.py +18 -0
- scitex/gen/_print_config.py +84 -0
- scitex/gen/_shell.py +48 -0
- scitex/gen/_src.py +111 -0
- scitex/gen/_start.py +451 -0
- scitex/gen/_symlink.py +55 -0
- scitex/gen/_symlog.py +27 -0
- scitex/gen/_tee.py +238 -0
- scitex/gen/_title2path.py +60 -0
- scitex/gen/_title_case.py +88 -0
- scitex/gen/_to_even.py +84 -0
- scitex/gen/_to_odd.py +34 -0
- scitex/gen/_to_rank.py +39 -0
- scitex/gen/_transpose.py +37 -0
- scitex/gen/_type.py +78 -0
- scitex/gen/_var_info.py +73 -0
- scitex/gen/_wrap.py +17 -0
- scitex/gen/_xml2dict.py +76 -0
- scitex/gen/misc.py +730 -0
- scitex/gen/path.py +0 -0
- scitex/general/__init__.py +5 -0
- scitex/gists/_SigMacro_processFigure_S.py +128 -0
- scitex/gists/_SigMacro_toBlue.py +172 -0
- scitex/gists/__init__.py +12 -0
- scitex/io/_H5Explorer.py +292 -0
- scitex/io/__init__.py +82 -0
- scitex/io/_cache.py +101 -0
- scitex/io/_flush.py +24 -0
- scitex/io/_glob.py +103 -0
- scitex/io/_json2md.py +113 -0
- scitex/io/_load.py +168 -0
- scitex/io/_load_configs.py +146 -0
- scitex/io/_load_modules/__init__.py +38 -0
- scitex/io/_load_modules/_catboost.py +66 -0
- scitex/io/_load_modules/_con.py +20 -0
- scitex/io/_load_modules/_db.py +24 -0
- scitex/io/_load_modules/_docx.py +42 -0
- scitex/io/_load_modules/_eeg.py +110 -0
- scitex/io/_load_modules/_hdf5.py +196 -0
- scitex/io/_load_modules/_image.py +19 -0
- scitex/io/_load_modules/_joblib.py +19 -0
- scitex/io/_load_modules/_json.py +18 -0
- scitex/io/_load_modules/_markdown.py +103 -0
- scitex/io/_load_modules/_matlab.py +37 -0
- scitex/io/_load_modules/_numpy.py +39 -0
- scitex/io/_load_modules/_optuna.py +155 -0
- scitex/io/_load_modules/_pandas.py +69 -0
- scitex/io/_load_modules/_pdf.py +31 -0
- scitex/io/_load_modules/_pickle.py +24 -0
- scitex/io/_load_modules/_torch.py +16 -0
- scitex/io/_load_modules/_txt.py +126 -0
- scitex/io/_load_modules/_xml.py +49 -0
- scitex/io/_load_modules/_yaml.py +23 -0
- scitex/io/_mv_to_tmp.py +19 -0
- scitex/io/_path.py +286 -0
- scitex/io/_reload.py +78 -0
- scitex/io/_save.py +539 -0
- scitex/io/_save_modules/__init__.py +66 -0
- scitex/io/_save_modules/_catboost.py +22 -0
- scitex/io/_save_modules/_csv.py +89 -0
- scitex/io/_save_modules/_excel.py +49 -0
- scitex/io/_save_modules/_hdf5.py +249 -0
- scitex/io/_save_modules/_html.py +48 -0
- scitex/io/_save_modules/_image.py +140 -0
- scitex/io/_save_modules/_joblib.py +25 -0
- scitex/io/_save_modules/_json.py +25 -0
- scitex/io/_save_modules/_listed_dfs_as_csv.py +57 -0
- scitex/io/_save_modules/_listed_scalars_as_csv.py +42 -0
- scitex/io/_save_modules/_matlab.py +24 -0
- scitex/io/_save_modules/_mp4.py +29 -0
- scitex/io/_save_modules/_numpy.py +57 -0
- scitex/io/_save_modules/_optuna_study_as_csv_and_pngs.py +38 -0
- scitex/io/_save_modules/_pickle.py +45 -0
- scitex/io/_save_modules/_plotly.py +27 -0
- scitex/io/_save_modules/_text.py +23 -0
- scitex/io/_save_modules/_torch.py +26 -0
- scitex/io/_save_modules/_yaml.py +29 -0
- scitex/life/__init__.py +10 -0
- scitex/life/_monitor_rain.py +49 -0
- scitex/linalg/__init__.py +17 -0
- scitex/linalg/_distance.py +63 -0
- scitex/linalg/_geometric_median.py +64 -0
- scitex/linalg/_misc.py +73 -0
- scitex/nn/_AxiswiseDropout.py +27 -0
- scitex/nn/_BNet.py +126 -0
- scitex/nn/_BNet_Res.py +164 -0
- scitex/nn/_ChannelGainChanger.py +44 -0
- scitex/nn/_DropoutChannels.py +50 -0
- scitex/nn/_Filters.py +489 -0
- scitex/nn/_FreqGainChanger.py +110 -0
- scitex/nn/_GaussianFilter.py +48 -0
- scitex/nn/_Hilbert.py +111 -0
- scitex/nn/_MNet_1000.py +157 -0
- scitex/nn/_ModulationIndex.py +221 -0
- scitex/nn/_PAC.py +414 -0
- scitex/nn/_PSD.py +40 -0
- scitex/nn/_ResNet1D.py +120 -0
- scitex/nn/_SpatialAttention.py +25 -0
- scitex/nn/_Spectrogram.py +161 -0
- scitex/nn/_SwapChannels.py +50 -0
- scitex/nn/_TransposeLayer.py +19 -0
- scitex/nn/_Wavelet.py +183 -0
- scitex/nn/__init__.py +63 -0
- scitex/os/__init__.py +8 -0
- scitex/os/_mv.py +50 -0
- scitex/parallel/__init__.py +8 -0
- scitex/parallel/_run.py +151 -0
- scitex/path/__init__.py +33 -0
- scitex/path/_clean.py +52 -0
- scitex/path/_find.py +108 -0
- scitex/path/_get_module_path.py +51 -0
- scitex/path/_get_spath.py +35 -0
- scitex/path/_getsize.py +18 -0
- scitex/path/_increment_version.py +87 -0
- scitex/path/_mk_spath.py +51 -0
- scitex/path/_path.py +19 -0
- scitex/path/_split.py +23 -0
- scitex/path/_this_path.py +19 -0
- scitex/path/_version.py +101 -0
- scitex/pd/__init__.py +41 -0
- scitex/pd/_find_indi.py +126 -0
- scitex/pd/_find_pval.py +113 -0
- scitex/pd/_force_df.py +154 -0
- scitex/pd/_from_xyz.py +71 -0
- scitex/pd/_ignore_SettingWithCopyWarning.py +34 -0
- scitex/pd/_melt_cols.py +81 -0
- scitex/pd/_merge_columns.py +221 -0
- scitex/pd/_mv.py +63 -0
- scitex/pd/_replace.py +62 -0
- scitex/pd/_round.py +93 -0
- scitex/pd/_slice.py +63 -0
- scitex/pd/_sort.py +91 -0
- scitex/pd/_to_numeric.py +53 -0
- scitex/pd/_to_xy.py +59 -0
- scitex/pd/_to_xyz.py +110 -0
- scitex/plt/__init__.py +36 -0
- scitex/plt/_subplots/_AxesWrapper.py +182 -0
- scitex/plt/_subplots/_AxisWrapper.py +249 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_AdjustmentMixin.py +414 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_MatplotlibPlotMixin.py +896 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin.py +368 -0
- scitex/plt/_subplots/_AxisWrapperMixins/_TrackingMixin.py +185 -0
- scitex/plt/_subplots/_AxisWrapperMixins/__init__.py +16 -0
- scitex/plt/_subplots/_FigWrapper.py +226 -0
- scitex/plt/_subplots/_SubplotsWrapper.py +171 -0
- scitex/plt/_subplots/__init__.py +111 -0
- scitex/plt/_subplots/_export_as_csv.py +232 -0
- scitex/plt/_subplots/_export_as_csv_formatters/__init__.py +61 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_bar.py +90 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_barh.py +49 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_boxplot.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_contour.py +39 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_errorbar.py +125 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_eventplot.py +72 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill.py +34 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_fill_between.py +36 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_hist.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_imshow2d.py +32 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot.py +79 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_box.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_conf_mat.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_ecdf.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_fillv.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_heatmap.py +66 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_image.py +95 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_joyplot.py +67 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_kde.py +52 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_line.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_ci.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_mean_std.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_median_iqr.py +46 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_raster.py +44 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_rectangle.py +103 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_scatter_hist.py +82 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_shaded_line.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_plot_violin.py +117 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_scatter.py +30 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_barplot.py +51 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_boxplot.py +93 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_heatmap.py +94 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_histplot.py +92 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_jointplot.py +65 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_kdeplot.py +59 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_lineplot.py +58 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_pairplot.py +45 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_scatterplot.py +70 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_stripplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_swarmplot.py +75 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_sns_violinplot.py +155 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violin.py +64 -0
- scitex/plt/_subplots/_export_as_csv_formatters/_format_violinplot.py +77 -0
- scitex/plt/_subplots/_export_as_csv_formatters/test_formatters.py +210 -0
- scitex/plt/_subplots/_export_as_csv_formatters/verify_formatters.py +342 -0
- scitex/plt/_subplots/_export_as_csv_formatters.py +115 -0
- scitex/plt/_tpl.py +28 -0
- scitex/plt/ax/__init__.py +114 -0
- scitex/plt/ax/_plot/__init__.py +53 -0
- scitex/plt/ax/_plot/_plot_circular_hist.py +124 -0
- scitex/plt/ax/_plot/_plot_conf_mat.py +136 -0
- scitex/plt/ax/_plot/_plot_cube.py +57 -0
- scitex/plt/ax/_plot/_plot_ecdf.py +84 -0
- scitex/plt/ax/_plot/_plot_fillv.py +55 -0
- scitex/plt/ax/_plot/_plot_heatmap.py +266 -0
- scitex/plt/ax/_plot/_plot_image.py +94 -0
- scitex/plt/ax/_plot/_plot_joyplot.py +76 -0
- scitex/plt/ax/_plot/_plot_raster.py +172 -0
- scitex/plt/ax/_plot/_plot_rectangle.py +69 -0
- scitex/plt/ax/_plot/_plot_scatter_hist.py +133 -0
- scitex/plt/ax/_plot/_plot_shaded_line.py +142 -0
- scitex/plt/ax/_plot/_plot_statistical_shaded_line.py +221 -0
- scitex/plt/ax/_plot/_plot_violin.py +343 -0
- scitex/plt/ax/_style/__init__.py +38 -0
- scitex/plt/ax/_style/_add_marginal_ax.py +44 -0
- scitex/plt/ax/_style/_add_panel.py +92 -0
- scitex/plt/ax/_style/_extend.py +64 -0
- scitex/plt/ax/_style/_force_aspect.py +37 -0
- scitex/plt/ax/_style/_format_label.py +23 -0
- scitex/plt/ax/_style/_hide_spines.py +84 -0
- scitex/plt/ax/_style/_map_ticks.py +182 -0
- scitex/plt/ax/_style/_rotate_labels.py +215 -0
- scitex/plt/ax/_style/_sci_note.py +279 -0
- scitex/plt/ax/_style/_set_log_scale.py +299 -0
- scitex/plt/ax/_style/_set_meta.py +261 -0
- scitex/plt/ax/_style/_set_n_ticks.py +37 -0
- scitex/plt/ax/_style/_set_size.py +16 -0
- scitex/plt/ax/_style/_set_supxyt.py +116 -0
- scitex/plt/ax/_style/_set_ticks.py +276 -0
- scitex/plt/ax/_style/_set_xyt.py +121 -0
- scitex/plt/ax/_style/_share_axes.py +264 -0
- scitex/plt/ax/_style/_shift.py +139 -0
- scitex/plt/ax/_style/_show_spines.py +333 -0
- scitex/plt/color/_PARAMS.py +70 -0
- scitex/plt/color/__init__.py +52 -0
- scitex/plt/color/_add_hue_col.py +41 -0
- scitex/plt/color/_colors.py +205 -0
- scitex/plt/color/_get_colors_from_cmap.py +134 -0
- scitex/plt/color/_interpolate.py +29 -0
- scitex/plt/color/_vizualize_colors.py +54 -0
- scitex/plt/utils/__init__.py +44 -0
- scitex/plt/utils/_calc_bacc_from_conf_mat.py +46 -0
- scitex/plt/utils/_calc_nice_ticks.py +101 -0
- scitex/plt/utils/_close.py +68 -0
- scitex/plt/utils/_colorbar.py +96 -0
- scitex/plt/utils/_configure_mpl.py +295 -0
- scitex/plt/utils/_histogram_utils.py +132 -0
- scitex/plt/utils/_im2grid.py +70 -0
- scitex/plt/utils/_is_valid_axis.py +78 -0
- scitex/plt/utils/_mk_colorbar.py +65 -0
- scitex/plt/utils/_mk_patches.py +26 -0
- scitex/plt/utils/_scientific_captions.py +638 -0
- scitex/plt/utils/_scitex_config.py +223 -0
- scitex/reproduce/__init__.py +14 -0
- scitex/reproduce/_fix_seeds.py +45 -0
- scitex/reproduce/_gen_ID.py +55 -0
- scitex/reproduce/_gen_timestamp.py +35 -0
- scitex/res/__init__.py +5 -0
- scitex/resource/__init__.py +13 -0
- scitex/resource/_get_processor_usages.py +281 -0
- scitex/resource/_get_specs.py +280 -0
- scitex/resource/_log_processor_usages.py +190 -0
- scitex/resource/_utils/__init__.py +31 -0
- scitex/resource/_utils/_get_env_info.py +481 -0
- scitex/resource/limit_ram.py +33 -0
- scitex/scholar/__init__.py +24 -0
- scitex/scholar/_local_search.py +454 -0
- scitex/scholar/_paper.py +244 -0
- scitex/scholar/_pdf_downloader.py +325 -0
- scitex/scholar/_search.py +393 -0
- scitex/scholar/_vector_search.py +370 -0
- scitex/scholar/_web_sources.py +457 -0
- scitex/stats/__init__.py +31 -0
- scitex/stats/_calc_partial_corr.py +17 -0
- scitex/stats/_corr_test_multi.py +94 -0
- scitex/stats/_corr_test_wrapper.py +115 -0
- scitex/stats/_describe_wrapper.py +90 -0
- scitex/stats/_multiple_corrections.py +63 -0
- scitex/stats/_nan_stats.py +93 -0
- scitex/stats/_p2stars.py +116 -0
- scitex/stats/_p2stars_wrapper.py +56 -0
- scitex/stats/_statistical_tests.py +73 -0
- scitex/stats/desc/__init__.py +40 -0
- scitex/stats/desc/_describe.py +189 -0
- scitex/stats/desc/_nan.py +289 -0
- scitex/stats/desc/_real.py +94 -0
- scitex/stats/multiple/__init__.py +14 -0
- scitex/stats/multiple/_bonferroni_correction.py +72 -0
- scitex/stats/multiple/_fdr_correction.py +400 -0
- scitex/stats/multiple/_multicompair.py +28 -0
- scitex/stats/tests/__corr_test.py +277 -0
- scitex/stats/tests/__corr_test_multi.py +343 -0
- scitex/stats/tests/__corr_test_single.py +277 -0
- scitex/stats/tests/__init__.py +22 -0
- scitex/stats/tests/_brunner_munzel_test.py +192 -0
- scitex/stats/tests/_nocorrelation_test.py +28 -0
- scitex/stats/tests/_smirnov_grubbs.py +98 -0
- scitex/str/__init__.py +113 -0
- scitex/str/_clean_path.py +75 -0
- scitex/str/_color_text.py +52 -0
- scitex/str/_decapitalize.py +58 -0
- scitex/str/_factor_out_digits.py +281 -0
- scitex/str/_format_plot_text.py +498 -0
- scitex/str/_grep.py +48 -0
- scitex/str/_latex.py +155 -0
- scitex/str/_latex_fallback.py +471 -0
- scitex/str/_mask_api.py +39 -0
- scitex/str/_mask_api_key.py +8 -0
- scitex/str/_parse.py +158 -0
- scitex/str/_print_block.py +47 -0
- scitex/str/_print_debug.py +68 -0
- scitex/str/_printc.py +62 -0
- scitex/str/_readable_bytes.py +38 -0
- scitex/str/_remove_ansi.py +23 -0
- scitex/str/_replace.py +134 -0
- scitex/str/_search.py +125 -0
- scitex/str/_squeeze_space.py +36 -0
- scitex/tex/__init__.py +10 -0
- scitex/tex/_preview.py +103 -0
- scitex/tex/_to_vec.py +116 -0
- scitex/torch/__init__.py +18 -0
- scitex/torch/_apply_to.py +34 -0
- scitex/torch/_nan_funcs.py +77 -0
- scitex/types/_ArrayLike.py +44 -0
- scitex/types/_ColorLike.py +21 -0
- scitex/types/__init__.py +14 -0
- scitex/types/_is_listed_X.py +70 -0
- scitex/utils/__init__.py +22 -0
- scitex/utils/_compress_hdf5.py +116 -0
- scitex/utils/_email.py +120 -0
- scitex/utils/_grid.py +148 -0
- scitex/utils/_notify.py +247 -0
- scitex/utils/_search.py +121 -0
- scitex/web/__init__.py +38 -0
- scitex/web/_search_pubmed.py +438 -0
- scitex/web/_summarize_url.py +158 -0
- scitex-2.0.0.dist-info/METADATA +307 -0
- scitex-2.0.0.dist-info/RECORD +572 -0
- scitex-2.0.0.dist-info/WHEEL +6 -0
- scitex-2.0.0.dist-info/licenses/LICENSE +7 -0
- scitex-2.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-04 01:39:25 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/ai/_gen_ai/_format_output_func.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
Functionality:
|
|
8
|
+
- Formats AI model output text
|
|
9
|
+
- Wraps URLs in HTML anchor tags
|
|
10
|
+
- Converts markdown to HTML
|
|
11
|
+
- Handles DOI links specially
|
|
12
|
+
Input:
|
|
13
|
+
- Raw text output from AI models
|
|
14
|
+
- Optional API key for masking
|
|
15
|
+
Output:
|
|
16
|
+
- Formatted HTML text with proper link handling
|
|
17
|
+
Prerequisites:
|
|
18
|
+
- markdown2 package
|
|
19
|
+
- Regular expressions support
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
"""Imports"""
|
|
23
|
+
import re
|
|
24
|
+
import sys
|
|
25
|
+
from typing import List, Optional
|
|
26
|
+
|
|
27
|
+
import markdown2
|
|
28
|
+
import matplotlib.pyplot as plt
|
|
29
|
+
import scitex
|
|
30
|
+
|
|
31
|
+
"""Functions & Classes"""
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def format_output_func(out_text: str) -> str:
|
|
35
|
+
"""Formats AI output text with proper link handling and markdown conversion.
|
|
36
|
+
|
|
37
|
+
Example
|
|
38
|
+
-------
|
|
39
|
+
>>> text = "Check https://example.com or doi:10.1234/abc"
|
|
40
|
+
>>> print(format_output_func(text))
|
|
41
|
+
Check <a href="https://example.com">https://example.com</a> or <a href="https://doi.org/10.1234/abc">https://doi.org/10.1234/abc</a>
|
|
42
|
+
|
|
43
|
+
Parameters
|
|
44
|
+
----------
|
|
45
|
+
out_text : str
|
|
46
|
+
Raw text output from AI model
|
|
47
|
+
|
|
48
|
+
Returns
|
|
49
|
+
-------
|
|
50
|
+
str
|
|
51
|
+
HTML formatted text with proper link handling
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
def find_unwrapped_urls(text: str) -> List[str]:
|
|
55
|
+
url_pattern = r'(?<!<a href=")(https?://|doi:|http://doi.org/)[^\s,<>"]+'
|
|
56
|
+
return re.findall(url_pattern, text)
|
|
57
|
+
|
|
58
|
+
def add_a_href_tag(text: str) -> str:
|
|
59
|
+
def replace_url(match) -> str:
|
|
60
|
+
url = match.group(0)
|
|
61
|
+
if url.startswith("doi:"):
|
|
62
|
+
url = "https://doi.org/" + url[4:]
|
|
63
|
+
return f'<a href="{url}">{url}</a>'
|
|
64
|
+
|
|
65
|
+
url_pattern = r'(?<!<a href=")(https?://|doi:|http://doi.org/)[^\s,<>"]+'
|
|
66
|
+
return re.sub(url_pattern, replace_url, text)
|
|
67
|
+
|
|
68
|
+
def add_masked_api_key(text: str, api_key: str) -> str:
|
|
69
|
+
masked_key = f"{api_key[:4]}****{api_key[-4:]}"
|
|
70
|
+
return text + f"\n(API Key: {masked_key}"
|
|
71
|
+
|
|
72
|
+
formatted_text = markdown2.markdown(out_text)
|
|
73
|
+
formatted_text = add_a_href_tag(formatted_text)
|
|
74
|
+
formatted_text = re.sub(r"^<p>(.*)</p>$", r"\1", formatted_text, flags=re.DOTALL)
|
|
75
|
+
return formatted_text
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def main() -> None:
|
|
79
|
+
pass
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
if __name__ == "__main__":
|
|
83
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt, verbose=False)
|
|
84
|
+
main()
|
|
85
|
+
scitex.gen.close(CONFIG, verbose=False, notify=False)
|
|
86
|
+
|
|
87
|
+
# EOF
|
|
88
|
+
# #!/usr/bin/env python3
|
|
89
|
+
# # -*- coding: utf-8 -*-
|
|
90
|
+
# # Time-stamp: "2024-11-04 01:32:10 (ywatanabe)"
|
|
91
|
+
# # File: ./scitex_repo/src/scitex/ai/_gen_ai/_format_output_func.py
|
|
92
|
+
|
|
93
|
+
# """This script does XYZ."""
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# """Imports"""
|
|
97
|
+
# import re
|
|
98
|
+
# import sys
|
|
99
|
+
|
|
100
|
+
# import markdown2
|
|
101
|
+
# import matplotlib.pyplot as plt
|
|
102
|
+
# import scitex
|
|
103
|
+
|
|
104
|
+
# """
|
|
105
|
+
# Warnings
|
|
106
|
+
# """
|
|
107
|
+
# # warnings.simplefilter("ignore", UserWarning)
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# """
|
|
111
|
+
# Config
|
|
112
|
+
# """
|
|
113
|
+
# # CONFIG = scitex.gen.load_configs()
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
# """
|
|
117
|
+
# Functions & Classes
|
|
118
|
+
# """
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
# def format_output_func(out_text):
|
|
122
|
+
# def find_unwrapped_urls(text):
|
|
123
|
+
# # Regex to find URLs that are not already within <a href> tags
|
|
124
|
+
# url_pattern = (
|
|
125
|
+
# r'(?<!<a href=")(https?://|doi:|http://doi.org/)[^\s,<>"]+'
|
|
126
|
+
# )
|
|
127
|
+
|
|
128
|
+
# # Find all matches that are not already wrapped
|
|
129
|
+
# unwrapped_urls = re.findall(url_pattern, text)
|
|
130
|
+
|
|
131
|
+
# return unwrapped_urls
|
|
132
|
+
|
|
133
|
+
# def add_a_href_tag(text):
|
|
134
|
+
# # Function to replace each URL with its wrapped version
|
|
135
|
+
# def replace_url(match):
|
|
136
|
+
# url = match.group(0)
|
|
137
|
+
# # Normalize DOI URLs
|
|
138
|
+
# if url.startswith("doi:"):
|
|
139
|
+
# url = "https://doi.org/" + url[4:]
|
|
140
|
+
# return f'<a href="{url}">{url}</a>'
|
|
141
|
+
|
|
142
|
+
# # Regex pattern to match URLs not already wrapped in <a> tags
|
|
143
|
+
# url_pattern = (
|
|
144
|
+
# r'(?<!<a href=")(https?://|doi:|http://doi.org/)[^\s,<>"]+'
|
|
145
|
+
# )
|
|
146
|
+
|
|
147
|
+
# # Replace all occurrences of unwrapped URLs in the text
|
|
148
|
+
# updated_text = re.sub(url_pattern, replace_url, text)
|
|
149
|
+
|
|
150
|
+
# return updated_text
|
|
151
|
+
|
|
152
|
+
# def add_masked_api_key(text, api_key):
|
|
153
|
+
# masked_api_key = f"{api_key[:4]}****{api_key[-4:]}"
|
|
154
|
+
# return text + f"\n(API Key: {masked_api_key}"
|
|
155
|
+
|
|
156
|
+
# out_text = markdown2.markdown(out_text)
|
|
157
|
+
# out_text = add_a_href_tag(out_text)
|
|
158
|
+
# out_text = re.sub(r"^<p>(.*)</p>$", r"\1", out_text, flags=re.DOTALL)
|
|
159
|
+
# return out_text
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
# def main():
|
|
163
|
+
# pass
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
# if __name__ == "__main__":
|
|
167
|
+
# # # Argument Parser
|
|
168
|
+
# # import argparse
|
|
169
|
+
# # parser = argparse.ArgumentParser(description='')
|
|
170
|
+
# # parser.add_argument('--var', '-v', type=int, default=1, help='')
|
|
171
|
+
# # parser.add_argument('--flag', '-f', action='store_true', default=False, help='')
|
|
172
|
+
# # args = parser.parse_args()
|
|
173
|
+
|
|
174
|
+
# # Main
|
|
175
|
+
# CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
|
|
176
|
+
# sys, plt, verbose=False
|
|
177
|
+
# )
|
|
178
|
+
# main()
|
|
179
|
+
# scitex.gen.close(CONFIG, verbose=False, notify=False)
|
|
180
|
+
|
|
181
|
+
#
|
|
182
|
+
|
|
183
|
+
# EOF
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-05-03 11:57:10 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_genai_factory.py
|
|
5
|
+
# ----------------------------------------
|
|
6
|
+
import os
|
|
7
|
+
|
|
8
|
+
__FILE__ = "./src/scitex/ai/_gen_ai/_genai_factory.py"
|
|
9
|
+
__DIR__ = os.path.dirname(__FILE__)
|
|
10
|
+
# ----------------------------------------
|
|
11
|
+
|
|
12
|
+
import random
|
|
13
|
+
|
|
14
|
+
from .anthropic import Anthropic
|
|
15
|
+
from .deepseek import DeepSeek
|
|
16
|
+
from .google import Google
|
|
17
|
+
from .groq import Groq
|
|
18
|
+
from .llama import Llama
|
|
19
|
+
from .openai import OpenAI
|
|
20
|
+
from .params import MODELS
|
|
21
|
+
from .perplexity import Perplexity
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def genai_factory(
|
|
25
|
+
model="gpt-3.5-turbo",
|
|
26
|
+
stream=False,
|
|
27
|
+
api_key=None,
|
|
28
|
+
seed=None,
|
|
29
|
+
temperature=1.0,
|
|
30
|
+
n_keep=1,
|
|
31
|
+
chat_history=None,
|
|
32
|
+
max_tokens=4096,
|
|
33
|
+
):
|
|
34
|
+
"""Factory function to create an instance of an AI model handler."""
|
|
35
|
+
AVAILABLE_MODELS = MODELS.name.tolist()
|
|
36
|
+
|
|
37
|
+
if model not in AVAILABLE_MODELS:
|
|
38
|
+
raise ValueError(
|
|
39
|
+
f'Model "{model}" is not available. Please choose from:{MODELS.name.tolist()}'
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
provider = MODELS[MODELS.name == model].provider.iloc[0]
|
|
43
|
+
|
|
44
|
+
# model_class = globals()[provider]
|
|
45
|
+
model_class = {
|
|
46
|
+
"OpenAI": OpenAI,
|
|
47
|
+
"Anthropic": Anthropic,
|
|
48
|
+
"Google": Google,
|
|
49
|
+
"Llama": Llama,
|
|
50
|
+
"Perplexity": Perplexity,
|
|
51
|
+
"DeepSeek": DeepSeek,
|
|
52
|
+
"Groq": Groq,
|
|
53
|
+
}[provider]
|
|
54
|
+
|
|
55
|
+
# Select a random API key from the list
|
|
56
|
+
if isinstance(api_key, (list, tuple)):
|
|
57
|
+
api_key = random.choice(api_key)
|
|
58
|
+
|
|
59
|
+
return model_class(
|
|
60
|
+
model=model,
|
|
61
|
+
stream=stream,
|
|
62
|
+
api_key=api_key,
|
|
63
|
+
seed=seed,
|
|
64
|
+
temperature=temperature,
|
|
65
|
+
n_keep=n_keep,
|
|
66
|
+
chat_history=chat_history,
|
|
67
|
+
max_tokens=max_tokens,
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
# EOF
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Timestamp: "2025-02-06 13:47:23 (ywatanabe)"
|
|
4
|
+
# File: _Google.py
|
|
5
|
+
|
|
6
|
+
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/_Google.py"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
Functionality:
|
|
11
|
+
- Implements Google's Generative AI (Gemini) interface
|
|
12
|
+
- Handles both streaming and static text generation
|
|
13
|
+
Input:
|
|
14
|
+
- User prompts and chat history
|
|
15
|
+
- Model configurations and API credentials
|
|
16
|
+
Output:
|
|
17
|
+
- Generated text responses from Gemini models
|
|
18
|
+
- Token usage statistics
|
|
19
|
+
Prerequisites:
|
|
20
|
+
- Google API key (GOOGLE_API_KEY environment variable)
|
|
21
|
+
- google.generativeai package
|
|
22
|
+
|
|
23
|
+
DEPRECATED: This module is deprecated. Please use google_provider.py instead.
|
|
24
|
+
The new provider-based architecture offers better modularity and maintainability.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
"""Imports"""
|
|
28
|
+
import os
|
|
29
|
+
import sys
|
|
30
|
+
from pprint import pprint
|
|
31
|
+
from typing import Any, Dict, Generator, List, Optional
|
|
32
|
+
import warnings
|
|
33
|
+
|
|
34
|
+
import matplotlib.pyplot as plt
|
|
35
|
+
import scitex
|
|
36
|
+
|
|
37
|
+
from google import genai
|
|
38
|
+
|
|
39
|
+
from .base_genai import BaseGenAI
|
|
40
|
+
|
|
41
|
+
warnings.warn(
|
|
42
|
+
"google.py is deprecated. Please use google_provider.py instead. "
|
|
43
|
+
"See PROVIDER_MIGRATION_GUIDE.md for migration instructions.",
|
|
44
|
+
DeprecationWarning,
|
|
45
|
+
stacklevel=2,
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
"""Functions & Classes"""
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
class Google(BaseGenAI):
|
|
52
|
+
def __init__(
|
|
53
|
+
self,
|
|
54
|
+
system_setting: str = "",
|
|
55
|
+
api_key: Optional[str] = os.getenv("GOOGLE_API_KEY"),
|
|
56
|
+
model: str = "gemini-1.5-pro-latest",
|
|
57
|
+
stream: bool = False,
|
|
58
|
+
seed: Optional[int] = None,
|
|
59
|
+
n_keep: int = 1,
|
|
60
|
+
temperature: float = 1.0,
|
|
61
|
+
chat_history: Optional[List[Dict[str, str]]] = None,
|
|
62
|
+
max_tokens: int = 32_768,
|
|
63
|
+
) -> None:
|
|
64
|
+
|
|
65
|
+
api_key = api_key or os.getenv("GOOGLE_API_KEY")
|
|
66
|
+
|
|
67
|
+
if not api_key:
|
|
68
|
+
raise ValueError("GOOGLE_API_KEY environment variable not set")
|
|
69
|
+
|
|
70
|
+
super().__init__(
|
|
71
|
+
system_setting=system_setting,
|
|
72
|
+
model=model,
|
|
73
|
+
api_key=api_key,
|
|
74
|
+
stream=stream,
|
|
75
|
+
seed=seed,
|
|
76
|
+
n_keep=n_keep,
|
|
77
|
+
temperature=temperature,
|
|
78
|
+
provider="Google",
|
|
79
|
+
chat_history=chat_history,
|
|
80
|
+
max_tokens=max_tokens,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def _init_client(self) -> Any:
|
|
84
|
+
return genai.Client(api_key=self.api_key)
|
|
85
|
+
|
|
86
|
+
def _api_call_static(self) -> str:
|
|
87
|
+
response = self.client.models.generate_content(
|
|
88
|
+
model=self.model, contents=self.history
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
try:
|
|
92
|
+
self.input_tokens += response.usage_metadata.prompt_token_count
|
|
93
|
+
self.output_tokens += response.usage_metadata.candidates_token_count
|
|
94
|
+
except:
|
|
95
|
+
pass
|
|
96
|
+
|
|
97
|
+
return response.text
|
|
98
|
+
|
|
99
|
+
def _api_call_stream(self) -> Generator[str, None, None]:
|
|
100
|
+
# print("========================================")
|
|
101
|
+
# pprint(self.history)
|
|
102
|
+
# print("========================================")
|
|
103
|
+
|
|
104
|
+
# return self.client.models.generate_content_stream(
|
|
105
|
+
# model=self.model, contents=self.history
|
|
106
|
+
# )
|
|
107
|
+
|
|
108
|
+
for chunk in self.client.models.generate_content_stream(
|
|
109
|
+
model=self.model, contents=self.history
|
|
110
|
+
):
|
|
111
|
+
if chunk:
|
|
112
|
+
try:
|
|
113
|
+
self.input_tokens += chunk.usage_metadata.prompt_token_count
|
|
114
|
+
self.output_tokens += chunk.usage_metadata.candidates_token_count
|
|
115
|
+
except:
|
|
116
|
+
pass
|
|
117
|
+
|
|
118
|
+
yield chunk.text
|
|
119
|
+
|
|
120
|
+
def _api_format_history(
|
|
121
|
+
self, history: List[Dict[str, str]]
|
|
122
|
+
) -> List[Dict[str, str]]:
|
|
123
|
+
"""Formats the chat history for the Google Generative AI API."""
|
|
124
|
+
formatted_history = []
|
|
125
|
+
for item in history:
|
|
126
|
+
if isinstance(item.get("parts"), list):
|
|
127
|
+
# Rename role from assistant to model
|
|
128
|
+
if item.get("role") == "assistant":
|
|
129
|
+
item["role"] = "model"
|
|
130
|
+
formatted_history.append(item)
|
|
131
|
+
else:
|
|
132
|
+
formatted_history.append(
|
|
133
|
+
{
|
|
134
|
+
"role": item["role"],
|
|
135
|
+
"parts": [{"text": item["content"]}],
|
|
136
|
+
}
|
|
137
|
+
)
|
|
138
|
+
# print(formatted_history)
|
|
139
|
+
return formatted_history
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def main() -> None:
|
|
143
|
+
ai = scitex.ai.GenAI(
|
|
144
|
+
# "gemini-2.0-flash-exp",
|
|
145
|
+
# "gemini-2.0-flash",
|
|
146
|
+
# "gemini-2.0-flash-lite-preview-02-05",
|
|
147
|
+
# "gemini-2.0-pro-exp-02-05",
|
|
148
|
+
"gemini-2.0-flash-thinking-exp-01-21",
|
|
149
|
+
stream=True,
|
|
150
|
+
n_keep=10,
|
|
151
|
+
)
|
|
152
|
+
print(ai("hi"))
|
|
153
|
+
print(ai("My name is Yusuke"))
|
|
154
|
+
print(ai("do you remember my name?"))
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
if __name__ == "__main__":
|
|
158
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(sys, plt, verbose=False)
|
|
159
|
+
main()
|
|
160
|
+
scitex.gen.close(CONFIG, verbose=False, notify=False)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
"""
|
|
164
|
+
python src/scitex/ai/_gen_ai/_Google.py
|
|
165
|
+
python -m src.scitex.ai._gen_ai._Google
|
|
166
|
+
"""
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
# EOF
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-13 20:25:55 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/ai/genai/google_provider.py
|
|
5
|
+
|
|
6
|
+
"""Google Generative AI (Gemini) provider implementation using the new component-based architecture.
|
|
7
|
+
|
|
8
|
+
This module provides integration with Google's Gemini models through the google.generativeai API.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
import os
|
|
12
|
+
from typing import Dict, List, Iterator, Optional, Any
|
|
13
|
+
|
|
14
|
+
try:
|
|
15
|
+
from google import genai
|
|
16
|
+
except ImportError:
|
|
17
|
+
raise ImportError(
|
|
18
|
+
"google-generativeai package is required for Google provider. "
|
|
19
|
+
"Install with: pip install google-generativeai"
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
from .base_provider import BaseProvider, ProviderConfig
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
class GoogleProvider(BaseProvider):
|
|
26
|
+
"""Google Generative AI (Gemini) provider implementation."""
|
|
27
|
+
|
|
28
|
+
SUPPORTED_MODELS = [
|
|
29
|
+
"gemini-1.5-pro-latest",
|
|
30
|
+
"gemini-1.5-flash-latest",
|
|
31
|
+
"gemini-2.0-flash-exp",
|
|
32
|
+
"gemini-2.0-flash",
|
|
33
|
+
"gemini-2.0-flash-thinking-exp-01-21",
|
|
34
|
+
"gemini-2.0-pro-exp-02-05",
|
|
35
|
+
"gemini-2.0-flash-lite-preview-02-05",
|
|
36
|
+
]
|
|
37
|
+
|
|
38
|
+
DEFAULT_MODEL = "gemini-1.5-pro-latest"
|
|
39
|
+
|
|
40
|
+
def __init__(self, config: ProviderConfig):
|
|
41
|
+
"""Initialize Google provider.
|
|
42
|
+
|
|
43
|
+
Args:
|
|
44
|
+
config: Provider configuration
|
|
45
|
+
"""
|
|
46
|
+
self.config = config
|
|
47
|
+
self.api_key = config.api_key or os.getenv("GOOGLE_API_KEY")
|
|
48
|
+
|
|
49
|
+
if not self.api_key:
|
|
50
|
+
raise ValueError(
|
|
51
|
+
"Google API key not provided. Set GOOGLE_API_KEY environment variable or pass api_key."
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Initialize Google Generative AI client
|
|
55
|
+
self.client = genai.Client(api_key=self.api_key)
|
|
56
|
+
|
|
57
|
+
# Set default max_tokens if not provided
|
|
58
|
+
if self.config.max_tokens is None:
|
|
59
|
+
self.config.max_tokens = 32_768
|
|
60
|
+
|
|
61
|
+
def validate_messages(self, messages: List[Dict[str, Any]]) -> None:
|
|
62
|
+
"""Validate message format.
|
|
63
|
+
|
|
64
|
+
Args:
|
|
65
|
+
messages: List of message dictionaries
|
|
66
|
+
|
|
67
|
+
Raises:
|
|
68
|
+
ValueError: If messages are invalid
|
|
69
|
+
"""
|
|
70
|
+
if not messages:
|
|
71
|
+
raise ValueError("Messages cannot be empty")
|
|
72
|
+
|
|
73
|
+
for msg in messages:
|
|
74
|
+
if "role" not in msg:
|
|
75
|
+
raise ValueError(f"Missing role in message: {msg}")
|
|
76
|
+
if "content" not in msg:
|
|
77
|
+
raise ValueError(f"Missing content in message: {msg}")
|
|
78
|
+
if msg["role"] not in ["system", "user", "assistant", "model"]:
|
|
79
|
+
raise ValueError(f"Invalid role: {msg['role']}")
|
|
80
|
+
|
|
81
|
+
def format_messages(self, messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
82
|
+
"""Format messages for Google Generative AI API.
|
|
83
|
+
|
|
84
|
+
Google expects a specific format with 'parts' and 'model' role instead of 'assistant'.
|
|
85
|
+
|
|
86
|
+
Args:
|
|
87
|
+
messages: List of message dictionaries
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
Formatted messages for Google API
|
|
91
|
+
"""
|
|
92
|
+
formatted = []
|
|
93
|
+
|
|
94
|
+
# Add system prompt if configured
|
|
95
|
+
if self.config.system_prompt:
|
|
96
|
+
formatted.append(
|
|
97
|
+
{"role": "user", "parts": [{"text": self.config.system_prompt}]}
|
|
98
|
+
)
|
|
99
|
+
formatted.append(
|
|
100
|
+
{
|
|
101
|
+
"role": "model",
|
|
102
|
+
"parts": [
|
|
103
|
+
{"text": "I understand. I will follow these instructions."}
|
|
104
|
+
],
|
|
105
|
+
}
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
# Format user messages
|
|
109
|
+
for msg in messages:
|
|
110
|
+
role = msg["role"]
|
|
111
|
+
# Convert assistant to model for Google API
|
|
112
|
+
if role == "assistant":
|
|
113
|
+
role = "model"
|
|
114
|
+
elif role == "system":
|
|
115
|
+
# System messages are handled as user messages in Google API
|
|
116
|
+
role = "user"
|
|
117
|
+
|
|
118
|
+
# Check if already formatted with parts
|
|
119
|
+
if isinstance(msg.get("parts"), list):
|
|
120
|
+
formatted.append({"role": role, "parts": msg["parts"]})
|
|
121
|
+
else:
|
|
122
|
+
formatted.append({"role": role, "parts": [{"text": msg["content"]}]})
|
|
123
|
+
|
|
124
|
+
return formatted
|
|
125
|
+
|
|
126
|
+
def complete(self, messages: List[Dict[str, Any]], **kwargs) -> Dict[str, Any]:
|
|
127
|
+
"""Generate a completion.
|
|
128
|
+
|
|
129
|
+
Args:
|
|
130
|
+
messages: List of message dictionaries
|
|
131
|
+
**kwargs: Additional parameters for the API
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
Completion response dictionary
|
|
135
|
+
"""
|
|
136
|
+
self.validate_messages(messages)
|
|
137
|
+
formatted_messages = self.format_messages(messages)
|
|
138
|
+
|
|
139
|
+
# Merge config parameters with kwargs
|
|
140
|
+
model = self.config.model or self.DEFAULT_MODEL
|
|
141
|
+
|
|
142
|
+
try:
|
|
143
|
+
response = self.client.models.generate_content(
|
|
144
|
+
model=model,
|
|
145
|
+
contents=formatted_messages,
|
|
146
|
+
# Google API doesn't support all OpenAI parameters directly
|
|
147
|
+
# Temperature and other settings would need to be set via generation_config
|
|
148
|
+
)
|
|
149
|
+
|
|
150
|
+
# Extract token usage if available
|
|
151
|
+
usage = {}
|
|
152
|
+
if hasattr(response, "usage_metadata"):
|
|
153
|
+
usage = {
|
|
154
|
+
"prompt_tokens": response.usage_metadata.prompt_token_count,
|
|
155
|
+
"completion_tokens": response.usage_metadata.candidates_token_count,
|
|
156
|
+
"total_tokens": (
|
|
157
|
+
response.usage_metadata.prompt_token_count
|
|
158
|
+
+ response.usage_metadata.candidates_token_count
|
|
159
|
+
),
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
return {
|
|
163
|
+
"content": response.text,
|
|
164
|
+
"model": model,
|
|
165
|
+
"usage": usage,
|
|
166
|
+
"finish_reason": "stop",
|
|
167
|
+
}
|
|
168
|
+
except Exception as e:
|
|
169
|
+
raise RuntimeError(f"Google Generative AI error: {str(e)}")
|
|
170
|
+
|
|
171
|
+
def stream(
|
|
172
|
+
self, messages: List[Dict[str, Any]], **kwargs
|
|
173
|
+
) -> Iterator[Dict[str, Any]]:
|
|
174
|
+
"""Stream a completion.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
messages: List of message dictionaries
|
|
178
|
+
**kwargs: Additional parameters for the API
|
|
179
|
+
|
|
180
|
+
Yields:
|
|
181
|
+
Chunks of the completion
|
|
182
|
+
"""
|
|
183
|
+
self.validate_messages(messages)
|
|
184
|
+
formatted_messages = self.format_messages(messages)
|
|
185
|
+
|
|
186
|
+
model = self.config.model or self.DEFAULT_MODEL
|
|
187
|
+
|
|
188
|
+
try:
|
|
189
|
+
stream = self.client.models.generate_content_stream(
|
|
190
|
+
model=model,
|
|
191
|
+
contents=formatted_messages,
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
total_prompt_tokens = 0
|
|
195
|
+
total_completion_tokens = 0
|
|
196
|
+
|
|
197
|
+
for chunk in stream:
|
|
198
|
+
if chunk and hasattr(chunk, "text") and chunk.text:
|
|
199
|
+
# Track token usage if available
|
|
200
|
+
if hasattr(chunk, "usage_metadata"):
|
|
201
|
+
if hasattr(chunk.usage_metadata, "prompt_token_count"):
|
|
202
|
+
total_prompt_tokens += (
|
|
203
|
+
chunk.usage_metadata.prompt_token_count
|
|
204
|
+
)
|
|
205
|
+
if hasattr(chunk.usage_metadata, "candidates_token_count"):
|
|
206
|
+
total_completion_tokens += (
|
|
207
|
+
chunk.usage_metadata.candidates_token_count
|
|
208
|
+
)
|
|
209
|
+
|
|
210
|
+
yield {
|
|
211
|
+
"content": chunk.text,
|
|
212
|
+
"model": model,
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
# Yield final chunk with usage info if we collected any
|
|
216
|
+
if total_prompt_tokens > 0 or total_completion_tokens > 0:
|
|
217
|
+
yield {
|
|
218
|
+
"content": "",
|
|
219
|
+
"usage": {
|
|
220
|
+
"prompt_tokens": total_prompt_tokens,
|
|
221
|
+
"completion_tokens": total_completion_tokens,
|
|
222
|
+
"total_tokens": total_prompt_tokens + total_completion_tokens,
|
|
223
|
+
},
|
|
224
|
+
"finish_reason": "stop",
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
except Exception as e:
|
|
228
|
+
raise RuntimeError(f"Google Generative AI error: {str(e)}")
|