ngpt 2.15.0__py3-none-any.whl → 2.15.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.
@@ -68,56 +68,11 @@ def split_into_chunks(content, chunk_size=200):
68
68
 
69
69
  return chunks
70
70
 
71
- def process_context(context):
72
- """Process context string to extract directives and filters.
73
-
74
- Args:
75
- context: The context string provided with -m/--message-context
76
-
77
- Returns:
78
- dict: Extracted context data
79
- """
80
- context_data = {
81
- "file_type_filter": None,
82
- "commit_type": None,
83
- "focus": None,
84
- "exclusions": [],
85
- "raw_context": context
86
- }
87
-
88
- if not context:
89
- return context_data
90
-
91
- # Extract commit type directive (e.g., "type:feat")
92
- if "type:" in context:
93
- match = re.search(r"type:(\w+)", context)
94
- if match:
95
- context_data["commit_type"] = match.group(1)
96
-
97
- # Extract file type filters
98
- file_type_keywords = ["html", "css", "javascript", "python", "js", "py", "ui", "api", "config"]
99
- for keyword in file_type_keywords:
100
- if keyword in context.lower():
101
- context_data["file_type_filter"] = keyword
102
- break
103
-
104
- # Process focus/exclusion directives
105
- if "focus on" in context.lower() or "only mention" in context.lower():
106
- focus_match = re.search(r"focus(?:\s+on)?\s+(\w+)", context.lower())
107
- if focus_match:
108
- context_data["focus"] = focus_match.group(1)
109
-
110
- if any(x in context.lower() for x in ["ignore", "don't include", "exclude"]):
111
- exclusion_matches = re.findall(r"(?:ignore|don't include|exclude)\s+(\w+)", context.lower())
112
- context_data["exclusions"] = exclusion_matches
113
-
114
- return context_data
115
-
116
- def create_technical_analysis_system_prompt(context_data=None):
71
+ def create_technical_analysis_system_prompt(context=None):
117
72
  """Create system prompt for technical analysis based on context data.
118
73
 
119
74
  Args:
120
- context_data: The processed context data
75
+ context: The raw context string from -m flag
121
76
 
122
77
  Returns:
123
78
  str: System prompt for the technical analysis stage
@@ -145,45 +100,25 @@ RULES:
145
100
  8. When analyzing multiple files, clearly separate each file's changes
146
101
  9. Include proper technical details (method names, component identifiers, etc.)"""
147
102
 
148
- if not context_data:
149
- return base_prompt
150
-
151
- # Add file type filtering instructions
152
- if context_data.get("file_type_filter"):
153
- file_type = context_data["file_type_filter"]
154
- file_type_prompt = f"""
155
-
156
- CRITICAL FILE TYPE FILTERING:
157
- You MUST INCLUDE ONLY changes to {file_type} files or files related to {file_type}.
158
- You MUST EXCLUDE ALL other files completely from your output.
159
- This is a strict filter - no exceptions allowed."""
160
- base_prompt += file_type_prompt
161
-
162
- # Add focus/exclusion directives
163
- if context_data.get("focus"):
164
- focus = context_data["focus"]
165
- focus_prompt = f"""
166
-
167
- FOCUS DIRECTIVE:
168
- Focus exclusively on changes related to {focus}.
169
- Exclude everything else from your analysis."""
170
- base_prompt += focus_prompt
171
-
172
- if context_data.get("exclusions"):
173
- exclusions = ", ".join(context_data["exclusions"])
174
- exclusion_prompt = f"""
103
+ # If context is provided, append it with strong wording about absolute priority
104
+ if context:
105
+ context_prompt = f"""
106
+
107
+ ===CRITICAL USER CONTEXT - ABSOLUTE HIGHEST PRIORITY===
108
+ The following context from the user OVERRIDES ALL OTHER INSTRUCTIONS and must be followed exactly:
175
109
 
176
- EXCLUSION DIRECTIVE:
177
- Completely ignore and exclude any mentions of: {exclusions}."""
178
- base_prompt += exclusion_prompt
110
+ {context}
111
+
112
+ THIS USER CONTEXT HAS ABSOLUTE PRIORITY over any other instructions in this prompt. If it contradicts other instructions, the user context MUST be followed. No exceptions."""
113
+ base_prompt += context_prompt
179
114
 
