featcopilot 0.1.0__py3-none-any.whl → 0.2.0__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.
@@ -0,0 +1,287 @@
1
+ """Model utilities for Copilot client."""
2
+
3
+ import asyncio
4
+ from typing import Optional
5
+
6
+ from featcopilot.utils.logger import get_logger
7
+
8
+ logger = get_logger(__name__)
9
+
10
+ # Cache for models fetched from Copilot
11
+ _cached_models: Optional[list[dict]] = None
12
+
13
+ # Default model
14
+ DEFAULT_MODEL = "gpt-5.2"
15
+
16
+
17
+ async def _fetch_models_from_copilot() -> list[dict]:
18
+ """Fetch available models from Copilot SDK."""
19
+ try:
20
+ from copilot import CopilotClient
21
+
22
+ client = CopilotClient()
23
+ await client.start()
24
+
25
+ # Get available models from Copilot
26
+ models = await client.list_models()
27
+ await client.stop()
28
+
29
+ return models
30
+
31
+ except ImportError:
32
+ logger.warning("copilot-sdk not installed. Cannot fetch models from Copilot.")
33
+ return []
34
+ except Exception as e:
35
+ logger.warning(f"Could not fetch models from Copilot: {e}")
36
+ return []
37
+
38
+
39
+ def _get_event_loop():
40
+ """Get or create an event loop."""
41
+ try:
42
+ loop = asyncio.get_event_loop()
43
+ if loop.is_closed():
44
+ loop = asyncio.new_event_loop()
45
+ asyncio.set_event_loop(loop)
46
+ except RuntimeError:
47
+ loop = asyncio.new_event_loop()
48
+ asyncio.set_event_loop(loop)
49
+ return loop
50
+
51
+
52
+ def fetch_models(force_refresh: bool = False) -> list[dict]:
53
+ """
54
+ Fetch available models from the Copilot client.
55
+
56
+ This function queries the Copilot SDK to get the current list of
57
+ supported models. Results are cached for subsequent calls.
58
+
59
+ Parameters
60
+ ----------
61
+ force_refresh : bool, default=False
62
+ If True, bypass cache and fetch fresh model list
63
+
64
+ Returns
65
+ -------
66
+ list[dict]
67
+ List of model information dictionaries. Each dict contains
68
+ model metadata from the Copilot API.
69
+
70
+ Examples
71
+ --------
72
+ >>> from featcopilot.utils import fetch_models
73
+ >>> models = fetch_models()
74
+ >>> for m in models:
75
+ ... print(m.get('id') or m.get('name'))
76
+ """
77
+ global _cached_models
78
+
79
+ if _cached_models is not None and not force_refresh:
80
+ return _cached_models
81
+
82
+ loop = _get_event_loop()
83
+ models = loop.run_until_complete(_fetch_models_from_copilot())
84
+
85
+ if models:
86
+ _cached_models = models
87
+
88
+ return models
89
+
90
+
91
+ def list_models(
92
+ provider: Optional[str] = None,
93
+ verbose: bool = False,
94
+ force_refresh: bool = False,
95
+ ) -> list[dict]:
96
+ """
97
+ List all supported models from the Copilot client.
98
+
99
+ Retrieves the current list of available models directly from
100
+ the Copilot SDK.
101
+
102
+ Parameters
103
+ ----------
104
+ provider : str, optional
105
+ Filter by provider (e.g., 'OpenAI', 'Anthropic', 'Google')
106
+ verbose : bool, default=False
107
+ If True, print model information to logger
108
+ force_refresh : bool, default=False
109
+ If True, bypass cache and fetch fresh model list
110
+
111
+ Returns
112
+ -------
113
+ list[dict]
114
+ List of model information dictionaries from Copilot API
115
+
116
+ Examples
117
+ --------
118
+ >>> from featcopilot.utils import list_models
119
+ >>> models = list_models()
120
+ >>> for m in models:
121
+ ... print(m)
122
+
123
+ >>> # With verbose output
124
+ >>> list_models(verbose=True)
125
+
126
+ >>> # Filter by provider (if supported by returned data)
127
+ >>> openai_models = list_models(provider='OpenAI')
128
+ """
129
+ models = fetch_models(force_refresh=force_refresh)
130
+
131
+ # Apply provider filter if specified
132
+ if provider and models:
133
+ filtered = []
134
+ for m in models:
135
+ model_provider = m.get("provider", "") or m.get("vendor", "") or ""
136
+ if provider.lower() in model_provider.lower():
137
+ filtered.append(m)
138
+ models = filtered
139
+
140
+ if verbose:
141
+ _print_models(models)
142
+
143
+ return models
144
+
145
+
146
+ def get_model_info(model_name: str, force_refresh: bool = False) -> Optional[dict]:
147
+ """
148
+ Get information about a specific model from Copilot.
149
+
150
+ Parameters
151
+ ----------
152
+ model_name : str
153
+ The model identifier
154
+ force_refresh : bool, default=False
155
+ If True, bypass cache and fetch fresh model list
156
+
157
+ Returns
158
+ -------
159
+ dict or None
160
+ Model information if found, None otherwise
161
+
162
+ Examples
163
+ --------
164
+ >>> from featcopilot.utils import get_model_info
165
+ >>> info = get_model_info('gpt-5.2')
166
+ >>> if info:
167
+ ... print(info)
168
+ """
169
+ models = fetch_models(force_refresh=force_refresh)
170
+
171
+ for model in models:
172
+ # Check various possible name fields
173
+ if model.get("id") == model_name:
174
+ return model
175
+ if model.get("name") == model_name:
176
+ return model
177
+ if model.get("model") == model_name:
178
+ return model
179
+
180
+ return None
181
+
182
+
183
+ def get_default_model() -> str:
184
+ """
185
+ Get the default model name.
186
+
187
+ Returns
188
+ -------
189
+ str
190
+ The default model identifier
191
+
192
+ Examples
193
+ --------
194
+ >>> from featcopilot.utils import get_default_model
195
+ >>> model = get_default_model()
196
+ >>> print(model) # 'gpt-5.2'
197
+ """
198
+ return DEFAULT_MODEL
199
+
200
+
201
+ def get_model_names(force_refresh: bool = False) -> list[str]:
202
+ """
203
+ Get list of available model names/identifiers.
204
+
205
+ Parameters
206
+ ----------
207
+ force_refresh : bool, default=False
208
+ If True, bypass cache and fetch fresh model list
209
+
210
+ Returns
211
+ -------
212
+ list[str]
213
+ List of model identifiers
214
+
215
+ Examples
216
+ --------
217
+ >>> from featcopilot.utils import get_model_names
218
+ >>> names = get_model_names()
219
+ >>> print(names)
220
+ """
221
+ models = fetch_models(force_refresh=force_refresh)
222
+ names = []
223
+
224
+ for m in models:
225
+ name = m.get("id") or m.get("name") or m.get("model")
226
+ if name:
227
+ names.append(name)
228
+
229
+ return names
230
+
231
+
232
+ def is_valid_model(model_name: str, force_refresh: bool = False) -> bool:
233
+ """
234
+ Check if a model name is valid/supported.
235
+
236
+ Parameters
237
+ ----------
238
+ model_name : str
239
+ The model identifier to check
240
+ force_refresh : bool, default=False
241
+ If True, bypass cache and fetch fresh model list
242
+
243
+ Returns
244
+ -------
245
+ bool
246
+ True if model is supported, False otherwise
247
+
248
+ Examples
249
+ --------
250
+ >>> from featcopilot.utils import is_valid_model
251
+ >>> is_valid_model('gpt-5.2')
252
+ """
253
+ models = fetch_models(force_refresh=force_refresh)
254
+
255
+ if not models:
256
+ # If we couldn't fetch models, allow any model name
257
+ # (let the Copilot API validate it)
258
+ logger.warning("Could not validate model - Copilot unavailable")
259
+ return True
260
+
261
+ return model_name in get_model_names(force_refresh=False)
262
+
263
+
264
+ def _print_models(models: list[dict]) -> None:
265
+ """Print models information."""
266
+ if not models:
267
+ logger.info("No models found. Copilot SDK may not be available.")
268
+ return
269
+
270
+ logger.info("Available models from Copilot:")
271
+ logger.info("-" * 60)
272
+
273
+ for model in models:
274
+ model_id = model.get("id") or model.get("name") or model.get("model") or "unknown"
275
+ description = model.get("description", "")
276
+ provider = model.get("provider") or model.get("vendor") or ""
277
+
278
+ line = f" {model_id}"
279
+ if provider:
280
+ line += f" ({provider})"
281
+ if description:
282
+ line += f" - {description[:50]}..."
283
+
284
+ logger.info(line)
285
+
286
+ logger.info("-" * 60)
287
+ logger.info(f"Total: {len(models)} models")
@@ -4,6 +4,10 @@ from typing import Any, Callable, Optional
4
4
 
