gptmed 0.3.5__py3-none-any.whl → 0.4.1__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: gptmed
3
- Version: 0.3.5
3
+ Version: 0.4.1
4
4
  Summary: A lightweight GPT-based language model framework for training custom question-answering models on any domain
5
5
  Author-email: Sanjog Sigdel <sigdelsanjog@gmail.com>
6
6
  Maintainer-email: Sanjog Sigdel <sigdelsanjog@gmail.com>
@@ -10,7 +10,7 @@ Project-URL: Documentation, https://github.com/sigdelsanjog/gptmed#readme
10
10
  Project-URL: Repository, https://github.com/sigdelsanjog/gptmed
11
11
  Project-URL: Issues, https://github.com/sigdelsanjog/gptmed/issues
12
12
  Keywords: nlp,language-model,transformer,gpt,pytorch,qa,question-answering,training,deep-learning,custom-model
13
- Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Development Status :: 4 - Beta
14
14
  Classifier: Intended Audience :: Developers
15
15
  Classifier: Intended Audience :: Science/Research
16
16
  Classifier: Intended Audience :: Education
@@ -38,28 +38,64 @@ Requires-Dist: mypy>=0.950; extra == "dev"
38
38
  Provides-Extra: training
39
39
  Requires-Dist: tensorboard>=2.10.0; extra == "training"
40
40
  Requires-Dist: wandb>=0.13.0; extra == "training"
41
+ Provides-Extra: visualization
42
+ Requires-Dist: matplotlib>=3.5.0; extra == "visualization"
43
+ Requires-Dist: seaborn>=0.12.0; extra == "visualization"
44
+ Provides-Extra: xai
45
+ Requires-Dist: matplotlib>=3.5.0; extra == "xai"
46
+ Requires-Dist: seaborn>=0.12.0; extra == "xai"
47
+ Requires-Dist: captum>=0.6.0; extra == "xai"
48
+ Requires-Dist: scikit-learn>=1.0.0; extra == "xai"
41
49
  Dynamic: license-file
42
50
 
43
51
  # GptMed 🤖
44
52
 
