ngpt 3.4.0__py3-none-any.whl → 3.4.2__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.
- ngpt/cli/args.py +35 -10
- ngpt/cli/modes/code.py +1 -1
- ngpt/cli/modes/shell.py +1 -1
- ngpt/utils/cli_config.py +1 -1
- ngpt/utils/web_search.py +28 -9
- {ngpt-3.4.0.dist-info → ngpt-3.4.2.dist-info}/METADATA +1 -1
- {ngpt-3.4.0.dist-info → ngpt-3.4.2.dist-info}/RECORD +10 -10
- {ngpt-3.4.0.dist-info → ngpt-3.4.2.dist-info}/WHEEL +0 -0
- {ngpt-3.4.0.dist-info → ngpt-3.4.2.dist-info}/entry_points.txt +0 -0
- {ngpt-3.4.0.dist-info → ngpt-3.4.2.dist-info}/licenses/LICENSE +0 -0
ngpt/cli/args.py
CHANGED
@@ -79,14 +79,19 @@ def setup_argument_parser():
|
|
79
79
|
help='Set filepath to log conversation to, or create a temporary log file if no path provided')
|
80
80
|
global_group.add_argument('--preprompt',
|
81
81
|
help='Set custom system prompt to control AI behavior')
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
help='
|
82
|
+
|
83
|
+
# Output display options (mutually exclusive group)
|
84
|
+
output_group = parser.add_argument_group('Output Display Options (mutually exclusive)')
|
85
|
+
output_exclusive_group = output_group.add_mutually_exclusive_group()
|
86
|
+
output_exclusive_group.add_argument('--no-stream', action='store_true',
|
87
|
+
help='Return the whole response without streaming or formatting')
|
88
|
+
output_exclusive_group.add_argument('--prettify', action='store_const', const='auto',
|
89
|
+
help='Render complete response with markdown and code formatting (non-streaming)')
|
90
|
+
output_exclusive_group.add_argument('--stream-prettify', action='store_true', default=True,
|
91
|
+
help='Stream response with real-time markdown rendering (default)')
|
92
|
+
|
88
93
|
global_group.add_argument('--renderer', choices=['auto', 'rich', 'glow'], default='auto',
|
89
|
-
help='Select which markdown renderer to use with --prettify (auto, rich, or glow)')
|
94
|
+
help='Select which markdown renderer to use with --prettify or --stream-prettify (auto, rich, or glow)')
|
90
95
|
|
91
96
|
# GitCommit message options
|
92
97
|
gitcommsg_group = parser.add_argument_group('Git Commit Message Options')
|
@@ -134,9 +139,29 @@ def validate_args(args):
|
|
134
139
|
if args.all and not args.show_config:
|
135
140
|
raise ValueError("--all can only be used with --show-config")
|
136
141
|
|
137
|
-
#
|
138
|
-
|
139
|
-
|
142
|
+
# These three options are mutually exclusive rendering modes
|
143
|
+
provided_modes = []
|
144
|
+
if '--no-stream' in sys.argv:
|
145
|
+
provided_modes.append('--no-stream')
|
146
|
+
if '--prettify' in sys.argv:
|
147
|
+
provided_modes.append('--prettify')
|
148
|
+
if '--stream-prettify' in sys.argv:
|
149
|
+
provided_modes.append('--stream-prettify')
|
150
|
+
|
151
|
+
# If more than one rendering mode explicitly provided, raise error
|
152
|
+
if len(provided_modes) > 1:
|
153
|
+
raise ValueError(f"The options {', '.join(provided_modes)} cannot be used together. These options are mutually exclusive.")
|
154
|
+
|
155
|
+
# Handle the conflict between default stream-prettify and explicitly provided options
|
156
|
+
if args.no_stream:
|
157
|
+
args.stream_prettify = False
|
158
|
+
args.prettify = False
|
159
|
+
elif args.prettify:
|
160
|
+
args.stream_prettify = False
|
161
|
+
args.no_stream = False
|
162
|
+
elif args.stream_prettify:
|
163
|
+
args.no_stream = False
|
164
|
+
args.prettify = False
|
140
165
|
|
141
166
|
# Check if --stream-prettify is used but Rich is not available
|
142
167
|
if args.stream_prettify and not has_markdown_renderer('rich'):
|
ngpt/cli/modes/code.py
CHANGED
@@ -31,7 +31,7 @@ def code_mode(client, args, logger=None):
|
|
31
31
|
if args.web_search:
|
32
32
|
try:
|
33
33
|
original_prompt = prompt
|
34
|
-
prompt = enhance_prompt_with_web_search(prompt, logger=logger)
|
34
|
+
prompt = enhance_prompt_with_web_search(prompt, logger=logger, disable_citations=True)
|
35
35
|
print("Enhanced input with web search results.")
|
36
36
|
|
37
37
|
# Log the enhanced prompt if logging is enabled
|
ngpt/cli/modes/shell.py
CHANGED
@@ -31,7 +31,7 @@ def shell_mode(client, args, logger=None):
|
|
31
31
|
if args.web_search:
|
32
32
|
try:
|
33
33
|
original_prompt = prompt
|
34
|
-
prompt = enhance_prompt_with_web_search(prompt, logger=logger)
|
34
|
+
prompt = enhance_prompt_with_web_search(prompt, logger=logger, disable_citations=True)
|
35
35
|
print("Enhanced input with web search results.")
|
36
36
|
|
37
37
|
# Log the enhanced prompt if logging is enabled
|
ngpt/utils/cli_config.py
CHANGED
@@ -15,7 +15,7 @@ CLI_CONFIG_OPTIONS = {
|
|
15
15
|
"preprompt": {"type": "str", "default": None, "context": ["all"]},
|
16
16
|
"no-stream": {"type": "bool", "default": False, "context": ["all"], "exclusive": ["prettify", "stream-prettify"]},
|
17
17
|
"prettify": {"type": "bool", "default": False, "context": ["all"], "exclusive": ["no-stream", "stream-prettify"]},
|
18
|
-
"stream-prettify": {"type": "bool", "default":
|
18
|
+
"stream-prettify": {"type": "bool", "default": True, "context": ["all"], "exclusive": ["no-stream", "prettify"]},
|
19
19
|
"renderer": {"type": "str", "default": "auto", "context": ["all"]},
|
20
20
|
"config-index": {"type": "int", "default": 0, "context": ["all"], "exclusive": ["provider"]},
|
21
21
|
"web-search": {"type": "bool", "default": False, "context": ["all"]},
|
ngpt/utils/web_search.py
CHANGED
@@ -29,11 +29,11 @@ def get_logger():
|
|
29
29
|
if _logger is not None:
|
30
30
|
return _logger
|
31
31
|
else:
|
32
|
-
# Default logging to stderr if no logger provided
|
32
|
+
# Default logging to stderr if no logger provided, but only for errors
|
33
33
|
class DefaultLogger:
|
34
|
-
def info(self, msg):
|
34
|
+
def info(self, msg): pass # Suppress INFO messages
|
35
35
|
def error(self, msg): print(f"ERROR: {msg}", file=sys.stderr)
|
36
|
-
def warning(self, msg):
|
36
|
+
def warning(self, msg): pass # Suppress WARNING messages
|
37
37
|
def debug(self, msg): pass
|
38
38
|
return DefaultLogger()
|
39
39
|
|
@@ -256,15 +256,15 @@ def format_web_search_results_for_prompt(search_results: Dict[str, Any]) -> str:
|
|
256
256
|
formatted_text += "Example citation format in text:\n"
|
257
257
|
formatted_text += "Today is Thursday [1] and it's expected to rain tomorrow [2].\n\n"
|
258
258
|
formatted_text += "Example reference format (YOU MUST FOLLOW THIS EXACT FORMAT WITH EMPTY LINES BETWEEN REFERENCES):\n"
|
259
|
-
formatted_text += "> [
|
259
|
+
formatted_text += "> [1] https://example.com/date\n"
|
260
260
|
formatted_text += ">\n"
|
261
|
-
formatted_text += "> [
|
261
|
+
formatted_text += "> [2] https://weather.com/forecast\n"
|
262
262
|
formatted_text += ">\n"
|
263
|
-
formatted_text += "> [
|
263
|
+
formatted_text += "> [3] https://www.timeanddate.com\n\n"
|
264
264
|
|
265
265
|
return formatted_text
|
266
266
|
|
267
|
-
def enhance_prompt_with_web_search(prompt: str, max_results: int = 5, logger=None) -> str:
|
267
|
+
def enhance_prompt_with_web_search(prompt: str, max_results: int = 5, logger=None, disable_citations: bool = False) -> str:
|
268
268
|
"""
|
269
269
|
Enhance a prompt with web search results.
|
270
270
|
|
@@ -272,6 +272,7 @@ def enhance_prompt_with_web_search(prompt: str, max_results: int = 5, logger=Non
|
|
272
272
|
prompt: The original user prompt
|
273
273
|
max_results: Maximum number of search results to include
|
274
274
|
logger: Optional logger to use
|
275
|
+
disable_citations: If True, disables citation instructions (used for code and shell modes)
|
275
276
|
|
276
277
|
Returns:
|
277
278
|
Enhanced prompt with web search results prepended
|
@@ -282,10 +283,28 @@ def enhance_prompt_with_web_search(prompt: str, max_results: int = 5, logger=Non
|
|
282
283
|
|
283
284
|
logger = get_logger()
|
284
285
|
search_results = get_web_search_results(prompt, max_results)
|
285
|
-
|
286
|
+
|
287
|
+
if disable_citations:
|
288
|
+
# Modified version without citation instructions for code/shell modes
|
289
|
+
query = search_results['query']
|
290
|
+
results = search_results['results']
|
291
|
+
timestamp = search_results['timestamp']
|
292
|
+
|
293
|
+
formatted_text = f"[Web Search Results for: {query} (searched at {timestamp})]\n\n"
|
294
|
+
|
295
|
+
for i, result in enumerate(results, 1):
|
296
|
+
formatted_text += f"RESULT {i}: {result['title']}\n"
|
297
|
+
formatted_text += f"URL: {result['url']}\n"
|
298
|
+
formatted_text += f"CONTENT:\n{result['content']}\n\n"
|
299
|
+
|
300
|
+
formatted_text += f"[End of Web Search Results]\n\n"
|
301
|
+
formatted_text += "Use the above web search information to help you, but do not include citations or references in your response.\n\n"
|
302
|
+
else:
|
303
|
+
# Standard version with citation instructions
|
304
|
+
formatted_text = format_web_search_results_for_prompt(search_results)
|
286
305
|
|
287
306
|
# Combine results with original prompt
|
288
|
-
enhanced_prompt =
|
307
|
+
enhanced_prompt = formatted_text + prompt
|
289
308
|
|
290
309
|
logger.info("Enhanced input with web search results")
|
291
310
|
return enhanced_prompt
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ngpt
|
3
|
-
Version: 3.4.
|
3
|
+
Version: 3.4.2
|
4
4
|
Summary: Swiss army knife for LLMs: powerful CLI, interactive chatbot, and flexible Python library. Works with OpenAI, Ollama, Groq, Claude, Gemini, and any OpenAI-compatible API.
|
5
5
|
Project-URL: Homepage, https://github.com/nazdridoy/ngpt
|
6
6
|
Project-URL: Repository, https://github.com/nazdridoy/ngpt
|
@@ -2,7 +2,7 @@ ngpt/__init__.py,sha256=kpKhViLakwMdHZkuLht2vWcjt0uD_5gR33gvMhfXr6w,664
|
|
2
2
|
ngpt/__main__.py,sha256=j3eFYPOtCCFBOGh7NK5IWEnADnTMMSEB9GLyIDoW724,66
|
3
3
|
ngpt/client.py,sha256=1kn-kVQ2ZYhOlQ5OPM9c_btVKajfk1qb52QbMyGdYtU,14645
|
4
4
|
ngpt/cli/__init__.py,sha256=hebbDSMGiOd43YNnQP67uzr67Ue6rZPwm2czynr5iZY,43
|
5
|
-
ngpt/cli/args.py,sha256=
|
5
|
+
ngpt/cli/args.py,sha256=4Yeik1kAb2nEOjiGYauf9Rg7wQ5NHFJWAS350D6a_zo,12411
|
6
6
|
ngpt/cli/config_manager.py,sha256=NQQcWnjUppAAd0s0p9YAf8EyKS1ex5-0EB4DvKdB4dk,3662
|
7
7
|
ngpt/cli/formatters.py,sha256=HBYGlx_7eoAKyzfy0Vq5L0yn8yVKjngqYBukMmXCcz0,9401
|
8
8
|
ngpt/cli/interactive.py,sha256=6SrnANvE5T9Luu-CSGPfW7lub4-yog9aqruAfs1XEIg,16392
|
@@ -11,18 +11,18 @@ ngpt/cli/renderers.py,sha256=m71BeUXKynpKKGXFzwRSW1XngvyKiZ_xEsdujUbU0MA,16597
|
|
11
11
|
ngpt/cli/ui.py,sha256=HoHDFpLiwMBP5wtMb8YYo244FMiqiPFRoBNcNGp6N0A,7310
|
12
12
|
ngpt/cli/modes/__init__.py,sha256=R3aO662RIzWEOvr3moTrEI8Tpg0zDDyMGGh1-OxiRgM,285
|
13
13
|
ngpt/cli/modes/chat.py,sha256=UlnZWqvxL_CSyVIDZKGVXNlG-KufDfo05E8-8xTcM_Y,6713
|
14
|
-
ngpt/cli/modes/code.py,sha256=
|
14
|
+
ngpt/cli/modes/code.py,sha256=Pdyfde_elIyZKp-pcArkRfWMJcucpBCwY2bVAMk5nzc,6754
|
15
15
|
ngpt/cli/modes/gitcommsg.py,sha256=rsfMoeOupmNp-5p5fsMSPAf18BbzXWq-4PF2HjEz6SY,46991
|
16
16
|
ngpt/cli/modes/rewrite.py,sha256=ftD-6M9iQ7g4rLdlKyyLTRiJWYtbz64LIG4PIByxmOk,11472
|
17
|
-
ngpt/cli/modes/shell.py,sha256=
|
17
|
+
ngpt/cli/modes/shell.py,sha256=KPhIfB-fCtyJLa4PJC9ztoKLaRtkNolAAo5-fuGh-eM,4094
|
18
18
|
ngpt/cli/modes/text.py,sha256=gdn4opioZ6G3nvfrTkp-dpoD-Of_ZvjVVRggVd6edkg,5528
|
19
19
|
ngpt/utils/__init__.py,sha256=qu_66I1Vtav2f1LDiPn5J3DUsbK7o1CSScMcTkYqxoM,1179
|
20
|
-
ngpt/utils/cli_config.py,sha256=
|
20
|
+
ngpt/utils/cli_config.py,sha256=Ug8cECBTIuzOwkBWidLTfs-OAdOsCMJ2bNa70pOADfw,11195
|
21
21
|
ngpt/utils/config.py,sha256=wsArA4osnh8fKqOvtsPqqBxAz3DpdjtaWUFaRtnUdyc,10452
|
22
22
|
ngpt/utils/log.py,sha256=f1jg2iFo35PAmsarH8FVL_62plq4VXH0Mu2QiP6RJGw,15934
|
23
|
-
ngpt/utils/web_search.py,sha256=
|
24
|
-
ngpt-3.4.
|
25
|
-
ngpt-3.4.
|
26
|
-
ngpt-3.4.
|
27
|
-
ngpt-3.4.
|
28
|
-
ngpt-3.4.
|
23
|
+
ngpt/utils/web_search.py,sha256=yvCUDNhwcIcKZ_hWESFQQ-vB-LKsDDCDT17YFzFcGR4,12598
|
24
|
+
ngpt-3.4.2.dist-info/METADATA,sha256=2ulru5egoGUkDG3bHm-gUYD7-wpj-ogt12J9fcBfoCM,29100
|
25
|
+
ngpt-3.4.2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
26
|
+
ngpt-3.4.2.dist-info/entry_points.txt,sha256=SqAAvLhMrsEpkIr4YFRdUeyuXQ9o0IBCeYgE6AVojoI,44
|
27
|
+
ngpt-3.4.2.dist-info/licenses/LICENSE,sha256=mQkpWoADxbHqE0HRefYLJdm7OpdrXBr3vNv5bZ8w72M,1065
|
28
|
+
ngpt-3.4.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|