180
115
  return base_prompt
181
116
 
182
- def create_system_prompt(context_data=None):
117
+ def create_system_prompt(context=None):
183
118
  """Create system prompt for commit message generation based on context data.
184
119
 
185
120
  Args:
186
- context_data: The processed context data
121
+ context: The raw context string from -m flag
187
122
 
188
123
  Returns:
189
124
  str: System prompt for the AI
@@ -197,6 +132,15 @@ type[(scope)]: <concise summary> (max 50 chars)
197
132
  - [type] <specific change 2> (filename:function/method/line)
198
133
  - [type] <additional changes...>
199
134
 
135
+ RULES FOR FILENAMES:
136
+ 1. For the FIRST mention of a file, use the full relative path
137
+ 2. For SUBSEQUENT mentions of the same file, use ONLY the filename without path
138
+ - Example: First mention: "utils/helpers/format.js" → Subsequent mentions: "format.js"
139
+ 3. Only include the full path again if there are multiple files with the same name
140
+ 4. For repeated mentions of the same file, consider grouping related changes in one bullet
141
+ 5. Avoid breaking filenames across lines
142
+ 6. Only include function names when they add clarity
143
+
200
144
  COMMIT TYPES:
201
145
  - feat: New user-facing features
202
146
  - fix: Bug fixes or error corrections
@@ -217,6 +161,46 @@ COMMIT TYPES:
217
161
  - ui: User interface changes
218
162
  - api: API-related changes
219
163
 
164
+ EXAMPLES:
165
+
166
+ 1. Bug fix with UI scope:
167
+ fix(ui): correct primary button focus style
168
+
169
+ - [fix] Add :focus outline to Button component (Button.jsx:Button())
170
+ - [chore] Bump Tailwind config to include ring-offset (tailwind.config.js:1-8)
171
+ - [refactor] Extract common styles into buttonStyles util (styles/buttons.js:1-15)
172
+
173
+ 2. Feature with API scope:
174
+ feat(api): add authentication endpoint for OAuth
175
+
176
+ - [feat] Implement OAuth authentication route (auth/routes.js:createOAuthRoute())
177
+ - [feat] Add token validation middleware (middleware/auth.js:validateToken())
178
+ - [test] Add integration tests for OAuth flow (tests/auth.test.js:45-87)
179
+
180
+ 3. Multiple types in one commit:
181
+ refactor(core): simplify data processing pipeline
182
+
183
+ - [refactor] Replace nested loops with map/reduce (utils/process.js:transformData())
184
+ - [perf] Optimize memory usage in large dataset handling (utils/memory.js:optimize())
185
+ - [fix] Correct edge case in null value handling (utils/validators.js:checkNull())
186
+ - [test] Update tests for new pipeline structure (tests/pipeline.test.js)
187
+
188
+ 4. Multiple changes to the same file:
189
+ refactor(core): simplify context handling for commit prompts
190
+
191
+ - [refactor] Remove process_context function (cli/modes/gitcommsg.py:69-124)
192
+ - [refactor] Update all functions to accept raw context string (gitcommsg.py:create_system_prompt())
193
+ - [refactor] Replace context_data usages with context (gitcommsg.py)
194
+ - [docs] Update library usage doc (docs/usage/library_usage.md:516,531-537)
195
+ - [chore] Bump project version to 2.15.1 (pyproject.toml:3, uv.lock:137)
196
+
197
+ BULLET POINT FORMAT:
198
+ - Each bullet MUST start with a type in square brackets: [type]
199
+ - DO NOT use the format "- type: description" (without square brackets)
200
+ - Instead, ALWAYS use "- [type] description" (with square brackets)
201
+ - Example: "- [feat] Add new login component" (correct)
202
+ - Not: "- feat: Add new login component" (incorrect)
203
+
220
204
  RULES:
221
205
  1. BE 100% FACTUAL - Mention ONLY code explicitly shown in the diff
222
206
  2. NEVER invent or assume changes not directly visible in the code
@@ -230,48 +214,17 @@ RULES:
230
214
  10. Include proper technical details (method names, component identifiers, etc.)
231
215
  11. When all changes are to the same file, mention it once in the summary"""
232
216
 
