fast-agent-mcp 0.3.12__py3-none-any.whl → 0.3.14__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.

Potentially problematic release.


This version of fast-agent-mcp might be problematic. Click here for more details.

Files changed (35) hide show
  1. fast_agent/agents/llm_agent.py +15 -34
  2. fast_agent/agents/llm_decorator.py +13 -2
  3. fast_agent/agents/mcp_agent.py +18 -2
  4. fast_agent/agents/tool_agent.py +8 -10
  5. fast_agent/cli/commands/check_config.py +45 -1
  6. fast_agent/config.py +63 -0
  7. fast_agent/constants.py +3 -0
  8. fast_agent/context.py +42 -9
  9. fast_agent/core/logging/listeners.py +1 -1
  10. fast_agent/event_progress.py +2 -3
  11. fast_agent/interfaces.py +9 -2
  12. fast_agent/llm/model_factory.py +4 -0
  13. fast_agent/llm/provider/google/google_converter.py +10 -3
  14. fast_agent/llm/provider_key_manager.py +1 -0
  15. fast_agent/llm/provider_types.py +1 -0
  16. fast_agent/llm/request_params.py +3 -1
  17. fast_agent/mcp/mcp_agent_client_session.py +13 -0
  18. fast_agent/mcp/mcp_aggregator.py +313 -40
  19. fast_agent/mcp/mcp_connection_manager.py +95 -22
  20. fast_agent/mcp/skybridge.py +45 -0
  21. fast_agent/mcp/sse_tracking.py +287 -0
  22. fast_agent/mcp/transport_tracking.py +37 -3
  23. fast_agent/mcp/types.py +24 -0
  24. fast_agent/resources/examples/workflows/router.py +1 -0
  25. fast_agent/resources/setup/fastagent.config.yaml +5 -0
  26. fast_agent/ui/console_display.py +347 -20
  27. fast_agent/ui/enhanced_prompt.py +107 -58
  28. fast_agent/ui/interactive_prompt.py +57 -34
  29. fast_agent/ui/mcp_display.py +159 -41
  30. fast_agent/ui/rich_progress.py +4 -1
  31. {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/METADATA +16 -7
  32. {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/RECORD +35 -32
  33. {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/WHEEL +0 -0
  34. {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/entry_points.txt +0 -0
  35. {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/licenses/LICENSE +0 -0
@@ -39,6 +39,7 @@ class Colours:
39
39
  # Capability token states
40
40
  TOKEN_ERROR = "bright_red"
41
41
  TOKEN_WARNING = "bright_cyan"
42
+ TOKEN_CAUTION = "bright_yellow"
42
43
  TOKEN_DISABLED = "dim"
43
44
  TOKEN_HIGHLIGHTED = "bright_yellow"
44
45
  TOKEN_ENABLED = "bright_green"
@@ -54,6 +55,17 @@ class Colours:
54
55
  TEXT_CYAN = "cyan"
55
56
 
56
57
 
58
+ # Symbol definitions for timelines and legends
59
+ SYMBOL_IDLE = "·"
60
+ SYMBOL_ERROR = "●"
61
+ SYMBOL_RESPONSE = "▼"
62
+ SYMBOL_NOTIFICATION = "●"
63
+ SYMBOL_REQUEST = "◆"
64
+ SYMBOL_STDIO_ACTIVITY = "●"
65
+ SYMBOL_PING = "●"
66
+ SYMBOL_DISABLED = "▽"
67
+
68
+
57
69
  # Color mappings for different contexts
58
70
  TIMELINE_COLORS = {
59
71
  "error": Colours.ERROR,
@@ -93,6 +105,38 @@ def _format_compact_duration(seconds: float | None) -> str | None:
93
105
  return f"{days}d{hours:02d}h"
94
106
 
95
107
 
108
+ def _format_timeline_label(total_seconds: int) -> str:
109
+ total = max(0, int(total_seconds))
110
+ if total == 0:
111
+ return "0s"
112
+
113
+ days, remainder = divmod(total, 86400)
114
+ if days:
115
+ if remainder == 0:
116
+ return f"{days}d"
117
+ hours = remainder // 3600
118
+ if hours == 0:
119
+ return f"{days}d"
120
+ return f"{days}d{hours}h"
121
+
122
+ hours, remainder = divmod(total, 3600)
123
+ if hours:
124
+ if remainder == 0:
125
+ return f"{hours}h"
126
+ minutes = remainder // 60
127
+ if minutes == 0:
128
+ return f"{hours}h"
129
+ return f"{hours}h{minutes:02d}m"
130
+
131
+ minutes, seconds = divmod(total, 60)
132
+ if minutes:
133
+ if seconds == 0:
134
+ return f"{minutes}m"
135
+ return f"{minutes}m{seconds:02d}s"
136
+
137
+ return f"{seconds}s"
138
+
139
+
96
140
  def _summarise_call_counts(call_counts: dict[str, int]) -> str | None:
97
141
  if not call_counts:
98
142
  return None
@@ -189,6 +233,18 @@ def _format_capability_shorthand(
189
233
  else:
190
234
  entries.append(("In", "blue", False))
191
235
 
236
+ skybridge_config = getattr(status, "skybridge", None)
237
+ if not skybridge_config:
238
+ entries.append(("Sk", False, False))
239
+ else:
240
+ has_warnings = bool(getattr(skybridge_config, "warnings", None))
241
+ if has_warnings:
242
+ entries.append(("Sk", "warn", False))
243
+ elif getattr(skybridge_config, "enabled", False):
244
+ entries.append(("Sk", True, False))
245
+ else:
246
+ entries.append(("Sk", False, False))
247
+
192
248
  if status.roots_configured:
193
249
  entries.append(("Ro", True, False))
194
250
  else:
@@ -217,6 +273,8 @@ def _format_capability_shorthand(
217
273
  return Colours.TOKEN_ERROR
218
274
  if supported == "blue":
219
275
  return Colours.TOKEN_WARNING
276
+ if supported == "warn":
277
+ return Colours.TOKEN_CAUTION
220
278
  if not supported:
221
279
  return Colours.TOKEN_DISABLED
222
280
  if highlighted:
@@ -257,17 +315,43 @@ def _format_label(label: str, width: int = 10) -> str:
257
315
  return f"{label:<{width}}" if len(label) < width else label
258
316
 
259
317
 
260
- def _build_inline_timeline(buckets: Iterable[str]) -> str:
318
+ def _build_inline_timeline(
319
+ buckets: Iterable[str],
320
+ *,
321
+ bucket_seconds: int | None = None,
322
+ bucket_count: int | None = None,
323
+ ) -> str:
261
324
  """Build a compact timeline string for inline display."""
262
- timeline = " [dim]10m[/dim] "
263
- for state in buckets:
325
+ bucket_list = list(buckets)
326
+ count = bucket_count or len(bucket_list)
327
+ if count <= 0:
328
+ count = len(bucket_list) or 1
329
+
330
+ seconds = bucket_seconds or 30
331
+ total_window = seconds * count
332
+ timeline = f" [dim]{_format_timeline_label(total_window)}[/dim] "
333
+
334
+ if len(bucket_list) < count:
335
+ bucket_list.extend(["none"] * (count - len(bucket_list)))
336
+ elif len(bucket_list) > count:
337
+ bucket_list = bucket_list[-count:]
338
+
339
+ for state in bucket_list:
264
340
  color = TIMELINE_COLORS.get(state, Colours.NONE)
265
341
  if state in {"idle", "none"}:
266
- symbol = "·"
342
+ symbol = SYMBOL_IDLE
267
343
  elif state == "request":
268
- symbol = "◆" # Diamond for requests - rare and important
344
+ symbol = SYMBOL_REQUEST
345
+ elif state == "notification":
346
+ symbol = SYMBOL_NOTIFICATION
347
+ elif state == "error":
348
+ symbol = SYMBOL_ERROR
349
+ elif state == "ping":
350
+ symbol = SYMBOL_PING
351
+ elif state == "disabled":
352
+ symbol = SYMBOL_DISABLED
269
353
  else:
270
- symbol = "●" # Circle for other activity
354
+ symbol = SYMBOL_RESPONSE
271
355
  timeline += f"[bold {color}]{symbol}[/bold {color}]"
272
356
  timeline += " [dim]now[/dim]"
273
357
  return timeline
@@ -278,6 +362,10 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
278
362
  if snapshot is None:
279
363
  return
280
364
 
365
+ transport_value = getattr(status, "transport", None)
366
+ transport_lower = (transport_value or "").lower()
367
+ is_sse_transport = transport_lower == "sse"
368
+
281
369
  # Show channel types based on what's available
282
370
  entries: list[tuple[str, str, ChannelSnapshot | None]] = []
283
371
 
@@ -292,12 +380,13 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
292
380
  stdio_channel = getattr(snapshot, "stdio", None)
293
381
 
294
382
  if any(channel is not None for channel in http_channels):
295
- # HTTP transport - show the original three channels
383
+ # HTTP or SSE transport - show available channels
296
384
  entries = [
297
385
  ("GET (SSE)", "◀", getattr(snapshot, "get", None)),
298
386
  ("POST (SSE)", "▶", getattr(snapshot, "post_sse", None)),
299
- ("POST (JSON)", "▶", getattr(snapshot, "post_json", None)),
300
387
  ]
388
+ if not is_sse_transport:
389
+ entries.append(("POST (JSON)", "▶", getattr(snapshot, "post_json", None)))
301
390
  elif stdio_channel is not None:
302
391
  # STDIO transport - show single bidirectional channel
303
392
  entries = [
@@ -313,36 +402,31 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
313
402
  # Determine if we're showing stdio or HTTP channels
314
403
  is_stdio = stdio_channel is not None
315
404
 
405
+ default_bucket_seconds = getattr(snapshot, "activity_bucket_seconds", None) or 30
406
+ default_bucket_count = getattr(snapshot, "activity_bucket_count", None) or 20
407
+ timeline_header_label = _format_timeline_label(default_bucket_seconds * default_bucket_count)
408
+
409
+ # Total characters before the metrics section in each row (excluding indent)
410
+ # Structure: "│ " + arrow + " " + label(13) + timeline_label + " " + buckets + " now"
411
+ metrics_prefix_width = 22 + len(timeline_header_label) + default_bucket_count
412
+
316
413
  # Get transport type for display
317
- transport = getattr(status, "transport", None) or "unknown"
414
+ transport = transport_value or "unknown"
318
415
  transport_display = transport.upper() if transport != "unknown" else "Channels"
319
416
 
320
417
  # Header with column labels
321
418
  header = Text(indent)
322
- header.append(f"┌ {transport_display} ", style="dim")
419
+ header_intro = f"┌ {transport_display} "
420
+ header.append(header_intro, style="dim")
323
421
 
324
422
  # Calculate padding needed based on transport display length
325
- # Base structure: "┌ " (2) + transport_display + " " (1) + "─" padding to align with columns
326
- header_prefix_len = 3 + len(transport_display)
423
+ header_prefix_len = len(header_intro)
327
424
 
425
+ dash_count = max(1, metrics_prefix_width - header_prefix_len + 2)
328
426
  if is_stdio:
329
- # Simplified header for stdio: just activity column
330
- # Need to align with "│ ⇄ STDIO 10m ●●●●●●●●●●●●●●●●●●●● now 29"
331
- # That's: "│ " + arrow + " " + label(13) + "10m " + dots(20) + " now" = 47 chars
332
- # Then: " " + activity(8) = 10 chars
333
- # Total content width = 47 + 10 = 57 chars
334
- # So we need 47 - header_prefix_len dashes before "activity"
335
- dash_count = max(1, 47 - header_prefix_len)
336
427
  header.append("─" * dash_count, style="dim")
337
428
  header.append(" activity", style="dim")
338
429
  else:
339
- # Original header for HTTP channels
340
- # Need to align with the req/resp/notif/ping columns
341
- # Structure: "│ " + arrow + " " + label(13) + "10m " + dots(20) + " now" = 47 chars
342
- # Then: " " + req(5) + " " + resp(5) + " " + notif(5) + " " + ping(5) = 25 chars
343
- # Total content width = 47 + 25 = 72 chars
344
- # So we need 47 - header_prefix_len dashes before the column headers
345
- dash_count = max(1, 47 - header_prefix_len)
346
430
  header.append("─" * dash_count, style="dim")
347
431
  header.append(" req resp notif ping", style="dim")
348
432
 
@@ -416,7 +500,12 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
416
500
  elif arrow_style == Colours.ARROW_ERROR and "GET" in label:
417
501
  # Highlight GET stream errors in red to match the arrow indicator
418
502
  label_style = Colours.TEXT_ERROR
419
- elif channel.request_count == 0 and channel.response_count == 0:
503
+ elif (
504
+ channel.request_count == 0
505
+ and channel.response_count == 0
506
+ and channel.notification_count == 0
507
+ and (channel.ping_count or 0) == 0
508
+ ):
420
509
  # No activity = dim
421
510
  label_style = Colours.TEXT_DIM
422
511
  else:
@@ -425,25 +514,46 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
425
514
  line.append(f" {label:<13}", style=label_style)
426
515
 
427
516
  # Always show timeline (dim black dots if no data)
428
- line.append("10m ", style="dim")
429
- if channel and channel.activity_buckets:
517
+ channel_bucket_seconds = (
518
+ getattr(channel, "activity_bucket_seconds", None) or default_bucket_seconds
519
+ )
520
+ bucket_count = (
521
+ len(channel.activity_buckets)
522
+ if channel and channel.activity_buckets
523
+ else getattr(channel, "activity_bucket_count", None)
524
+ )
525
+ if not bucket_count or bucket_count <= 0:
526
+ bucket_count = default_bucket_count
527
+ total_window_seconds = channel_bucket_seconds * bucket_count
528
+ timeline_label = _format_timeline_label(total_window_seconds)
529
+
530
+ line.append(f"{timeline_label} ", style="dim")
531
+ bucket_states = channel.activity_buckets if channel and channel.activity_buckets else None
532
+ if bucket_states:
430
533
  # Show actual activity
431
- for bucket_state in channel.activity_buckets:
534
+ for bucket_state in bucket_states:
432
535
  color = timeline_color_map.get(bucket_state, "dim")
433
536
  if bucket_state in {"idle", "none"}:
434
- symbol = "·"
537
+ symbol = SYMBOL_IDLE
435
538
  elif is_stdio:
436
- # For STDIO, all activity shows as filled circles since types are combined
437
- symbol = "●"
539
+ symbol = SYMBOL_STDIO_ACTIVITY
438
540
  elif bucket_state == "request":
439
- symbol = "◆" # Diamond for requests - rare and important
541
+ symbol = SYMBOL_REQUEST
542
+ elif bucket_state == "notification":
543
+ symbol = SYMBOL_NOTIFICATION
544
+ elif bucket_state == "error":
545
+ symbol = SYMBOL_ERROR
546
+ elif bucket_state == "ping":
547
+ symbol = SYMBOL_PING
548
+ elif bucket_state == "disabled":
549
+ symbol = SYMBOL_DISABLED
440
550
  else:
441
- symbol = "●" # Circle for other activity
551
+ symbol = SYMBOL_RESPONSE
442
552
  line.append(symbol, style=f"bold {color}")
443
553
  else:
444
554
  # Show dim dots for no activity
445
- for _ in range(20):
446
- line.append("·", style="black dim")
555
+ for _ in range(bucket_count):
556
+ line.append(SYMBOL_IDLE, style="black dim")
447
557
  line.append(" now", style="dim")
448
558
 
449
559
  # Metrics - different layouts for stdio vs HTTP
@@ -548,11 +658,19 @@ def _render_channel_summary(status: ServerStatus, indent: str, total_width: int)
548
658
  if i > 0:
549
659
  footer.append(" ", style="dim")
550
660
  if name == "idle":
551
- symbol = "·"
661
+ symbol = SYMBOL_IDLE
552
662
  elif name == "request":
553
- symbol = "◆" # Diamond for requests
663
+ symbol = SYMBOL_REQUEST
664
+ elif name == "notification":
665
+ symbol = SYMBOL_NOTIFICATION
666
+ elif name == "error":
667
+ symbol = SYMBOL_ERROR
668
+ elif name == "ping":
669
+ symbol = SYMBOL_PING
670
+ elif is_stdio and name == "activity":
671
+ symbol = SYMBOL_STDIO_ACTIVITY
554
672
  else:
555
- symbol = "●"
673
+ symbol = SYMBOL_RESPONSE
556
674
  footer.append(symbol, style=f"{color}")
557
675
  footer.append(f" {name}", style="dim")
558
676
 
@@ -619,7 +737,7 @@ async def render_mcp_status(agent, indent: str = "") -> None:
619
737
 
620
738
  header_label = Text(indent)
621
739
  header_label.append("▎", style=Colours.TEXT_CYAN)
622
- header_label.append("●", style=f"dim {Colours.TEXT_CYAN}")
740
+ header_label.append(SYMBOL_RESPONSE, style=f"dim {Colours.TEXT_CYAN}")
623
741
  header_label.append(f" [{index:2}] ", style=Colours.TEXT_CYAN)
624
742
  header_label.append(server, style=f"{Colours.TEXT_INFO} bold")
625
743
  render_header(header_label)
@@ -78,6 +78,7 @@ class RichProgressDisplay:
78
78
  ProgressAction.INITIALIZED: "dim green",
79
79
  ProgressAction.CHATTING: "bold blue",
80
80
  ProgressAction.STREAMING: "bold green", # Assistant Colour
81
+ ProgressAction.THINKING: "bold yellow", # Assistant Colour
81
82
  ProgressAction.ROUTING: "bold blue",
82
83
  ProgressAction.PLANNING: "bold blue",
83
84
  ProgressAction.READY: "dim green",
@@ -108,7 +109,9 @@ class RichProgressDisplay:
108
109
 
109
110
  # Ensure no None values in the update
110
111
  # For streaming, use custom description immediately to avoid flashing
111
- if event.action == ProgressAction.STREAMING and event.streaming_tokens:
112
+ if (
113
+ event.action == ProgressAction.STREAMING or event.action == ProgressAction.THINKING
114
+ ) and event.streaming_tokens:
112
115
  # Account for [dim][/dim] tags (11 characters) in padding calculation
113
116
  formatted_tokens = f"▎[dim]◀[/dim] {event.streaming_tokens.strip()}".ljust(17 + 11)
114
117
  description = f"[{self._get_action_style(event.action)}]{formatted_tokens}"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.3.12
3
+ Version: 0.3.14
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>
6
6
  License: Apache License
@@ -208,7 +208,7 @@ License-File: LICENSE
208
208
  Classifier: License :: OSI Approved :: Apache Software License
209
209
  Classifier: Operating System :: OS Independent
210
210
  Classifier: Programming Language :: Python :: 3
211
- Requires-Python: >=3.13.5
211
+ Requires-Python: <3.14,>=3.13.5
212
212
  Requires-Dist: a2a-sdk>=0.3.6
213
213
  Requires-Dist: aiohttp>=3.11.13
214
214
  Requires-Dist: anthropic>=0.69.0
@@ -219,7 +219,7 @@ Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
220
  Requires-Dist: google-genai>=1.33.0
221
221
  Requires-Dist: keyring>=24.3.1
222
- Requires-Dist: mcp==1.16.0
222
+ Requires-Dist: mcp==1.17.0
223
223
  Requires-Dist: openai>=2.1.0
224
224
  Requires-Dist: opentelemetry-distro>=0.55b0
225
225
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
@@ -249,15 +249,24 @@ Description-Content-Type: text/markdown
249
249
  ## Overview
250
250
 
251
251
  > [!TIP]
252
- > Documentation site is in production here : https://fast-agent.ai. Feel free to feed back what's helpful and what's not. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
252
+ > Please see : https://fast-agent.ai for latest documentation. There is also an LLMs.txt [here](https://fast-agent.ai/llms.txt)
253
253
 
254
- **`fast-agent`** enables you to create and interact with sophisticated Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling. Model support is comprehensive with native support for Anthropic, OpenAI and Google as well as Azure, Ollama, Deepseek and dozens of others via TensorZero.
254
+ **`fast-agent`** enables you to create and interact with sophisticated multimodal Agents and Workflows in minutes. It is the first framework with complete, end-to-end tested MCP Feature support including Sampling and Elicitations.
255
255
 
256
- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6)
256
+ <!-- ![multi_model_trim](https://github.com/user-attachments/assets/c8bf7474-2c41-4ef3-8924-06e29907d7c6) -->
257
257
 
258
258
  The simple declarative syntax lets you concentrate on composing your Prompts and MCP Servers to [build effective agents](https://www.anthropic.com/research/building-effective-agents).
259
259
 
260
- `fast-agent` is multi-modal, supporting Images and PDFs for both Anthropic and OpenAI endpoints via Prompts, Resources and MCP Tool Call results. The inclusion of passthrough and playback LLMs enable rapid development and test of Python glue-code for your applications.
260
+ Model support is comprehensive with native support for Anthropic, OpenAI and Google providers as well as Azure, Ollama, Deepseek and dozens of others via TensorZero. Structured Outputs, PDF and Vision support is simple to use and well tested. Passthrough and Playback LLMs enable rapid development and test of Python glue-code for your applications.
261
+
262
+ <img width="800" alt="MCP Transport Diagnostics" src="https://github.com/user-attachments/assets/e26472de-58d9-4726-8bdd-01eb407414cf" />
263
+
264
+
265
+ `fast-agent` is the only tool that allows you to inspect Streamable HTTP Transport usage - a critical feature for ensuring reliable, compliant deployments. OAuth is supported with KeyRing storage for secrets. Use the `fast-agent auth` command to manage.
266
+
267
+
268
+
269
+
261
270
 
262
271
  > [!IMPORTANT]
263
272
  >
@@ -1,18 +1,18 @@
1
1
  fast_agent/__init__.py,sha256=ns6CPmjOL5y7cyV4XgFTfMGcfLnuBJwVTbcjJ5Co3x4,4152
2
- fast_agent/config.py,sha256=tKnAhGAADpuwU7DggScG0VESs7el4R1Y1T3MUPzD5_U,22509
3
- fast_agent/constants.py,sha256=IoXL5m4L0iLlcRrKerMaK3ZPcS6KCJgK8b_bj1BAR60,345
4
- fast_agent/context.py,sha256=nBelOqehSH91z3aG2nYhwETP-biRzz-iuA2fqmKdHP8,7700
2
+ fast_agent/config.py,sha256=sewLcvcywqWiDuLUbjds8VMhLszgu3ZW3h88CLa3uTU,24789
3
+ fast_agent/constants.py,sha256=GQZw66l9_X58T1fwSnOQZbPnj3ydJxWdwzvLo0RnGYU,520
4
+ fast_agent/context.py,sha256=kHCWvj6Smo2WwfcKHF4bFdnqD7H2HdCmiTWePos-4NM,8890
5
5
  fast_agent/context_dependent.py,sha256=KU1eydVBoIt4bYOZroqxDgE1AUexDaZi7hurE26QsF4,1584
6
- fast_agent/event_progress.py,sha256=OETeh-4jJGyxvvPAlVTzW4JsCbFUmOTo-ti0ROgtG5M,1999
7
- fast_agent/interfaces.py,sha256=XktRxJjLfCMPbC5ReV23dP-dRy0gDNtYfMCvSp0QD0I,6373
6
+ fast_agent/event_progress.py,sha256=iTGlD-tAG3n_mLnUr7h03nPMSZK8piyLeaA-IB9erBw,2064
7
+ fast_agent/interfaces.py,sha256=SF-ITigHU4J5zJPJzn5pzO0_cME_RSCPvqTRpIKvL3c,6588
8
8
  fast_agent/mcp_server_registry.py,sha256=TDCNpQIehsh1PK4y7AWp_rkQMcwYx7FaouUbK3kWNZo,2635
9
9
  fast_agent/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  fast_agent/agents/__init__.py,sha256=WfgtR9MgmJUJI7rb-CUH_10s7308LjxYIYzJRIBZ_9Y,2644
11
11
  fast_agent/agents/agent_types.py,sha256=xAFEFWIvOtSnTNDcqqfaAnBx_lFLhnS2_b4hm9xKMo8,1719
12
- fast_agent/agents/llm_agent.py,sha256=k2owG-tADgRsH6cFjvgCWM8krbaMoj12GBykmqxindk,10715
13
- fast_agent/agents/llm_decorator.py,sha256=OezFrnjLwcl3W-1K1sGPtTqD_zVp67wlBUb4SxTesKw,29702
14
- fast_agent/agents/mcp_agent.py,sha256=O9CrjjUrkmbNYsXQevZy2b8EG4B0KdNSH3wtnbe2HI4,39279
15
- fast_agent/agents/tool_agent.py,sha256=bR0V06zCjuPVtOpOQQzym2Mmyt6EsDzAodJmQOEMoFI,8883
12
+ fast_agent/agents/llm_agent.py,sha256=q8tXXRIUquIm8Cz4-7dFmzFQ4gQI87kAzKst6hqSrXc,9908
13
+ fast_agent/agents/llm_decorator.py,sha256=aJ3ynv_YMARCOh7Lk9Srf-sWOt3ax1rDkjvNiabW4-A,30135
14
+ fast_agent/agents/mcp_agent.py,sha256=UysCZTO9RbkFUS8RRhTdqKu8ewBb9Cl2K1yRDqcIhYg,39869
15
+ fast_agent/agents/tool_agent.py,sha256=D4NrDkH8BtFOIc058GiqikZq5H9kUsIK-OdDrgenyec,8832
16
16
  fast_agent/agents/workflow/chain_agent.py,sha256=Pd8dOH_YdKu3LXsKa4fwqzY_B2qVuhzdfCUiKi5v17s,6293
17
17
  fast_agent/agents/workflow/evaluator_optimizer.py,sha256=rhzazy8Aj-ydId6kmBC77TmtYZ5mirSe7eV6PPMWkBA,12040
18
18
  fast_agent/agents/workflow/iterative_planner.py,sha256=CTtDpK-YGrFFZMQQmFeE-2I_9-cZv23pNwUoh8w5voA,20478
@@ -26,7 +26,7 @@ fast_agent/cli/constants.py,sha256=flYDsml3_8wVcGg7T1t5mPFT9CC1M-XMjBigXjX6PuI,5
26
26
  fast_agent/cli/main.py,sha256=tERbfQjure3kgKYqzZCNDSLyiVZGXCH2coZ8YBwvq64,4398
27
27
  fast_agent/cli/terminal.py,sha256=tDN1fJ91Nc_wZJTNafkQuD7Z7gFscvo1PHh-t7Wl-5s,1066
28
28
  fast_agent/cli/commands/auth.py,sha256=nJEC7zrz5UXYUz5O6AgGZnfJPHIrgHk68CUwGo-7Nyg,15063
29
- fast_agent/cli/commands/check_config.py,sha256=D0emHGl6yc9XRq-HjAwS4KfS7a9r5gkA55MyiIRptGQ,26638
29
+ fast_agent/cli/commands/check_config.py,sha256=FsC3gXS8qjSKIHARAd4w5jGkCKuQcyK4eGQKmlqyAMo,28407
30
30
  fast_agent/cli/commands/go.py,sha256=mZJv1jXO9xqVUzuDCO5iWKI8ubBUACHO6i3lZwu5NFU,15148
31
31
  fast_agent/cli/commands/quickstart.py,sha256=UOTqAbaVGLECHkTvpUNQ41PWXssqCijVvrqh30YUqnM,20624
32
32
  fast_agent/cli/commands/server_helpers.py,sha256=Nuded8sZb4Rybwoq5LbXXUgwtJZg-OO04xhmPUp6e98,4073
@@ -49,7 +49,7 @@ fast_agent/core/executor/workflow_signal.py,sha256=Cg1uZBk3fn8kXhPOg-wINNuVaf3v9
49
49
  fast_agent/core/logging/__init__.py,sha256=dFW2bbTtz45zebUuQs7RVi7mg1RJm4DHH6TGfBMhW14,167
50
50
  fast_agent/core/logging/events.py,sha256=WTjr26uIxtbxhnoLNPROVUIt0HNJrzK1g1fUMZ-zVsQ,4207
51
51
  fast_agent/core/logging/json_serializer.py,sha256=kQDkwTHIkHSQgbhDOJhMoetNvfJVMZGOScaKoLX8kmw,5797
52
- fast_agent/core/logging/listeners.py,sha256=LVZMf274gN-T-MKNpkmwaE_FbJX2AS0HoHdROrrkmdQ,9400
52
+ fast_agent/core/logging/listeners.py,sha256=U4RpiUTFRUXO9YmujKiBsvVmwNablDtZdLePs6mG34g,9446
53
53
  fast_agent/core/logging/logger.py,sha256=L-hLfUGFCIABoNYDiUkNHWvFxL6j-6zn5Pc5E7aC44M,11074
54
54
  fast_agent/core/logging/transport.py,sha256=i_WYXk5mqyfetT72bCYrbdrMWcuL1HJCyeQKfQg7U2w,16994
55
55
  fast_agent/history/history_exporter.py,sha256=oqkw7qC5rrW73u20tkIqt8yBWPoVzCTC61x2Q2rOKGs,1404
@@ -63,12 +63,12 @@ fast_agent/llm/__init__.py,sha256=MCsrkfnTQXYvn0SofJ-JFmp1l1jX_eidgvegbWbgpsw,18
63
63
  fast_agent/llm/fastagent_llm.py,sha256=GyvBGAgwd1frWUzSiBANNQdFX-a50ps97WPEX7q2uw8,25119
64
64
  fast_agent/llm/memory.py,sha256=POFoBVMHK0wX4oLd3Gz-6Ru3uC4kTCvAqsVQ77e7KJA,8551
65
65
  fast_agent/llm/model_database.py,sha256=qhC4CX_dKNDTQ3bJA_YCq2wIJK5YP_xlbqNuI1K-a6g,12948
66
- fast_agent/llm/model_factory.py,sha256=y0gmgFzk15UJHZuTbnp5ExYG4DhlX0X1YzzUc1leNVo,13043
66
+ fast_agent/llm/model_factory.py,sha256=tLOT1c1LXvZAe-XExj7apkjLcot-tyVcCiXRktsupSc,13209
67
67
  fast_agent/llm/model_info.py,sha256=DAIMW70W-EFqNLIudhjHJE2gobHUAKg90gkwOPuaFUc,4125
68
68
  fast_agent/llm/prompt_utils.py,sha256=1WU67G-BFqftja5I8FKPMMzsvDk1K_1jDi9A9kkFdOg,4899
69
- fast_agent/llm/provider_key_manager.py,sha256=igzs1ghXsUp0wA4nJVVfWCWiYOib8Ux4jMGlhWbgXu8,3396
70
- fast_agent/llm/provider_types.py,sha256=Ya0MGo_4cE0oCwinqPvr9SJUwx4hEJ7CFbCrLB_27FI,1142
71
- fast_agent/llm/request_params.py,sha256=lQxDmPDpqkbKQPI0WxL8Y4FDweovI6lTbxsHPZ_agq8,1735
69
+ fast_agent/llm/provider_key_manager.py,sha256=O8jhoqzLgMbY57TbJxztNwElbsQPC0GMIwgiaz_5SuQ,3455
70
+ fast_agent/llm/provider_types.py,sha256=JyJoyyCI3htgX9VCvvyz2Lx9fBQtdrLbXma0oc9vfsw,1185
71
+ fast_agent/llm/request_params.py,sha256=HjzGLvEvRMXPMDOxDzbVyb4X_QOt0WErdv1nbCEaZnY,1812
72
72
  fast_agent/llm/sampling_converter.py,sha256=YEUpdVeZlJNDljCuwrXyhsb40o0-1QuWGTuorQnvhbo,3102
73
73
  fast_agent/llm/usage_tracking.py,sha256=6FRIIimIaAoSlYTCGVG00GuavGRIFbOBEBWHvfBxWw0,16791
74
74
  fast_agent/llm/internal/passthrough.py,sha256=0P7qc13_xTV1aMHJmZ2KQEtMtGtu0H7ArkEL6hiy5_M,5209
@@ -80,7 +80,7 @@ fast_agent/llm/provider/anthropic/llm_anthropic.py,sha256=3QGmJitHKqmYUSH3l1c_lX
80
80
  fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py,sha256=szHqhd5i-OclNWM7EHVT66kTiHJ5B0y1qd-JqgJIOO4,16529
81
81
  fast_agent/llm/provider/bedrock/bedrock_utils.py,sha256=mqWCCeB1gUQSL2KRUMqpFjvHZ0ZTJugCsd5YOrx6U30,7750
82
82
  fast_agent/llm/provider/bedrock/llm_bedrock.py,sha256=Yl3luBfgM4wNGuMpPN9yg8DGHr_ncfYg0EemvKi2Rxc,100199
83
- fast_agent/llm/provider/google/google_converter.py,sha256=w7povk-qM7DMsNIHwzL-x89YPkcKn3rjrGLwwI6-iQs,17263
83
+ fast_agent/llm/provider/google/google_converter.py,sha256=cGb2ty_uBgdATa0Nib_BzvEbWCpBf3Mwzu9pMxMziA8,17599
84
84
  fast_agent/llm/provider/google/llm_google_native.py,sha256=pbCld68BFlN1vUQSHWQzIAbFPOBTnd8ZVBEjGmxVS_Q,19296
85
85
  fast_agent/llm/provider/openai/llm_aliyun.py,sha256=ti7VHTpwl0AG3ytwBERpDzVtacvCfamKnl2bAnTE96s,1213
86
86
  fast_agent/llm/provider/openai/llm_azure.py,sha256=dePpuOf7yD4-zQc1PEHm4yaVznrZe9RaIz7nxsbZhlU,6061
@@ -103,9 +103,9 @@ fast_agent/mcp/gen_client.py,sha256=Q0hhCVzC659GsvTLJIbhUBgGwsAJRL8b3ejTFokyjn4,
103
103
  fast_agent/mcp/hf_auth.py,sha256=ndDvR7E9LCc5dBiMsStFXtvvX9lYrL-edCq_qJw4lDw,4476
104
104
  fast_agent/mcp/interfaces.py,sha256=xCWONGXe4uQSmmBlMZRD3mflPegTJnz2caVNihEl3ok,2411
105
105
  fast_agent/mcp/logger_textio.py,sha256=4YLVXlXghdGm1s_qp1VoAWEX_eWufBfD2iD7l08yoak,3170
106
- fast_agent/mcp/mcp_agent_client_session.py,sha256=5_9cW3CSzYspRzb8lOJTFx9E8Qk7ieCBASBbUtNrmiY,15578
107
- fast_agent/mcp/mcp_aggregator.py,sha256=HzNyKuUelAlp5JBkjMAaOB2JvdMgpm0ItEPGjidI9l0,67198
108
- fast_agent/mcp/mcp_connection_manager.py,sha256=nbjcyWGK3LQhuFUABV1Mxf_v3rWFSMXNsDHV1h3qDUI,23803
106
+ fast_agent/mcp/mcp_agent_client_session.py,sha256=VTPEjNjPMrxZopeCr7bXjlvr_2MTzdqEjjBOeQri04g,16050
107
+ fast_agent/mcp/mcp_aggregator.py,sha256=bgqETI-hFtkweW-lcQkA2nvmokiVUv3Z0NohdkhnJwg,77890
108
+ fast_agent/mcp/mcp_connection_manager.py,sha256=57trQyXYCI5MjyiEBSBpyzv4qDyty-MEaqQSAl2_UYA,26515
109
109
  fast_agent/mcp/mcp_content.py,sha256=F9bgJ57EO9sgWg1m-eTNM6xd9js79mHKf4e9O8K8jrI,8829
110
110
  fast_agent/mcp/mime_utils.py,sha256=D6YXNdZJ351BjacSW5o0sVF_hrWuRHD6UyWS4TDlLZI,2915
111
111
  fast_agent/mcp/oauth_client.py,sha256=3shN3iwsJNXrk7nbcfUgrzNos3i2RuMuLXA80nR8r6Y,17104
@@ -115,9 +115,12 @@ fast_agent/mcp/prompt_render.py,sha256=AqDaQqM6kqciV9X79S5rsRr3VjcQ_2JOiLaHqpRzs
115
115
  fast_agent/mcp/prompt_serialization.py,sha256=QMbY0aa_UlJ7bbxl_muOm2TYeYbBVTEeEMHFmEy99ss,20182
116
116
  fast_agent/mcp/resource_utils.py,sha256=cu-l9aOy-NFs8tPihYRNjsB2QSuime8KGOGpUvihp84,6589
117
117
  fast_agent/mcp/sampling.py,sha256=6S9bpGCFGC5azIGE-zxODvKgBbBn1x6amL5mc4sMg_4,7491
118
+ fast_agent/mcp/skybridge.py,sha256=IdaZE3BoXLCxI1Tt9Q3L44t94JBNh1ei4IyUkZDKvCQ,1333
119
+ fast_agent/mcp/sse_tracking.py,sha256=BG4Y84oVE3r8Ggsbda3zEh4yHYPsBzVnl9O_sithMxM,11748
118
120
  fast_agent/mcp/stdio_tracking_simple.py,sha256=T6kCIb6YjwqKtXHz_6HvlLLYiSCbuggt2xCXSihVnIg,1918
119
121
  fast_agent/mcp/streamable_http_tracking.py,sha256=bcNNReokho6WMjWEH13F33bUSkjJ2F5l3qnegkDqdMA,11465
120
- fast_agent/mcp/transport_tracking.py,sha256=tsc2Ntf47KbKXs8DzRkqvG0U-FbpwU2VxemNfRbJBpo,24088
122
+ fast_agent/mcp/transport_tracking.py,sha256=Qm0c-QjlU4DJW3lI8oYR1CCia9gYxOHecKPY8hHFXYU,25617
123
+ fast_agent/mcp/types.py,sha256=BSKto-ArpIt1xiMaISF32xsPNlWVaFkf9rUnl085Q7o,643
121
124
  fast_agent/mcp/ui_agent.py,sha256=OBGEuFpOPPK7EthPRwzxmtzu1SDIeZy-vHwdRsyDNQk,1424
122
125
  fast_agent/mcp/ui_mixin.py,sha256=iOlSNJVPwiMUun0clCiWyot59Qgy8R7ZvUgH2afRnQA,7662
123
126
  fast_agent/mcp/helpers/__init__.py,sha256=o6-HuX6bEVFnfT_wgclFOVb1NxtOsJEOnHX8L2IqDdw,857
@@ -178,12 +181,12 @@ fast_agent/resources/examples/workflows/graded_report.md,sha256=QVF38xEtDIO1a2P-
178
181
  fast_agent/resources/examples/workflows/human_input.py,sha256=gFuptgiU0mMMtv3F1XI7syCSyVV8tyi5qTOn9ziJdWI,792
179
182
  fast_agent/resources/examples/workflows/orchestrator.py,sha256=YWSgH8cDqEuWercgof2aZLbrO0idiSL932ym3lrniNM,2526
180
183
  fast_agent/resources/examples/workflows/parallel.py,sha256=kROiRueTm0Wql4EWVjFSyonV5A4gPepm1jllz5alias,1826
181
- fast_agent/resources/examples/workflows/router.py,sha256=lxMxz6g0_XjYnwzEwKdl9l2hxRsD4PSsaIlhH5nLuQY,2075
184
+ fast_agent/resources/examples/workflows/router.py,sha256=_xVOLzSHY3ZcNfUjvtqVrkiiML5atgGp8Xti7z-U_ZY,2109
182
185
  fast_agent/resources/examples/workflows/short_story.md,sha256=XN9I2kzCcMmke3dE5F2lyRH5iFUZUQ8Sy-hS3rm_Wlc,1153
183
186
  fast_agent/resources/examples/workflows/short_story.txt,sha256=X3y_1AyhLFN2AKzCKvucJtDgAFIJfnlbsbGZO5bBWu0,1187
184
187
  fast_agent/resources/setup/.gitignore,sha256=bksf0bkvBXtm3F5Nd4F9FB2LaO2RcTbHujYWjq5JKPo,305
185
188
  fast_agent/resources/setup/agent.py,sha256=IlZecsc9vTtH2rj9BFF4M6BUgClg5fQ2HasYV1PPIHA,518
186
- fast_agent/resources/setup/fastagent.config.yaml,sha256=4lYdNTUqBwp7DiyeoUDqBDlqfnFi9JTihOTnix3V9M0,1464
189
+ fast_agent/resources/setup/fastagent.config.yaml,sha256=kQPSopSJ03r6YeevPTlXo9NNE9TChN94_lymE57z5yQ,1703
187
190
  fast_agent/resources/setup/fastagent.secrets.yaml.example,sha256=ht-i2_SpAyeXG2OnG_vOA1n7gRsGIInxp9g5Nio-jpI,1038
188
191
  fast_agent/resources/setup/pyproject.toml.tmpl,sha256=SxyVPXbtD67yFOx9wIrzq6Yxo4W2PkSR1rrnPkmpjwA,478
189
192
  fast_agent/tools/elicitation.py,sha256=8FaNvuN__LAM328VSJ5T4Bg3m8auHraqYvIYv6Eh4KU,13464
@@ -191,21 +194,21 @@ fast_agent/types/__init__.py,sha256=y-53m-C4drf4Rx8Bbnk_GAhko9LdNYCyRUWya8e0mos,
191
194
  fast_agent/types/llm_stop_reason.py,sha256=bWe97OfhALUe8uQeAQOnTdPlYzJiabIfo8u38kPgj3Q,2293
192
195
  fast_agent/ui/__init__.py,sha256=MXxTQjFdF7mI_3JHxBPd-aoZYLlxV_-51-Trqgv5-3w,1104
193
196
  fast_agent/ui/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
194
- fast_agent/ui/console_display.py,sha256=oZg-SMd_F0_1azsxWF5ug7cee_-ou2xOgGeW_y_6xrI,42034
197
+ fast_agent/ui/console_display.py,sha256=SQCGq0wlu_s0032Mf0tklFdx1WOSUP5hf3v_G4IOTHk,55736
195
198
  fast_agent/ui/elicitation_form.py,sha256=t3UhBG44YmxTLu1RjCnHwW36eQQaroE45CiBGJB2czg,29410
196
199
  fast_agent/ui/elicitation_style.py,sha256=-WqXgVjVs65oNwhCDw3E0A9cCyw95IOe6LYCJgjT6ok,3939
197
- fast_agent/ui/enhanced_prompt.py,sha256=TPJmC1zKQaiqDbtlI0WcxUoH5uw1sY23uJ8uEeYiMCY,45018
200
+ fast_agent/ui/enhanced_prompt.py,sha256=NTbO81GzSpa1kUxZgz2ppKHWqsKgACM8fcA5Al6W1Rk,47015
198
201
  fast_agent/ui/history_display.py,sha256=b7l-pXohSnn1YK1g-8BUmY479x-d-wf5sG2pItG2_ps,19024
199
- fast_agent/ui/interactive_prompt.py,sha256=KI2jSO4roWNivfOeyibiu44J9pu5RU6PiB7Fd59iCYw,46699
200
- fast_agent/ui/mcp_display.py,sha256=vokUfri1DSMpMLyvzJqFrrqKED_dU2-xafWY8vEUjGo,27333
202
+ fast_agent/ui/interactive_prompt.py,sha256=2nKETLjLOizYP8MPSDlrPSmp59CPjFenZPUZxDzbP7g,47790
203
+ fast_agent/ui/mcp_display.py,sha256=YSpfb0DLtThDs6xEP-USeYAsnejfaYhIgNx7gtrJ9-Q,30791
201
204
  fast_agent/ui/mcp_ui_utils.py,sha256=hV7z-yHX86BgdH6CMmN5qyOUjyiegQXLJOa5n5A1vQs,8476
202
205
  fast_agent/ui/mermaid_utils.py,sha256=MpcRyVCPMTwU1XeIxnyFg0fQLjcyXZduWRF8NhEqvXE,5332
203
206
  fast_agent/ui/notification_tracker.py,sha256=-hiBwR47SdnwhvrGIXcgsVaqMlMudmrKAf9Xi_E5Eok,5850
204
207
  fast_agent/ui/progress_display.py,sha256=hajDob65PttiJ2mPS6FsCtnmTcnyvDWGn-UqQboXqkQ,361
205
- fast_agent/ui/rich_progress.py,sha256=4n5NmsRQTT1GX18faP43yLPhB_gZJqJeWX6-j7g1_zI,7731
208
+ fast_agent/ui/rich_progress.py,sha256=s0HAaZHR3R7ubqtV20SX64RmkwvGCLXuJ8y29VjVKZs,7870
206
209
  fast_agent/ui/usage_display.py,sha256=ltJpn_sDzo8PDNSXWx-QdEUbQWUnhmajCItNt5mA5rM,7285
207
- fast_agent_mcp-0.3.12.dist-info/METADATA,sha256=04VuIDYIhpA_OQHA6Ejz-O7wXpwu6uXwethvvhSuwa8,31695
208
- fast_agent_mcp-0.3.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
209
- fast_agent_mcp-0.3.12.dist-info/entry_points.txt,sha256=i6Ujja9J-hRxttOKqTYdbYP_tyaS4gLHg53vupoCSsg,199
210
- fast_agent_mcp-0.3.12.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
211
- fast_agent_mcp-0.3.12.dist-info/RECORD,,
210
+ fast_agent_mcp-0.3.14.dist-info/METADATA,sha256=Lcp_aH3GGNC7mK0GgGa_5nPjZKBFWMaQTcInnBM_DEc,32003
211
+ fast_agent_mcp-0.3.14.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
212
+ fast_agent_mcp-0.3.14.dist-info/entry_points.txt,sha256=i6Ujja9J-hRxttOKqTYdbYP_tyaS4gLHg53vupoCSsg,199
213
+ fast_agent_mcp-0.3.14.dist-info/licenses/LICENSE,sha256=Gx1L3axA4PnuK4FxsbX87jQ1opoOkSFfHHSytW6wLUU,10935
214
+ fast_agent_mcp-0.3.14.dist-info/RECORD,,