fast-agent-mcp 0.2.57__tar.gz → 0.3.0__tar.gz

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 (309) hide show
  1. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/.gitignore +1 -3
  2. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/PKG-INFO +7 -7
  3. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/README.md +1 -1
  4. fast_agent_mcp-0.3.0/examples/bedrock/fast-agent.config.yaml +24 -0
  5. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/custom-agents/agent.py +3 -3
  6. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/data-analysis/analysis-campaign.py +5 -4
  7. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/data-analysis/analysis.py +1 -1
  8. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/elicitation_forms_server.py +25 -3
  9. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/forms_demo.py +3 -3
  10. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/game_character.py +2 -2
  11. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/game_character_handler.py +1 -1
  12. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/tool_call.py +1 -1
  13. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/mcp-filtering/test_mcp_filtering.py +27 -23
  14. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/state-transfer/agent_one.py +1 -1
  15. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/mcp/state-transfer/agent_two.py +1 -1
  16. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/vision-examples/example1.py +2 -2
  17. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/vision-examples/example2.py +1 -1
  18. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/vision-examples/example3.py +1 -1
  19. fast_agent_mcp-0.3.0/examples/new-api/display_check.py +25 -0
  20. fast_agent_mcp-0.3.0/examples/new-api/simple_llm.py +80 -0
  21. fast_agent_mcp-0.3.0/examples/new-api/simple_llm_advanced.py +110 -0
  22. fast_agent_mcp-0.3.0/examples/new-api/simple_mcp.py +27 -0
  23. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/otel/agent.py +3 -3
  24. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/otel/agent2.py +3 -3
  25. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/researcher/researcher-eval.py +1 -1
  26. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/researcher/researcher-imp.py +1 -1
  27. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/researcher/researcher.py +1 -1
  28. fast_agent_mcp-0.3.0/examples/setup/.gitignore +24 -0
  29. fast_agent_mcp-0.3.0/examples/setup/agent.py +18 -0
  30. fast_agent_mcp-0.3.0/examples/setup/fastagent.config.yaml +44 -0
  31. fast_agent_mcp-0.3.0/examples/setup/fastagent.secrets.yaml.example +38 -0
  32. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/agent.py +2 -2
  33. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/tensorzero/image_demo.py +3 -3
  34. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/simple_agent.py +1 -1
  35. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/workflows/chaining.py +1 -1
  36. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/workflows/evaluator.py +3 -3
  37. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/workflows/human_input.py +5 -3
  38. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/workflows/orchestrator.py +1 -1
  39. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/workflows/parallel.py +2 -2
  40. {fast_agent_mcp-0.2.57/src/mcp_agent/resources → fast_agent_mcp-0.3.0}/examples/workflows/router.py +5 -2
  41. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/hatch_build.py +37 -12
  42. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/pyproject.toml +24 -24
  43. fast_agent_mcp-0.3.0/src/fast_agent/__init__.py +127 -0
  44. fast_agent_mcp-0.3.0/src/fast_agent/agents/__init__.py +36 -0
  45. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/agents}/agent_types.py +2 -1
  46. fast_agent_mcp-0.3.0/src/fast_agent/agents/llm_agent.py +217 -0
  47. fast_agent_mcp-0.3.0/src/fast_agent/agents/llm_decorator.py +486 -0
  48. fast_agent_mcp-0.2.57/src/mcp_agent/agents/base_agent.py → fast_agent_mcp-0.3.0/src/fast_agent/agents/mcp_agent.py +377 -385
  49. fast_agent_mcp-0.3.0/src/fast_agent/agents/tool_agent.py +168 -0
  50. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/chain_agent.py +43 -33
  51. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/evaluator_optimizer.py +31 -35
  52. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/iterative_planner.py +56 -47
  53. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/orchestrator_models.py +4 -4
  54. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/parallel_agent.py +34 -41
  55. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/router_agent.py +54 -39
  56. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/__main__.py +5 -3
  57. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/check_config.py +95 -66
  58. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/go.py +20 -11
  59. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/quickstart.py +4 -4
  60. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/server_helpers.py +1 -1
  61. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/setup.py +64 -134
  62. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/commands/url_parser.py +9 -8
  63. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/main.py +36 -16
  64. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/terminal.py +2 -2
  65. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/config.py +13 -2
  66. fast_agent_mcp-0.3.0/src/fast_agent/constants.py +8 -0
  67. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/context.py +24 -19
  68. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/context_dependent.py +9 -5
  69. fast_agent_mcp-0.3.0/src/fast_agent/core/__init__.py +17 -0
  70. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/agent_app.py +39 -36
  71. fast_agent_mcp-0.3.0/src/fast_agent/core/core_app.py +135 -0
  72. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/direct_decorators.py +12 -26
  73. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/direct_factory.py +95 -73
  74. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/executor/executor.py +4 -5
  75. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/fastagent.py +32 -32
  76. fast_agent_mcp-0.3.0/src/fast_agent/core/logging/__init__.py +5 -0
  77. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/logging/events.py +3 -3
  78. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/logging/json_serializer.py +1 -1
  79. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/logging/listeners.py +85 -7
  80. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/logging/logger.py +7 -7
  81. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/logging/transport.py +10 -11
  82. fast_agent_mcp-0.3.0/src/fast_agent/core/prompt.py +9 -0
  83. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/validation.py +4 -4
  84. fast_agent_mcp-0.3.0/src/fast_agent/event_progress.py +61 -0
  85. fast_agent_mcp-0.3.0/src/fast_agent/history/history_exporter.py +44 -0
  86. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/__init__.py +9 -12
  87. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/elicitation_handler.py +26 -8
  88. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/elicitation_state.py +7 -7
  89. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/simple_form.py +6 -4
  90. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/types.py +1 -18
  91. fast_agent_mcp-0.3.0/src/fast_agent/interfaces.py +228 -0
  92. fast_agent_mcp-0.3.0/src/fast_agent/llm/__init__.py +9 -0
  93. fast_agent_mcp-0.2.57/src/mcp_agent/llm/augmented_llm.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/fastagent_llm.py +128 -218
  94. fast_agent_mcp-0.3.0/src/fast_agent/llm/internal/passthrough.py +137 -0
  95. fast_agent_mcp-0.2.57/src/mcp_agent/llm/augmented_llm_playback.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/internal/playback.py +29 -25
  96. fast_agent_mcp-0.2.57/src/mcp_agent/llm/augmented_llm_silent.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/internal/silent.py +10 -17
  97. fast_agent_mcp-0.3.0/src/fast_agent/llm/internal/slow.py +38 -0
  98. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/memory.py +40 -30
  99. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/model_database.py +35 -2
  100. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/model_factory.py +103 -77
  101. fast_agent_mcp-0.3.0/src/fast_agent/llm/model_info.py +126 -0
  102. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/anthropic}/anthropic_utils.py +7 -7
  103. fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +603 -0
  104. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/anthropic}/multipart_converter_anthropic.py +79 -86
  105. fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +218 -0
  106. fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +2192 -0
  107. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/google}/google_converter.py +66 -14
  108. fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/google/llm_google_native.py +431 -0
  109. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_aliyun.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_aliyun.py +6 -7
  110. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_azure.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_azure.py +4 -4
  111. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_deepseek.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_deepseek.py +10 -11
  112. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_generic.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_generic.py +4 -4
  113. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_google_oai.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_google_oai.py +4 -4
  114. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_groq.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_groq.py +14 -16
  115. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_openai.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_openai.py +133 -206
  116. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_openrouter.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_openrouter.py +6 -6
  117. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_tensorzero_openai.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +17 -16
  118. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_xai.py → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai/llm_xai.py +6 -6
  119. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai}/multipart_converter_openai.py +125 -63
  120. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai}/openai_multipart.py +12 -12
  121. {fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers → fast_agent_mcp-0.3.0/src/fast_agent/llm/provider/openai}/openai_utils.py +18 -16
  122. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/provider_key_manager.py +2 -2
  123. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/provider_types.py +2 -0
  124. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/sampling_converter.py +15 -12
  125. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/usage_tracking.py +23 -5
  126. fast_agent_mcp-0.3.0/src/fast_agent/mcp/__init__.py +43 -0
  127. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/elicitation_factory.py +3 -3
  128. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/elicitation_handlers.py +19 -10
  129. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/gen_client.py +3 -3
  130. fast_agent_mcp-0.3.0/src/fast_agent/mcp/helpers/__init__.py +36 -0
  131. fast_agent_mcp-0.3.0/src/fast_agent/mcp/helpers/content_helpers.py +183 -0
  132. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/helpers/server_config_helpers.py +8 -8
  133. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/hf_auth.py +25 -23
  134. fast_agent_mcp-0.3.0/src/fast_agent/mcp/interfaces.py +93 -0
  135. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/logger_textio.py +4 -4
  136. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/mcp_agent_client_session.py +49 -44
  137. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/mcp_aggregator.py +66 -115
  138. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/mcp_connection_manager.py +16 -23
  139. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/mcp}/mcp_content.py +23 -15
  140. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/mime_utils.py +39 -0
  141. fast_agent_mcp-0.3.0/src/fast_agent/mcp/prompt.py +159 -0
  142. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/prompt_message_multipart.py → fast_agent_mcp-0.3.0/src/fast_agent/mcp/prompt_message_extended.py +27 -20
  143. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompt_render.py +21 -19
  144. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompt_serialization.py +46 -46
  145. fast_agent_mcp-0.3.0/src/fast_agent/mcp/prompts/__main__.py +7 -0
  146. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompts/prompt_helpers.py +31 -30
  147. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompts/prompt_load.py +8 -8
  148. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompts/prompt_server.py +11 -19
  149. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompts/prompt_template.py +18 -18
  150. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/resource_utils.py +1 -1
  151. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/sampling.py +31 -26
  152. {fast_agent_mcp-0.2.57/src/mcp_agent/mcp_server → fast_agent_mcp-0.3.0/src/fast_agent/mcp/server}/__init__.py +1 -1
  153. {fast_agent_mcp-0.2.57/src/mcp_agent/mcp_server → fast_agent_mcp-0.3.0/src/fast_agent/mcp/server}/agent_server.py +5 -6
  154. fast_agent_mcp-0.3.0/src/fast_agent/mcp/ui_agent.py +48 -0
  155. fast_agent_mcp-0.3.0/src/fast_agent/mcp/ui_mixin.py +209 -0
  156. fast_agent_mcp-0.3.0/src/fast_agent/mcp_server_registry.py +90 -0
  157. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/data-analysis/analysis-campaign.py +5 -4
  158. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/data-analysis/analysis.py +1 -1
  159. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/elicitation_forms_server.py +25 -3
  160. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/forms_demo.py +3 -3
  161. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/game_character.py +2 -2
  162. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/mcp/elicitations/game_character_handler.py +1 -1
  163. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/tool_call.py +1 -1
  164. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/state-transfer/agent_one.py +1 -1
  165. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/mcp/state-transfer/agent_two.py +1 -1
  166. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/researcher/researcher-eval.py +1 -1
  167. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/researcher/researcher-imp.py +1 -1
  168. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/researcher/researcher.py +1 -1
  169. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/agent.py +2 -2
  170. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/tensorzero/image_demo.py +3 -3
  171. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/simple_agent.py +1 -1
  172. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/workflows/chaining.py +1 -1
  173. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/workflows/evaluator.py +3 -3
  174. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/workflows/human_input.py +5 -3
  175. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/workflows/orchestrator.py +1 -1
  176. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/workflows/parallel.py +2 -2
  177. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0/src/fast_agent/resources}/examples/workflows/router.py +5 -2
  178. fast_agent_mcp-0.3.0/src/fast_agent/resources/setup/.gitignore +24 -0
  179. fast_agent_mcp-0.3.0/src/fast_agent/resources/setup/agent.py +18 -0
  180. fast_agent_mcp-0.3.0/src/fast_agent/resources/setup/fastagent.config.yaml +44 -0
  181. fast_agent_mcp-0.3.0/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +38 -0
  182. fast_agent_mcp-0.3.0/src/fast_agent/tools/elicitation.py +369 -0
  183. fast_agent_mcp-0.3.0/src/fast_agent/types/__init__.py +32 -0
  184. fast_agent_mcp-0.3.0/src/fast_agent/types/llm_stop_reason.py +77 -0
  185. fast_agent_mcp-0.3.0/src/fast_agent/ui/__init__.py +38 -0
  186. fast_agent_mcp-0.3.0/src/fast_agent/ui/console_display.py +1005 -0
  187. {fast_agent_mcp-0.2.57/src/mcp_agent/human_input → fast_agent_mcp-0.3.0/src/fast_agent/ui}/elicitation_form.py +56 -39
  188. fast_agent_mcp-0.2.57/src/mcp_agent/human_input/elicitation_forms.py → fast_agent_mcp-0.3.0/src/fast_agent/ui/elicitation_style.py +1 -1
  189. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/ui}/enhanced_prompt.py +96 -25
  190. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/ui}/interactive_prompt.py +330 -125
  191. fast_agent_mcp-0.3.0/src/fast_agent/ui/mcp_ui_utils.py +224 -0
  192. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/ui}/progress_display.py +2 -2
  193. {fast_agent_mcp-0.2.57/src/mcp_agent/logging → fast_agent_mcp-0.3.0/src/fast_agent/ui}/rich_progress.py +4 -4
  194. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/ui}/usage_display.py +3 -8
  195. fast_agent_mcp-0.2.57/examples/bedrock/fast-agent.config.yaml +0 -13
  196. fast_agent_mcp-0.2.57/src/mcp_agent/__init__.py +0 -114
  197. fast_agent_mcp-0.2.57/src/mcp_agent/agents/agent.py +0 -92
  198. fast_agent_mcp-0.2.57/src/mcp_agent/agents/workflow/__init__.py +0 -1
  199. fast_agent_mcp-0.2.57/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -597
  200. fast_agent_mcp-0.2.57/src/mcp_agent/app.py +0 -175
  201. fast_agent_mcp-0.2.57/src/mcp_agent/core/__init__.py +0 -26
  202. fast_agent_mcp-0.2.57/src/mcp_agent/core/prompt.py +0 -191
  203. fast_agent_mcp-0.2.57/src/mcp_agent/event_progress.py +0 -134
  204. fast_agent_mcp-0.2.57/src/mcp_agent/human_input/handler.py +0 -81
  205. fast_agent_mcp-0.2.57/src/mcp_agent/llm/__init__.py +0 -2
  206. fast_agent_mcp-0.2.57/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -232
  207. fast_agent_mcp-0.2.57/src/mcp_agent/llm/augmented_llm_slow.py +0 -53
  208. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/__init__.py +0 -8
  209. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -717
  210. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +0 -1788
  211. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -495
  212. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -57
  213. fast_agent_mcp-0.2.57/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -26
  214. fast_agent_mcp-0.2.57/src/mcp_agent/llm/sampling_format_converter.py +0 -37
  215. fast_agent_mcp-0.2.57/src/mcp_agent/logging/__init__.py +0 -0
  216. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/__init__.py +0 -50
  217. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/helpers/__init__.py +0 -25
  218. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/helpers/content_helpers.py +0 -187
  219. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/interfaces.py +0 -266
  220. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  221. fast_agent_mcp-0.2.57/src/mcp_agent/mcp/prompts/__main__.py +0 -10
  222. fast_agent_mcp-0.2.57/src/mcp_agent/mcp_server_registry.py +0 -343
  223. fast_agent_mcp-0.2.57/src/mcp_agent/tools/tool_definition.py +0 -14
  224. fast_agent_mcp-0.2.57/src/mcp_agent/ui/console_display.py +0 -790
  225. fast_agent_mcp-0.2.57/src/mcp_agent/ui/console_display_legacy.py +0 -401
  226. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/LICENSE +0 -0
  227. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/azure-openai/fastagent.config.yaml +0 -0
  228. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/custom-agents/fastagent.config.yaml +0 -0
  229. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/data-analysis/fastagent.config.yaml +0 -0
  230. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  231. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  232. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  233. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  234. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  235. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  236. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  237. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  238. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  239. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  240. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/vision-examples/cat.png +0 -0
  241. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  242. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/otel/docker-compose.yaml +0 -0
  243. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/otel/fastagent.config.yaml +0 -0
  244. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/researcher/fastagent.config.yaml +0 -0
  245. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/.env.sample +0 -0
  246. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/Makefile +0 -0
  247. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/README.md +0 -0
  248. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/demo_images/clam.jpg +0 -0
  249. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/demo_images/crab.png +0 -0
  250. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/demo_images/shrimp.png +0 -0
  251. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/docker-compose.yml +0 -0
  252. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/fastagent.config.yaml +0 -0
  253. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  254. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  255. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  256. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  257. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  258. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  259. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  260. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/workflows/fastagent.config.yaml +0 -0
  261. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/workflows/graded_report.md +0 -0
  262. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/workflows/short_story.md +0 -0
  263. {fast_agent_mcp-0.2.57 → fast_agent_mcp-0.3.0}/examples/workflows/short_story.txt +0 -0
  264. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/agents/workflow/orchestrator_prompts.py +0 -0
  265. {fast_agent_mcp-0.2.57/src/mcp_agent/agents → fast_agent_mcp-0.3.0/src/fast_agent/cli}/__init__.py +0 -0
  266. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/cli/constants.py +0 -0
  267. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/error_handling.py +0 -0
  268. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/core/exceptions.py +0 -0
  269. {fast_agent_mcp-0.2.57/src/mcp_agent/cli → fast_agent_mcp-0.3.0/src/fast_agent/core/executor}/__init__.py +0 -0
  270. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/executor/task_registry.py +0 -0
  271. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/core}/executor/workflow_signal.py +0 -0
  272. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/human_input/form_fields.py +0 -0
  273. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/llm/prompt_utils.py +0 -0
  274. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/llm}/request_params.py +0 -0
  275. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/common.py +0 -0
  276. {fast_agent_mcp-0.2.57/src/mcp_agent/executor → fast_agent_mcp-0.3.0/src/fast_agent/mcp/prompts}/__init__.py +0 -0
  277. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/mcp/prompts/prompt_constants.py +0 -0
  278. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/py.typed +0 -0
  279. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  280. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  281. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  282. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  283. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  284. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  285. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  286. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  287. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/researcher/fastagent.config.yaml +0 -0
  288. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/.env.sample +0 -0
  289. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/Makefile +0 -0
  290. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/README.md +0 -0
  291. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  292. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/demo_images/crab.png +0 -0
  293. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  294. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/docker-compose.yml +0 -0
  295. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  296. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  297. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  298. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  299. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  300. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  301. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  302. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  303. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  304. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/workflows/fastagent.config.yaml +0 -0
  305. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/workflows/graded_report.md +0 -0
  306. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/workflows/short_story.md +0 -0
  307. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent}/resources/examples/workflows/short_story.txt +0 -0
  308. {fast_agent_mcp-0.2.57/src/mcp_agent → fast_agent_mcp-0.3.0/src/fast_agent/ui}/console.py +0 -0
  309. {fast_agent_mcp-0.2.57/src/mcp_agent/core → fast_agent_mcp-0.3.0/src/fast_agent/ui}/mermaid_utils.py +0 -0