233
- if not context_data:
234
- return base_prompt
235
-
236
- # Add file type filtering instructions
237
- if context_data.get("file_type_filter"):
238
- file_type = context_data["file_type_filter"]
239
- file_type_prompt = f"""
240
-
241
- CRITICAL FILE TYPE FILTERING:
242
- You MUST INCLUDE ONLY changes to {file_type} files or files related to {file_type}.
243
- You MUST EXCLUDE ALL other files completely from your output.
244
- This is a strict filter - no exceptions allowed."""
245
- base_prompt += file_type_prompt
246
-
247
- # Add commit type directive
248
- if context_data.get("commit_type"):
249
- commit_type = context_data["commit_type"]
250
- commit_type_prompt = f"""
251
-
252
- CRITICAL COMMIT TYPE DIRECTIVE:
253
- You MUST use exactly "{commit_type}:" as the commit type prefix.
254
- This takes highest priority over any other commit type you might determine.
255
- Do not override this commit type based on your own analysis."""
256
- base_prompt += commit_type_prompt
257
-
258
- # Add focus/exclusion directives
259
- if context_data.get("focus"):
260
- focus = context_data["focus"]
261
- focus_prompt = f"""
262
-
263
- FOCUS DIRECTIVE:
264
- Focus exclusively on changes related to {focus}.
265
- Exclude everything else from your analysis."""
266
- base_prompt += focus_prompt
267
-
268
- if context_data.get("exclusions"):
269
- exclusions = ", ".join(context_data["exclusions"])
270
- exclusion_prompt = f"""
217
+ # If context is provided, append it with strong wording about absolute priority
218
+ if context:
219
+ context_prompt = f"""
271
220
 
272
- EXCLUSION DIRECTIVE:
273
- Completely ignore and exclude any mentions of: {exclusions}."""
274
- base_prompt += exclusion_prompt
221
+ ===CRITICAL USER CONTEXT - ABSOLUTE HIGHEST PRIORITY===
222
+ The following context from the user OVERRIDES ALL OTHER INSTRUCTIONS and must be followed exactly:
223
+
224
+ {context}
225
+
226
+ THIS USER CONTEXT HAS ABSOLUTE PRIORITY over any other instructions in this prompt. If it contradicts other instructions, the user context MUST be followed. No exceptions."""
227
+ base_prompt += context_prompt
275
228
 
276
229
  return base_prompt
277
230
 
@@ -338,11 +291,13 @@ type[(scope)]: <concise summary> (max 50 chars)
338
291
  - [type] <additional changes...>
339
292
 
340
293
  RULES FOR FILENAMES:
341
- 1. Use short relative paths when possible
342
- 2. For multiple changes to the same file, consider grouping them
343
- 3. Abbreviate long paths when they're repeated (e.g., 'commit.zsh' instead of full path)
344
- 4. Avoid breaking filenames across lines
345
- 5. Only include function names when they add clarity
294
+ 1. For the FIRST mention of a file, use the full relative path
295
+ 2. For SUBSEQUENT mentions of the same file, use ONLY the filename without path
296
+ - Example: First mention: "utils/helpers/format.js" Subsequent mentions: "format.js"
297
+ 3. Only include the full path again if there are multiple files with the same name
298
+ 4. For repeated mentions of the same file, consider grouping related changes in one bullet
299
+ 5. Avoid breaking filenames across lines
300
+ 6. Only include function names when they add clarity
346
301
 
347
302
  COMMIT TYPES:
348
303
  - feat: New user-facing features
@@ -364,6 +319,39 @@ COMMIT TYPES:
364
319
  - ui: User interface changes
365
320
  - api: API-related changes
366
321
 
