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 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
- global_group.add_argument('--no-stream', action='store_true',
83
- help='Return the whole response without streaming')
84
- global_group.add_argument('--prettify', action='store_const', const='auto',
85
- help='Render markdown responses and code with syntax highlighting and formatting')
86
- global_group.add_argument('--stream-prettify', action='store_true',
87
- help='Enable streaming with markdown rendering (automatically uses Rich renderer)')
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
- # Check if --prettify is used with --stream-prettify (conflict)
138
- if args.prettify and args.stream_prettify:
139
- raise ValueError("--prettify and --stream-prettify cannot be used together. Choose one option.")
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": False, "context": ["all"], "exclusive": ["no-stream", "prettify"]},
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): print(f"INFO: {msg}", file=sys.stderr)
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): print(f"WARNING: {msg}", file=sys.stderr)
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 += "> [0] https://example.com/date\n"
259
+ formatted_text += "> [1] https://example.com/date\n"
260
260
  formatted_text += ">\n"
261
- formatted_text += "> [1] https://weather.com/forecast\n"
261
+ formatted_text += "> [2] https://weather.com/forecast\n"
262
262
  formatted_text += ">\n"
263
- formatted_text += "> [2] https://www.timeanddate.com\n\n"
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
- formatted_results = format_web_search_results_for_prompt(search_results)
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 = formatted_results + 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.0
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=7ixh5anahTeHWsrEKwhaLA_dR3sJ-ZzO8NyGOeDmd3Q,11392
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=4TpIV-EkyXb8d3XJKrsLs9Wxq5P9jC82z94PI2Zck_g,6730
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=fxE9LEEo4arSn5-q_6zxdnUH7RlqifWmk-_kcA76OhM,4070
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=IlHnOEEGpLoGZInynM778wgpxLVcJ_STKWxg2Ypvir4,11196
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=xHfAymkVkx5b7rOITee2smxpH7waRUpaX8aqTf5WBeA,11599
24
- ngpt-3.4.0.dist-info/METADATA,sha256=1xkrTK7mKFEVilhnLdkNqsRmuczpphjRCgSD8t89Gp8,29100
25
- ngpt-3.4.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
26
- ngpt-3.4.0.dist-info/entry_points.txt,sha256=SqAAvLhMrsEpkIr4YFRdUeyuXQ9o0IBCeYgE6AVojoI,44
27
- ngpt-3.4.0.dist-info/licenses/LICENSE,sha256=mQkpWoADxbHqE0HRefYLJdm7OpdrXBr3vNv5bZ8w72M,1065
28
- ngpt-3.4.0.dist-info/RECORD,,
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