sibbbuu commited on
Commit
dea5f50
Β·
verified Β·
1 Parent(s): 59973fb

Upload folder using huggingface_hub

Browse files
Files changed (8) hide show
  1. README.md +93 -0
  2. __init__.py +1 -0
  3. compat_model.joblib +3 -0
  4. config.json +2041 -0
  5. error_model.joblib +3 -0
  6. example.py +27 -0
  7. pycompat_model.py +561 -0
  8. requirements.txt +4 -0
README.md ADDED
@@ -0,0 +1,93 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language: en
3
+ license: mit
4
+ library_name: scikit-learn
5
+ tags:
6
+ - python
7
+ - package-compatibility
8
+ - prediction
9
+ - scikit-learn
10
+ - tabular-classification
11
+ metrics:
12
+ - accuracy
13
+ - f1
14
+ model-index:
15
+ - name: pycompat-predictor
16
+ results:
17
+ - task:
18
+ type: tabular-classification
19
+ name: Package Compatibility Prediction
20
+ metrics:
21
+ - name: Accuracy
22
+ type: accuracy
23
+ value: 0.9708
24
+ - name: F1 Score
25
+ type: f1
26
+ value: 0.97
27
+ ---
28
+
29
+ # PyCompat β€” Python Package Compatibility Predictor
30
+
31
+ AI model that predicts whether a Python package version is compatible with a given system
32
+ (OS, Python version, platform) and recommends the best compatible versions.
33
+
34
+ ## Model Details
35
+
36
+ - **Model Type:** Random Forest (compatibility) + Gradient Boosting (error type)
37
+ - **Training Data:** 5484 compatibility test records
38
+ - **Packages:** 198 unique packages
39
+ - **Python Versions:** 3.10, 3.11, 3.12, 3.9
40
+ - **Platforms:** darwin_x86_64
41
+
42
+ ## Performance
43
+
44
+ | Model | Accuracy | F1 Score |
45
+ |-------|----------|----------|
46
+ | Compatibility | 0.9708 | 0.97 |
47
+ | Error Type | 0.9836 | 0.9826 |
48
+
49
+ ## Usage
50
+
51
+ ```python
52
+ from pycompat_model import PyCompatModel
53
+
54
+ # Load model
55
+ model = PyCompatModel.load("./model")
56
+
57
+ # Single prediction
58
+ result = model.predict("boto3", "1.42.49", "3.12", "darwin_x86_64")
59
+ print(result)
60
+ # {'is_compatible': True, 'confidence': 0.9977, 'predicted_error_type': 'none', ...}
61
+
62
+ # Get recommendations
63
+ recs = model.recommend("alembic", "3.9")
64
+ for r in recs:
65
+ status = "βœ…" if r["is_compatible"] else "❌"
66
+ print(f" v{r['version']} {status} ({r['confidence']:.0%})")
67
+
68
+ # Batch prediction
69
+ results = model.predict_batch([
70
+ {"package": "boto3", "version": "1.42.49", "python_version": "3.12"},
71
+ {"package": "alembic", "version": "1.18.4", "python_version": "3.9"},
72
+ ])
73
+ ```
74
+
75
+ ## Error Types Predicted
76
+
77
+ | Error Type | Description |
78
+ |-----------|-------------|
79
+ | `none` | Fully compatible |
80
+ | `no_wheel` | No compatible wheel/distribution found |
81
+ | `import_error` | Installs but fails to import |
82
+ | `abi_mismatch` | ABI incompatibility with dependencies |
83
+ | `build_error` | Failed to build from source |
84
+ | `timeout` | Network timeout during install |
85
+
86
+ ## Training
87
+
88
+ ```python
89
+ from pycompat_model import PyCompatModel
90
+
91
+ model = PyCompatModel.train_from_data("data.json")
92
+ model.save("./model")
93
+ ```
__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ from .pycompat_model import PyCompatModel
compat_model.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:441f2a5708c9965dd27b10edc63f2a45d60c125252902b67bc0c1ed121a2ee6f
3
+ size 7434281
config.json ADDED
@@ -0,0 +1,2041 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_name": "pycompat-predictor",
3
+ "model_version": "1.0.0",
4
+ "mappings": {
5
+ "package_map": {
6
+ "aiobotocore": 0,
7
+ "aiohappyeyeballs": 1,
8
+ "aiohttp": 2,
9
+ "aiosignal": 3,
10
+ "alembic": 4,
11
+ "annotated-doc": 5,
12
+ "annotated-types": 6,
13
+ "anyio": 7,
14
+ "asn1crypto": 8,
15
+ "async-timeout": 9,
16
+ "attrs": 10,
17
+ "awscli": 11,
18
+ "azure-core": 12,
19
+ "azure-identity": 13,
20
+ "backoff": 14,
21
+ "bcrypt": 15,
22
+ "beautifulsoup4": 16,
23
+ "blinker": 17,
24
+ "boto3": 18,
25
+ "botocore": 19,
26
+ "build": 20,
27
+ "cachetools": 21,
28
+ "certifi": 22,
29
+ "cffi": 23,
30
+ "chardet": 24,
31
+ "charset-normalizer": 25,
32
+ "click": 26,
33
+ "cloudpickle": 27,
34
+ "colorama": 28,
35
+ "coverage": 29,
36
+ "cryptography": 30,
37
+ "cycler": 31,
38
+ "decorator": 32,
39
+ "deprecated": 33,
40
+ "dill": 34,
41
+ "distlib": 35,
42
+ "distro": 36,
43
+ "dnspython": 37,
44
+ "docutils": 38,
45
+ "et-xmlfile": 39,
46
+ "exceptiongroup": 40,
47
+ "fastapi": 41,
48
+ "filelock": 42,
49
+ "flask": 43,
50
+ "fonttools": 44,
51
+ "frozenlist": 45,
52
+ "fsspec": 46,
53
+ "gitdb": 47,
54
+ "gitpython": 48,
55
+ "google-api-core": 49,
56
+ "google-api-python-client": 50,
57
+ "google-auth": 51,
58
+ "google-auth-oauthlib": 52,
59
+ "google-cloud-bigquery": 53,
60
+ "google-cloud-core": 54,
61
+ "google-cloud-storage": 55,
62
+ "google-crc32c": 56,
63
+ "google-genai": 57,
64
+ "google-resumable-media": 58,
65
+ "googleapis-common-protos": 59,
66
+ "greenlet": 60,
67
+ "grpcio": 61,
68
+ "grpcio-status": 62,
69
+ "grpcio-tools": 63,
70
+ "h11": 64,
71
+ "hatchling": 65,
72
+ "httpcore": 66,
73
+ "httpx": 67,
74
+ "huggingface-hub": 68,
75
+ "idna": 69,
76
+ "importlib-metadata": 70,
77
+ "iniconfig": 71,
78
+ "isodate": 72,
79
+ "itsdangerous": 73,
80
+ "jaraco-classes": 74,
81
+ "jeepney": 75,
82
+ "jinja2": 76,
83
+ "jiter": 77,
84
+ "jmespath": 78,
85
+ "joblib": 79,
86
+ "jsonpointer": 80,
87
+ "jsonschema": 81,
88
+ "jsonschema-specifications": 82,
89
+ "keyring": 83,
90
+ "kiwisolver": 84,
91
+ "kubernetes": 85,
92
+ "langchain": 86,
93
+ "langsmith": 87,
94
+ "lxml": 88,
95
+ "markdown-it-py": 89,
96
+ "markupsafe": 90,
97
+ "matplotlib": 91,
98
+ "mdurl": 92,
99
+ "more-itertools": 93,
100
+ "msal": 94,
101
+ "msgpack": 95,
102
+ "multidict": 96,
103
+ "mypy-extensions": 97,
104
+ "networkx": 98,
105
+ "nodeenv": 99,
106
+ "numpy": 100,
107
+ "oauthlib": 101,
108
+ "openai": 102,
109
+ "openpyxl": 103,
110
+ "opentelemetry-api": 104,
111
+ "opentelemetry-exporter-otlp": 105,
112
+ "opentelemetry-exporter-otlp-proto-common": 106,
113
+ "opentelemetry-exporter-otlp-proto-grpc": 107,
114
+ "opentelemetry-exporter-otlp-proto-http": 108,
115
+ "opentelemetry-proto": 109,
116
+ "opentelemetry-sdk": 110,
117
+ "packaging": 111,
118
+ "pandas": 112,
119
+ "paramiko": 113,
120
+ "pathspec": 114,
121
+ "pexpect": 115,
122
+ "pillow": 116,
123
+ "platformdirs": 117,
124
+ "pluggy": 118,
125
+ "poetry-core": 119,
126
+ "prompt-toolkit": 120,
127
+ "propcache": 121,
128
+ "proto-plus": 122,
129
+ "protobuf": 123,
130
+ "psutil": 124,
131
+ "psycopg2-binary": 125,
132
+ "ptyprocess": 126,
133
+ "pyarrow": 127,
134
+ "pyasn1": 128,
135
+ "pyasn1-modules": 129,
136
+ "pycparser": 130,
137
+ "pydantic": 131,
138
+ "pydantic-core": 132,
139
+ "pydantic-settings": 133,
140
+ "pygments": 134,
141
+ "pyjwt": 135,
142
+ "pynacl": 136,
143
+ "pyopenssl": 137,
144
+ "pyparsing": 138,
145
+ "pyproject-hooks": 139,
146
+ "pytest": 140,
147
+ "pytest-asyncio": 141,
148
+ "pytest-cov": 142,
149
+ "python-dateutil": 143,
150
+ "python-dotenv": 144,
151
+ "python-multipart": 145,
152
+ "pytz": 146,
153
+ "pyyaml": 147,
154
+ "redis": 148,
155
+ "referencing": 149,
156
+ "regex": 150,
157
+ "requests": 151,
158
+ "requests-oauthlib": 152,
159
+ "requests-toolbelt": 153,
160
+ "rich": 154,
161
+ "rpds-py": 155,
162
+ "rsa": 156,
163
+ "ruamel-yaml": 157,
164
+ "ruff": 158,
165
+ "s3fs": 159,
166
+ "s3transfer": 160,
167
+ "scikit-learn": 161,
168
+ "scipy": 162,
169
+ "secretstorage": 163,
170
+ "setuptools-scm": 164,
171
+ "shellingham": 165,
172
+ "six": 166,
173
+ "smmap": 167,
174
+ "sniffio": 168,
175
+ "snowflake-connector-python": 169,
176
+ "sortedcontainers": 170,
177
+ "soupsieve": 171,
178
+ "sqlalchemy": 172,
179
+ "starlette": 173,
180
+ "tabulate": 174,
181
+ "tenacity": 175,
182
+ "threadpoolctl": 176,
183
+ "tomli": 177,
184
+ "tomlkit": 178,
185
+ "tqdm": 179,
186
+ "trove-classifiers": 180,
187
+ "typer": 181,
188
+ "typing-extensions": 182,
189
+ "typing-inspection": 183,
190
+ "tzdata": 184,
191
+ "tzlocal": 185,
192
+ "urllib3": 186,
193
+ "uvicorn": 187,
194
+ "virtualenv": 188,
195
+ "wcwidth": 189,
196
+ "websocket-client": 190,
197
+ "websockets": 191,
198
+ "werkzeug": 192,
199
+ "wrapt": 193,
200
+ "yandexcloud": 194,
201
+ "yarl": 195,
202
+ "zipp": 196,
203
+ "zstandard": 197
204
+ },
205
+ "platform_map": {
206
+ "darwin_x86_64": 0
207
+ },
208
+ "error_map": {
209
+ "abi_mismatch": 0,
210
+ "build_error": 1,
211
+ "import_error": 2,
212
+ "no_wheel": 3,
213
+ "none": 4,
214
+ "timeout": 5
215
+ },
216
+ "reverse_error_map": {
217
+ "0": "abi_mismatch",
218
+ "1": "build_error",
219
+ "2": "import_error",
220
+ "3": "no_wheel",
221
+ "4": "none",
222
+ "5": "timeout"
223
+ }
224
+ },
225
+ "metadata": {
226
+ "model_name": "pycompat-predictor",
227
+ "model_version": "1.0.0",
228
+ "total_records": 5484,
229
+ "total_packages": 198,
230
+ "python_versions": [
231
+ "3.10",
232
+ "3.11",
233
+ "3.12",
234
+ "3.9"
235
+ ],
236
+ "platforms": [
237
+ "darwin_x86_64"
238
+ ],
239
+ "feature_columns": [
240
+ "package_encoded",
241
+ "version_major",
242
+ "version_minor",
243
+ "version_patch",
244
+ "python_version_num",
245
+ "platform_encoded",
246
+ "version_recency",
247
+ "pkg_name_len",
248
+ "pkg_has_hyphen"
249
+ ],
250
+ "metrics": {
251
+ "compatibility": {
252
+ "accuracy": 0.9708,
253
+ "f1_score": 0.97
254
+ },
255
+ "error_type": {
256
+ "accuracy": 0.9836,
257
+ "f1_score": 0.9826
258
+ }
259
+ },
260
+ "feature_importances": {
261
+ "package_encoded": 0.193,
262
+ "version_major": 0.1274,
263
+ "version_minor": 0.2012,
264
+ "version_patch": 0.0568,
265
+ "python_version_num": 0.0557,
266
+ "platform_encoded": 0.0,
267
+ "version_recency": 0.0401,
268
+ "pkg_name_len": 0.1742,
269
+ "pkg_has_hyphen": 0.1516
270
+ }
271
+ },
272
+ "package_versions": {
273
+ "aiobotocore": [
274
+ "2.25.2",
275
+ "2.26.0",
276
+ "3.0.0",
277
+ "3.1.0",
278
+ "3.1.1",
279
+ "3.1.2",
280
+ "3.1.3"
281
+ ],
282
+ "aiohappyeyeballs": [
283
+ "2.4.5",
284
+ "2.4.6",
285
+ "2.4.7",
286
+ "2.4.8",
287
+ "2.5.0",
288
+ "2.6.0",
289
+ "2.6.1"
290
+ ],
291
+ "aiohttp": [
292
+ "3.12.13",
293
+ "3.12.14",
294
+ "3.12.15",
295
+ "3.13.0",
296
+ "3.13.1",
297
+ "3.13.2",
298
+ "3.13.3"
299
+ ],
300
+ "aiosignal": [
301
+ "1.1.0",
302
+ "1.1.1",
303
+ "1.1.2",
304
+ "1.2.0",
305
+ "1.3.1",
306
+ "1.3.2",
307
+ "1.4.0"
308
+ ],
309
+ "alembic": [
310
+ "1.17.1",
311
+ "1.17.2",
312
+ "1.18.0",
313
+ "1.18.1",
314
+ "1.18.2",
315
+ "1.18.3",
316
+ "1.18.4"
317
+ ],
318
+ "annotated-doc": [
319
+ "0.0.1",
320
+ "0.0.2",
321
+ "0.0.3",
322
+ "0.0.4"
323
+ ],
324
+ "annotated-types": [
325
+ "0.2.0",
326
+ "0.3.0",
327
+ "0.3.1",
328
+ "0.4.0",
329
+ "0.5.0",
330
+ "0.6.0",
331
+ "0.7.0"
332
+ ],
333
+ "anyio": [
334
+ "4.10.0",
335
+ "4.11.0",
336
+ "4.12.0",
337
+ "4.12.1",
338
+ "4.7.0",
339
+ "4.8.0",
340
+ "4.9.0"
341
+ ],
342
+ "asn1crypto": [
343
+ "1.0.1",
344
+ "1.1.0",
345
+ "1.2.0",
346
+ "1.3.0",
347
+ "1.4.0",
348
+ "1.5.0",
349
+ "1.5.1"
350
+ ],
351
+ "async-timeout": [
352
+ "3.0.1",
353
+ "4.0.0",
354
+ "4.0.1",
355
+ "4.0.2",
356
+ "4.0.3",
357
+ "5.0.0",
358
+ "5.0.1"
359
+ ],
360
+ "attrs": [
361
+ "24.1.0",
362
+ "24.2.0",
363
+ "24.3.0",
364
+ "25.1.0",
365
+ "25.2.0",
366
+ "25.3.0",
367
+ "25.4.0"
368
+ ],
369
+ "awscli": [
370
+ "1.44.39",
371
+ "1.44.40",
372
+ "1.44.41",
373
+ "1.44.42",
374
+ "1.44.43",
375
+ "1.44.44",
376
+ "1.44.45"
377
+ ],
378
+ "azure-core": [
379
+ "1.35.0",
380
+ "1.35.1",
381
+ "1.36.0",
382
+ "1.37.0",
383
+ "1.38.0",
384
+ "1.38.1",
385
+ "1.38.2"
386
+ ],
387
+ "azure-identity": [
388
+ "1.22.0",
389
+ "1.23.0",
390
+ "1.23.1",
391
+ "1.24.0",
392
+ "1.25.0",
393
+ "1.25.1",
394
+ "1.25.2"
395
+ ],
396
+ "backoff": [
397
+ "2.0.0",
398
+ "2.0.1",
399
+ "2.1.0",
400
+ "2.1.1",
401
+ "2.1.2",
402
+ "2.2.0",
403
+ "2.2.1"
404
+ ],
405
+ "bcrypt": [
406
+ "4.1.1",
407
+ "4.1.2",
408
+ "4.1.3",
409
+ "4.2.0",
410
+ "4.2.1",
411
+ "4.3.0",
412
+ "5.0.0"
413
+ ],
414
+ "beautifulsoup4": [
415
+ "4.13.3",
416
+ "4.13.4",
417
+ "4.13.5",
418
+ "4.14.0",
419
+ "4.14.1",
420
+ "4.14.2",
421
+ "4.14.3"
422
+ ],
423
+ "blinker": [
424
+ "1.6.2",
425
+ "1.6.3",
426
+ "1.7.0",
427
+ "1.8.0",
428
+ "1.8.1",
429
+ "1.8.2",
430
+ "1.9.0"
431
+ ],
432
+ "boto3": [
433
+ "1.42.49",
434
+ "1.42.50",
435
+ "1.42.51",
436
+ "1.42.52",
437
+ "1.42.53",
438
+ "1.42.54",
439
+ "1.42.55"
440
+ ],
441
+ "botocore": [
442
+ "1.42.49",
443
+ "1.42.50",
444
+ "1.42.51",
445
+ "1.42.52",
446
+ "1.42.53",
447
+ "1.42.54",
448
+ "1.42.55"
449
+ ],
450
+ "build": [
451
+ "1.1.0",
452
+ "1.1.1",
453
+ "1.2.0",
454
+ "1.2.1",
455
+ "1.2.2",
456
+ "1.3.0",
457
+ "1.4.0"
458
+ ],
459
+ "cachetools": [
460
+ "6.2.2",
461
+ "6.2.3",
462
+ "6.2.4",
463
+ "6.2.5",
464
+ "6.2.6",
465
+ "7.0.0",
466
+ "7.0.1"
467
+ ],
468
+ "certifi": [
469
+ "2025.10.5",
470
+ "2025.11.12",
471
+ "2025.6.15",
472
+ "2025.7.14",
473
+ "2025.7.9",
474
+ "2025.8.3",
475
+ "2026.1.4"
476
+ ],
477
+ "cffi": [
478
+ "1.14.6",
479
+ "1.15.0",
480
+ "1.15.1",
481
+ "1.16.0",
482
+ "1.17.0",
483
+ "1.17.1",
484
+ "2.0.0"
485
+ ],
486
+ "chardet": [
487
+ "3.0.3",
488
+ "3.0.4",
489
+ "4.0.0",
490
+ "5.0.0",
491
+ "5.1.0",
492
+ "5.2.0",
493
+ "6.0.0"
494
+ ],
495
+ "charset-normalizer": [
496
+ "3.3.1",
497
+ "3.3.2",
498
+ "3.4.0",
499
+ "3.4.1",
500
+ "3.4.2",
501
+ "3.4.3",
502
+ "3.4.4"
503
+ ],
504
+ "click": [
505
+ "8.1.7",
506
+ "8.1.8",
507
+ "8.2.0",
508
+ "8.2.1",
509
+ "8.2.2",
510
+ "8.3.0",
511
+ "8.3.1"
512
+ ],
513
+ "cloudpickle": [
514
+ "2.1.0",
515
+ "2.2.0",
516
+ "2.2.1",
517
+ "3.0.0",
518
+ "3.1.0",
519
+ "3.1.1",
520
+ "3.1.2"
521
+ ],
522
+ "colorama": [
523
+ "0.4.0",
524
+ "0.4.1",
525
+ "0.4.2",
526
+ "0.4.3",
527
+ "0.4.4",
528
+ "0.4.5",
529
+ "0.4.6"
530
+ ],
531
+ "coverage": [
532
+ "7.11.3",
533
+ "7.12.0",
534
+ "7.13.0",
535
+ "7.13.1",
536
+ "7.13.2",
537
+ "7.13.3",
538
+ "7.13.4"
539
+ ],
540
+ "cryptography": [
541
+ "45.0.7",
542
+ "46.0.0",
543
+ "46.0.1",
544
+ "46.0.2",
545
+ "46.0.3",
546
+ "46.0.4",
547
+ "46.0.5"
548
+ ],
549
+ "cycler": [
550
+ "0.10.0",
551
+ "0.11.0",
552
+ "0.12.0",
553
+ "0.12.1",
554
+ "0.9.0"
555
+ ],
556
+ "decorator": [
557
+ "5.0.7",
558
+ "5.0.8",
559
+ "5.0.9",
560
+ "5.1.0",
561
+ "5.1.1",
562
+ "5.2.0",
563
+ "5.2.1"
564
+ ],
565
+ "deprecated": [
566
+ "1.2.14",
567
+ "1.2.15",
568
+ "1.2.16",
569
+ "1.2.17",
570
+ "1.2.18",
571
+ "1.3.0",
572
+ "1.3.1"
573
+ ],
574
+ "dill": [
575
+ "0.3.5.1",
576
+ "0.3.6",
577
+ "0.3.7",
578
+ "0.3.8",
579
+ "0.3.9",
580
+ "0.4.0",
581
+ "0.4.1"
582
+ ],
583
+ "distlib": [
584
+ "0.3.4",
585
+ "0.3.5",
586
+ "0.3.6",
587
+ "0.3.7",
588
+ "0.3.8",
589
+ "0.3.9",
590
+ "0.4.0"
591
+ ],
592
+ "distro": [
593
+ "1.3.0",
594
+ "1.4.0",
595
+ "1.5.0",
596
+ "1.6.0",
597
+ "1.7.0",
598
+ "1.8.0",
599
+ "1.9.0"
600
+ ],
601
+ "dnspython": [
602
+ "2.4.1",
603
+ "2.4.2",
604
+ "2.5.0",
605
+ "2.6.0",
606
+ "2.6.1",
607
+ "2.7.0",
608
+ "2.8.0"
609
+ ],
610
+ "docutils": [
611
+ "0.21.1",
612
+ "0.21.2",
613
+ "0.22",
614
+ "0.22.1",
615
+ "0.22.2",
616
+ "0.22.3",
617
+ "0.22.4"
618
+ ],
619
+ "et-xmlfile": [
620
+ "1.0.0",
621
+ "1.0.1",
622
+ "1.1.0",
623
+ "2.0.0"
624
+ ],
625
+ "exceptiongroup": [
626
+ "1.1.2",
627
+ "1.1.3",
628
+ "1.2.0",
629
+ "1.2.1",
630
+ "1.2.2",
631
+ "1.3.0",
632
+ "1.3.1"
633
+ ],
634
+ "fastapi": [
635
+ "0.129.1",
636
+ "0.129.2",
637
+ "0.130.0",
638
+ "0.131.0",
639
+ "0.132.0",
640
+ "0.132.1",
641
+ "0.133.0"
642
+ ],
643
+ "filelock": [
644
+ "3.21.2",
645
+ "3.22.0",
646
+ "3.23.0",
647
+ "3.24.0",
648
+ "3.24.1",
649
+ "3.24.2",
650
+ "3.24.3"
651
+ ],
652
+ "flask": [
653
+ "3.0.1",
654
+ "3.0.2",
655
+ "3.0.3",
656
+ "3.1.0",
657
+ "3.1.1",
658
+ "3.1.2",
659
+ "3.1.3"
660
+ ],
661
+ "fonttools": [
662
+ "4.59.1",
663
+ "4.59.2",
664
+ "4.60.0",
665
+ "4.60.1",
666
+ "4.60.2",
667
+ "4.61.0",
668
+ "4.61.1"
669
+ ],
670
+ "frozenlist": [
671
+ "1.4.1",
672
+ "1.5.0",
673
+ "1.6.0",
674
+ "1.6.1",
675
+ "1.6.2",
676
+ "1.7.0",
677
+ "1.8.0"
678
+ ],
679
+ "fsspec": [
680
+ "2025.10.0",
681
+ "2025.12.0",
682
+ "2025.5.1",
683
+ "2025.7.0",
684
+ "2025.9.0",
685
+ "2026.1.0",
686
+ "2026.2.0"
687
+ ],
688
+ "gitdb": [
689
+ "4.0.10",
690
+ "4.0.11",
691
+ "4.0.12",
692
+ "4.0.6",
693
+ "4.0.7",
694
+ "4.0.8",
695
+ "4.0.9"
696
+ ],
697
+ "gitpython": [
698
+ "3.1.40",
699
+ "3.1.41",
700
+ "3.1.42",
701
+ "3.1.43",
702
+ "3.1.44",
703
+ "3.1.45",
704
+ "3.1.46"
705
+ ],
706
+ "google-api-core": [
707
+ "2.25.2",
708
+ "2.26.0",
709
+ "2.27.0",
710
+ "2.28.0",
711
+ "2.28.1",
712
+ "2.29.0",
713
+ "2.30.0"
714
+ ],
715
+ "google-api-python-client": [
716
+ "2.184.0",
717
+ "2.185.0",
718
+ "2.186.0",
719
+ "2.187.0",
720
+ "2.188.0",
721
+ "2.189.0",
722
+ "2.190.0"
723
+ ],
724
+ "google-auth": [
725
+ "2.42.1",
726
+ "2.43.0",
727
+ "2.44.0",
728
+ "2.45.0",
729
+ "2.46.0",
730
+ "2.47.0",
731
+ "2.48.0"
732
+ ],
733
+ "google-auth-oauthlib": [
734
+ "1.0.0",
735
+ "1.1.0",
736
+ "1.2.0",
737
+ "1.2.1",
738
+ "1.2.2",
739
+ "1.2.3",
740
+ "1.2.4"
741
+ ],
742
+ "google-cloud-bigquery": [
743
+ "3.35.1",
744
+ "3.36.0",
745
+ "3.37.0",
746
+ "3.38.0",
747
+ "3.39.0",
748
+ "3.40.0",
749
+ "3.40.1"
750
+ ],
751
+ "google-cloud-core": [
752
+ "2.3.2",
753
+ "2.3.3",
754
+ "2.4.0",
755
+ "2.4.1",
756
+ "2.4.2",
757
+ "2.4.3",
758
+ "2.5.0"
759
+ ],
760
+ "google-cloud-storage": [
761
+ "3.4.0",
762
+ "3.4.1",
763
+ "3.5.0",
764
+ "3.6.0",
765
+ "3.7.0",
766
+ "3.8.0",
767
+ "3.9.0"
768
+ ],
769
+ "google-crc32c": [
770
+ "1.2.0",
771
+ "1.3.0",
772
+ "1.5.0",
773
+ "1.6.0",
774
+ "1.7.0",
775
+ "1.7.1",
776
+ "1.8.0"
777
+ ],
778
+ "google-genai": [
779
+ "1.58.0",
780
+ "1.59.0",
781
+ "1.60.0",
782
+ "1.61.0",
783
+ "1.62.0",
784
+ "1.63.0",
785
+ "1.64.0"
786
+ ],
787
+ "google-resumable-media": [
788
+ "2.4.1",
789
+ "2.5.0",
790
+ "2.6.0",
791
+ "2.7.0",
792
+ "2.7.1",
793
+ "2.7.2",
794
+ "2.8.0"
795
+ ],
796
+ "googleapis-common-protos": [
797
+ "1.68.0",
798
+ "1.69.0",
799
+ "1.69.1",
800
+ "1.69.2",
801
+ "1.70.0",
802
+ "1.71.0",
803
+ "1.72.0"
804
+ ],
805
+ "greenlet": [
806
+ "3.2.2",
807
+ "3.2.3",
808
+ "3.2.4",
809
+ "3.2.5",
810
+ "3.3.0",
811
+ "3.3.1",
812
+ "3.3.2"
813
+ ],
814
+ "grpcio": [
815
+ "1.73.1",
816
+ "1.74.0",
817
+ "1.75.0",
818
+ "1.75.1",
819
+ "1.76.0",
820
+ "1.78.0",
821
+ "1.78.1"
822
+ ],
823
+ "grpcio-status": [
824
+ "1.73.1",
825
+ "1.74.0",
826
+ "1.75.0",
827
+ "1.75.1",
828
+ "1.76.0",
829
+ "1.78.0",
830
+ "1.78.1"
831
+ ],
832
+ "grpcio-tools": [
833
+ "1.73.1",
834
+ "1.74.0",
835
+ "1.75.0",
836
+ "1.75.1",
837
+ "1.76.0",
838
+ "1.78.0",
839
+ "1.78.1"
840
+ ],
841
+ "h11": [
842
+ "0.10.0",
843
+ "0.11.0",
844
+ "0.12.0",
845
+ "0.13.0",
846
+ "0.14.0",
847
+ "0.15.0",
848
+ "0.16.0"
849
+ ],
850
+ "hatchling": [
851
+ "1.26.0",
852
+ "1.26.1",
853
+ "1.26.2",
854
+ "1.26.3",
855
+ "1.27.0",
856
+ "1.28.0",
857
+ "1.29.0"
858
+ ],
859
+ "httpcore": [
860
+ "1.0.3",
861
+ "1.0.4",
862
+ "1.0.5",
863
+ "1.0.6",
864
+ "1.0.7",
865
+ "1.0.8",
866
+ "1.0.9"
867
+ ],
868
+ "httpx": [
869
+ "0.25.2",
870
+ "0.26.0",
871
+ "0.27.0",
872
+ "0.27.1",
873
+ "0.27.2",
874
+ "0.28.0",
875
+ "0.28.1"
876
+ ],
877
+ "huggingface-hub": [
878
+ "1.3.2",
879
+ "1.3.3",
880
+ "1.3.4",
881
+ "1.3.5",
882
+ "1.3.7",
883
+ "1.4.0",
884
+ "1.4.1"
885
+ ],
886
+ "idna": [
887
+ "3.10",
888
+ "3.11",
889
+ "3.5",
890
+ "3.6",
891
+ "3.7",
892
+ "3.8",
893
+ "3.9"
894
+ ],
895
+ "importlib-metadata": [
896
+ "8.3.0",
897
+ "8.4.0",
898
+ "8.5.0",
899
+ "8.6.0",
900
+ "8.6.1",
901
+ "8.7.0",
902
+ "8.7.1"
903
+ ],
904
+ "iniconfig": [
905
+ "1.0.1",
906
+ "1.1.0",
907
+ "1.1.1",
908
+ "2.0.0",
909
+ "2.1.0",
910
+ "2.2.0",
911
+ "2.3.0"
912
+ ],
913
+ "isodate": [
914
+ "0.5.0",
915
+ "0.5.1",
916
+ "0.5.4",
917
+ "0.6.0",
918
+ "0.6.1",
919
+ "0.7.0",
920
+ "0.7.2"
921
+ ],
922
+ "itsdangerous": [
923
+ "1.1.0",
924
+ "2.0.0",
925
+ "2.0.1",
926
+ "2.1.0",
927
+ "2.1.1",
928
+ "2.1.2",
929
+ "2.2.0"
930
+ ],
931
+ "jaraco-classes": [
932
+ "3.2.0",
933
+ "3.2.1",
934
+ "3.2.2",
935
+ "3.2.3",
936
+ "3.3.0",
937
+ "3.3.1",
938
+ "3.4.0"
939
+ ],
940
+ "jeepney": [
941
+ "0.4.3",
942
+ "0.5.0",
943
+ "0.6.0",
944
+ "0.7.0",
945
+ "0.7.1",
946
+ "0.8.0",
947
+ "0.9.0"
948
+ ],
949
+ "jinja2": [
950
+ "3.1.0",
951
+ "3.1.1",
952
+ "3.1.2",
953
+ "3.1.3",
954
+ "3.1.4",
955
+ "3.1.5",
956
+ "3.1.6"
957
+ ],
958
+ "jiter": [
959
+ "0.10.0",
960
+ "0.11.0",
961
+ "0.11.1",
962
+ "0.12.0",
963
+ "0.13.0",
964
+ "0.9.0",
965
+ "0.9.1"
966
+ ],
967
+ "jmespath": [
968
+ "0.10.0",
969
+ "0.9.3",
970
+ "0.9.4",
971
+ "0.9.5",
972
+ "1.0.0",
973
+ "1.0.1",
974
+ "1.1.0"
975
+ ],
976
+ "joblib": [
977
+ "1.3.2",
978
+ "1.4.0",
979
+ "1.4.2",
980
+ "1.5.0",
981
+ "1.5.1",
982
+ "1.5.2",
983
+ "1.5.3"
984
+ ],
985
+ "jsonpointer": [
986
+ "1.14",
987
+ "2.0",
988
+ "2.1",
989
+ "2.2",
990
+ "2.3",
991
+ "2.4",
992
+ "3.0.0"
993
+ ],
994
+ "jsonschema": [
995
+ "4.22.0",
996
+ "4.23.0",
997
+ "4.24.0",
998
+ "4.24.1",
999
+ "4.25.0",
1000
+ "4.25.1",
1001
+ "4.26.0"
1002
+ ],
1003
+ "jsonschema-specifications": [
1004
+ "2023.11.1",
1005
+ "2023.11.2",
1006
+ "2023.12.1",
1007
+ "2023.7.1",
1008
+ "2024.10.1",
1009
+ "2025.4.1",
1010
+ "2025.9.1"
1011
+ ],
1012
+ "keyring": [
1013
+ "25.2.1",
1014
+ "25.3.0",
1015
+ "25.4.0",
1016
+ "25.4.1",
1017
+ "25.5.0",
1018
+ "25.6.0",
1019
+ "25.7.0"
1020
+ ],
1021
+ "kiwisolver": [
1022
+ "1.4.3",
1023
+ "1.4.4",
1024
+ "1.4.5",
1025
+ "1.4.6",
1026
+ "1.4.7",
1027
+ "1.4.8",
1028
+ "1.4.9"
1029
+ ],
1030
+ "kubernetes": [
1031
+ "30.1.0",
1032
+ "31.0.0",
1033
+ "32.0.0",
1034
+ "32.0.1",
1035
+ "33.1.0",
1036
+ "34.1.0",
1037
+ "35.0.0"
1038
+ ],
1039
+ "langchain": [
1040
+ "1.2.10",
1041
+ "1.2.4",
1042
+ "1.2.5",
1043
+ "1.2.6",
1044
+ "1.2.7",
1045
+ "1.2.8",
1046
+ "1.2.9"
1047
+ ],
1048
+ "langsmith": [
1049
+ "0.7.0",
1050
+ "0.7.1",
1051
+ "0.7.2",
1052
+ "0.7.3",
1053
+ "0.7.4",
1054
+ "0.7.5",
1055
+ "0.7.6"
1056
+ ],
1057
+ "lxml": [
1058
+ "5.3.0",
1059
+ "5.3.1",
1060
+ "5.3.2",
1061
+ "5.4.0",
1062
+ "6.0.0",
1063
+ "6.0.1",
1064
+ "6.0.2"
1065
+ ],
1066
+ "markdown-it-py": [
1067
+ "1.1.0",
1068
+ "2.0.0",
1069
+ "2.0.1",
1070
+ "2.1.0",
1071
+ "2.2.0",
1072
+ "3.0.0",
1073
+ "4.0.0"
1074
+ ],
1075
+ "markupsafe": [
1076
+ "2.1.3",
1077
+ "2.1.4",
1078
+ "2.1.5",
1079
+ "3.0.0",
1080
+ "3.0.1",
1081
+ "3.0.2",
1082
+ "3.0.3"
1083
+ ],
1084
+ "matplotlib": [
1085
+ "3.10.0",
1086
+ "3.10.1",
1087
+ "3.10.3",
1088
+ "3.10.5",
1089
+ "3.10.6",
1090
+ "3.10.7",
1091
+ "3.10.8"
1092
+ ],
1093
+ "mdurl": [
1094
+ "0.0.1",
1095
+ "0.1.0",
1096
+ "0.1.1",
1097
+ "0.1.2"
1098
+ ],
1099
+ "more-itertools": [
1100
+ "10.2.0",
1101
+ "10.3.0",
1102
+ "10.4.0",
1103
+ "10.5.0",
1104
+ "10.6.0",
1105
+ "10.7.0",
1106
+ "10.8.0"
1107
+ ],
1108
+ "msal": [
1109
+ "1.31.1",
1110
+ "1.32.0",
1111
+ "1.32.1",
1112
+ "1.32.2",
1113
+ "1.32.3",
1114
+ "1.33.0",
1115
+ "1.34.0"
1116
+ ],
1117
+ "msgpack": [
1118
+ "1.0.5",
1119
+ "1.0.6",
1120
+ "1.0.7",
1121
+ "1.0.8",
1122
+ "1.1.0",
1123
+ "1.1.1",
1124
+ "1.1.2"
1125
+ ],
1126
+ "multidict": [
1127
+ "6.6.0",
1128
+ "6.6.1",
1129
+ "6.6.2",
1130
+ "6.6.3",
1131
+ "6.6.4",
1132
+ "6.7.0",
1133
+ "6.7.1"
1134
+ ],
1135
+ "mypy-extensions": [
1136
+ "0.4.0",
1137
+ "0.4.1",
1138
+ "0.4.2",
1139
+ "0.4.3",
1140
+ "0.4.4",
1141
+ "1.0.0",
1142
+ "1.1.0"
1143
+ ],
1144
+ "networkx": [
1145
+ "3.3",
1146
+ "3.4",
1147
+ "3.4.1",
1148
+ "3.4.2",
1149
+ "3.5",
1150
+ "3.6",
1151
+ "3.6.1"
1152
+ ],
1153
+ "nodeenv": [
1154
+ "1.10.0",
1155
+ "1.5.0",
1156
+ "1.6.0",
1157
+ "1.7.0",
1158
+ "1.8.0",
1159
+ "1.9.0",
1160
+ "1.9.1"
1161
+ ],
1162
+ "numpy": [
1163
+ "2.3.2",
1164
+ "2.3.3",
1165
+ "2.3.4",
1166
+ "2.3.5",
1167
+ "2.4.0",
1168
+ "2.4.1",
1169
+ "2.4.2"
1170
+ ],
1171
+ "oauthlib": [
1172
+ "3.1.0",
1173
+ "3.1.1",
1174
+ "3.2.0",
1175
+ "3.2.1",
1176
+ "3.2.2",
1177
+ "3.3.0",
1178
+ "3.3.1"
1179
+ ],
1180
+ "openai": [
1181
+ "2.17.0",
1182
+ "2.18.0",
1183
+ "2.19.0",
1184
+ "2.20.0",
1185
+ "2.21.0",
1186
+ "2.22.0",
1187
+ "2.23.0"
1188
+ ],
1189
+ "openpyxl": [
1190
+ "3.0.10",
1191
+ "3.1.0",
1192
+ "3.1.1",
1193
+ "3.1.2",
1194
+ "3.1.3",
1195
+ "3.1.4",
1196
+ "3.1.5"
1197
+ ],
1198
+ "opentelemetry-api": [
1199
+ "1.34.1",
1200
+ "1.35.0",
1201
+ "1.36.0",
1202
+ "1.37.0",
1203
+ "1.38.0",
1204
+ "1.39.0",
1205
+ "1.39.1"
1206
+ ],
1207
+ "opentelemetry-exporter-otlp": [
1208
+ "1.34.1",
1209
+ "1.35.0",
1210
+ "1.36.0",
1211
+ "1.37.0",
1212
+ "1.38.0",
1213
+ "1.39.0",
1214
+ "1.39.1"
1215
+ ],
1216
+ "opentelemetry-exporter-otlp-proto-common": [
1217
+ "1.34.1",
1218
+ "1.35.0",
1219
+ "1.36.0",
1220
+ "1.37.0",
1221
+ "1.38.0",
1222
+ "1.39.0",
1223
+ "1.39.1"
1224
+ ],
1225
+ "opentelemetry-exporter-otlp-proto-grpc": [
1226
+ "1.34.1",
1227
+ "1.35.0",
1228
+ "1.36.0",
1229
+ "1.37.0",
1230
+ "1.38.0",
1231
+ "1.39.0",
1232
+ "1.39.1"
1233
+ ],
1234
+ "opentelemetry-exporter-otlp-proto-http": [
1235
+ "1.34.1",
1236
+ "1.35.0",
1237
+ "1.36.0",
1238
+ "1.37.0",
1239
+ "1.38.0",
1240
+ "1.39.0",
1241
+ "1.39.1"
1242
+ ],
1243
+ "opentelemetry-proto": [
1244
+ "1.34.1",
1245
+ "1.35.0",
1246
+ "1.36.0",
1247
+ "1.37.0",
1248
+ "1.38.0",
1249
+ "1.39.0",
1250
+ "1.39.1"
1251
+ ],
1252
+ "opentelemetry-sdk": [
1253
+ "1.34.1",
1254
+ "1.35.0",
1255
+ "1.36.0",
1256
+ "1.37.0",
1257
+ "1.38.0",
1258
+ "1.39.0",
1259
+ "1.39.1"
1260
+ ],
1261
+ "packaging": [
1262
+ "23.1",
1263
+ "23.2",
1264
+ "24.0",
1265
+ "24.1",
1266
+ "24.2",
1267
+ "25.0",
1268
+ "26.0"
1269
+ ],
1270
+ "pandas": [
1271
+ "2.2.3",
1272
+ "2.3.0",
1273
+ "2.3.1",
1274
+ "2.3.2",
1275
+ "2.3.3",
1276
+ "3.0.0",
1277
+ "3.0.1"
1278
+ ],
1279
+ "paramiko": [
1280
+ "3.3.1",
1281
+ "3.3.2",
1282
+ "3.4.0",
1283
+ "3.4.1",
1284
+ "3.5.0",
1285
+ "3.5.1",
1286
+ "4.0.0"
1287
+ ],
1288
+ "pathspec": [
1289
+ "0.12.0",
1290
+ "0.12.1",
1291
+ "1.0.0",
1292
+ "1.0.1",
1293
+ "1.0.2",
1294
+ "1.0.3",
1295
+ "1.0.4"
1296
+ ],
1297
+ "pexpect": [
1298
+ "4.3.1",
1299
+ "4.4.0",
1300
+ "4.5.0",
1301
+ "4.6.0",
1302
+ "4.7.0",
1303
+ "4.8.0",
1304
+ "4.9.0"
1305
+ ],
1306
+ "pillow": [
1307
+ "11.0.0",
1308
+ "11.1.0",
1309
+ "11.2.1",
1310
+ "11.3.0",
1311
+ "12.0.0",
1312
+ "12.1.0",
1313
+ "12.1.1"
1314
+ ],
1315
+ "platformdirs": [
1316
+ "4.6.0",
1317
+ "4.7.0",
1318
+ "4.7.1",
1319
+ "4.8.0",
1320
+ "4.9.0",
1321
+ "4.9.1",
1322
+ "4.9.2"
1323
+ ],
1324
+ "pluggy": [
1325
+ "1.0.0",
1326
+ "1.1.0",
1327
+ "1.2.0",
1328
+ "1.3.0",
1329
+ "1.4.0",
1330
+ "1.5.0",
1331
+ "1.6.0"
1332
+ ],
1333
+ "poetry-core": [
1334
+ "2.1.1",
1335
+ "2.1.2",
1336
+ "2.1.3",
1337
+ "2.2.0",
1338
+ "2.2.1",
1339
+ "2.3.0",
1340
+ "2.3.1"
1341
+ ],
1342
+ "prompt-toolkit": [
1343
+ "3.0.46",
1344
+ "3.0.47",
1345
+ "3.0.48",
1346
+ "3.0.49",
1347
+ "3.0.50",
1348
+ "3.0.51",
1349
+ "3.0.52"
1350
+ ],
1351
+ "propcache": [
1352
+ "0.2.0",
1353
+ "0.2.1",
1354
+ "0.3.0",
1355
+ "0.3.1",
1356
+ "0.3.2",
1357
+ "0.4.0",
1358
+ "0.4.1"
1359
+ ],
1360
+ "proto-plus": [
1361
+ "1.23.0",
1362
+ "1.24.0",
1363
+ "1.25.0",
1364
+ "1.26.0",
1365
+ "1.26.1",
1366
+ "1.27.0",
1367
+ "1.27.1"
1368
+ ],
1369
+ "protobuf": [
1370
+ "6.32.1",
1371
+ "6.33.0",
1372
+ "6.33.1",
1373
+ "6.33.2",
1374
+ "6.33.3",
1375
+ "6.33.4",
1376
+ "6.33.5"
1377
+ ],
1378
+ "psutil": [
1379
+ "7.1.0",
1380
+ "7.1.1",
1381
+ "7.1.2",
1382
+ "7.1.3",
1383
+ "7.2.0",
1384
+ "7.2.1",
1385
+ "7.2.2"
1386
+ ],
1387
+ "psycopg2-binary": [
1388
+ "2.9.10",
1389
+ "2.9.11",
1390
+ "2.9.5",
1391
+ "2.9.6",
1392
+ "2.9.7",
1393
+ "2.9.8",
1394
+ "2.9.9"
1395
+ ],
1396
+ "ptyprocess": [
1397
+ "0.3.1",
1398
+ "0.4",
1399
+ "0.5",
1400
+ "0.5.1",
1401
+ "0.5.2",
1402
+ "0.6.0",
1403
+ "0.7.0"
1404
+ ],
1405
+ "pyarrow": [
1406
+ "19.0.0",
1407
+ "19.0.1",
1408
+ "20.0.0",
1409
+ "21.0.0",
1410
+ "22.0.0",
1411
+ "23.0.0",
1412
+ "23.0.1"
1413
+ ],
1414
+ "pyasn1": [
1415
+ "0.4.7",
1416
+ "0.4.8",
1417
+ "0.5.0",
1418
+ "0.5.1",
1419
+ "0.6.0",
1420
+ "0.6.1",
1421
+ "0.6.2"
1422
+ ],
1423
+ "pyasn1-modules": [
1424
+ "0.2.6",
1425
+ "0.2.7",
1426
+ "0.2.8",
1427
+ "0.3.0",
1428
+ "0.4.0",
1429
+ "0.4.1",
1430
+ "0.4.2"
1431
+ ],
1432
+ "pycparser": [
1433
+ "2.18",
1434
+ "2.19",
1435
+ "2.20",
1436
+ "2.21",
1437
+ "2.22",
1438
+ "2.23",
1439
+ "3.0"
1440
+ ],
1441
+ "pydantic": [
1442
+ "2.11.10",
1443
+ "2.12.0",
1444
+ "2.12.1",
1445
+ "2.12.2",
1446
+ "2.12.3",
1447
+ "2.12.4",
1448
+ "2.12.5"
1449
+ ],
1450
+ "pydantic-core": [
1451
+ "2.41.0",
1452
+ "2.41.1",
1453
+ "2.41.2",
1454
+ "2.41.3",
1455
+ "2.41.4",
1456
+ "2.41.5",
1457
+ "2.42.0"
1458
+ ],
1459
+ "pydantic-settings": [
1460
+ "2.10.0",
1461
+ "2.10.1",
1462
+ "2.11.0",
1463
+ "2.12.0",
1464
+ "2.13.0",
1465
+ "2.13.1",
1466
+ "2.9.1"
1467
+ ],
1468
+ "pygments": [
1469
+ "2.17.0",
1470
+ "2.17.1",
1471
+ "2.17.2",
1472
+ "2.18.0",
1473
+ "2.19.0",
1474
+ "2.19.1",
1475
+ "2.19.2"
1476
+ ],
1477
+ "pyjwt": [
1478
+ "2.10.0",
1479
+ "2.10.1",
1480
+ "2.11.0",
1481
+ "2.6.0",
1482
+ "2.7.0",
1483
+ "2.8.0",
1484
+ "2.9.0"
1485
+ ],
1486
+ "pynacl": [
1487
+ "1.2.1",
1488
+ "1.3.0",
1489
+ "1.4.0",
1490
+ "1.5.0",
1491
+ "1.6.0",
1492
+ "1.6.1",
1493
+ "1.6.2"
1494
+ ],
1495
+ "pyopenssl": [
1496
+ "24.1.0",
1497
+ "24.2.1",
1498
+ "24.3.0",
1499
+ "25.0.0",
1500
+ "25.1.0",
1501
+ "25.2.0",
1502
+ "25.3.0"
1503
+ ],
1504
+ "pyparsing": [
1505
+ "3.2.2",
1506
+ "3.2.3",
1507
+ "3.2.4",
1508
+ "3.2.5",
1509
+ "3.3.0",
1510
+ "3.3.1",
1511
+ "3.3.2"
1512
+ ],
1513
+ "pyproject-hooks": [
1514
+ "0.1.0",
1515
+ "1.0.0",
1516
+ "1.1.0",
1517
+ "1.2.0"
1518
+ ],
1519
+ "pytest": [
1520
+ "8.3.5",
1521
+ "8.4.0",
1522
+ "8.4.1",
1523
+ "8.4.2",
1524
+ "9.0.0",
1525
+ "9.0.1",
1526
+ "9.0.2"
1527
+ ],
1528
+ "pytest-asyncio": [
1529
+ "0.25.3",
1530
+ "0.26.0",
1531
+ "1.0.0",
1532
+ "1.1.0",
1533
+ "1.1.1",
1534
+ "1.2.0",
1535
+ "1.3.0"
1536
+ ],
1537
+ "pytest-cov": [
1538
+ "6.0.0",
1539
+ "6.1.0",
1540
+ "6.1.1",
1541
+ "6.2.0",
1542
+ "6.2.1",
1543
+ "6.3.0",
1544
+ "7.0.0"
1545
+ ],
1546
+ "python-dateutil": [
1547
+ "2.7.3",
1548
+ "2.7.4",
1549
+ "2.7.5",
1550
+ "2.8.0",
1551
+ "2.8.1",
1552
+ "2.8.2",
1553
+ "2.9.0"
1554
+ ],
1555
+ "python-dotenv": [
1556
+ "0.21.1",
1557
+ "1.0.0",
1558
+ "1.0.1",
1559
+ "1.1.0",
1560
+ "1.1.1",
1561
+ "1.2.0",
1562
+ "1.2.1"
1563
+ ],
1564
+ "python-multipart": [
1565
+ "0.0.16",
1566
+ "0.0.17",
1567
+ "0.0.18",
1568
+ "0.0.19",
1569
+ "0.0.20",
1570
+ "0.0.21",
1571
+ "0.0.22"
1572
+ ],
1573
+ "pytz": [
1574
+ "2023.2",
1575
+ "2023.3",
1576
+ "2023.4",
1577
+ "2024.1",
1578
+ "2024.2",
1579
+ "2025.1",
1580
+ "2025.2"
1581
+ ],
1582
+ "pyyaml": [
1583
+ "5.3.1",
1584
+ "5.4",
1585
+ "5.4.1",
1586
+ "6.0",
1587
+ "6.0.1",
1588
+ "6.0.2",
1589
+ "6.0.3"
1590
+ ],
1591
+ "redis": [
1592
+ "6.3.0",
1593
+ "6.4.0",
1594
+ "7.0.0",
1595
+ "7.0.1",
1596
+ "7.1.0",
1597
+ "7.1.1",
1598
+ "7.2.0"
1599
+ ],
1600
+ "referencing": [
1601
+ "0.34.0",
1602
+ "0.35.0",
1603
+ "0.35.1",
1604
+ "0.36.0",
1605
+ "0.36.1",
1606
+ "0.36.2",
1607
+ "0.37.0"
1608
+ ],
1609
+ "regex": [
1610
+ "2025.10.22",
1611
+ "2025.10.23",
1612
+ "2025.11.3",
1613
+ "2025.9.18",
1614
+ "2026.1.14",
1615
+ "2026.1.15",
1616
+ "2026.2.19"
1617
+ ],
1618
+ "requests": [
1619
+ "2.31.0",
1620
+ "2.32.0",
1621
+ "2.32.1",
1622
+ "2.32.2",
1623
+ "2.32.3",
1624
+ "2.32.4",
1625
+ "2.32.5"
1626
+ ],
1627
+ "requests-oauthlib": [
1628
+ "1.1.0",
1629
+ "1.2.0",
1630
+ "1.3.0",
1631
+ "1.3.1",
1632
+ "1.4.0",
1633
+ "1.4.1",
1634
+ "2.0.0"
1635
+ ],
1636
+ "requests-toolbelt": [
1637
+ "0.10.0",
1638
+ "0.10.1",
1639
+ "0.7.1",
1640
+ "0.8.0",
1641
+ "0.9.0",
1642
+ "0.9.1",
1643
+ "1.0.0"
1644
+ ],
1645
+ "rich": [
1646
+ "14.0.0",
1647
+ "14.1.0",
1648
+ "14.2.0",
1649
+ "14.3.0",
1650
+ "14.3.1",
1651
+ "14.3.2",
1652
+ "14.3.3"
1653
+ ],
1654
+ "rpds-py": [
1655
+ "0.25.1",
1656
+ "0.26.0",
1657
+ "0.27.0",
1658
+ "0.27.1",
1659
+ "0.28.0",
1660
+ "0.29.0",
1661
+ "0.30.0"
1662
+ ],
1663
+ "rsa": [
1664
+ "4.6",
1665
+ "4.7",
1666
+ "4.7.1",
1667
+ "4.7.2",
1668
+ "4.8",
1669
+ "4.9",
1670
+ "4.9.1"
1671
+ ],
1672
+ "ruamel-yaml": [
1673
+ "0.18.13",
1674
+ "0.18.14",
1675
+ "0.18.15",
1676
+ "0.18.16",
1677
+ "0.18.17",
1678
+ "0.19.0",
1679
+ "0.19.1"
1680
+ ],
1681
+ "ruff": [
1682
+ "0.14.11",
1683
+ "0.14.12",
1684
+ "0.14.13",
1685
+ "0.14.14",
1686
+ "0.15.0",
1687
+ "0.15.1",
1688
+ "0.15.2"
1689
+ ],
1690
+ "s3fs": [
1691
+ "2025.10.0",
1692
+ "2025.12.0",
1693
+ "2025.5.1",
1694
+ "2025.7.0",
1695
+ "2025.9.0",
1696
+ "2026.1.0",
1697
+ "2026.2.0"
1698
+ ],
1699
+ "s3transfer": [
1700
+ "0.11.5",
1701
+ "0.12.0",
1702
+ "0.13.0",
1703
+ "0.13.1",
1704
+ "0.14.0",
1705
+ "0.15.0",
1706
+ "0.16.0"
1707
+ ],
1708
+ "scikit-learn": [
1709
+ "1.5.2",
1710
+ "1.6.0",
1711
+ "1.6.1",
1712
+ "1.7.0",
1713
+ "1.7.1",
1714
+ "1.7.2",
1715
+ "1.8.0"
1716
+ ],
1717
+ "scipy": [
1718
+ "1.15.3",
1719
+ "1.16.0",
1720
+ "1.16.1",
1721
+ "1.16.2",
1722
+ "1.16.3",
1723
+ "1.17.0",
1724
+ "1.17.1"
1725
+ ],
1726
+ "secretstorage": [
1727
+ "3.3.0",
1728
+ "3.3.1",
1729
+ "3.3.2",
1730
+ "3.3.3",
1731
+ "3.4.0",
1732
+ "3.4.1",
1733
+ "3.5.0"
1734
+ ],
1735
+ "setuptools-scm": [
1736
+ "9.0.2",
1737
+ "9.0.3",
1738
+ "9.1.0",
1739
+ "9.1.1",
1740
+ "9.2.0",
1741
+ "9.2.1",
1742
+ "9.2.2"
1743
+ ],
1744
+ "shellingham": [
1745
+ "1.3.2",
1746
+ "1.4.0",
1747
+ "1.5.0",
1748
+ "1.5.1",
1749
+ "1.5.2",
1750
+ "1.5.3",
1751
+ "1.5.4"
1752
+ ],
1753
+ "six": [
1754
+ "1.11.0",
1755
+ "1.12.0",
1756
+ "1.13.0",
1757
+ "1.14.0",
1758
+ "1.15.0",
1759
+ "1.16.0",
1760
+ "1.17.0"
1761
+ ],
1762
+ "smmap": [
1763
+ "3.0.4",
1764
+ "3.0.5",
1765
+ "4.0.0",
1766
+ "5.0.0",
1767
+ "5.0.1",
1768
+ "5.0.2",
1769
+ "6.0.0"
1770
+ ],
1771
+ "sniffio": [
1772
+ "0.0.0",
1773
+ "1.0.0",
1774
+ "1.1.0",
1775
+ "1.2.0",
1776
+ "1.3.0",
1777
+ "1.3.1"
1778
+ ],
1779
+ "snowflake-connector-python": [
1780
+ "3.17.4",
1781
+ "3.18.0",
1782
+ "4.0.0",
1783
+ "4.1.0",
1784
+ "4.1.1",
1785
+ "4.2.0",
1786
+ "4.3.0"
1787
+ ],
1788
+ "sortedcontainers": [
1789
+ "2.0.5",
1790
+ "2.1.0",
1791
+ "2.2.0",
1792
+ "2.2.1",
1793
+ "2.2.2",
1794
+ "2.3.0",
1795
+ "2.4.0"
1796
+ ],
1797
+ "soupsieve": [
1798
+ "2.5",
1799
+ "2.6",
1800
+ "2.7",
1801
+ "2.8",
1802
+ "2.8.1",
1803
+ "2.8.2",
1804
+ "2.8.3"
1805
+ ],
1806
+ "sqlalchemy": [
1807
+ "2.0.40",
1808
+ "2.0.41",
1809
+ "2.0.42",
1810
+ "2.0.43",
1811
+ "2.0.44",
1812
+ "2.0.45",
1813
+ "2.0.46"
1814
+ ],
1815
+ "starlette": [
1816
+ "0.49.1",
1817
+ "0.49.2",
1818
+ "0.49.3",
1819
+ "0.50.0",
1820
+ "0.51.0",
1821
+ "0.52.0",
1822
+ "0.52.1"
1823
+ ],
1824
+ "tabulate": [
1825
+ "0.8.10",
1826
+ "0.8.5",
1827
+ "0.8.6",
1828
+ "0.8.7",
1829
+ "0.8.8",
1830
+ "0.8.9",
1831
+ "0.9.0"
1832
+ ],
1833
+ "tenacity": [
1834
+ "8.4.1",
1835
+ "8.4.2",
1836
+ "8.5.0",
1837
+ "9.0.0",
1838
+ "9.1.2",
1839
+ "9.1.3",
1840
+ "9.1.4"
1841
+ ],
1842
+ "threadpoolctl": [
1843
+ "3.0.0",
1844
+ "3.1.0",
1845
+ "3.2.0",
1846
+ "3.3.0",
1847
+ "3.4.0",
1848
+ "3.5.0",
1849
+ "3.6.0"
1850
+ ],
1851
+ "tomli": [
1852
+ "2.0.0",
1853
+ "2.0.1",
1854
+ "2.0.2",
1855
+ "2.1.0",
1856
+ "2.2.1",
1857
+ "2.3.0",
1858
+ "2.4.0"
1859
+ ],
1860
+ "tomlkit": [
1861
+ "0.12.4",
1862
+ "0.12.5",
1863
+ "0.13.0",
1864
+ "0.13.1",
1865
+ "0.13.2",
1866
+ "0.13.3",
1867
+ "0.14.0"
1868
+ ],
1869
+ "tqdm": [
1870
+ "4.66.4",
1871
+ "4.66.5",
1872
+ "4.66.6",
1873
+ "4.67.0",
1874
+ "4.67.1",
1875
+ "4.67.2",
1876
+ "4.67.3"
1877
+ ],
1878
+ "trove-classifiers": [
1879
+ "2025.11.14.15",
1880
+ "2025.12.1.14",
1881
+ "2025.9.11.17",
1882
+ "2025.9.8.13",
1883
+ "2025.9.9.12",
1884
+ "2026.1.12.15",
1885
+ "2026.1.14.14"
1886
+ ],
1887
+ "typer": [
1888
+ "0.21.2",
1889
+ "0.22.0",
1890
+ "0.23.0",
1891
+ "0.23.1",
1892
+ "0.23.2",
1893
+ "0.24.0",
1894
+ "0.24.1"
1895
+ ],
1896
+ "typing-extensions": [
1897
+ "4.12.2",
1898
+ "4.13.0",
1899
+ "4.13.1",
1900
+ "4.13.2",
1901
+ "4.14.0",
1902
+ "4.14.1",
1903
+ "4.15.0"
1904
+ ],
1905
+ "typing-inspection": [
1906
+ "0.1.0",
1907
+ "0.2.0",
1908
+ "0.3.0",
1909
+ "0.3.1",
1910
+ "0.4.0",
1911
+ "0.4.1",
1912
+ "0.4.2"
1913
+ ],
1914
+ "tzdata": [
1915
+ "2023.3",
1916
+ "2023.4",
1917
+ "2024.1",
1918
+ "2024.2",
1919
+ "2025.1",
1920
+ "2025.2",
1921
+ "2025.3"
1922
+ ],
1923
+ "tzlocal": [
1924
+ "4.3.1",
1925
+ "5.0",
1926
+ "5.0.1",
1927
+ "5.1",
1928
+ "5.2",
1929
+ "5.3",
1930
+ "5.3.1"
1931
+ ],
1932
+ "urllib3": [
1933
+ "2.3.0",
1934
+ "2.4.0",
1935
+ "2.5.0",
1936
+ "2.6.0",
1937
+ "2.6.1",
1938
+ "2.6.2",
1939
+ "2.6.3"
1940
+ ],
1941
+ "uvicorn": [
1942
+ "0.36.0",
1943
+ "0.36.1",
1944
+ "0.37.0",
1945
+ "0.38.0",
1946
+ "0.39.0",
1947
+ "0.40.0",
1948
+ "0.41.0"
1949
+ ],
1950
+ "virtualenv": [
1951
+ "20.35.2",
1952
+ "20.35.3",
1953
+ "20.35.4",
1954
+ "20.36.0",
1955
+ "20.36.1",
1956
+ "20.38.0",
1957
+ "20.39.0"
1958
+ ],
1959
+ "wcwidth": [
1960
+ "0.3.4",
1961
+ "0.3.5",
1962
+ "0.4.0",
1963
+ "0.5.0",
1964
+ "0.5.2",
1965
+ "0.5.3",
1966
+ "0.6.0"
1967
+ ],
1968
+ "websocket-client": [
1969
+ "1.6.1",
1970
+ "1.6.2",
1971
+ "1.6.3",
1972
+ "1.6.4",
1973
+ "1.7.0",
1974
+ "1.8.0",
1975
+ "1.9.0"
1976
+ ],
1977
+ "websockets": [
1978
+ "13.1",
1979
+ "14.0",
1980
+ "14.1",
1981
+ "14.2",
1982
+ "15.0",
1983
+ "15.0.1",
1984
+ "16.0"
1985
+ ],
1986
+ "werkzeug": [
1987
+ "3.1.0",
1988
+ "3.1.1",
1989
+ "3.1.2",
1990
+ "3.1.3",
1991
+ "3.1.4",
1992
+ "3.1.5",
1993
+ "3.1.6"
1994
+ ],
1995
+ "wrapt": [
1996
+ "1.17.1",
1997
+ "1.17.2",
1998
+ "1.17.3",
1999
+ "2.0.0",
2000
+ "2.0.1",
2001
+ "2.1.0",
2002
+ "2.1.1"
2003
+ ],
2004
+ "yandexcloud": [
2005
+ "0.373.0",
2006
+ "0.374.0",
2007
+ "0.375.0",
2008
+ "0.376.0",
2009
+ "0.377.0",
2010
+ "0.378.0",
2011
+ "0.379.0"
2012
+ ],
2013
+ "yarl": [
2014
+ "1.18.2",
2015
+ "1.18.3",
2016
+ "1.19.0",
2017
+ "1.20.0",
2018
+ "1.20.1",
2019
+ "1.21.0",
2020
+ "1.22.0"
2021
+ ],
2022
+ "zipp": [
2023
+ "3.19.3",
2024
+ "3.20.0",
2025
+ "3.20.1",
2026
+ "3.20.2",
2027
+ "3.21.0",
2028
+ "3.22.0",
2029
+ "3.23.0"
2030
+ ],
2031
+ "zstandard": [
2032
+ "0.19.0",
2033
+ "0.20.0",
2034
+ "0.21.0",
2035
+ "0.22.0",
2036
+ "0.23.0",
2037
+ "0.24.0",
2038
+ "0.25.0"
2039
+ ]
2040
+ }
2041
+ }
error_model.joblib ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:d998ba71332f853219e6163e2bbcf5f7a9444ceb400d9de510353f4435e745ad
3
+ size 15843513
example.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Example usage of PyCompat model from Hugging Face Hub."""
2
+
3
+ from pycompat_model import PyCompatModel
4
+
5
+ # Load from local directory (after downloading from Hub)
6
+ model = PyCompatModel.load(".")
7
+
8
+ # Single prediction
9
+ result = model.predict("boto3", "1.42.49", "3.12", "darwin_x86_64")
10
+ print(f"Compatible: {result['is_compatible']} (confidence: {result['confidence']:.0%})")
11
+
12
+ # Recommendations
13
+ print("\nTop 5 recommendations for alembic on Python 3.9:")
14
+ for r in model.recommend("alembic", "3.9", top_n=5):
15
+ s = "βœ…" if r["is_compatible"] else "❌"
16
+ print(f" v{r['version']} {s} ({r['confidence']:.0%})")
17
+
18
+ # Batch prediction
19
+ results = model.predict_batch([
20
+ {"package": "boto3", "version": "1.42.49", "python_version": "3.12"},
21
+ {"package": "alembic", "version": "1.18.4", "python_version": "3.9"},
22
+ {"package": "azure-core", "version": "1.38.0", "python_version": "3.11"},
23
+ ])
24
+ print("\nBatch results:")
25
+ for r in results:
26
+ s = "βœ…" if r["is_compatible"] else "❌"
27
+ print(f" {r['package']} v{r['version']} on Py{r['python_version']}: {s}")
pycompat_model.py ADDED
@@ -0,0 +1,561 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ PyCompat β€” Python Package Compatibility Prediction Model
3
+ =========================================================
4
+ Standalone model package for Hugging Face and project integration.
5
+
6
+ Usage:
7
+ from pycompat_model import PyCompatModel
8
+
9
+ model = PyCompatModel.load("./model")
10
+ result = model.predict("boto3", "1.42.49", "3.12", "darwin_x86_64")
11
+ recommendations = model.recommend("alembic", "3.9")
12
+ """
13
+
14
+ import os
15
+ import json
16
+ import re
17
+ import pickle
18
+ import numpy as np
19
+ import joblib
20
+
21
+
22
+ class PyCompatModel:
23
+ """
24
+ Self-contained package compatibility prediction model.
25
+ Can be saved/loaded as a single directory for Hugging Face Hub or local use.
26
+ """
27
+
28
+ MODEL_VERSION = "1.0.0"
29
+ MODEL_NAME = "pycompat-predictor"
30
+
31
+ def __init__(self):
32
+ self.compat_model = None
33
+ self.error_model = None
34
+ self.mappings = None
35
+ self.metadata = {}
36
+ self.package_versions = {} # package -> list of known versions
37
+
38
+ # ─── Training ───────────────────────────────────────────────
39
+
40
+ @classmethod
41
+ def train_from_data(cls, data_path):
42
+ """Train a new model from a data.json file."""
43
+ instance = cls()
44
+ instance._train(data_path)
45
+ return instance
46
+
47
+ def _train(self, data_path):
48
+ """Full training pipeline."""
49
+ import pandas as pd
50
+ from sklearn.model_selection import train_test_split
51
+ from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
52
+ from sklearn.metrics import accuracy_score, f1_score, classification_report
53
+
54
+ # Load data
55
+ with open(data_path, "r") as f:
56
+ raw_data = json.load(f)
57
+
58
+ df = pd.DataFrame(raw_data)
59
+ print(f"πŸ“¦ Loaded {len(df)} records, {df['package'].nunique()} packages")
60
+
61
+ # Store known package versions for recommendations
62
+ for pkg in df["package"].unique():
63
+ self.package_versions[pkg] = sorted(
64
+ df[df["package"] == pkg]["version"].unique().tolist()
65
+ )
66
+
67
+ # Feature engineering
68
+ df = self._engineer_features(df)
69
+
70
+ # Prepare data
71
+ feature_cols = self._feature_columns()
72
+ X = df[feature_cols].values
73
+ y_compat = df["is_compatible"].values
74
+ y_error = df["error_type_encoded"].values
75
+
76
+ X_train, X_test, yc_train, yc_test, ye_train, ye_test = train_test_split(
77
+ X, y_compat, y_error, test_size=0.2, random_state=42, stratify=y_compat
78
+ )
79
+
80
+ # Train compatibility model
81
+ print("πŸ”§ Training compatibility model...")
82
+ self.compat_model = RandomForestClassifier(
83
+ n_estimators=200, max_depth=None, min_samples_split=5,
84
+ min_samples_leaf=1, random_state=42, class_weight="balanced", n_jobs=-1
85
+ )
86
+ self.compat_model.fit(X_train, yc_train)
87
+ yc_pred = self.compat_model.predict(X_test)
88
+ compat_acc = accuracy_score(yc_test, yc_pred)
89
+ compat_f1 = f1_score(yc_test, yc_pred, average="weighted")
90
+ print(f" Accuracy: {compat_acc:.4f} | F1: {compat_f1:.4f}")
91
+
92
+ # Train error type model
93
+ print("πŸ”§ Training error type model...")
94
+ self.error_model = GradientBoostingClassifier(
95
+ n_estimators=150, max_depth=8, learning_rate=0.1,
96
+ min_samples_split=5, random_state=42
97
+ )
98
+ self.error_model.fit(X_train, ye_train)
99
+ ye_pred = self.error_model.predict(X_test)
100
+ error_acc = accuracy_score(ye_test, ye_pred)
101
+ error_f1 = f1_score(ye_test, ye_pred, average="weighted")
102
+ print(f" Accuracy: {error_acc:.4f} | F1: {error_f1:.4f}")
103
+
104
+ # Store metadata
105
+ self.metadata = {
106
+ "model_name": self.MODEL_NAME,
107
+ "model_version": self.MODEL_VERSION,
108
+ "total_records": len(df),
109
+ "total_packages": df["package"].nunique(),
110
+ "python_versions": sorted(df["python_version"].unique().tolist()),
111
+ "platforms": sorted(df["platform"].unique().tolist()),
112
+ "feature_columns": feature_cols,
113
+ "metrics": {
114
+ "compatibility": {"accuracy": round(compat_acc, 4), "f1_score": round(compat_f1, 4)},
115
+ "error_type": {"accuracy": round(error_acc, 4), "f1_score": round(error_f1, 4)},
116
+ },
117
+ "feature_importances": {
118
+ feat: round(imp, 4)
119
+ for feat, imp in zip(feature_cols, self.compat_model.feature_importances_)
120
+ },
121
+ }
122
+
123
+ print(f"βœ… Training complete!")
124
+ print(f" Compat accuracy: {compat_acc:.1%} | Error accuracy: {error_acc:.1%}")
125
+
126
+ def _engineer_features(self, df):
127
+ """Apply feature engineering to a DataFrame."""
128
+ import pandas as pd
129
+
130
+ # Parse version
131
+ vparts = df["version"].apply(self._parse_version)
132
+ df["version_major"] = vparts.apply(lambda x: x[0])
133
+ df["version_minor"] = vparts.apply(lambda x: x[1])
134
+ df["version_patch"] = vparts.apply(lambda x: x[2])
135
+
136
+ # Python version as float
137
+ df["python_version_num"] = df["python_version"].astype(float)
138
+
139
+ # Encode categoricals
140
+ self.mappings = {
141
+ "package_map": {pkg: i for i, pkg in enumerate(sorted(df["package"].unique()))},
142
+ "platform_map": {p: i for i, p in enumerate(sorted(df["platform"].unique()))},
143
+ "error_map": {e: i for i, e in enumerate(sorted(df["error_type"].unique()))},
144
+ }
145
+ self.mappings["reverse_error_map"] = {v: k for k, v in self.mappings["error_map"].items()}
146
+
147
+ df["package_encoded"] = df["package"].map(self.mappings["package_map"])
148
+ df["platform_encoded"] = df["platform"].map(self.mappings["platform_map"])
149
+ df["error_type_encoded"] = df["error_type"].map(self.mappings["error_map"])
150
+
151
+ # Target
152
+ df["is_compatible"] = (df["install_success"] & df["import_success"]).astype(int)
153
+
154
+ # Version recency
155
+ df["version_recency"] = 0.5
156
+ for pkg in df["package"].unique():
157
+ mask = df["package"] == pkg
158
+ v = df.loc[mask, ["version_major", "version_minor", "version_patch"]].values
159
+ vnums = v[:, 0] * 10000 + v[:, 1] * 100 + v[:, 2]
160
+ usorted = sorted(set(vnums))
161
+ rmap = {val: i / max(len(usorted) - 1, 1) for i, val in enumerate(usorted)}
162
+ df.loc[mask, "version_recency"] = [rmap[val] for val in vnums]
163
+
164
+ # Name features
165
+ df["pkg_name_len"] = df["package"].apply(len)
166
+ df["pkg_has_hyphen"] = df["package"].apply(lambda x: 1 if "-" in x else 0)
167
+
168
+ return df
169
+
170
+ @staticmethod
171
+ def _parse_version(version_str):
172
+ parts = re.split(r'[.\-]', str(version_str))
173
+ major = int(parts[0]) if len(parts) > 0 and parts[0].isdigit() else 0
174
+ minor = int(parts[1]) if len(parts) > 1 and parts[1].isdigit() else 0
175
+ patch = int(parts[2]) if len(parts) > 2 and parts[2].isdigit() else 0
176
+ return major, minor, patch
177
+
178
+ @staticmethod
179
+ def _feature_columns():
180
+ return [
181
+ "package_encoded", "version_major", "version_minor", "version_patch",
182
+ "python_version_num", "platform_encoded", "version_recency",
183
+ "pkg_name_len", "pkg_has_hyphen",
184
+ ]
185
+
186
+ # ─── Prediction ─────────────────────────────────────────────
187
+
188
+ def predict(self, package, version, python_version, platform="darwin_x86_64"):
189
+ """
190
+ Predict compatibility for a package+version on a given system.
191
+
192
+ Args:
193
+ package: Package name (e.g. "boto3")
194
+ version: Version string (e.g. "1.42.49")
195
+ python_version: Python version (e.g. "3.12")
196
+ platform: Platform string (e.g. "darwin_x86_64")
197
+
198
+ Returns:
199
+ dict with is_compatible, confidence, predicted_error_type, etc.
200
+ """
201
+ if self.compat_model is None:
202
+ raise RuntimeError("Model not loaded. Call load() or train_from_data() first.")
203
+
204
+ features = self._build_features(package, version, python_version, platform)
205
+
206
+ compat_pred = self.compat_model.predict(features)[0]
207
+ compat_proba = self.compat_model.predict_proba(features)[0]
208
+ confidence = float(max(compat_proba))
209
+
210
+ error_pred = "unknown"
211
+ if self.error_model is not None:
212
+ err_enc = self.error_model.predict(features)[0]
213
+ rev_map = self.mappings.get("reverse_error_map", {})
214
+ # JSON converts int keys to strings, so check both
215
+ error_pred = rev_map.get(err_enc, rev_map.get(str(err_enc), "unknown"))
216
+
217
+ return {
218
+ "package": package,
219
+ "version": version,
220
+ "python_version": python_version,
221
+ "platform": platform,
222
+ "is_compatible": bool(compat_pred),
223
+ "confidence": round(confidence, 4),
224
+ "compatibility_probability": round(
225
+ float(compat_proba[1]) if len(compat_proba) > 1 else float(compat_proba[0]), 4
226
+ ),
227
+ "predicted_error_type": error_pred if not compat_pred else "none",
228
+ }
229
+
230
+ def recommend(self, package, python_version, platform="darwin_x86_64", top_n=5):
231
+ """
232
+ Recommend best compatible versions for a package.
233
+
234
+ Args:
235
+ package: Package name
236
+ python_version: Python version
237
+ platform: Platform string
238
+ top_n: Number of recommendations to return
239
+
240
+ Returns:
241
+ list of dicts sorted by compatibility probability (descending)
242
+ """
243
+ versions = self.package_versions.get(package, [])
244
+ if not versions:
245
+ return []
246
+
247
+ results = []
248
+ for v in versions:
249
+ pred = self.predict(package, v, python_version, platform)
250
+ results.append(pred)
251
+
252
+ results.sort(key=lambda x: (x["is_compatible"], x["compatibility_probability"]), reverse=True)
253
+ return results[:top_n]
254
+
255
+ def predict_batch(self, queries):
256
+ """
257
+ Batch prediction for multiple queries.
258
+
259
+ Args:
260
+ queries: list of dicts with keys: package, version, python_version, platform
261
+
262
+ Returns:
263
+ list of prediction dicts
264
+ """
265
+ return [
266
+ self.predict(
267
+ q["package"], q["version"],
268
+ q["python_version"], q.get("platform", "darwin_x86_64")
269
+ )
270
+ for q in queries
271
+ ]
272
+
273
+ def _build_features(self, package, version, python_version, platform):
274
+ pkg_enc = self.mappings["package_map"].get(package, len(self.mappings["package_map"]) // 2)
275
+ plat_enc = self.mappings["platform_map"].get(platform, 0)
276
+ major, minor, patch = self._parse_version(version)
277
+ py_ver = float(python_version)
278
+
279
+ # Version recency
280
+ recency = 0.5
281
+ versions = self.package_versions.get(package, [])
282
+ if versions and version in versions:
283
+ idx = versions.index(version)
284
+ recency = idx / max(len(versions) - 1, 1)
285
+
286
+ return np.array([[
287
+ pkg_enc, major, minor, patch, py_ver, plat_enc,
288
+ recency, len(package), 1 if "-" in package else 0
289
+ ]])
290
+
291
+ # ─── Save / Load ────────────────────────────────────────────
292
+
293
+ def save(self, path):
294
+ """
295
+ Save model to a directory (compatible with Hugging Face Hub).
296
+
297
+ Creates:
298
+ path/
299
+ config.json β€” Model metadata and mappings
300
+ compat_model.joblib β€” Compatibility classifier
301
+ error_model.joblib β€” Error type classifier
302
+ README.md β€” Hugging Face model card
303
+ """
304
+ os.makedirs(path, exist_ok=True)
305
+
306
+ # Save models
307
+ joblib.dump(self.compat_model, os.path.join(path, "compat_model.joblib"))
308
+ joblib.dump(self.error_model, os.path.join(path, "error_model.joblib"))
309
+
310
+ # Save config (mappings + metadata + package_versions)
311
+ config = {
312
+ "model_name": self.MODEL_NAME,
313
+ "model_version": self.MODEL_VERSION,
314
+ "mappings": self.mappings,
315
+ "metadata": self.metadata,
316
+ "package_versions": self.package_versions,
317
+ }
318
+ with open(os.path.join(path, "config.json"), "w") as f:
319
+ json.dump(config, f, indent=2)
320
+
321
+ # Generate model card
322
+ self._write_model_card(path)
323
+
324
+ print(f"βœ… Model saved to {path}/")
325
+ print(f" Files: config.json, compat_model.joblib, error_model.joblib, README.md")
326
+
327
+ @classmethod
328
+ def load(cls, path):
329
+ """
330
+ Load model from a directory.
331
+
332
+ Args:
333
+ path: Directory containing config.json and .joblib files
334
+
335
+ Returns:
336
+ PyCompatModel instance ready for predictions
337
+ """
338
+ instance = cls()
339
+
340
+ with open(os.path.join(path, "config.json"), "r") as f:
341
+ config = json.load(f)
342
+
343
+ instance.mappings = config["mappings"]
344
+ instance.metadata = config.get("metadata", {})
345
+ instance.package_versions = config.get("package_versions", {})
346
+ instance.compat_model = joblib.load(os.path.join(path, "compat_model.joblib"))
347
+ instance.error_model = joblib.load(os.path.join(path, "error_model.joblib"))
348
+
349
+ print(f"βœ… Model loaded from {path}/")
350
+ return instance
351
+
352
+ def _write_model_card(self, path):
353
+ """Generate Hugging Face model card README."""
354
+ metrics = self.metadata.get("metrics", {})
355
+ compat_m = metrics.get("compatibility", {})
356
+ error_m = metrics.get("error_type", {})
357
+
358
+ card = f"""---
359
+ language: en
360
+ license: mit
361
+ library_name: scikit-learn
362
+ tags:
363
+ - python
364
+ - package-compatibility
365
+ - prediction
366
+ - scikit-learn
367
+ - tabular-classification
368
+ metrics:
369
+ - accuracy
370
+ - f1
371
+ model-index:
372
+ - name: {self.MODEL_NAME}
373
+ results:
374
+ - task:
375
+ type: tabular-classification
376
+ name: Package Compatibility Prediction
377
+ metrics:
378
+ - name: Accuracy
379
+ type: accuracy
380
+ value: {compat_m.get('accuracy', 'N/A')}
381
+ - name: F1 Score
382
+ type: f1
383
+ value: {compat_m.get('f1_score', 'N/A')}
384
+ ---
385
+
386
+ # PyCompat β€” Python Package Compatibility Predictor
387
+
388
+ AI model that predicts whether a Python package version is compatible with a given system
389
+ (OS, Python version, platform) and recommends the best compatible versions.
390
+
391
+ ## Model Details
392
+
393
+ - **Model Type:** Random Forest (compatibility) + Gradient Boosting (error type)
394
+ - **Training Data:** {self.metadata.get('total_records', 'N/A')} compatibility test records
395
+ - **Packages:** {self.metadata.get('total_packages', 'N/A')} unique packages
396
+ - **Python Versions:** {', '.join(self.metadata.get('python_versions', []))}
397
+ - **Platforms:** {', '.join(self.metadata.get('platforms', []))}
398
+
399
+ ## Performance
400
+
401
+ | Model | Accuracy | F1 Score |
402
+ |-------|----------|----------|
403
+ | Compatibility | {compat_m.get('accuracy', 'N/A')} | {compat_m.get('f1_score', 'N/A')} |
404
+ | Error Type | {error_m.get('accuracy', 'N/A')} | {error_m.get('f1_score', 'N/A')} |
405
+
406
+ ## Usage
407
+
408
+ ```python
409
+ from pycompat_model import PyCompatModel
410
+
411
+ # Load model
412
+ model = PyCompatModel.load("./model")
413
+
414
+ # Single prediction
415
+ result = model.predict("boto3", "1.42.49", "3.12", "darwin_x86_64")
416
+ print(result)
417
+ # {{'is_compatible': True, 'confidence': 0.9977, 'predicted_error_type': 'none', ...}}
418
+
419
+ # Get recommendations
420
+ recs = model.recommend("alembic", "3.9")
421
+ for r in recs:
422
+ status = "βœ…" if r["is_compatible"] else "❌"
423
+ print(f" v{{r['version']}} {{status}} ({{r['confidence']:.0%}})")
424
+
425
+ # Batch prediction
426
+ results = model.predict_batch([
427
+ {{"package": "boto3", "version": "1.42.49", "python_version": "3.12"}},
428
+ {{"package": "alembic", "version": "1.18.4", "python_version": "3.9"}},
429
+ ])
430
+ ```
431
+
432
+ ## Error Types Predicted
433
+
434
+ | Error Type | Description |
435
+ |-----------|-------------|
436
+ | `none` | Fully compatible |
437
+ | `no_wheel` | No compatible wheel/distribution found |
438
+ | `import_error` | Installs but fails to import |
439
+ | `abi_mismatch` | ABI incompatibility with dependencies |
440
+ | `build_error` | Failed to build from source |
441
+ | `timeout` | Network timeout during install |
442
+
443
+ ## Training
444
+
445
+ ```python
446
+ from pycompat_model import PyCompatModel
447
+
448
+ model = PyCompatModel.train_from_data("data.json")
449
+ model.save("./model")
450
+ ```
451
+ """
452
+ with open(os.path.join(path, "README.md"), "w") as f:
453
+ f.write(card)
454
+
455
+ # ─── Hugging Face Hub ───────────────────────────────────────
456
+
457
+ def push_to_hub(self, repo_id, token=None):
458
+ """
459
+ Push model to Hugging Face Hub.
460
+
461
+ Args:
462
+ repo_id: e.g. "username/pycompat-model"
463
+ token: Hugging Face API token (or set HF_TOKEN env var)
464
+
465
+ Requires: pip install huggingface_hub
466
+ """
467
+ from huggingface_hub import HfApi, create_repo
468
+
469
+ token = token or os.environ.get("HF_TOKEN")
470
+ if not token:
471
+ raise ValueError("Provide a token or set HF_TOKEN environment variable")
472
+
473
+ # Save to temp dir
474
+ tmp_dir = "/tmp/pycompat_hf_upload"
475
+ self.save(tmp_dir)
476
+
477
+ # Create repo and upload
478
+ api = HfApi(token=token)
479
+ try:
480
+ create_repo(repo_id, token=token, repo_type="model", exist_ok=True)
481
+ except Exception:
482
+ pass
483
+
484
+ api.upload_folder(
485
+ folder_path=tmp_dir,
486
+ repo_id=repo_id,
487
+ repo_type="model",
488
+ )
489
+ print(f"πŸš€ Model pushed to https://huggingface.co/{repo_id}")
490
+
491
+ @classmethod
492
+ def from_hub(cls, repo_id, token=None):
493
+ """
494
+ Load model from Hugging Face Hub.
495
+
496
+ Args:
497
+ repo_id: e.g. "username/pycompat-model"
498
+
499
+ Returns:
500
+ PyCompatModel instance
501
+ """
502
+ from huggingface_hub import snapshot_download
503
+
504
+ local_dir = snapshot_download(repo_id, token=token)
505
+ return cls.load(local_dir)
506
+
507
+
508
+ # ─── CLI ────────────────────────────────────────────────────────
509
+
510
+ if __name__ == "__main__":
511
+ import sys
512
+
513
+ if len(sys.argv) < 2:
514
+ print("""
515
+ PyCompat Model CLI
516
+ ==================
517
+ Train: python pycompat_model.py train data.json ./model
518
+ Predict: python pycompat_model.py predict ./model boto3 1.42.49 3.12
519
+ Recommend: python pycompat_model.py recommend ./model alembic 3.9
520
+ Push: python pycompat_model.py push ./model username/pycompat-model
521
+ """)
522
+ sys.exit(0)
523
+
524
+ cmd = sys.argv[1]
525
+
526
+ if cmd == "train":
527
+ data_path = sys.argv[2] if len(sys.argv) > 2 else "data.json"
528
+ save_path = sys.argv[3] if len(sys.argv) > 3 else "./model"
529
+ model = PyCompatModel.train_from_data(data_path)
530
+ model.save(save_path)
531
+
532
+ elif cmd == "predict":
533
+ model_path = sys.argv[2]
534
+ pkg = sys.argv[3]
535
+ ver = sys.argv[4]
536
+ pyver = sys.argv[5]
537
+ plat = sys.argv[6] if len(sys.argv) > 6 else "darwin_x86_64"
538
+ model = PyCompatModel.load(model_path)
539
+ result = model.predict(pkg, ver, pyver, plat)
540
+ print(json.dumps(result, indent=2))
541
+
542
+ elif cmd == "recommend":
543
+ model_path = sys.argv[2]
544
+ pkg = sys.argv[3]
545
+ pyver = sys.argv[4]
546
+ plat = sys.argv[5] if len(sys.argv) > 5 else "darwin_x86_64"
547
+ model = PyCompatModel.load(model_path)
548
+ recs = model.recommend(pkg, pyver, plat, top_n=10)
549
+ print(f"\nπŸ” Top recommendations for {pkg} on Python {pyver}:\n")
550
+ for i, r in enumerate(recs, 1):
551
+ s = "βœ…" if r["is_compatible"] else "❌"
552
+ print(f" {i}. v{r['version']} {s} confidence: {r['confidence']:.0%} error: {r['predicted_error_type']}")
553
+
554
+ elif cmd == "push":
555
+ model_path = sys.argv[2]
556
+ repo_id = sys.argv[3]
557
+ model = PyCompatModel.load(model_path)
558
+ model.push_to_hub(repo_id)
559
+
560
+ else:
561
+ print(f"Unknown command: {cmd}")
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ scikit-learn>=1.3.0
2
+ numpy>=1.24.0
3
+ joblib>=1.3.0
4
+ pandas>=2.0.0