@@ -161,7 +161,7 @@ examples/**/*.secrets.yaml
161
161
  !examples/**/*.secrets.yaml.example
162
162
 
163
163
  # Build-generated resources (copied from examples/ during build)
164
- src/mcp_agent/resources/examples/
164
+ src/fast_agent/resources/
165
165
 
166
166
  # Test data files
167
167
  examples/mcp_root_test/test_data/*.png
@@ -179,8 +179,6 @@ project_contents.md
179
179
 
180
180
  # example logs
181
181
  examples/**/*.jsonl
182
- mcp_agent.config.yaml
183
- mcp_agent.secrets.yaml
184
182
  fastagent.secrets.yaml
185
183
  CLAUDE.md
186
184
  example-outputs/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.57
3
+ Version: 0.3.0
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,18 +208,18 @@ 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
211
+ Requires-Python: >=3.13.7
212
212
  Requires-Dist: a2a-sdk>=0.3.0
213
213
  Requires-Dist: aiohttp>=3.11.13
214
- Requires-Dist: anthropic>=0.63.0
214
+ Requires-Dist: anthropic>=0.66.0
215
215
  Requires-Dist: azure-identity>=1.14.0
216
216
  Requires-Dist: boto3>=1.35.0
217
217
  Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
- Requires-Dist: google-genai>=1.27.0
221
- Requires-Dist: mcp==1.12.4
222
- Requires-Dist: openai>=1.99.9
220
+ Requires-Dist: google-genai>=1.33.0
221
+ Requires-Dist: mcp==1.14.0
222
+ Requires-Dist: openai>=1.106.1
223
223
  Requires-Dist: opentelemetry-distro>=0.55b0