322
+ EXAMPLES:
323
+
324
+ 1. Bug fix with UI scope:
325
+ fix(ui): correct primary button focus style
326
+
327
+ - [fix] Add :focus outline to Button component (Button.jsx:Button())
328
+ - [chore] Bump Tailwind config to include ring-offset (tailwind.config.js:1-8)
329
+ - [refactor] Extract common styles into buttonStyles util (styles/buttons.js:1-15)
330
+
331
+ 2. Feature with API scope:
332
+ feat(api): add authentication endpoint for OAuth
333
+
334
+ - [feat] Implement OAuth authentication route (auth/routes.js:createOAuthRoute())
335
+ - [feat] Add token validation middleware (middleware/auth.js:validateToken())
336
+ - [test] Add integration tests for OAuth flow (tests/auth.test.js:45-87)
337
+
338
+ 3. Multiple types in one commit:
339
+ refactor(core): simplify data processing pipeline
340
+
341
+ - [refactor] Replace nested loops with map/reduce (utils/process.js:transformData())
342
+ - [perf] Optimize memory usage in large dataset handling (utils/memory.js:optimize())
343
+ - [fix] Correct edge case in null value handling (utils/validators.js:checkNull())
344
+ - [test] Update tests for new pipeline structure (tests/pipeline.test.js)
345
+
346
+ 4. Multiple changes to the same file:
347
+ refactor(core): simplify context handling for commit prompts
348
+
349
+ - [refactor] Remove process_context function (cli/modes/gitcommsg.py:69-124)
350
+ - [refactor] Update all functions to accept raw context string (gitcommsg.py:create_system_prompt())
351
+ - [refactor] Replace context_data usages with context (gitcommsg.py)
352
+ - [docs] Update library usage doc (docs/usage/library_usage.md:516,531-537)
353
+ - [chore] Bump project version to 2.15.1 (pyproject.toml:3, uv.lock:137)
354
+
367
355
  BULLET POINT FORMAT:
368
356
  - Each bullet MUST start with a type in square brackets: [type]
369
357
  - DO NOT use the format "- type: description" (without square brackets)