5
5
  import pandas as pd
6
6
 
7
+ from featcopilot.utils.logger import get_logger
8
+
9
+ logger = get_logger(__name__)
10
+
7
11
 
8
12
  def parallel_apply(
9
13
  func: Callable,
@@ -51,7 +55,7 @@ def parallel_apply(
51
55
  except ImportError:
52
56
  # Fallback to sequential processing
53
57
  if verbose:
54
- print("joblib not available, using sequential processing")
58
+ logger.warning("joblib not available, using sequential processing")
55
59
 
56
60
  return [func(row) for _, row in data.iterrows()]
57
61
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: featcopilot
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Next-generation LLM-powered auto feature engineering framework with GitHub Copilot SDK
5
5
  Author: FeatCopilot Contributors
6
6
  License: MIT
@@ -28,11 +28,26 @@ Requires-Dist: pydantic>=2.0.0
28
28
  Requires-Dist: joblib>=1.1.0
29
29
  Provides-Extra: llm
30
30
  Requires-Dist: github-copilot-sdk>=0.1.0; extra == "llm"
31
+ Requires-Dist: nest_asyncio>=1.5.0; extra == "llm"
32
+ Provides-Extra: litellm
33
+ Requires-Dist: litellm>=1.0.0; extra == "litellm"
34
+ Requires-Dist: nest_asyncio>=1.5.0; extra == "litellm"
31
35
  Provides-Extra: timeseries
32
36
  Requires-Dist: statsmodels>=0.13.0; extra == "timeseries"
37
+ Provides-Extra: feast
38
+ Requires-Dist: feast>=0.30.0; extra == "feast"
33
39
  Provides-Extra: full
34
40
  Requires-Dist: github-copilot-sdk>=0.1.0; extra == "full"
41
+ Requires-Dist: litellm>=1.0.0; extra == "full"
35
42
  Requires-Dist: statsmodels>=0.13.0; extra == "full"
43
+ Requires-Dist: feast>=0.30.0; extra == "full"
44
+ Requires-Dist: nest_asyncio>=1.5.0; extra == "full"
45
+ Provides-Extra: benchmark
46
+ Requires-Dist: github-copilot-sdk>=0.1.0; extra == "benchmark"
47
+ Requires-Dist: statsmodels>=0.13.0; extra == "benchmark"
48
+ Requires-Dist: flaml[automl,blendsearch]>=2.0.0; extra == "benchmark"
49
+ Requires-Dist: autogluon.tabular>=1.0.0; extra == "benchmark"
50
+ Requires-Dist: h2o>=3.40.0; extra == "benchmark"
36
51
  Provides-Extra: dev
37
52
  Requires-Dist: pytest>=7.0.0; extra == "dev"
38
53
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -44,9 +59,9 @@ Requires-Dist: pre-commit>=3.6.0; extra == "dev"
44
59
 
45
60
  # FeatCopilot 🚀
46
61
 
47
- **Next-Generation LLM-Powered Auto Feature Engineering with GitHub Copilot SDK**
62
+ **Next-Generation LLM-Powered Auto Feature Engineering Framework**
48
63
 
49
- FeatCopilot is a unified feature engineering framework that combines the best approaches from existing libraries (Featuretools, TSFresh, AutoFeat, OpenFE) with novel LLM-powered capabilities via GitHub Copilot SDK.
64
+ FeatCopilot automatically generates, selects, and explains predictive features using semantic understanding. It analyzes column meanings, applies domain-aware transformations, and provides human-readable explanations—turning raw data into ML-ready features in seconds.
50
65
 
51
66
  ## 📊 Benchmark Highlights
52
67
 
@@ -59,7 +74,7 @@ FeatCopilot is a unified feature engineering framework that combines the best ap
59
74
  | Classification | +0.54% | +4.35% |
60
75
  | Regression | +0.65% | +5.57% |
61
76
 
62
- ### LLM Engine (With Copilot - 30-60s)
77
+ ### LLM Engine (With LiteLLM - 30-60s)
63
78
 
64
79
  | Task Type | Average Improvement | Best Case |
65
80
  |-----------|--------------------:|----------:|
@@ -87,7 +102,7 @@ FeatCopilot is a unified feature engineering framework that combines the best ap
87
102
  # Basic installation
88
103
  pip install featcopilot
89
104
 
90
- # With LLM capabilities (requires GitHub Copilot)
105
+ # With LLM capabilities
91
106
  pip install featcopilot[llm]
92
107
 
93
108
  # Full installation
@@ -111,7 +126,7 @@ X_transformed = engineer.fit_transform(X, y) # <1 second
111
126
  print(f"Features: {X.shape[1]} -> {X_transformed.shape[1]}")
112
127
  ```
113
128
 
114
- ### LLM Mode (With Copilot)
129
+ ### LLM Mode (With LiteLLM)
115
130
 
116
131
  ```python
117
132
  from featcopilot import AutoFeatureEngineer
@@ -164,16 +179,24 @@ engine = TimeSeriesEngine(
164
179
  ```
165
180
 
166
181
  ### LLM Engine
167
- Uses GitHub Copilot SDK for intelligent feature generation.
182
+ Uses GitHub Copilot SDK (default) or LiteLLM (100+ providers) for intelligent feature generation.
168
183
 
169
184
  ```python
170
185
  from featcopilot.llm import SemanticEngine
171
186
 
187
+ # Default: GitHub Copilot SDK
172
188
  engine = SemanticEngine(
173
- model='gpt-5',
189
+ model='gpt-5.2',
174
190
  max_suggestions=20,
175
191
  validate_features=True
176
192
  )
193
+
194
+ # Alternative: LiteLLM backend
195
+ engine = SemanticEngine(
196
+ model='gpt-4o',
197
+ backend='litellm',
198
+ max_suggestions=20
199
+ )
177
200
  ```
178
201
 
179
202
  ## Feature Selection
@@ -211,7 +234,7 @@ X_selected = selector.fit_transform(X, y)
211
234
 
212
235
  - Python 3.9+
213
236
  - NumPy, Pandas, Scikit-learn
214
- - GitHub Copilot CLI (for LLM features)
237
+ - GitHub Copilot SDK (default) or LiteLLM (for 100+ LLM providers)
215
238
 
216
239
  ## License
217
240
 
@@ -0,0 +1,35 @@
1
+ featcopilot/__init__.py,sha256=pHamq5ULkm-VFVvy0JQFu-x3CRNqY4mZXppVqV_W4f0,763
2
+ featcopilot/core/__init__.py,sha256=TX_AsPRsVDY1ZKO-ApK7qBFhbgngQbYNamhzYU9P3P8,338
3
+ featcopilot/core/base.py,sha256=lN1zfV6GHCNy2XSNV9OH2dXtvwrZZsu376kT_ExrZto,6090
4
+ featcopilot/core/feature.py,sha256=BzzRJB6RH5RlaOszIvVqcRfQ2F0vfkP_sctfpYAlb-Y,7441
5
+ featcopilot/core/registry.py,sha256=EK4lleLShhMkGRXI1evv6SsVO81rpLLkzJbjImHryJE,4030
6
+ featcopilot/engines/__init__.py,sha256=bXY5eiEQTZ9IxPY1fTESw4v1-nXFkegSs8p4VYGr7TQ,360
7
+ featcopilot/engines/relational.py,sha256=MUqOZgOwKmp7sMsE7lCMbLEjqekBPpcdLXeXkCEKzPM,8402
8
+ featcopilot/engines/tabular.py,sha256=YPjqc9vxCI9-n9pzP3Bm4w2MZ5KHKE5XOk1BdI_nqSc,10878
9
+ featcopilot/engines/text.py,sha256=sixWPg7iuf1NGCWo51gIVZ6DMEf0NUrKA5HECcLXF1k,7496
10
+ featcopilot/engines/timeseries.py,sha256=FdwpOUJJToIkT1RR4VTpFIWYSvEfl_5pXJXf2qAuKm8,13644
11
+ featcopilot/llm/__init__.py,sha256=NswbNiGISinrIzx0EKwaL8fZL4t0DDDD8CIKZ3v_vps,629
12
+ featcopilot/llm/code_generator.py,sha256=p6qSSZ4ul8kxOBjmnAEAU_1dwtVMJWqIfDiM5UXkZqY,9814
13
+ featcopilot/llm/copilot_client.py,sha256=PX7JKBvF0dpnTNMRn_eZcH3swkvZqGQ6pKRICoxwF6c,19034
14
+ featcopilot/llm/explainer.py,sha256=5ukhm27zqyH3oHDOgCHrw3OeJMDEt9olIOYD_hTHqbA,6232
15
+ featcopilot/llm/litellm_client.py,sha256=HSrzJ9-cvxaDdqv142cgoeAqJ2WcIcwVhgz1Jb-PPv8,20443
16
+ featcopilot/llm/semantic_engine.py,sha256=6eg_9Ru_llo0W4wcdIPbMZOlx_p1MTdmCWLQ85g2v6o,14466
17
+ featcopilot/selection/__init__.py,sha256=pjoos64ym3CR7Hk75qq2dY0NN4OT0Sn3hiBSG_h44SE,406
18
+ featcopilot/selection/importance.py,sha256=GEUXfSwknLweAnbdaKX1OZuOn7tfhn-SPyIGiuBSvBg,5575
19
+ featcopilot/selection/redundancy.py,sha256=2S-fP20nfTPPikgIQFc0dvfJU3SprThake5waDdINF4,5398
20
+ featcopilot/selection/statistical.py,sha256=dey-vX-WKT9rrDtHPLYyksfJLHQqdREjSnrXJIUPT0I,6269
21
+ featcopilot/selection/unified.py,sha256=7H8USqe59FLA6cCXJC2etP8Cp6YMLJW3rwaNjIS_iUI,6358
22
+ featcopilot/stores/__init__.py,sha256=w_Ap3jA8pbV7eij3jK6TxAapG1O1tdKFAmUvAPcSdZA,439
23
+ featcopilot/stores/base.py,sha256=VzHUA1IYMUiP4-cE4SXt_xmgkk2raIz09-9aZ6szOxQ,4395
24
+ featcopilot/stores/feast_store.py,sha256=ej6b05JRMwXqQ8pTorxKH8LQ3JTlwzGAGNckZPzq7d8,19032
25
+ featcopilot/transformers/__init__.py,sha256=pHHSivxNVyC9AmKzdA8UJS0B-b9V1B4eI1QgTP0Z8uw,234
26
+ featcopilot/transformers/sklearn_compat.py,sha256=rf9tapjbiRT6Bx-hU_t-7UMncrKGwTaKn45qHcYWfUI,13637
27
+ featcopilot/utils/__init__.py,sha256=aWRMS_4sZHdw8eTHBYT_O4qMYuM9EHsPGPlo5a-PzaE,489
28
+ featcopilot/utils/cache.py,sha256=CYIVXQU9dpVdrLkemhjVAoCzXRMRzuQ-U36-q_8zDoc,6489
29
+ featcopilot/utils/logger.py,sha256=qJe4OT13TPanF-vebfs8BILmwkuV8zi2KSHlAUDaSnU,1334
30
+ featcopilot/utils/models.py,sha256=X9amoyLjy8umaCvbp0G6BkmzmasvAYZc2xVKvD6yeAA,7317
31
+ featcopilot/utils/parallel.py,sha256=k0ePtnI48aXNomD0lBBptla0RlhCX1-5xyEDD9zbkDQ,2963
32
+ featcopilot-0.2.0.dist-info/METADATA,sha256=9p7mmGYqFf4gerx16TnIxOLUueLxU5DBATWivlapS9k,7763
33
+ featcopilot-0.2.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
34
+ featcopilot-0.2.0.dist-info/top_level.txt,sha256=Lf6lB8VBDX71TBzSXW3qq44RO5hIUKQ6DMi_dL8G_Ak,12
35
+ featcopilot-0.2.0.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- featcopilot/__init__.py,sha256=Ljn4cK5Emw_Rh8rg-T1EqDoyuWz_GXCAkiaZ_amz-cA,708
2
- featcopilot/core/__init__.py,sha256=TX_AsPRsVDY1ZKO-ApK7qBFhbgngQbYNamhzYU9P3P8,338
3
- featcopilot/core/base.py,sha256=lN1zfV6GHCNy2XSNV9OH2dXtvwrZZsu376kT_ExrZto,6090
4
- featcopilot/core/feature.py,sha256=YGE-xDj7cRZDA50Oa5W-USXiEZ1NrX3WagZueRQiZbk,7361
5
- featcopilot/core/registry.py,sha256=EK4lleLShhMkGRXI1evv6SsVO81rpLLkzJbjImHryJE,4030
6
- featcopilot/engines/__init__.py,sha256=bXY5eiEQTZ9IxPY1fTESw4v1-nXFkegSs8p4VYGr7TQ,360
7
- featcopilot/engines/relational.py,sha256=0zr8OhCRg-jvch1HRaxR6RgQFti3McDPvdco-onsUTc,8311
8
- featcopilot/engines/tabular.py,sha256=M5cynbfNzkFilxV2rPG5kIcEwni-wc_HtjGNuGiSXGU,10781
9
- featcopilot/engines/text.py,sha256=I9OGN0Rwf2SW1V9shaJDmmud1eymnx5xLdSmLfCzKhU,7396
10
- featcopilot/engines/timeseries.py,sha256=76YE5QAD-yzXdajeP3wP3cfqtRSOZglz-E-OVSnvvs8,13553
11
- featcopilot/llm/__init__.py,sha256=75MgMNw8cAggNOUAJV8ib1uV_UCTjA04tdYbqWNwumU,468
12
- featcopilot/llm/code_generator.py,sha256=dAn5n3fp-sWj3DhQ9I-ZME5bYSXRVSe4Blx5P-W484Q,9715
13
- featcopilot/llm/copilot_client.py,sha256=BLAENfNjkyOvgeVWQt-94mkTtxcdz5esk0ro6iaUCPM,17328
14
- featcopilot/llm/explainer.py,sha256=fztidSmLX5dmbPRMcLmgXNv7AvDEJjXM5OzD6NFtQjQ,6142
15
- featcopilot/llm/semantic_engine.py,sha256=U4CQ-OsWEr_c2Q8HF6yN7jXhKpTaSR6lft-lEacBzXo,12554
16
- featcopilot/selection/__init__.py,sha256=pjoos64ym3CR7Hk75qq2dY0NN4OT0Sn3hiBSG_h44SE,406
17
- featcopilot/selection/importance.py,sha256=GzSHTwKIeHJt42mzb1x8ClGFnqU9_2MxV1kOce9SODg,5481
18
- featcopilot/selection/redundancy.py,sha256=bz47JQtEBKoz9eMIMB3YMOxH_1s7q1OsEUE_Ob3t0xg,5301
19
- featcopilot/selection/statistical.py,sha256=POuWuMoyggJt1bCML10I6C7gKZoUP7Yc4nMsKBwECYs,6184
20
- featcopilot/selection/unified.py,sha256=UPrTJ0svTjy6SnqQVeyiAGNjkgTRbXO_AzbucGZNUjc,6273
21
- featcopilot/transformers/__init__.py,sha256=pHHSivxNVyC9AmKzdA8UJS0B-b9V1B4eI1QgTP0Z8uw,234
22
- featcopilot/transformers/sklearn_compat.py,sha256=z5oA_y8YENQaGTTnR13u7CWhJpIhNmUoQP-DNVIgPeA,13536
23
- featcopilot/utils/__init__.py,sha256=PH-fC1WYJYevcMVI4CCoXIUTJlb5lPXwKeKNj56vs_k,198
24
- featcopilot/utils/cache.py,sha256=CYIVXQU9dpVdrLkemhjVAoCzXRMRzuQ-U36-q_8zDoc,6489
25
- featcopilot/utils/parallel.py,sha256=MjLAYWYgoeu02IoWNWEZ82sCcRDi5bICJVcSq7dXmN4,2874
26
- featcopilot-0.1.0.dist-info/METADATA,sha256=EI1MSGG2KkICOCRnLX1CI5-v91N40pmRS6oyAVgk1w4,6804
27
- featcopilot-0.1.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
28
- featcopilot-0.1.0.dist-info/top_level.txt,sha256=Lf6lB8VBDX71TBzSXW3qq44RO5hIUKQ6DMi_dL8G_Ak,12
29
- featcopilot-0.1.0.dist-info/RECORD,,