224
224
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
225
225
  Requires-Dist: opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'
@@ -321,7 +321,7 @@ Here is the complete `sizer.py` Agent application, with boilerplate code:
321
321
 
322
322
  ```python
323
323
  import asyncio
324
- from mcp_agent.core.fastagent import FastAgent
324
+ from fast_agent.core.fastagent import FastAgent
325
325
 
326
326
  # Create the application
327
327
  fast = FastAgent("Agent Example")
@@ -83,7 +83,7 @@ Here is the complete `sizer.py` Agent application, with boilerplate code:
83
83
 
84
84
  ```python
85
85
  import asyncio
86
- from mcp_agent.core.fastagent import FastAgent
86
+ from fast_agent.core.fastagent import FastAgent
87
87
 
88
88
  # Create the application
89
89
  fast = FastAgent("Agent Example")
@@ -0,0 +1,24 @@
1
+ # Example minimal fast-agent.config.yaml for Bedrock
2
+
3
+ # List of supported models: https://docs.aws.amazon.com/bedrock/latest/userguide/models-supported.html
4
+ # Model string format: bedrock.<model_id>.<reasoning_effort>
5
+ # Examples:
6
+ # bedrock.amazon.nova-lite-v1:0 # No reasoning
7
+ # bedrock.claude-sonnet-4-0.high # High reasoning effort
8
+ # bedrock.anthropic.claude-3-7-sonnet-20250219-v1:0.medium # Medium reasoning
9
+ default_model: bedrock.amazon.nova-lite-v1:0
10
+
11
+ # Bedrock uses the AWS credentials provider chain to authenticate.
12
+ # This can be accomplished with aws sso login on local machines,
13
+ # or by IAM roles within AWS.
14
+ # see https://docs.aws.amazon.com/res/latest/ug/sso-idc.html
15
+ bedrock:
16
+ region: "us-east-1" # required
17
+ profile: "default" # optional, defaults to "default" - only needed if you have multiple profiles.
18
+ # Only needed on local machines, not on AWS.
19
+
20
+ # Default reasoning effort for all Bedrock models (can be overridden in model string)
21
+ # Options: "minimal" (off), "low" (512 tokens), "medium" (1024 tokens), "high" (2048 tokens)
22
+ # Note: Only Claude 4, Claude 3.7 Sonnet, and DeepSeek-R1 support reasoning
23
+ # Other models will automatically fallback to no reasoning if unsupported
24
+ reasoning_effort: "minimal" # Default: disabled
@@ -1,13 +1,13 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.agents.base_agent import BaseAgent
4
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.agents.mcp_agent import McpAgent
4
+ from fast_agent.core.fastagent import FastAgent
5
5
 