@@ -461,13 +449,13 @@ def handle_api_call(client, prompt, system_prompt=None, logger=None, max_retries
461
449
  # Exponential backoff
462
450
  wait_seconds *= 2
463
451
 
464
- def process_with_chunking(client, diff_content, context_data, chunk_size=200, recursive=False, logger=None, max_msg_lines=20, max_recursion_depth=3, analyses_chunk_size=None):
452
+ def process_with_chunking(client, diff_content, context, chunk_size=200, recursive=False, logger=None, max_msg_lines=20, max_recursion_depth=3, analyses_chunk_size=None):
465
453
  """Process diff with chunking to handle large diffs.
466
454
 
467
455
  Args:
468
456
  client: The NGPTClient instance
469
457
  diff_content: The diff content to process
470
- context_data: The processed context data
458
+ context: The raw context string
471
459
  chunk_size: Maximum number of lines per chunk
472
460
  recursive: Whether to use recursive chunking
473
461
  logger: Optional logger instance
@@ -483,8 +471,8 @@ def process_with_chunking(client, diff_content, context_data, chunk_size=200, re
483
471
  analyses_chunk_size = chunk_size
484
472
 
485
473
  # Create different system prompts for different stages
486
- technical_system_prompt = create_technical_analysis_system_prompt(context_data)
487
- commit_system_prompt = create_system_prompt(context_data)
474
+ technical_system_prompt = create_technical_analysis_system_prompt(context)
475
+ commit_system_prompt = create_system_prompt(context)
488
476
 
489
477
  # Log initial diff content
490
478
  if logger:
@@ -549,7 +537,7 @@ def process_with_chunking(client, diff_content, context_data, chunk_size=200, re
549
537
  return recursive_chunk_analysis(
550
538
  client,
551
539
  combined_analyses,
552
- context_data,
540
+ context,
553
541
  analyses_chunk_size,
554
542
  logger,
555
543
  max_msg_lines,
@@ -586,13 +574,13 @@ def process_with_chunking(client, diff_content, context_data, chunk_size=200, re
586
574
  logger.error(f"Error combining analyses: {str(e)}")
587
575
  return None
588
576
 
589
- def recursive_chunk_analysis(client, combined_analysis, context_data, chunk_size, logger=None, max_msg_lines=20, max_recursion_depth=3, current_depth=1):
577
+ def recursive_chunk_analysis(client, combined_analysis, context, chunk_size, logger=None, max_msg_lines=20, max_recursion_depth=3, current_depth=1):
590
578
  """Recursively chunk and process large analysis results until they're small enough.
591
579
 
592
580
  Args:
593
581
  client: The NGPTClient instance
594
582
  combined_analysis: The combined analysis to process
595
- context_data: The processed context data
583
+ context: The raw context string
596
584
  chunk_size: Maximum number of lines per chunk
597
585
  logger: Optional logger instance
598
586
  max_msg_lines: Maximum number of lines in commit message before condensing
@@ -603,8 +591,8 @@ def recursive_chunk_analysis(client, combined_analysis, context_data, chunk_size
603
591
  str: Generated commit message
604
592
  """
605
593
  # Create different system prompts for different stages
606
- technical_system_prompt = create_technical_analysis_system_prompt(context_data)
607
- commit_system_prompt = create_system_prompt(context_data)
594
+ technical_system_prompt = create_technical_analysis_system_prompt(context)
595
+ commit_system_prompt = create_system_prompt(context)
608
596
 
609
597
  print(f"\n{COLORS['cyan']}Recursive analysis chunking level {current_depth}...{COLORS['reset']}")
610
598
 
@@ -737,7 +725,7 @@ SECTION OF ANALYSIS TO CONDENSE:
737
725
  return recursive_chunk_analysis(
738
726
  client,
739
727
  combined_condensed,
740
- context_data,
728
+ context,
741
729
  chunk_size,
742
730
  logger,
743
731
  max_msg_lines,
@@ -888,6 +876,29 @@ The analyses to combine:
888
876
 
889
877
  {all_analyses}
890
878
 
879
+ RULES FOR FILENAMES:
880
+ 1. For the FIRST mention of a file, use the full relative path
881
+ 2. For SUBSEQUENT mentions of the same file, use ONLY the filename without path
882
+ - Example: First mention: "utils/helpers/format.js" → Subsequent mentions: "format.js"
883
+ 3. Only include the full path again if there are multiple files with the same name
884
+ 4. For repeated mentions of the same file, consider grouping related changes in one bullet
885
+
886
+ BULLET POINT FORMAT:
887
+ - Each bullet MUST start with a type in square brackets: [type]
888
+ - DO NOT use the format "- type: description" (without square brackets)
889
+ - Instead, ALWAYS use "- [type] description" (with square brackets)
890
+ - Example: "- [feat] Add new login component" (correct)
891
+ - Not: "- feat: Add new login component" (incorrect)
892
+
893
+ EXAMPLE OF PROPERLY FORMATTED COMMIT MESSAGE:
894
+ refactor(core): simplify context handling for commit prompts
895
+
896
+ - [refactor] Remove process_context function (cli/modes/gitcommsg.py:69-124)
897
+ - [refactor] Update all functions to accept raw context string (gitcommsg.py:create_system_prompt())
898
+ - [refactor] Replace context_data usages with context (gitcommsg.py)
899
+ - [docs] Update library usage doc (docs/usage/library_usage.md:516,531-537)
900
+ - [chore] Bump project version to 2.15.1 (pyproject.toml:3, uv.lock:137)
901
+
891
902
  REMINDER:
892
903
  - First line must be under 50 characters
893
904
  - Include a blank line after the first line
@@ -958,16 +969,16 @@ def gitcommsg_mode(client, args, logger=None):
958
969
  active_logger.log_diff("DEBUG", diff_content)
959
970
 
960
971
  # Process context if provided
961
- context_data = None
972
+ context = None
962
973
  if args.message_context:
963
- context_data = process_context(args.message_context)
974
+ context = args.message_context
964
975
  if active_logger:
965
- active_logger.debug(f"Processed context: {context_data}")
966
- active_logger.log_content("DEBUG", "CONTEXT_DATA", str(context_data))
976
+ active_logger.debug(f"Using raw context: {context}")
977
+ active_logger.log_content("DEBUG", "CONTEXT", context)
967
978
 
968
979
  # Create system prompts for different stages
969
- technical_system_prompt = create_technical_analysis_system_prompt(context_data)
970
- commit_system_prompt = create_system_prompt(context_data)
980
+ technical_system_prompt = create_technical_analysis_system_prompt(context)
981
+ commit_system_prompt = create_system_prompt(context)
971
982
 
972
983
  # Log system prompts
973
984
  if active_logger:
@@ -1006,7 +1017,7 @@ def gitcommsg_mode(client, args, logger=None):
1006
1017
  result = process_with_chunking(
1007
1018
  client,
1008
1019
  diff_content,
1009
- context_data,
1020
+ context,
1010
1021
  chunk_size=args.chunk_size,
1011
1022
  recursive=True,
1012
1023
  logger=active_logger,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ngpt
3
- Version: 2.15.0
3
+ Version: 2.15.1
4
4
  Summary: A lightweight Python CLI and library for interacting with OpenAI-compatible APIs, supporting both official and self-hosted LLM endpoints.
5
5
  Project-URL: Homepage, https://github.com/nazdridoy/ngpt
6
6
  Project-URL: Repository, https://github.com/nazdridoy/ngpt
@@ -12,7 +12,7 @@ ngpt/cli/ui.py,sha256=iMinm_QdsmwrEUpb7CBRexyyBqf4sviFI9M3E8D-hhA,5303
12
12
  ngpt/cli/modes/__init__.py,sha256=R3aO662RIzWEOvr3moTrEI8Tpg0zDDyMGGh1-OxiRgM,285
13
13
  ngpt/cli/modes/chat.py,sha256=4a5EgM_5A1zCSrLrjgQMDnBwIHd1Rnu5_BjSKSm7p24,4255
14
14
  ngpt/cli/modes/code.py,sha256=RjOAj7BDO5vLUdIPkUfPtyIkI_W6qEHsZvYh-sIdVaM,4293
15
- ngpt/cli/modes/gitcommsg.py,sha256=Fk3H07DKGW41_nySFUDd6XwtTVdpebdA1hyAm21dB1A,42835
15
+ ngpt/cli/modes/gitcommsg.py,sha256=Kx9pWGWB2bMNFhpBPAa4q7VwHmJQwnZ2qoFrWK7t3gs,45080
16
16
  ngpt/cli/modes/rewrite.py,sha256=Zb0PFvWRKXs4xJCF3GEdYc-LSmy6qRszz8-QJuldHc0,8595
17
17
  ngpt/cli/modes/shell.py,sha256=lF9f7w-0bl_FdZl-WJnZuV736BKrWQtrwoKr3ejPXFE,2682
18
18
  ngpt/cli/modes/text.py,sha256=ncYnfLFMdTPuHiOvAaHNiOWhox6GF6S-2fTwMIrAz-g,3140
@@ -20,8 +20,8 @@ ngpt/utils/__init__.py,sha256=E46suk2-QgYBI0Qrs6WXOajOUOebF3ETAFY7ah8DTWs,942
20
20
  ngpt/utils/cli_config.py,sha256=tQxR3a2iXyc5TfRBPQHSUXPInO2dv_zTPGn04eWfmoo,11285
21
21
  ngpt/utils/config.py,sha256=WYOk_b1eiYjo6hpV3pfXr2RjqhOnmKqwZwKid1T41I4,10363
22
22
  ngpt/utils/log.py,sha256=f1jg2iFo35PAmsarH8FVL_62plq4VXH0Mu2QiP6RJGw,15934
23
- ngpt-2.15.0.dist-info/METADATA,sha256=vXlC2PN84791lHaFgEPOmaRMg4j_3V2BRHSATjGlop4,23523
24
- ngpt-2.15.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
- ngpt-2.15.0.dist-info/entry_points.txt,sha256=SqAAvLhMrsEpkIr4YFRdUeyuXQ9o0IBCeYgE6AVojoI,44
26
- ngpt-2.15.0.dist-info/licenses/LICENSE,sha256=mQkpWoADxbHqE0HRefYLJdm7OpdrXBr3vNv5bZ8w72M,1065
27
- ngpt-2.15.0.dist-info/RECORD,,
23
+ ngpt-2.15.1.dist-info/METADATA,sha256=vKoeQ_IrjV2UtPpEGsThb-i8wg6OE46qXw-UDZdj9YQ,23523
24
+ ngpt-2.15.1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
25
+ ngpt-2.15.1.dist-info/entry_points.txt,sha256=SqAAvLhMrsEpkIr4YFRdUeyuXQ9o0IBCeYgE6AVojoI,44
26
+ ngpt-2.15.1.dist-info/licenses/LICENSE,sha256=mQkpWoADxbHqE0HRefYLJdm7OpdrXBr3vNv5bZ8w72M,1065
27
+ ngpt-2.15.1.dist-info/RECORD,,
File without changes