45
- A lightweight GPT-based language model framework for training custom question-answering models on any domain. This package provides a transformer-based GPT architecture that you can train on your own Q&A datasets - whether it's casual conversations, technical support, education, or any other domain.
46
-
53
+ [![Downloads](https://static.pepy.tech/badge/gptmed)](https://pepy.tech/project/gptmed)
54
+ [![Downloads/Month](https://static.pepy.tech/badge/gptmed/month)](https://pepy.tech/project/gptmed)
47
55
  [![PyPI version](https://badge.fury.io/py/gptmed.svg)](https://badge.fury.io/py/gptmed)
48
56
  [![Python 3.8+](https://img.shields.io/badge/python-3.8+-blue.svg)](https://www.python.org/downloads/)
49
57
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
50
58
 
51
- ## 📖 [Complete User Manual](USER_MANUAL.md) | [Quick Start](#quick-start)
59
+ A lightweight GPT-based language model framework for training custom question-answering models on any domain. This package provides a transformer-based GPT architecture that you can train on your own Q&A datasets - whether it's casual conversations, technical support, education, or any other domain.
52
60
 
53
- > **New to GptMed?** Check out the [**step-by-step User Manual**](USER_MANUAL.md) for a complete guide on training your own model!
61
+ ## Citation
54
62
 
55
- ## Features
63
+ If you use this model in your research, please cite:
56
64
 
57
- - 🧠 **Custom GPT Architecture**: Lightweight transformer model for any Q&A domain
58
- - 🎯 **Domain-Agnostic**: Train on any question-answering dataset (casual chat, tech support, education, etc.)
59
- - **Fast Inference**: Optimized for quick question answering
60
- - 🔧 **Flexible Training**: Easy to train on your own custom datasets
61
- - 📦 **Lightweight**: Small model size suitable for edge deployment
62
- - 🛠️ **Complete Toolkit**: Includes tokenizer training, model training, and inference utilities
65
+ ```bibtex
66
+ @software{gptmed_2026,
67
+ author = {Sanjog Sigdel},
68
+ title = {GptMed: A custom causal question answering general purpose GPT Transformer Architecture Model},
69
+ year = {2026},
70
+ url = {https://github.com/sigdelsanjog/gptmed}
71
+ }
72
+ ```
73
+
74
+ ## Table of Contents
75
+
76
+ - [Installation](#installation)
77
+ - [From PyPI (Recommended)](#from-pypi-recommended)
78
+ - [From Source](#from-source)
79
+ - [With Optional Dependencies](#with-optional-dependencies)
80
+ - [Quick Start](#quick-start)
81
+ - [Using the High-Level API](#using-the-high-level-api)
82
+ - [Inference (Generate Answers)](#inference-generate-answers)
83
+ - [Using Command Line](#using-command-line)
84
+ - [Training Your Own Model](#training-your-own-model)
85
+ - [Model Architecture](#model-architecture)
86
+ - [Configuration](#configuration)
87
+ - [Model Sizes](#model-sizes)
88
+ - [Training Configuration](#training-configuration)
89
+ - [Observability](#observability)
90
+ - [Project Structure](#project-structure)
91
+ - [Requirements](#requirements)
92
+ - [Documentation](#documentation)
93
+ - [Performance](#performance)
94
+ - [Examples](#examples)
95
+ - [Contributing](#contributing)
96
+ - [Citation](#citation)
97
+ - [License](#license)
98
+ - [Support](#support)
63
99
 
64
100
  ## Installation
65
101
 
@@ -83,15 +119,49 @@ pip install -e .
83
119
  # For development
84
120
  pip install gptmed[dev]
85
121
 
86
- # For training
122
+ # For training with logging integrations
87
123
  pip install gptmed[training]
88
124
 
125
+ # For visualization (loss curves, metrics plots)
126
+ pip install gptmed[visualization]
127
+
128
+ # For Explainable AI features
129
+ pip install gptmed[xai]
130
+
89
131
  # All dependencies
90
- pip install gptmed[dev,training]
132
+ pip install gptmed[dev,training,visualization,xai]
91
133
  ```
92
134
 
93
135
  ## Quick Start
94
136
 
137
+ ### Using the High-Level API
138
+
139
+ The easiest way to use GptMed is through the high-level API:
140
+
141
+ ```python
142
+ import gptmed
143
+
144
+ # 1. Create a training configuration
145
+ gptmed.create_config('my_config.yaml')
146
+
147
+ # 2. Edit my_config.yaml with your settings (data paths, model size, etc.)
148
+
149
+ # 3. Train the model
150
+ gptmed.train_from_config('my_config.yaml')
151
+
152
+ # 4. Generate answers
153
+ answer = gptmed.generate(
154
+ checkpoint='model/checkpoints/best_model.pt',
155
+ tokenizer='tokenizer/my_tokenizer.model',
156
+ prompt='What is machine learning?',
157
+ max_length=150,
158
+ temperature=0.7
159
+ )
160
+ print(answer)
161
+ ```
162
+
163
+ For a complete API testing workflow, see the [gptmed-api folder](https://github.com/sigdelsanjog/gptmed/tree/main/gptmed-api) with ready-to-run examples.
164
+
95
165
  ### Inference (Generate Answers)
96
166
 
97
167
  ```python
@@ -187,6 +257,50 @@ config = TrainingConfig(
187
257
  )
188
258
  ```
189
259
 
260
+ ## Observability
261
+
262
+ **New in v0.4.0**: Built-in training monitoring with Observer Pattern architecture.
263
+
264
+ ### Features
265
+
266
+ - 📊 **Loss Curves**: Track training/validation loss over time
267
+ - 📈 **Metrics Tracking**: Perplexity, gradient norms, learning rates
268
+ - 🔔 **Callbacks**: Console output, JSON logging, early stopping
269
+ - 📁 **Export**: CSV export, matplotlib visualizations
270
+ - 🔌 **Extensible**: Add custom observers for integrations (W&B, TensorBoard)
271
+
272
+ ### Quick Example
273
+
274
+ ```python
275
+ from gptmed.observability import MetricsTracker, ConsoleCallback, EarlyStoppingCallback
276
+
277
+ # Create observers
278
+ tracker = MetricsTracker(output_dir='./metrics')
279
+ console = ConsoleCallback(print_every=50)
280
+ early_stop = EarlyStoppingCallback(patience=3)
281
+
282
+ # Use with TrainingService (automatic)
283
+ from gptmed.services import TrainingService
284
+ service = TrainingService(config_path='config.yaml')
285
+ service.train() # Automatically creates MetricsTracker
286
+
287
+ # Or use with Trainer directly
288
+ trainer = Trainer(model, train_loader, config, observers=[tracker, console])
289
+ trainer.train()
290
+ ```
291
+
292
+ ### Available Observers
293
+
294
+ | Observer | Description |
295
+ | ----------------------- | --------------------------------------------------------- |
296
+ | `MetricsTracker` | Comprehensive metrics collection with export capabilities |
297
+ | `ConsoleCallback` | Real-time console output with progress bars |
298
+ | `JSONLoggerCallback` | Structured JSON logging for analysis |
299
+ | `EarlyStoppingCallback` | Stop training when validation loss plateaus |
300
+ | `LRSchedulerCallback` | Learning rate scheduling integration |
301
+
302
+ See [XAI.md](XAI.md) for future Explainable AI features roadmap.
303
+
190
304
  ## Project Structure
191
305
 
192
306
  ```
@@ -201,10 +315,16 @@ gptmed/
201
315
  │ ├── train.py # Training script
202
316
  │ ├── trainer.py # Training loop
203
317
  │ └── dataset.py # Data loading
318
+ ├── observability/ # Training monitoring & XAI (v0.4.0+)
319
+ │ ├── base.py # Observer pattern interfaces
320
+ │ ├── metrics_tracker.py # Loss curves & metrics
321
+ │ └── callbacks.py # Console, JSON, early stopping
204
322
  ├── tokenizer/
205
323
  │ └── train_tokenizer.py # SentencePiece tokenizer
206
324
  ├── configs/
207
325
  │ └── train_config.py # Training configurations
326
+ ├── services/
327
+ │ └── training_service.py # High-level training orchestration
208
328
  └── utils/
209
329
  ├── checkpoints.py # Model checkpointing
210
330
  └── logging.py # Training logging
@@ -226,6 +346,7 @@ gptmed/
226
346
 
227
347
  - [User Manual](USER_MANUAL.md) - **Start here!** Complete training pipeline guide
228
348
  - [Architecture Guide](ARCHITECTURE_EXTENSION_GUIDE.md) - Understanding the model architecture
349
+ - [XAI Roadmap](XAI.md) - Explainable AI features & implementation guide
229
350
  - [Deployment Guide](DEPLOYMENT_GUIDE.md) - Publishing to PyPI
230
351
  - [Changelog](CHANGELOG.md) - Version history
231
352
 
@@ -241,20 +362,53 @@ _Tested on GTX 1080 8GB_
241
362
 
242
363
  ## Examples
243
364
 
244
- ### Medical Question Answering
365
+ ### Domain-Agnostic Usage
366
+
367
+ GptMed works with **any domain** - just train on your own Q&A data:
245
368
 
246
369
  ```python
247
- # Example 1: Symptoms inquiry
248
- question = "What are the early signs of Alzheimer's disease?"
370
+ # Technical Support Bot
371
+ question = "How do I reset my WiFi router?"
249
372
  answer = generator.generate(question, temperature=0.7)
250
373
 
251
- # Example 2: Treatment information
252
- question = "How is Type 2 diabetes treated?"
374
+ # Educational Assistant
375
+ question = "Explain the water cycle in simple terms"
253
376
  answer = generator.generate(question, temperature=0.6)
254
377
 
255
- # Example 3: Medical definitions
256
- question = "What is hypertension?"
378
+ # Customer Service
379
+ question = "What is your return policy?"
257
380
  answer = generator.generate(question, temperature=0.5)
381
+
382
+ # Medical Q&A (example domain)
383
+ question = "What are the symptoms of flu?"
384
+ answer = generator.generate(question, temperature=0.7)
385
+ ```
386
+
387
+ ### Training Observability (v0.4.0+)
388
+
389
+ Monitor your training with built-in observability:
390
+
391
+ ```python
392
+ from gptmed.observability import MetricsTracker, ConsoleCallback
393
+
394
+ # Create observers
395
+ tracker = MetricsTracker(output_dir='./metrics')
396
+ console = ConsoleCallback(print_every=10)
397
+
398
+ # Train with observability
399
+ gptmed.train_from_config(
400
+ 'my_config.yaml',
401
+ observers=[tracker, console]
402
+ )
403
+
404
+ # After training - get the report
405
+ report = tracker.get_report()
406
+ print(f"Final Loss: {report['final_loss']:.4f}")
407
+ print(f"Total Steps: {report['total_steps']}")
408
+
409
+ # Export metrics
410
+ tracker.export_to_csv('training_metrics.csv')
411
+ tracker.plot_loss_curves('loss_curves.png') # Requires matplotlib
258
412
  ```
259
413
 
260
414
  ## Contributing
@@ -267,19 +421,6 @@ Contributions are welcome! Please feel free to submit a Pull Request.
267
421
  4. Push to the branch (`git push origin feature/AmazingFeature`)
268
422
  5. Open a Pull Request
269
423
 
270
- ## Citation
271
-
272
- If you use this model in your research, please cite:
273
-
274
- ```bibtex
275
- @software{llm_med_2026,
276
- author = {Sanjog Sigdel},
277
- title = {GptMed: A custom causal question answering general purpose GPT Transformer Architecture Model},
278
- year = {2026},
279
- url = {https://github.com/sigdelsanjog/gptmed}
280
- }
281
- ```
282
-
283
424
  ## License
284
425
 
285
426
  This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
@@ -289,16 +430,12 @@ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file
289
430
  - MedQuAD dataset creators
290
431
  - PyTorch team
291
432
 
292
- ## Disclaimer
293
-
294
- ⚠️ **Medical Disclaimer**: This model is for research and educational purposes only. It should NOT be used for actual medical diagnosis or treatment decisions. Always consult qualified healthcare professionals for medical advice.
295
-
296
433
  ## Support
297
434
 
298
- - **[User Manual](USER_MANUAL.md)** - Complete step-by-step training guide
299
- - �📫 Issues: [GitHub Issues](https://github.com/sigdelsanjog/gptmed/issues)
435
+ - 📫 [User Manual](USER_MANUAL.md)\*\* - Complete step-by-step training guide
436
+ - 📫 Issues: [GitHub Issues](https://github.com/sigdelsanjog/gptmed/issues)
300
437
  - 💬 Discussions: [GitHub Discussions](https://github.com/sigdelsanjog/gptmed/discussions)
301
- - 📧 Email: sanjog.sigdel@ku.edu.np
438
+ - 📧 Email: sigdelsanjog@gmail.com | sanjog.sigdel@ku.edu.np
302
439
 
303
440
  ## Changelog
304
441
 
@@ -306,4 +443,4 @@ See [CHANGELOG.md](CHANGELOG.md) for version history.
306
443
 
307
444
  ---
308
445
 
309
- Made with ❤️ for learning purpose
446
+ #### Made with ❤️ from Nepal
@@ -1,8 +1,8 @@
1
- gptmed/__init__.py,sha256=mwzeW2Qc6j1z5f6HOvZ_BNOnFSncWEK2KEkdqq91yYY,1676
2
- gptmed/api.py,sha256=k9a_1F2h__xgKnH2l0FaJqAqu-iTYt5tu_VfVO0UhrA,9806
1
+ gptmed/__init__.py,sha256=lSCUt0jmB81dEG0UroQdrk8TMG9Hv-_a14nAvB6yYiQ,2725
2
+ gptmed/api.py,sha256=GbOaFYvDQgn_qm2FCLiiSXDp-uhvlUNRcY6zTFmsBAs,9882
3
3
  gptmed/configs/__init__.py,sha256=yRa-zgPQ-OCzu8fvCrfWMG-CjF3dru3PZzknzm0oUaQ,23
4
4
  gptmed/configs/config_loader.py,sha256=3GQ1iCNpdJ5yALWXA3SPPHRkaUO-117vdArEL6u7sK8,6354
5
- gptmed/configs/train_config.py,sha256=KqfNBh9hdTTd_6gEAlrClU8sVFSlVDmZJOrf3cPwFe8,4657
5
+ gptmed/configs/train_config.py,sha256=cuGE5o4N3TA65Sue8J3XrbmI5QKI7Ww3WeHd2M7yoHQ,4828
6
6
  gptmed/configs/training_config.yaml,sha256=EEZZa3kcsZr3g-_fKDPYZt4_NTpmS-3NvJrTYSWNc8g,2874
7
7
  gptmed/data/__init__.py,sha256=iAHeakB5pBAd7MkmarPPY0UKS9bTaO_winLZ23Y2O90,54
8
8
  gptmed/data/parsers/__init__.py,sha256=BgVzXuZgeE5DUCC4SzN7vflL40wQ4Q4_4DmJ1Y43_nw,211
@@ -13,7 +13,7 @@ gptmed/inference/decoding_utils.py,sha256=zTDZYdl2jcGwSrcINXMw-5uoYuF4A9TSushhPx
13
13
  gptmed/inference/generation_config.py,sha256=hpPyZUk1K6qGSBAoQx3Jm0_ZrrYld77ACxbIlCCCcVU,2813
14
14
  gptmed/inference/generator.py,sha256=6JFmDPQF4btau_Gp5pfk8a5G0Iyg6QsB9Y8Oo4ygH-4,7884
15
15
  gptmed/inference/sampling.py,sha256=B6fRlJafypuBMKJ0rTbsk6k8KXloXiIvroi7rN6ekBA,7947
16
- gptmed/model/__init__.py,sha256=brAE8ZhCDeQlU13YSqiBZTrTE8SHL_3bvFhZMzZnh3A,191
16
+ gptmed/model/__init__.py,sha256=j5-KIrO_-913r1exnNzrbuuhuVmRJMmssRWrQjj5rdw,199
17
17
  gptmed/model/architecture/__init__.py,sha256=9MpSAYwwZY-t1vBLIupuRtLD7CaOLJRENMh3zKx3M-4,970
18
18
  gptmed/model/architecture/attention.py,sha256=Qk1eGl9glKWQbhcXJWmFkO5U3VHBq7OrsjVG0tPmgnY,6420
19
19
  gptmed/model/architecture/decoder_block.py,sha256=n-Uo09TDcirKeWTWTNumldGOrx-b2Elb25lbF6cTYwg,3879
@@ -22,23 +22,27 @@ gptmed/model/architecture/feedforward.py,sha256=uJ5QOlWX0ritKDQLUE7GPmMojelR9-sT
22
22
  gptmed/model/architecture/transformer.py,sha256=H1njPoy0Uam59JbA24C0olEDwPfhh3ev4HsUFRIC_0Y,6626
23
23
  gptmed/model/configs/__init__.py,sha256=LDCWhlCDOU7490wcfSId_jXBPfQrtYQEw8FoD67rqBs,275
24
24
  gptmed/model/configs/model_config.py,sha256=wI-i2Dw_pTdIKCDe1pqLvP3ky3YedEy7DwZYN5lwmKE,4673
25
+ gptmed/observability/__init__.py,sha256=AtGf0D8jEx2LGQ0Ro-Eh0SFDuA5ZjZkot7D1Y8j1jiM,1180
26
+ gptmed/observability/base.py,sha256=Mi3F95bJ9Tw5scoSyw9AtKlcu9aG444G1UlycIIGCtI,10748
27
+ gptmed/observability/callbacks.py,sha256=1b84_e86mfyt2EQGzf-6K2Sba3bZJt4I3bBJb52TAbA,13170
28
+ gptmed/observability/metrics_tracker.py,sha256=Bs6tppQYG9AOb3rj2T1lhWKDyOw4R4ZG6nFGRiek8FQ,19441
25
29
  gptmed/services/__init__.py,sha256=FtM7NQ_S4VOfl2n6A6cLcOxG9-w7BK7DicQsUvOMmGE,369
26
30
  gptmed/services/device_manager.py,sha256=RSsu0RlsexCIO-p4eejOZAPLgpaVA0y9niTg8wf1luY,7513
27
- gptmed/services/training_service.py,sha256=o9Kxxoi6CVDvvM9rwGYNX426qTnmqxLXLt_bVi1ZSK4,11253
31
+ gptmed/services/training_service.py,sha256=cF3yYo8aZe7BfQ-paTN-l7EYs9h8L_JUyRhiI0GEP4E,16921
28
32
  gptmed/tokenizer/__init__.py,sha256=KhLAHPmQyoWhnKDenyIJRxgFflKI7xklip28j4cKfKw,157
29
33
  gptmed/tokenizer/tokenize_data.py,sha256=KgMtMfaz_RtOhN_CrvC267k9ujxRdO89rToVJ6nzdwg,9139
30
34
  gptmed/tokenizer/train_tokenizer.py,sha256=f0Hucyft9e8LU2RtpTqg8h_0SpOC_oMABl0_me-wfL8,7068
31
35
  gptmed/training/__init__.py,sha256=6G0_gdlwBnQBG8wZlTm2NtgkXZJcXRfLMDQ2iu6O3U4,24
32
36
  gptmed/training/dataset.py,sha256=QbNVTN4Og5gqMAV2ckjRX8W_k9aUc9IZJDcu0u9U8t0,5347
33
37
  gptmed/training/train.py,sha256=sp4-1WpEXUTA9V0GUYAgSvMd2aaPkt1aq2PepQFLXD8,8142
34
- gptmed/training/trainer.py,sha256=asOKT9d7lvmtEm5PIcMHg8iUdulNJpobNFNwOjdkeEg,10728
38
+ gptmed/training/trainer.py,sha256=F1K9pkDMU-TbvmGGQ3JjRek4ZoFI6GHIFFEg7yYfIGM,15206
35
39
  gptmed/training/utils.py,sha256=pJxCwneNr2STITIYwIDCxRzIICDFOxOMzK8DT7ck2oQ,5651
36
40
  gptmed/utils/__init__.py,sha256=XuMhIqOXF7mjnog_6Iky-hSbwvFb0iK42B4iDUpgi0U,44
37
- gptmed/utils/checkpoints.py,sha256=L4q1-_4GbHCoD7QuEKYeQ-xXDTF-6sqZOxKQ_LT8YmQ,7112
41
+ gptmed/utils/checkpoints.py,sha256=jPKJtO0YRZieGmpwqotgDkBzd__s_raDxS1kLpfjBJE,7113
38
42
  gptmed/utils/logging.py,sha256=7dJc1tayMxCBjFSDXe4r9ACUTpoPTTGsJ0UZMTqZIDY,5303
39
- gptmed-0.3.5.dist-info/licenses/LICENSE,sha256=v2spsd7N1pKFFh2G8wGP_45iwe5S0DYiJzG4im8Rupc,1066
40
- gptmed-0.3.5.dist-info/METADATA,sha256=Zx3kFlZiBdkXco_VkEqOnIeasCYrgWl2XP21D2QcmuA,9382
41
- gptmed-0.3.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
- gptmed-0.3.5.dist-info/entry_points.txt,sha256=ATqOzTtPVdUiFX5ZSeo3n9JkUCqocUxEXTgy1CfNRZE,110
43
- gptmed-0.3.5.dist-info/top_level.txt,sha256=mhyEq3rG33t21ziJz5w3TPgx0RjPf4zXMNUx2JTiNmE,7
44
- gptmed-0.3.5.dist-info/RECORD,,
43
+ gptmed-0.4.1.dist-info/licenses/LICENSE,sha256=v2spsd7N1pKFFh2G8wGP_45iwe5S0DYiJzG4im8Rupc,1066
44
+ gptmed-0.4.1.dist-info/METADATA,sha256=ek6fOyXkyu9k_d66_Vt2Rn8-ZyikKn-raTkdeXFIEGg,13832
45
+ gptmed-0.4.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ gptmed-0.4.1.dist-info/entry_points.txt,sha256=ATqOzTtPVdUiFX5ZSeo3n9JkUCqocUxEXTgy1CfNRZE,110
47
+ gptmed-0.4.1.dist-info/top_level.txt,sha256=mhyEq3rG33t21ziJz5w3TPgx0RjPf4zXMNUx2JTiNmE,7
48
+ gptmed-0.4.1.dist-info/RECORD,,
File without changes