6
6
  # Create the application
7
7
  fast = FastAgent("fast-agent example")
8
8
 
9
9
 
10
- class MyAgent(BaseAgent):
10
+ class MyAgent(McpAgent):
11
11
  async def initialize(self):
12
12
  await super().initialize()
13
13
  print("it's a-me!...Mario!")
@@ -1,7 +1,7 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
4
- from mcp_agent.llm.augmented_llm import RequestParams
3
+ from fast_agent.core.fastagent import FastAgent
4
+ from fast_agent.llm.fastagent_llm import RequestParams
5
5
 
6
6
  # Create the application
7
7
  fast = FastAgent("Data Analysis & Campaign Generator")
@@ -179,8 +179,9 @@ async def main() -> None:
179
179
  )
180
180
 
181
181
  async with fast.run() as agent:
182
- await agent.research_campaign_creator.prompt(
183
- default_prompt="Analyze the CSV file in the current directory and create a comprehensive multi-lingual social media campaign based on the findings. Save all campaign elements as separate files."
182
+ await agent.interactive(
183
+ "research_campaign_creator",
184
+ default_prompt="Analyze the CSV file in the current directory and create a comprehensive multi-lingual social media campaign based on the findings. Save all campaign elements as separate files.",
184
185
  )
185
186
 
186
187
 
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("Data Analysis (Roots)")
@@ -100,11 +100,25 @@ async def product_review() -> ReadResourceResult:
100
100
  },
