shotgun-sh 0.2.5.dev1__py3-none-any.whl → 0.2.6.dev1__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.
@@ -36,6 +36,7 @@ from textual.message import Message
36
36
  from textual.widget import Widget
37
37
 
38
38
  from shotgun.agents.common import add_system_prompt_message, add_system_status_message
39
+ from shotgun.agents.config.models import KeyProvider
39
40
  from shotgun.agents.models import AgentType, FileOperation
40
41
  from shotgun.posthog_telemetry import track_event
41
42
  from shotgun.tui.screens.chat_screen.hint_message import HintMessage
@@ -359,10 +360,18 @@ class AgentManager(Widget):
359
360
  model_name = ""
360
361
  if hasattr(deps, "llm_model") and deps.llm_model is not None:
361
362
  model_name = deps.llm_model.name
362
- is_gpt5 = ( # streaming is likely not supported for gpt5. It varies between keys.
363
- "gpt-5" in model_name.lower()
363
+
364
+ # Check if it's a Shotgun account
365
+ is_shotgun_account = (
366
+ hasattr(deps, "llm_model")
367
+ and deps.llm_model is not None
368
+ and deps.llm_model.key_provider == KeyProvider.SHOTGUN
364
369
  )
365
370
 
371
+ # Only disable streaming for GPT-5 if NOT a Shotgun account
372
+ # Shotgun accounts support streaming for GPT-5
373
+ is_gpt5_byok = "gpt-5" in model_name.lower() and not is_shotgun_account
374
+
366
375
  # Track message send event
367
376
  event_name = f"message_send_{self._current_agent_type.value}"
368
377
  track_event(
@@ -383,7 +392,9 @@ class AgentManager(Widget):
383
392
  usage_limits=usage_limits,
384
393
  message_history=message_history,
385
394
  deferred_tool_results=deferred_tool_results,
386
- event_stream_handler=self._handle_event_stream if not is_gpt5 else None,
395
+ event_stream_handler=self._handle_event_stream
396
+ if not is_gpt5_byok
397
+ else None,
387
398
  **kwargs,
388
399
  )
389
400
  finally:
@@ -20,6 +20,7 @@ Your extensive expertise spans, among other things:
20
20
  9. **Be Creative**: If the user seems not to know something, always be creative and come up with ideas that fit their thinking.
21
21
  10. Greet the user when you're just starting to work.
22
22
  11. DO NOT repeat yourself.
23
+ 12. If a user has agreed to a plan, you DO NOT NEED TO FOLLOW UP with them after every step to ask "is this search query ok?".
23
24
 
24
25
 
25
26
  ## Quality Standards
@@ -215,8 +215,18 @@ class AgentResponseWidget(Widget):
215
215
  acc = ""
216
216
  if self.item is None:
217
217
  return ""
218
+
219
+ # Check if there's an ask_user tool call
220
+ has_ask_user = any(
221
+ isinstance(part, ToolCallPart) and part.tool_name == "ask_user"
222
+ for part in self.item.parts
223
+ )
224
+
218
225
  for idx, part in enumerate(self.item.parts):
219
226
  if isinstance(part, TextPart):
227
+ # Skip ALL text parts if there's an ask_user tool call
228
+ if has_ask_user:
229
+ continue
220
230
  # Only show the circle prefix if there's actual content
221
231
  if part.content and part.content.strip():
222
232
  acc += f"**⏺** {part.content}\n\n"
@@ -224,7 +234,25 @@ class AgentResponseWidget(Widget):
224
234
  parts_str = self._format_tool_call_part(part)
225
235
  acc += parts_str + "\n\n"
226
236
  elif isinstance(part, BuiltinToolCallPart):
227
- acc += f"{part.tool_name}({part.args})\n\n"
237
+ # Format builtin tool calls better
238
+ if part.tool_name and "search" in part.tool_name.lower():
239
+ args = self._parse_args(part.args)
240
+ if isinstance(args, dict) and "query" in args:
241
+ query = self._truncate(str(args.get("query", "")))
242
+ acc += f'Searching: "{query}"\n\n'
243
+ else:
244
+ acc += f"{part.tool_name}()\n\n"
245
+ else:
246
+ # For other builtin tools, show name only or with truncated args
247
+ if part.args:
248
+ args_str = (
249
+ str(part.args)[:50] + "..."
250
+ if len(str(part.args)) > 50
251
+ else str(part.args)
252
+ )
253
+ acc += f"{part.tool_name}({args_str})\n\n"
254
+ else:
255
+ acc += f"{part.tool_name}()\n\n"
228
256
  elif isinstance(part, BuiltinToolReturnPart):
229
257
  acc += f"builtin tool ({part.tool_name}) return: {part.content}\n\n"
230
258
  elif isinstance(part, ThinkingPart):
@@ -305,12 +333,16 @@ class AgentResponseWidget(Widget):
305
333
  return f'Reading file: "{args["filename"]}"'
306
334
  return "Reading file"
307
335
 
308
- # Web search tools
309
- if part.tool_name in [
310
- "openai_web_search_tool",
311
- "anthropic_web_search_tool",
312
- "gemini_web_search_tool",
313
- ]:
336
+ # Web search tools - handle variations
337
+ if (
338
+ part.tool_name
339
+ in [
340
+ "openai_web_search_tool",
341
+ "anthropic_web_search_tool",
342
+ "gemini_web_search_tool",
343
+ ]
344
+ or "search" in part.tool_name.lower()
345
+ ): # Catch other search variations
314
346
  if "query" in args:
315
347
  query = self._truncate(str(args["query"]))
316
348
  return f'Searching web: "{query}"'
@@ -332,7 +364,24 @@ class AgentResponseWidget(Widget):
332
364
  return f"{part.tool_name}({args['name']})"
333
365
  return f"▪ {part.tool_name}()"
334
366
 
335
- return f"{part.tool_name}({part.args})"
367
+ # Default case for unrecognized tools - format args properly
368
+ args = self._parse_args(part.args)
369
+ if args and isinstance(args, dict):
370
+ # Try to extract common fields
371
+ if "query" in args:
372
+ return f'{part.tool_name}: "{self._truncate(str(args["query"]))}"'
373
+ elif "question" in args:
374
+ return f'{part.tool_name}: "{self._truncate(str(args["question"]))}"'
375
+ else:
376
+ # Show tool name with truncated args
377
+ args_str = (
378
+ str(part.args)[:50] + "..."
379
+ if len(str(part.args)) > 50
380
+ else str(part.args)
381
+ )
382
+ return f"{part.tool_name}({args_str})"
383
+ else:
384
+ return f"{part.tool_name}()"
336
385
 
337
386
  def _format_ask_user_part(
338
387
  self,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: shotgun-sh
3
- Version: 0.2.5.dev1
3
+ Version: 0.2.6.dev1
4
4
  Summary: AI-powered research, planning, and task management CLI tool
5
5
  Project-URL: Homepage, https://shotgun.sh/
6
6
  Project-URL: Repository, https://github.com/shotgun-sh/shotgun
@@ -8,7 +8,7 @@ shotgun/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  shotgun/sentry_telemetry.py,sha256=VD8es-tREfgtRKhDsEVvqpo0_kM_ab6iVm2lkOEmTlI,2950
9
9
  shotgun/telemetry.py,sha256=WfxdHALh5_51nw783ZZvD-LEyC6ypHxSUTMXUioZhTQ,3339
10
10
  shotgun/agents/__init__.py,sha256=8Jzv1YsDuLyNPFJyckSr_qI4ehTVeDyIMDW4omsfPGc,25
11
- shotgun/agents/agent_manager.py,sha256=xq8L0oAFgtFCpKVsyUoMtYJqUyz5XxjWLKNnxoe1zo4,26577
11
+ shotgun/agents/agent_manager.py,sha256=s3-pP-Y5nXDf-W08nG7FXSB9m8as_aB2I6OWf3SFhvE,26961
12
12
  shotgun/agents/common.py,sha256=BINebrcS9BcHu7yDH2yxTjChCmQoUCUrmUMlRnz4_JY,19265
13
13
  shotgun/agents/conversation_history.py,sha256=5J8_1yxdZiiWTq22aDio88DkBDZ4_Lh_p5Iy5_ENszc,3898
14
14
  shotgun/agents/conversation_manager.py,sha256=fxAvXbEl3Cl2ugJ4N9aWXaqZtkrnfj3QzwjWC4LFXwI,3514
@@ -94,7 +94,7 @@ shotgun/prompts/agents/research.j2,sha256=JBtjXaMVDRuNTt7-Ai8gUb2InfolfqCkQoEkn9
94
94
  shotgun/prompts/agents/specify.j2,sha256=AP7XrA3KE7GZsCvW4guASxZHBM2mnrMw3irdZ3RUOBs,2808
95
95
  shotgun/prompts/agents/tasks.j2,sha256=9gGCimCWVvpaQSxkAjt7WmIxFHXJY2FlmqhqomFxQTA,5949
96
96
  shotgun/prompts/agents/partials/codebase_understanding.j2,sha256=7WH-PVd-TRBFQUdOdKkwwn9hAUaJznFZMAGHhO7IGGU,5633
97
- shotgun/prompts/agents/partials/common_agent_system_prompt.j2,sha256=eFuc3z1pSJzQtPJfjMIDNHv5XX9lP6YVrmKcbbskJj8,1877
97
+ shotgun/prompts/agents/partials/common_agent_system_prompt.j2,sha256=rFiPyIc4y1liZPc1SlWvjHLPpaNwyUC0_l7wMZswvVU,2004
98
98
  shotgun/prompts/agents/partials/content_formatting.j2,sha256=MG0JB7SSp8YV5akDWpbs2f9DcdREIYqLp38NnoWLeQ0,1854
99
99
  shotgun/prompts/agents/partials/interactive_mode.j2,sha256=9sYPbyc46HXg3k1FT_LugIQvOyNDnMQwsMIgOgN-_aY,1100
100
100
  shotgun/prompts/agents/state/system_state.j2,sha256=RPweqBYmgWMiDuOjdEDl6NLgYU7HMaUGW1jBSnD5UzQ,1270
@@ -140,7 +140,7 @@ shotgun/tui/screens/welcome.py,sha256=r-RjtzjMhAaA0XKgnYKdZOuE07bcBi223fleKEf-Fa
140
140
  shotgun/tui/screens/chat_screen/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
141
  shotgun/tui/screens/chat_screen/command_providers.py,sha256=7Xnxd4k30bpLOMZSX32bcugU4IgpqU4Y8f6eHWKXd4o,12694
142
142
  shotgun/tui/screens/chat_screen/hint_message.py,sha256=WOpbk8q7qt7eOHTyyHvh_IQIaublVDeJGaLpsxEk9FA,933
143
- shotgun/tui/screens/chat_screen/history.py,sha256=Go859iEjw0s5aELKpF42MjLXy7UFQ52XnJMTIkV3aLo,12406
143
+ shotgun/tui/screens/chat_screen/history.py,sha256=8rcFrBaCUbDQLNAQXoGXa5dp9AsrvuQMClGcnDaCa5c,14570
144
144
  shotgun/tui/utils/__init__.py,sha256=cFjDfoXTRBq29wgP7TGRWUu1eFfiIG-LLOzjIGfadgI,150
145
145
  shotgun/tui/utils/mode_progress.py,sha256=lseRRo7kMWLkBzI3cU5vqJmS2ZcCjyRYf9Zwtvc-v58,10931
146
146
  shotgun/utils/__init__.py,sha256=WinIEp9oL2iMrWaDkXz2QX4nYVPAm8C9aBSKTeEwLtE,198
@@ -149,8 +149,8 @@ shotgun/utils/env_utils.py,sha256=ulM3BRi9ZhS7uC-zorGeDQm4SHvsyFuuU9BtVPqdrHY,14
149
149
  shotgun/utils/file_system_utils.py,sha256=l-0p1bEHF34OU19MahnRFdClHufThfGAjQ431teAIp0,1004
150
150
  shotgun/utils/source_detection.py,sha256=Co6Q03R3fT771TF3RzB-70stfjNP2S4F_ArZKibwzm8,454
151
151
  shotgun/utils/update_checker.py,sha256=IgzPHRhS1ETH7PnJR_dIx6lxgr1qHpCkMTgzUxvGjhI,7586
152
- shotgun_sh-0.2.5.dev1.dist-info/METADATA,sha256=a7NtlC-7j0n4tJwtUOF49DcSZ4qWCL9IxV9GvsOLoFQ,11226
153
- shotgun_sh-0.2.5.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
154
- shotgun_sh-0.2.5.dev1.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
155
- shotgun_sh-0.2.5.dev1.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
156
- shotgun_sh-0.2.5.dev1.dist-info/RECORD,,
152
+ shotgun_sh-0.2.6.dev1.dist-info/METADATA,sha256=t0ADfddOFIsc7uBZHGy-qBO6fO377vx2W_S-GdpZRXg,11226
153
+ shotgun_sh-0.2.6.dev1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
154
+ shotgun_sh-0.2.6.dev1.dist-info/entry_points.txt,sha256=asZxLU4QILneq0MWW10saVCZc4VWhZfb0wFZvERnzfA,45
155
+ shotgun_sh-0.2.6.dev1.dist-info/licenses/LICENSE,sha256=YebsZl590zCHrF_acCU5pmNt0pnAfD2DmAnevJPB1tY,1065
156
+ shotgun_sh-0.2.6.dev1.dist-info/RECORD,,