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,276 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2025-05-31 10:15:00"
|
|
4
|
+
# Author: ywatanabe
|
|
5
|
+
# File: ./src/scitex/ai/genai/cost_tracker.py
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
Tracks token usage and costs for AI API calls.
|
|
9
|
+
|
|
10
|
+
This module provides cost tracking functionality including:
|
|
11
|
+
- Token counting for input/output
|
|
12
|
+
- Cost calculation based on model pricing
|
|
13
|
+
- Usage statistics aggregation
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
from typing import Dict, Optional, List, Any
|
|
17
|
+
from dataclasses import dataclass, field
|
|
18
|
+
|
|
19
|
+
from .calc_cost import calc_cost
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
@dataclass
|
|
23
|
+
class TokenUsage:
|
|
24
|
+
"""Token usage statistics.
|
|
25
|
+
|
|
26
|
+
Attributes
|
|
27
|
+
----------
|
|
28
|
+
input_tokens : int
|
|
29
|
+
Total input tokens used
|
|
30
|
+
output_tokens : int
|
|
31
|
+
Total output tokens used
|
|
32
|
+
total_tokens : int
|
|
33
|
+
Total tokens (input + output)
|
|
34
|
+
"""
|
|
35
|
+
|
|
36
|
+
input_tokens: int = 0
|
|
37
|
+
output_tokens: int = 0
|
|
38
|
+
|
|
39
|
+
@property
|
|
40
|
+
def total_tokens(self) -> int:
|
|
41
|
+
"""Get total token count."""
|
|
42
|
+
return self.input_tokens + self.output_tokens
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class CostTracker:
|
|
46
|
+
"""Tracks token usage and associated costs.
|
|
47
|
+
|
|
48
|
+
Example
|
|
49
|
+
-------
|
|
50
|
+
>>> tracker = CostTracker("openai", "gpt-4")
|
|
51
|
+
>>> tracker.update(input_tokens=100, output_tokens=50)
|
|
52
|
+
>>> cost = tracker.calculate_cost()
|
|
53
|
+
>>> print(f"Total cost: ${cost:.4f}")
|
|
54
|
+
Total cost: $0.0045
|
|
55
|
+
|
|
56
|
+
Parameters
|
|
57
|
+
----------
|
|
58
|
+
provider : str
|
|
59
|
+
The provider name (e.g., "openai", "anthropic")
|
|
60
|
+
model : str
|
|
61
|
+
The model name for cost calculation
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
def __init__(self, provider: str, model: str):
|
|
65
|
+
"""Initialize cost tracker.
|
|
66
|
+
|
|
67
|
+
Parameters
|
|
68
|
+
----------
|
|
69
|
+
provider : str
|
|
70
|
+
The provider name
|
|
71
|
+
model : str
|
|
72
|
+
The model name
|
|
73
|
+
"""
|
|
74
|
+
self.provider = provider
|
|
75
|
+
self.model = model
|
|
76
|
+
|
|
77
|
+
# Total token counters
|
|
78
|
+
self.input_tokens = 0
|
|
79
|
+
self.output_tokens = 0
|
|
80
|
+
|
|
81
|
+
# Session token counters
|
|
82
|
+
self.session_input_tokens = 0
|
|
83
|
+
self.session_output_tokens = 0
|
|
84
|
+
|
|
85
|
+
# Token history for detailed tracking
|
|
86
|
+
self._history: List[TokenUsage] = []
|
|
87
|
+
|
|
88
|
+
# Request counter
|
|
89
|
+
self.request_count = 0
|
|
90
|
+
|
|
91
|
+
# Properties for backward compatibility
|
|
92
|
+
@property
|
|
93
|
+
def total_prompt_tokens(self) -> int:
|
|
94
|
+
"""Get total prompt (input) tokens."""
|
|
95
|
+
return self.input_tokens
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def total_completion_tokens(self) -> int:
|
|
99
|
+
"""Get total completion (output) tokens."""
|
|
100
|
+
return self.output_tokens
|
|
101
|
+
|
|
102
|
+
@property
|
|
103
|
+
def total_cost(self) -> float:
|
|
104
|
+
"""Get total cost."""
|
|
105
|
+
return self.calculate_cost()
|
|
106
|
+
|
|
107
|
+
def update(self, input_tokens: int, output_tokens: int) -> None:
|
|
108
|
+
"""Update token counts.
|
|
109
|
+
|
|
110
|
+
Parameters
|
|
111
|
+
----------
|
|
112
|
+
input_tokens : int
|
|
113
|
+
Number of input tokens to add
|
|
114
|
+
output_tokens : int
|
|
115
|
+
Number of output tokens to add
|
|
116
|
+
"""
|
|
117
|
+
# Update total counters
|
|
118
|
+
self.input_tokens += input_tokens
|
|
119
|
+
self.output_tokens += output_tokens
|
|
120
|
+
|
|
121
|
+
# Update session counters
|
|
122
|
+
self.session_input_tokens += input_tokens
|
|
123
|
+
self.session_output_tokens += output_tokens
|
|
124
|
+
|
|
125
|
+
# Record in history
|
|
126
|
+
usage = TokenUsage(input_tokens=input_tokens, output_tokens=output_tokens)
|
|
127
|
+
self._history.append(usage)
|
|
128
|
+
|
|
129
|
+
# Increment request count
|
|
130
|
+
self.request_count += 1
|
|
131
|
+
|
|
132
|
+
def track_usage(self, model: str, usage: TokenUsage) -> None:
|
|
133
|
+
"""Track usage (for backward compatibility).
|
|
134
|
+
|
|
135
|
+
Parameters
|
|
136
|
+
----------
|
|
137
|
+
model : str
|
|
138
|
+
Model name (ignored, uses instance model)
|
|
139
|
+
usage : TokenUsage
|
|
140
|
+
Token usage to track
|
|
141
|
+
"""
|
|
142
|
+
self.update(usage.input_tokens, usage.output_tokens)
|
|
143
|
+
|
|
144
|
+
def calculate_cost(self) -> float:
|
|
145
|
+
"""Calculate total cost based on token usage.
|
|
146
|
+
|
|
147
|
+
Returns
|
|
148
|
+
-------
|
|
149
|
+
float
|
|
150
|
+
Total cost in USD
|
|
151
|
+
"""
|
|
152
|
+
return calc_cost(
|
|
153
|
+
model=self.model,
|
|
154
|
+
input_tokens=self.input_tokens,
|
|
155
|
+
output_tokens=self.output_tokens,
|
|
156
|
+
)
|
|
157
|
+
|
|
158
|
+
def calculate_session_cost(self) -> float:
|
|
159
|
+
"""Calculate session cost based on session token usage.
|
|
160
|
+
|
|
161
|
+
Returns
|
|
162
|
+
-------
|
|
163
|
+
float
|
|
164
|
+
Session cost in USD
|
|
165
|
+
"""
|
|
166
|
+
return calc_cost(
|
|
167
|
+
model=self.model,
|
|
168
|
+
input_tokens=self.session_input_tokens,
|
|
169
|
+
output_tokens=self.session_output_tokens,
|
|
170
|
+
)
|
|
171
|
+
|
|
172
|
+
def reset_session(self) -> None:
|
|
173
|
+
"""Reset session counters while keeping totals."""
|
|
174
|
+
self.session_input_tokens = 0
|
|
175
|
+
self.session_output_tokens = 0
|
|
176
|
+
|
|
177
|
+
def reset(self) -> None:
|
|
178
|
+
"""Reset all token usage and cost tracking."""
|
|
179
|
+
self.input_tokens = 0
|
|
180
|
+
self.output_tokens = 0
|
|
181
|
+
self.session_input_tokens = 0
|
|
182
|
+
self.session_output_tokens = 0
|
|
183
|
+
self._history = []
|
|
184
|
+
|
|
185
|
+
def get_usage_stats(self) -> Dict[str, Any]:
|
|
186
|
+
"""Get comprehensive usage statistics.
|
|
187
|
+
|
|
188
|
+
Returns
|
|
189
|
+
-------
|
|
190
|
+
Dict[str, Any]
|
|
191
|
+
Dictionary containing usage statistics
|
|
192
|
+
"""
|
|
193
|
+
return {
|
|
194
|
+
"total_input_tokens": self.input_tokens,
|
|
195
|
+
"total_output_tokens": self.output_tokens,
|
|
196
|
+
"total_tokens": self.input_tokens + self.output_tokens,
|
|
197
|
+
"session_input_tokens": self.session_input_tokens,
|
|
198
|
+
"session_output_tokens": self.session_output_tokens,
|
|
199
|
+
"session_total_tokens": self.session_input_tokens
|
|
200
|
+
+ self.session_output_tokens,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
def get_summary(self) -> str:
|
|
204
|
+
"""Get a cost summary (alias for format_cost_summary).
|
|
205
|
+
|
|
206
|
+
Returns
|
|
207
|
+
-------
|
|
208
|
+
str
|
|
209
|
+
Formatted cost summary
|
|
210
|
+
"""
|
|
211
|
+
return self.format_cost_summary()
|
|
212
|
+
|
|
213
|
+
def format_cost_summary(self) -> str:
|
|
214
|
+
"""Format a human-readable cost summary.
|
|
215
|
+
|
|
216
|
+
Returns
|
|
217
|
+
-------
|
|
218
|
+
str
|
|
219
|
+
Formatted cost summary
|
|
220
|
+
"""
|
|
221
|
+
total_cost = self.calculate_cost()
|
|
222
|
+
session_cost = self.calculate_session_cost()
|
|
223
|
+
|
|
224
|
+
return (
|
|
225
|
+
f"Cost Summary for {self.provider} - {self.model}\n"
|
|
226
|
+
f"{'=' * 50}\n"
|
|
227
|
+
f"Total Usage:\n"
|
|
228
|
+
f" Input tokens: {self.input_tokens:,}\n"
|
|
229
|
+
f" Output tokens: {self.output_tokens:,}\n"
|
|
230
|
+
f" Total tokens: {self.input_tokens + self.output_tokens:,}\n"
|
|
231
|
+
f" Total cost: ${total_cost:.4f}\n"
|
|
232
|
+
f"\n"
|
|
233
|
+
f"Session Usage:\n"
|
|
234
|
+
f" Input tokens: {self.session_input_tokens:,}\n"
|
|
235
|
+
f" Output tokens: {self.session_output_tokens:,}\n"
|
|
236
|
+
f" Total tokens: {self.session_input_tokens + self.session_output_tokens:,}\n"
|
|
237
|
+
f" Session cost: ${session_cost:.4f}\n"
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
def get_detailed_report(self) -> Dict[str, Any]:
|
|
241
|
+
"""Get a detailed cost and usage report.
|
|
242
|
+
|
|
243
|
+
Returns
|
|
244
|
+
-------
|
|
245
|
+
Dict[str, Any]
|
|
246
|
+
Comprehensive report including usage, costs, and statistics
|
|
247
|
+
"""
|
|
248
|
+
return {
|
|
249
|
+
"provider": self.provider,
|
|
250
|
+
"model": self.model,
|
|
251
|
+
"total_cost": self.calculate_cost(),
|
|
252
|
+
"session_cost": self.calculate_session_cost(),
|
|
253
|
+
"usage_stats": self.get_usage_stats(),
|
|
254
|
+
"num_api_calls": len(self._history),
|
|
255
|
+
"average_per_call": {
|
|
256
|
+
"input_tokens": (
|
|
257
|
+
self.input_tokens / len(self._history) if self._history else 0
|
|
258
|
+
),
|
|
259
|
+
"output_tokens": (
|
|
260
|
+
self.output_tokens / len(self._history) if self._history else 0
|
|
261
|
+
),
|
|
262
|
+
},
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
def __repr__(self) -> str:
|
|
266
|
+
"""String representation of CostTracker."""
|
|
267
|
+
cost = self.calculate_cost()
|
|
268
|
+
return (
|
|
269
|
+
f"CostTracker(provider={self.provider}, "
|
|
270
|
+
f"model={self.model}, "
|
|
271
|
+
f"total_tokens={self.input_tokens + self.output_tokens}, "
|
|
272
|
+
f"cost=${cost:.4f})"
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
|
|
276
|
+
# EOF
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-08 20:33:49 (ywatanabe)"
|
|
4
|
+
# File: ./scitex_repo/src/scitex/ai/_gen_ai/_DeepSeek.py
|
|
5
|
+
|
|
6
|
+
"""
|
|
7
|
+
1. Functionality:
|
|
8
|
+
- Implements DeepSeek Code LLM API interface
|
|
9
|
+
2. Input:
|
|
10
|
+
- Text prompts for code generation
|
|
11
|
+
3. Output:
|
|
12
|
+
- Generated code responses (streaming or static)
|
|
13
|
+
4. Prerequisites:
|
|
14
|
+
- DEEPSEEK_API_KEY environment variable
|
|
15
|
+
- requests library
|
|
16
|
+
|
|
17
|
+
DEPRECATED: This module is deprecated. Please use deepseek_provider.py instead.
|
|
18
|
+
The new provider-based architecture offers better modularity and maintainability.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
"""Imports"""
|
|
22
|
+
import json
|
|
23
|
+
import os
|
|
24
|
+
import sys
|
|
25
|
+
from typing import Dict, Generator, List, Optional
|
|
26
|
+
import warnings
|
|
27
|
+
|
|
28
|
+
import scitex
|
|
29
|
+
import requests
|
|
30
|
+
|
|
31
|
+
from .base_genai import BaseGenAI
|
|
32
|
+
|
|
33
|
+
warnings.warn(
|
|
34
|
+
"deepseek.py is deprecated. Please use deepseek_provider.py instead. "
|
|
35
|
+
"See PROVIDER_MIGRATION_GUIDE.md for migration instructions.",
|
|
36
|
+
DeprecationWarning,
|
|
37
|
+
stacklevel=2,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
"""Warnings"""
|
|
41
|
+
# scitex.pd.ignore_SettingWithCopyWarning()
|
|
42
|
+
# warnings.simplefilter("ignore", UserWarning)
|
|
43
|
+
# with warnings.catch_warnings():
|
|
44
|
+
# warnings.simplefilter("ignore", UserWarning)
|
|
45
|
+
|
|
46
|
+
"""Parameters"""
|
|
47
|
+
# from scitex.io import load_configs
|
|
48
|
+
# CONFIG = load_configs()
|
|
49
|
+
|
|
50
|
+
"""Functions & Classes"""
|
|
51
|
+
"""Imports"""
|
|
52
|
+
from .base_genai import BaseGenAI
|
|
53
|
+
from openai import OpenAI as _OpenAI
|
|
54
|
+
|
|
55
|
+
"""Functions & Classes"""
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class DeepSeek(BaseGenAI):
|
|
59
|
+
def __init__(
|
|
60
|
+
self,
|
|
61
|
+
system_setting="",
|
|
62
|
+
model="deepseek-chat",
|
|
63
|
+
api_key="",
|
|
64
|
+
stream=False,
|
|
65
|
+
seed=None,
|
|
66
|
+
n_keep=1,
|
|
67
|
+
temperature=1.0,
|
|
68
|
+
chat_history=None,
|
|
69
|
+
max_tokens=4096,
|
|
70
|
+
):
|
|
71
|
+
super().__init__(
|
|
72
|
+
system_setting=system_setting,
|
|
73
|
+
model=model,
|
|
74
|
+
api_key=api_key,
|
|
75
|
+
stream=stream,
|
|
76
|
+
n_keep=n_keep,
|
|
77
|
+
temperature=temperature,
|
|
78
|
+
provider="DeepSeek",
|
|
79
|
+
chat_history=chat_history,
|
|
80
|
+
max_tokens=max_tokens,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
def _init_client(self):
|
|
84
|
+
# client = _OpenAI(api_key=self.api_key, base_url="https://api.deepseek.com")
|
|
85
|
+
client = _OpenAI(api_key=self.api_key, base_url="https://api.deepseek.com/beta")
|
|
86
|
+
|
|
87
|
+
return client
|
|
88
|
+
|
|
89
|
+
def _api_call_static(self):
|
|
90
|
+
kwargs = dict(
|
|
91
|
+
model=self.model,
|
|
92
|
+
messages=self.history,
|
|
93
|
+
seed=self.seed,
|
|
94
|
+
stream=False,
|
|
95
|
+
temperature=self.temperature,
|
|
96
|
+
max_tokens=self.max_tokens,
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
output = self.client.chat.completions.create(**kwargs)
|
|
100
|
+
self.input_tokens += output.usage.prompt_tokens
|
|
101
|
+
self.output_tokens += output.usage.completion_tokens
|
|
102
|
+
|
|
103
|
+
out_text = output.choices[0].message.content
|
|
104
|
+
|
|
105
|
+
return out_text
|
|
106
|
+
|
|
107
|
+
def _api_call_stream(self):
|
|
108
|
+
kwargs = dict(
|
|
109
|
+
model=self.model,
|
|
110
|
+
messages=self.history,
|
|
111
|
+
max_tokens=self.max_tokens,
|
|
112
|
+
n=1,
|
|
113
|
+
stream=self.stream,
|
|
114
|
+
seed=self.seed,
|
|
115
|
+
temperature=self.temperature,
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
stream = self.client.chat.completions.create(**kwargs)
|
|
119
|
+
buffer = ""
|
|
120
|
+
|
|
121
|
+
for chunk in stream:
|
|
122
|
+
if chunk:
|
|
123
|
+
try:
|
|
124
|
+
self.input_tokens += chunk.usage.prompt_tokens
|
|
125
|
+
except:
|
|
126
|
+
pass
|
|
127
|
+
try:
|
|
128
|
+
self.output_tokens += chunk.usage.completion_tokens
|
|
129
|
+
except:
|
|
130
|
+
pass
|
|
131
|
+
|
|
132
|
+
try:
|
|
133
|
+
current_text = chunk.choices[0].delta.content
|
|
134
|
+
if current_text:
|
|
135
|
+
buffer += current_text
|
|
136
|
+
if any(char in ".!?\n " for char in current_text):
|
|
137
|
+
yield buffer
|
|
138
|
+
buffer = ""
|
|
139
|
+
except Exception as e:
|
|
140
|
+
pass
|
|
141
|
+
|
|
142
|
+
if buffer:
|
|
143
|
+
yield buffer
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if __name__ == "__main__":
|
|
147
|
+
# -----------------------------------
|
|
148
|
+
# Initiatialization of scitex format
|
|
149
|
+
# -----------------------------------
|
|
150
|
+
import sys
|
|
151
|
+
|
|
152
|
+
import matplotlib.pyplot as plt
|
|
153
|
+
|
|
154
|
+
# Configurations
|
|
155
|
+
CONFIG, sys.stdout, sys.stderr, plt, CC = scitex.gen.start(
|
|
156
|
+
sys,
|
|
157
|
+
plt,
|
|
158
|
+
verbose=False,
|
|
159
|
+
agg=True,
|
|
160
|
+
# sdir_suffix="",
|
|
161
|
+
)
|
|
162
|
+
|
|
163
|
+
# # Argument parser
|
|
164
|
+
# script_mode = scitex.gen.is_script()
|
|
165
|
+
# import argparse
|
|
166
|
+
# parser = argparse.ArgumentParser(description='')
|
|
167
|
+
# parser.add_argument('--var', '-v', type=int, choices=None, default=1, help='(default: %%(default)s)')
|
|
168
|
+
# parser.add_argument('--flag', '-f', action='store_true', default=False, help='(default: %%(default)s)')
|
|
169
|
+
# args = parser.parse_args()
|
|
170
|
+
# scitex.gen.print_block(args, c='yellow')
|
|
171
|
+
|
|
172
|
+
# -----------------------------------
|
|
173
|
+
# Main
|
|
174
|
+
# -----------------------------------
|
|
175
|
+
exit_status = main()
|
|
176
|
+
|
|
177
|
+
# -----------------------------------
|
|
178
|
+
# Cleanup scitex format
|
|
179
|
+
# -----------------------------------
|
|
180
|
+
scitex.gen.close(
|
|
181
|
+
CONFIG,
|
|
182
|
+
verbose=False,
|
|
183
|
+
notify=False,
|
|
184
|
+
message="",
|
|
185
|
+
exit_status=exit_status,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
# EOF
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# -*- coding: utf-8 -*-
|
|
3
|
+
# Time-stamp: "2024-11-25 12:00:00"
|
|
4
|
+
# Author: Yusuke Watanabe (ywatanabe@alumni.u-tokyo.ac.jp)
|
|
5
|
+
# scitex/src/scitex/ai/genai/deepseek_provider.py
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
DeepSeek provider implementation for GenAI.
|
|
9
|
+
|
|
10
|
+
Provides access to DeepSeek's API for code generation and chat.
|
|
11
|
+
Uses OpenAI-compatible API endpoint.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from typing import List, Dict, Any, Optional, Generator
|
|
15
|
+
import logging
|
|
16
|
+
import os
|
|
17
|
+
|
|
18
|
+
from .base_provider import BaseProvider, CompletionResponse, Provider
|
|
19
|
+
from .provider_factory import register_provider
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class DeepSeekProvider(BaseProvider):
|
|
25
|
+
"""
|
|
26
|
+
DeepSeek provider implementation.
|
|
27
|
+
|
|
28
|
+
Supports DeepSeek Chat and DeepSeek Coder models.
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
SUPPORTED_MODELS = [
|
|
32
|
+
"deepseek-chat",
|
|
33
|
+
"deepseek-coder",
|
|
34
|
+
]
|
|
35
|
+
|
|
36
|
+
DEFAULT_MODEL = "deepseek-chat"
|
|
37
|
+
|
|
38
|
+
def __init__(self, config):
|
|
39
|
+
"""Initialize DeepSeek provider."""
|
|
40
|
+
self.config = config
|
|
41
|
+
self.api_key = config.api_key or os.getenv("DEEPSEEK_API_KEY")
|
|
42
|
+
self.model = config.model or self.DEFAULT_MODEL
|
|
43
|
+
self.kwargs = config.kwargs or {}
|
|
44
|
+
|
|
45
|
+
if not self.api_key:
|
|
46
|
+
raise ValueError(
|
|
47
|
+
"DEEPSEEK_API_KEY not provided and not found in environment"
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# Import OpenAI client (DeepSeek uses OpenAI-compatible API)
|
|
51
|
+
try:
|
|
52
|
+
from openai import OpenAI as OpenAIClient
|
|
53
|
+
|
|
54
|
+
# DeepSeek uses a custom base URL
|
|
55
|
+
self.client = OpenAIClient(
|
|
56
|
+
api_key=self.api_key, base_url="https://api.deepseek.com/beta"
|
|
57
|
+
)
|
|
58
|
+
except ImportError:
|
|
59
|
+
raise ImportError(
|
|
60
|
+
"OpenAI package not installed. Install with: pip install openai"
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def complete(self, messages: List[Dict[str, Any]], **kwargs) -> CompletionResponse:
|
|
64
|
+
"""
|
|
65
|
+
Generate completion using DeepSeek API.
|
|
66
|
+
|
|
67
|
+
Args:
|
|
68
|
+
messages: List of message dictionaries
|
|
69
|
+
**kwargs: Additional parameters (temperature, max_tokens, etc.)
|
|
70
|
+
|
|
71
|
+
Returns:
|
|
72
|
+
CompletionResponse with generated text and usage info
|
|
73
|
+
"""
|
|
74
|
+
# Validate messages
|
|
75
|
+
if not self.validate_messages(messages):
|
|
76
|
+
raise ValueError("Invalid message format")
|
|
77
|
+
|
|
78
|
+
# Format messages for DeepSeek (same as OpenAI format)
|
|
79
|
+
formatted_messages = self.format_messages(messages)
|
|
80
|
+
|
|
81
|
+
# Prepare API parameters
|
|
82
|
+
api_params = {
|
|
83
|
+
"model": self.model,
|
|
84
|
+
"messages": formatted_messages,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
# Add optional parameters
|
|
88
|
+
for param in ["temperature", "max_tokens", "top_p", "stop", "seed", "n"]:
|
|
89
|
+
if param in kwargs:
|
|
90
|
+
api_params[param] = kwargs[param]
|
|
91
|
+
|
|
92
|
+
try:
|
|
93
|
+
# Make API call
|
|
94
|
+
response = self.client.chat.completions.create(**api_params)
|
|
95
|
+
|
|
96
|
+
# Extract content and usage
|
|
97
|
+
content = response.choices[0].message.content
|
|
98
|
+
usage = response.usage
|
|
99
|
+
|
|
100
|
+
return CompletionResponse(
|
|
101
|
+
content=content,
|
|
102
|
+
input_tokens=usage.prompt_tokens,
|
|
103
|
+
output_tokens=usage.completion_tokens,
|
|
104
|
+
finish_reason=response.choices[0].finish_reason,
|
|
105
|
+
provider_response=response,
|
|
106
|
+
)
|
|
107
|
+
|
|
108
|
+
except Exception as e:
|
|
109
|
+
logger.error(f"DeepSeek API error: {str(e)}")
|
|
110
|
+
raise
|
|
111
|
+
|
|
112
|
+
def format_messages(self, messages: List[Dict[str, Any]]) -> List[Dict[str, Any]]:
|
|
113
|
+
"""
|
|
114
|
+
Format messages for DeepSeek API.
|
|
115
|
+
|
|
116
|
+
DeepSeek uses the same message format as OpenAI.
|
|
117
|
+
"""
|
|
118
|
+
formatted_messages = []
|
|
119
|
+
|
|
120
|
+
for msg in messages:
|
|
121
|
+
formatted_msg = {"role": msg["role"], "content": msg["content"]}
|
|
122
|
+
formatted_messages.append(formatted_msg)
|
|
123
|
+
|
|
124
|
+
return formatted_messages
|
|
125
|
+
|
|
126
|
+
def validate_messages(self, messages: List[Dict[str, Any]]) -> bool:
|
|
127
|
+
"""Validate message format."""
|
|
128
|
+
if not messages:
|
|
129
|
+
return False
|
|
130
|
+
|
|
131
|
+
for msg in messages:
|
|
132
|
+
if not isinstance(msg, dict):
|
|
133
|
+
return False
|
|
134
|
+
if "role" not in msg or "content" not in msg:
|
|
135
|
+
return False
|
|
136
|
+
if msg["role"] not in ["system", "user", "assistant"]:
|
|
137
|
+
return False
|
|
138
|
+
|
|
139
|
+
return True
|
|
140
|
+
|
|
141
|
+
def stream(
|
|
142
|
+
self, messages: List[Dict[str, Any]], **kwargs
|
|
143
|
+
) -> Generator[str, None, CompletionResponse]:
|
|
144
|
+
"""Generate a streaming completion.
|
|
145
|
+
|
|
146
|
+
Args:
|
|
147
|
+
messages: List of messages in standard format
|
|
148
|
+
**kwargs: Additional parameters
|
|
149
|
+
|
|
150
|
+
Yields:
|
|
151
|
+
Text chunks during streaming
|
|
152
|
+
|
|
153
|
+
Returns:
|
|
154
|
+
Final CompletionResponse when complete
|
|
155
|
+
"""
|
|
156
|
+
# Validate messages
|
|
157
|
+
if not self.validate_messages(messages):
|
|
158
|
+
raise ValueError("Invalid message format")
|
|
159
|
+
|
|
160
|
+
# Format messages for DeepSeek
|
|
161
|
+
formatted_messages = self.format_messages(messages)
|
|
162
|
+
|
|
163
|
+
# Prepare API parameters
|
|
164
|
+
api_params = {
|
|
165
|
+
"model": self.model,
|
|
166
|
+
"messages": formatted_messages,
|
|
167
|
+
"stream": True,
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
# Add optional parameters
|
|
171
|
+
for param in ["temperature", "max_tokens", "top_p", "stop", "seed", "n"]:
|
|
172
|
+
if param in kwargs:
|
|
173
|
+
api_params[param] = kwargs[param]
|
|
174
|
+
|
|
175
|
+
try:
|
|
176
|
+
# Make streaming API call
|
|
177
|
+
stream = self.client.chat.completions.create(**api_params)
|
|
178
|
+
|
|
179
|
+
# Track content and usage
|
|
180
|
+
full_content = ""
|
|
181
|
+
prompt_tokens = 0
|
|
182
|
+
completion_tokens = 0
|
|
183
|
+
|
|
184
|
+
for chunk in stream:
|
|
185
|
+
if chunk.choices[0].delta.content:
|
|
186
|
+
content = chunk.choices[0].delta.content
|
|
187
|
+
full_content += content
|
|
188
|
+
yield content
|
|
189
|
+
|
|
190
|
+
# Try to get usage info from chunks (if available)
|
|
191
|
+
if hasattr(chunk, "usage") and chunk.usage:
|
|
192
|
+
if hasattr(chunk.usage, "prompt_tokens"):
|
|
193
|
+
prompt_tokens = chunk.usage.prompt_tokens
|
|
194
|
+
if hasattr(chunk.usage, "completion_tokens"):
|
|
195
|
+
completion_tokens = chunk.usage.completion_tokens
|
|
196
|
+
|
|
197
|
+
# If no usage info from stream, estimate
|
|
198
|
+
if prompt_tokens == 0:
|
|
199
|
+
prompt_tokens = self.count_tokens(str(formatted_messages))
|
|
200
|
+
if completion_tokens == 0:
|
|
201
|
+
completion_tokens = self.count_tokens(full_content)
|
|
202
|
+
|
|
203
|
+
# Return final response
|
|
204
|
+
return CompletionResponse(
|
|
205
|
+
content=full_content,
|
|
206
|
+
input_tokens=prompt_tokens,
|
|
207
|
+
output_tokens=completion_tokens,
|
|
208
|
+
finish_reason="stop",
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
except Exception as e:
|
|
212
|
+
logger.error(f"DeepSeek streaming error: {str(e)}")
|
|
213
|
+
raise
|
|
214
|
+
|
|
215
|
+
def count_tokens(self, text: str) -> int:
|
|
216
|
+
"""Count tokens in the given text.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
text: Text to count tokens for
|
|
220
|
+
|
|
221
|
+
Returns:
|
|
222
|
+
Number of tokens (estimated)
|
|
223
|
+
"""
|
|
224
|
+
# DeepSeek uses similar tokenization to GPT models
|
|
225
|
+
# Rough estimate: 1 token ≈ 4 characters or 0.75 words
|
|
226
|
+
return len(text.split()) * 4 // 3
|
|
227
|
+
|
|
228
|
+
@property
|
|
229
|
+
def supports_images(self) -> bool:
|
|
230
|
+
"""Check if this provider/model supports image inputs."""
|
|
231
|
+
# DeepSeek currently doesn't support multimodal inputs
|
|
232
|
+
return False
|
|
233
|
+
|
|
234
|
+
@property
|
|
235
|
+
def supports_streaming(self) -> bool:
|
|
236
|
+
"""Check if this provider/model supports streaming."""
|
|
237
|
+
return True
|
|
238
|
+
|
|
239
|
+
@property
|
|
240
|
+
def max_context_length(self) -> int:
|
|
241
|
+
"""Get maximum context length for this model."""
|
|
242
|
+
# DeepSeek models typically support 4K-16K context
|
|
243
|
+
context_lengths = {
|
|
244
|
+
"deepseek-chat": 4096,
|
|
245
|
+
"deepseek-coder": 16384,
|
|
246
|
+
}
|
|
247
|
+
return context_lengths.get(self.model, 4096)
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
# Auto-register when module is imported
|
|
251
|
+
register_provider(Provider.DEEPSEEK.value, DeepSeekProvider)
|