101
101
  )
102
102
  review_text: str = Field(
103
- description="Tell us about your experience", min_length=10, max_length=1000
103
+ description="Tell us about your experience",
104
+ default="""Great product!
105
+ Here's what I loved:
106
+
107
+ - Excellent build quality
108
+ - Fast shipping
109
+ - Works as advertised
110
+
111
+ One minor issue:
112
+ - Instructions could be clearer
113
+
114
+ Overall, highly recommended!""",
115
+ min_length=10,
116
+ max_length=1000
104
117
  )
105
118
 
106
119
  result = await mcp.get_context().elicit(
107
- "Share your product review - Help others make informed decisions!", schema=ProductReview
120
+ "Share your product review - Help others make informed decisions!",
121
+ schema=ProductReview,
108
122
  )
109
123
 
110
124
  match result:
@@ -140,6 +154,7 @@ async def account_settings() -> ReadResourceResult:
140
154
  email_notifications: bool = Field(True, description="Receive email notifications?")
141
155
  marketing_emails: bool = Field(False, description="Subscribe to marketing emails?")
142
156
  theme: str = Field(
157
+ "dark",
143
158
  description="Choose your preferred theme",
144
159
  json_schema_extra={
145
160
  "enum": ["light", "dark", "auto"],
@@ -147,7 +162,9 @@ async def account_settings() -> ReadResourceResult:
147
162
  },
148
163
  )
149
164
  privacy_public: bool = Field(False, description="Make your profile public?")
150
- items_per_page: int = Field(description="Items to show per page (10-100)", ge=10, le=100)
165
+ items_per_page: int = Field(
166
+ 25, description="Items to show per page (10-100)", ge=10, le=100
167
+ )
151
168
 
152
169
  result = await mcp.get_context().elicit("Update your account settings", schema=AccountSettings)
153
170
 
