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.
- fast_agent/agents/llm_agent.py +15 -34
- fast_agent/agents/llm_decorator.py +13 -2
- fast_agent/agents/mcp_agent.py +18 -2
- fast_agent/agents/tool_agent.py +8 -10
- fast_agent/cli/commands/check_config.py +45 -1
- fast_agent/config.py +63 -0
- fast_agent/constants.py +3 -0
- fast_agent/context.py +42 -9
- fast_agent/core/logging/listeners.py +1 -1
- fast_agent/event_progress.py +2 -3
- fast_agent/interfaces.py +9 -2
- fast_agent/llm/model_factory.py +4 -0
- fast_agent/llm/provider/google/google_converter.py +10 -3
- fast_agent/llm/provider_key_manager.py +1 -0
- fast_agent/llm/provider_types.py +1 -0
- fast_agent/llm/request_params.py +3 -1
- fast_agent/mcp/mcp_agent_client_session.py +13 -0
- fast_agent/mcp/mcp_aggregator.py +313 -40
- fast_agent/mcp/mcp_connection_manager.py +95 -22
- fast_agent/mcp/skybridge.py +45 -0
- fast_agent/mcp/sse_tracking.py +287 -0
- fast_agent/mcp/transport_tracking.py +37 -3
- fast_agent/mcp/types.py +24 -0
- fast_agent/resources/examples/workflows/router.py +1 -0
- fast_agent/resources/setup/fastagent.config.yaml +5 -0
- fast_agent/ui/console_display.py +347 -20
- fast_agent/ui/enhanced_prompt.py +107 -58
- fast_agent/ui/interactive_prompt.py +57 -34
- fast_agent/ui/mcp_display.py +159 -41
- fast_agent/ui/rich_progress.py +4 -1
- {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/METADATA +16 -7
- {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/RECORD +35 -32
- {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/WHEEL +0 -0
- {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/entry_points.txt +0 -0
- {fast_agent_mcp-0.3.12.dist-info → fast_agent_mcp-0.3.14.dist-info}/licenses/LICENSE +0 -0
fast_agent/ui/mcp_display.py
CHANGED
|
@@ -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(
|
|
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
|
-
|
|
263
|
-
|
|
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 =
|
|
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 =
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
429
|
-
|
|
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
|
|
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
|
-
|
|
437
|
-
symbol = "●"
|
|
539
|
+
symbol = SYMBOL_STDIO_ACTIVITY
|
|
438
540
|
elif bucket_state == "request":
|
|
439
|
-
symbol =
|
|
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 =
|
|
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(
|
|
446
|
-
line.append(
|
|
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 =
|
|
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(
|
|
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)
|
fast_agent/ui/rich_progress.py
CHANGED
|
@@ -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
|
|
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.
|
|
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:
|
|
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.
|
|
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
|
-
>
|
|
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
|
|
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
|
-

|
|
256
|
+
<!--  -->
|
|
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
|
-
|
|
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=
|
|
3
|
-
fast_agent/constants.py,sha256=
|
|
4
|
-
fast_agent/context.py,sha256=
|
|
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=
|
|
7
|
-
fast_agent/interfaces.py,sha256=
|
|
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=
|
|
13
|
-
fast_agent/agents/llm_decorator.py,sha256=
|
|
14
|
-
fast_agent/agents/mcp_agent.py,sha256=
|
|
15
|
-
fast_agent/agents/tool_agent.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
70
|
-
fast_agent/llm/provider_types.py,sha256=
|
|
71
|
-
fast_agent/llm/request_params.py,sha256=
|
|
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=
|
|
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=
|
|
107
|
-
fast_agent/mcp/mcp_aggregator.py,sha256=
|
|
108
|
-
fast_agent/mcp/mcp_connection_manager.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
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=
|
|
200
|
-
fast_agent/ui/mcp_display.py,sha256=
|
|
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=
|
|
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.
|
|
208
|
-
fast_agent_mcp-0.3.
|
|
209
|
-
fast_agent_mcp-0.3.
|
|
210
|
-
fast_agent_mcp-0.3.
|
|
211
|
-
fast_agent_mcp-0.3.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|