@@ -182,7 +199,11 @@ async def service_appointment() -> ReadResourceResult:
182
199
 
183
200
  class ServiceAppointment(BaseModel):
184
201
  customer_name: str = Field(description="Your full name", min_length=2, max_length=50)
202
+ phone_number: str = Field(
203
+ "555-", description="Contact phone number", min_length=10, max_length=20
204
+ )
185
205
  vehicle_type: str = Field(
206
+ default="sedan",
186
207
  description="What type of vehicle do you have?",
187
208
  json_schema_extra={
188
209
  "enum": ["sedan", "suv", "truck", "motorcycle", "other"],
@@ -205,6 +226,7 @@ async def service_appointment() -> ReadResourceResult:
205
226
  lines = [
206
227
  "🔧 Service Appointment Scheduled!",
207
228
  f"👤 Customer: {data.customer_name}",
229
+ f"📞 Phone: {data.phone_number}",
208
230
  f"🚗 Vehicle: {data.vehicle_type.title()}",
209
231
  f"🚙 Loaner needed: {'Yes' if data.needs_loaner else 'No'}",
210
232
  f"📅 Appointment: {data.appointment_time}",
@@ -13,8 +13,8 @@ import asyncio
13
13
  from rich.console import Console
14
14
  from rich.panel import Panel
15
15
 
16
- from mcp_agent.core.fastagent import FastAgent
17
- from mcp_agent.mcp.helpers.content_helpers import get_resource_text
16
+ from fast_agent.core.fastagent import FastAgent
17
+ from fast_agent.mcp.helpers.content_helpers import get_resource_text
18
18
 
19
19
  fast = FastAgent("Elicitation Forms Demo", quiet=True)
20
20
  console = Console()
@@ -38,7 +38,7 @@ async def main():
38
38
  console.print(
39
39
  "[dim]Demonstrates: string validation, email format, URL format, date format[/dim]"
40
40
  )
41
- result = await agent.get_resource("elicitation://event-registration")
41
+ result = await agent["forms-demo"].get_resource("elicitation://event-registration")
42
42
 
43
43
  if result_text := get_resource_text(result):
44
44
  panel = Panel(
@@ -14,8 +14,8 @@ from game_character_handler import game_character_elicitation_handler
14
14
  from rich.console import Console
15
15
  from rich.panel import Panel
16
16
 
17
- from mcp_agent.core.fastagent import FastAgent
18
- from mcp_agent.mcp.helpers.content_helpers import get_resource_text
17
+ from fast_agent.core.fastagent import FastAgent
18
+ from fast_agent.mcp.helpers.content_helpers import get_resource_text
19
19
 
20
20
  fast = FastAgent("Game Character Creator", quiet=True)
21
21
  console = Console()
@@ -17,7 +17,7 @@ from rich.progress import BarColumn, Progress, TextColumn
17
17
  from rich.prompt import Confirm
18
18
  from rich.table import Table
19
19
 
20
- from mcp_agent.logging.logger import get_logger
20
+ from fast_agent.core.logging.logger import get_logger
21
21
 
22
22
  if TYPE_CHECKING:
23
23
  from mcp import ClientSession
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("fast-agent example")
@@ -1,16 +1,13 @@
1
1
  import asyncio
2
2
  import sys
3
3
 
4
- from mcp_agent.core.fastagent import FastAgent, PromptExitError
4
+ from fast_agent.core.fastagent import FastAgent, PromptExitError
5
+
6
+ fast_agent = FastAgent(name="MCP Filtering Demo", parse_cli_args=False, quiet=False)
5
7
 
6
- fast_agent = FastAgent(
7
- name="MCP Filtering Demo",
8
- parse_cli_args=False,
9
- quiet=False
10
- )
11
8
 
12
9
  @fast_agent.agent(
13
- name="filtered_agent",
10
+ name="filtered_agent",
14
11
  model="gpt-4o-mini",
15
12
  instruction="You are a creative writer with filtered access to tools, resources, and prompts.",
16
13
  servers=["creativity"],
@@ -19,75 +16,82 @@ fast_agent = FastAgent(
19
16
  # Resource filtering: only writing resources (not coding resources)
20
17
  resources={"creativity": ["resource://writing/*"]},
21
18
  # Prompt filtering: only writing prompts (not coding prompts)
22
- prompts={"creativity": ["writing_*"]}
19
+ prompts={"creativity": ["writing_*"]},
23
20
  )
24
21
  async def filtered_agent():
25
22
  return "Filtered agent ready"
26
23
 
24
+
27
25
  @fast_agent.agent(
28
26
  name="unfiltered_agent",
29
- model="gpt-4o-mini",
27
+ model="gpt-4o-mini",
30
28
  instruction="You are a creative writer with access to all tools, resources, and prompts.",
31
- servers=["creativity"]
29
+ servers=["creativity"],
32
30
  # No filtering - gets everything
33
31
  )
34
32
  async def unfiltered_agent():
35
33
  return "Unfiltered agent ready"
36
34
 
35
+
37
36
  async def main():
38
37
  try:
39
38
  async with fast_agent.run() as agent:
40
39
  try:
41
40
  print("🎯 MCP Filtering Demo")
42
41
  print("=" * 50)
43
-
42
+
44
43
  # Show filtered agent capabilities
45
44
  print("\n📦 FILTERED AGENT:")
46
45
  filtered = agent._agent("filtered_agent")
47
-
46
+
48
47
  tools = await filtered.list_tools()
49
- print(f"✅ Available tools ({len(tools.tools)}): {[tool.name for tool in tools.tools]}")
50
-
48
+ print(
49
+ f"✅ Available tools ({len(tools.tools)}): {[tool.name for tool in tools.tools]}"
50
+ )
51
+
51
52
  resources = await filtered.list_resources()
52
53
  resource_list = resources.get("creativity", [])
53
54
  print(f"📚 Available resources ({len(resource_list)}): {resource_list}")
54
-
55
+
55
56
  prompts = await filtered.list_prompts()
56
57
  prompt_list = prompts.get("creativity", [])
57
58
  prompt_names = [p.name for p in prompt_list]
58
59
  print(f"💬 Available prompts ({len(prompt_names)}): {prompt_names}")
59
-
60
+
60
61
  # Show unfiltered agent capabilities
61
62
  print("\n🌐 UNFILTERED AGENT:")
62
63
  unfiltered = agent._agent("unfiltered_agent")
63
-
64
+
64
65
  tools = await unfiltered.list_tools()
65
- print(f"✅ Available tools ({len(tools.tools)}): {[tool.name for tool in tools.tools]}")
66
-
66
+ print(
67
+ f"✅ Available tools ({len(tools.tools)}): {[tool.name for tool in tools.tools]}"
68
+ )
69
+
67
70
  resources = await unfiltered.list_resources()
68
71
  resource_list = resources.get("creativity", [])
69
72
  print(f"📚 Available resources ({len(resource_list)}): {resource_list}")
70
-
73
+
71
74
  prompts = await unfiltered.list_prompts()
72
75
  prompt_list = prompts.get("creativity", [])
73
76
  prompt_names = [p.name for p in prompt_list]
74
77
  print(f"💬 Available prompts ({len(prompt_names)}): {prompt_names}")
75
-
78
+
76
79
  print("\n" + "=" * 50)
77
80
  print("🚀 Starting interactive session with filtered agent...")
78
81
  print("Type 'exit' to quit")
79
-
82
+
80
83
  await agent.interactive(agent_name="filtered_agent")
81
84
 
82
85
  except PromptExitError:
83
86
  print("👋 Goodbye!")
84
-
87
+
85
88
  except KeyboardInterrupt:
86
89
  print("\nExiting...")
87
90
  sys.exit(0)
88
91
  except Exception as e:
89
92
  print(f"Error: {e}")
90
93
  import traceback
94
+
91
95
  traceback.print_exc()
92
96
  sys.exit(1)
93
97
 
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("fast-agent agent_one (mcp server)")
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("fast-agent agent_two (mcp client)")
@@ -1,8 +1,8 @@
1
1
  import asyncio
2
2
  from pathlib import Path
3
3
 
4
- from mcp_agent.core.fastagent import FastAgent
5
- from mcp_agent.core.prompt import Prompt
4
+ from fast_agent.core.fastagent import FastAgent
5
+ from fast_agent.core.prompt import Prompt
6
6
 
7
7
  # Create the application
8
8
  fast = FastAgent("fast-agent example")
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("fast-agent example")
@@ -1,6 +1,6 @@
1
1
  import asyncio
2
2
 
3
- from mcp_agent.core.fastagent import FastAgent
3
+ from fast_agent.core.fastagent import FastAgent
4
4
 
5
5
  # Create the application
6
6
  fast = FastAgent("fast-agent example")
@@ -0,0 +1,25 @@
1
+ import asyncio
2
+
3
+ from fast_agent.agents.agent_types import AgentConfig
4
+ from fast_agent.agents.llm_agent import LlmAgent
5
+ from fast_agent.core import Core
6
+ from fast_agent.llm.model_factory import ModelFactory
7
+ from fast_agent.llm.request_params import RequestParams
8
+
9
+
10
+ async def main():
11
+ core: Core = Core()
12
+ await core.initialize()
13
+ test: AgentConfig = AgentConfig("hello", model="kimi")
14
+ agent: LlmAgent = LlmAgent(test, context=core.context)
15
+ await agent.attach_llm(ModelFactory.create_factory("haiku"))
16
+ await agent.send("hello world, render some xml tags both inside and outside of code fences")
17
+ await agent.generate("write a 200 word story", RequestParams(maxTokens=50))
18
+ await agent.generate(
19
+ "repeat after me: `one, two, three, four`",
20
+ RequestParams(stopSequences=[" two,"]),
21
+ )
22
+
23
+
24
+ if __name__ == "__main__":
25
+ asyncio.run(main())
@@ -0,0 +1,80 @@
1
+ import asyncio
2
+
3
+ from mcp.server.fastmcp import FastMCP
4
+
5
+ from fast_agent.agents.agent_types import AgentConfig
6
+ from fast_agent.agents.tool_agent import ToolAgent
7
+ from fast_agent.core import Core
8
+ from fast_agent.llm.model_factory import ModelFactory
9
+
10
+ # Initialize FastMCP instance for decorator-based tools
11
+ # Set log_level to WARNING or ERROR to avoid httpx INFO logs
12
+ mcp = FastMCP("Weather Bot", log_level="WARNING")
13
+
14
+
15
+ # Option 1: Using @mcp.tool decorator
16
+ @mcp.tool()
17
+ async def check_weather(city: str) -> str:
18
+ """Check the weather in a given city.
19
+
20
+ Args:
21
+ city: The city to check the weather for
22
+
23
+ Returns:
24
+ Weather information for the city
25
+ """
26
+ return f"The weather in {city} is sunny."
27
+
28
+
29
+ # Option 2: Simple function-based tool (without decorator)
30
+ async def check_weather_function(city: str) -> str:
31
+ """Check the weather in a given city (function version).
32
+
33
+ Args:
34
+ city: The city to check the weather for
35
+
36
+ Returns:
37
+ Weather information for the city
38
+ """
39
+ return f"The weather in {city} is sunny."
40
+
41
+
42
+ # Alternative: Regular (non-async) function also works
43
+ def get_temperature(city: str) -> int:
44
+ """Get the temperature in a city.
45
+
46
+ Args:
47
+ city: The city to get temperature for
48
+
49
+ Returns:
50
+ Temperature in degrees Celsius
51
+ """
52
+ return 22
53
+
54
+
55
+ async def main():
56
+ core: Core = Core()
57
+ await core.initialize()
58
+
59
+ # Create agent configuration
60
+ config = AgentConfig(name="weather_bot", model="haiku")
61
+
62
+ tool_agent = ToolAgent(
63
+ config,
64
+ tools=[
65
+ check_weather,
66
+ get_temperature,
67
+ ],
68
+ context=core.context,
69
+ )
70
+
71
+ # Attach the LLM
72
+ await tool_agent.attach_llm(ModelFactory.create_factory("haiku"))
73
+
74
+ # Test the agent
75
+ await tool_agent.send("What's the weather like in San Francisco and what's the temperature?")
76
+ await core.cleanup()
77
+
78
+
79
+ if __name__ == "__main__":
80
+ asyncio.run(main())
@@ -0,0 +1,110 @@
1
+ import asyncio
2
+ from typing import Any, Dict
3
+
4
+ from mcp.server.fastmcp.tools.base import Tool as FastMCPTool
5
+
6
+ from fast_agent.agents.agent_types import AgentConfig
7
+ from fast_agent.agents.tool_agent import ToolAgent
8
+ from fast_agent.core import Core
9
+ from fast_agent.llm.model_factory import ModelFactory
10
+
11
+
12
+ # Example 1: Simple function that will be wrapped
13
+ async def search_web(query: str, max_results: int = 5) -> str:
14
+ """Search the web for information.
15
+
16
+ Args:
17
+ query: The search query
18
+ max_results: Maximum number of results to return
19
+
20
+ Returns:
21
+ Search results as a formatted string
22
+ """
23
+ # Mock implementation
24
+ return f"Found {max_results} results for '{query}': [Result 1, Result 2, ...]"
25
+
26
+
27
+ # Example 2: Create a FastMCP Tool directly for more control
28
+ def create_calculator_tool() -> FastMCPTool:
29
+ """Create a calculator tool with explicit schema."""
30
+
31
+ def calculate(operation: str, a: float, b: float) -> float:
32
+ """Perform a calculation."""
33
+ operations = {
34
+ "add": lambda x, y: x + y,
35
+ "subtract": lambda x, y: x - y,
36
+ "multiply": lambda x, y: x * y,
37
+ "divide": lambda x, y: x / y if y != 0 else float("inf"),
38
+ }
39
+
40
+ if operation not in operations:
41
+ raise ValueError(f"Unknown operation: {operation}")
42
+
43
+ return operations[operation](a, b)
44
+
45
+ # Create the tool with explicit configuration
46
+ return FastMCPTool.from_function(
47
+ fn=calculate,
48
+ name="calculator",
49
+ description="Perform basic arithmetic operations",
50
+ # FastMCP will still generate the schema, but we could override if needed
51
+ )
52
+
53
+
54
+ # Example 3: Complex async tool with side effects
55
+ async def send_email(to: str, subject: str, body: str) -> Dict[str, Any]:
56
+ """Send an email (mock implementation).
57
+
58
+ Args:
59
+ to: Recipient email address
60
+ subject: Email subject
61
+ body: Email body content
62
+
63
+ Returns:
64
+ Dictionary with send status and message ID
65
+ """
66
+ # Mock async operation
67
+ await asyncio.sleep(0.1)
68
+
69
+ return {
70
+ "status": "sent",
71
+ "message_id": f"msg_{hash((to, subject))}",
72
+ "timestamp": "2024-01-01T12:00:00Z",
73
+ }
74
+
75
+
76
+ async def main():
77
+ core: Core = Core()
78
+ await core.initialize()
79
+
80
+ # Create agent configuration
81
+ config = AgentConfig(name="assistant", model="haiku")
82
+
83
+ # Mix different tool types
84
+ tools = [
85
+ search_web, # Async function
86
+ create_calculator_tool(), # Pre-configured FastMCP Tool
87
+ send_email, # Complex async function
88
+ ]
89
+
90
+ # Create tool agent
91
+ tool_agent = ToolAgent(config, tools=tools, context=core.context)
92
+
93
+ # Attach the LLM
94
+ await tool_agent.attach_llm(ModelFactory.create_factory("haiku"))
95
+
96
+ # Test various tools
97
+ print("Testing search:")
98
+ await tool_agent.send("Search for information about Python FastMCP")
99
+
100
+ print("\nTesting calculator:")
101
+ await tool_agent.send("What is 42 multiplied by 17?")
102
+
103
+ print("\nTesting email:")
104
+ await tool_agent.send(
105
+ "Send an email to test@example.com with subject 'Hello' and body 'Test message'"
106
+ )
107
+
108
+
109
+ if __name__ == "__main__":
110
+ asyncio.run(main())