fast-agent-mcp 0.2.29__tar.gz → 0.2.30__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 (199) hide show
  1. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/commands/check_config.py +11 -2
  4. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/config.py +16 -1
  5. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/enhanced_prompt.py +105 -0
  6. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/model_factory.py +6 -0
  7. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/provider_key_manager.py +1 -0
  8. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/provider_types.py +2 -0
  9. fast_agent_mcp-0.2.30/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +30 -0
  10. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +15 -1
  11. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/hf_auth.py +20 -1
  12. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/mcp_aggregator.py +2 -1
  13. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/.gitignore +0 -0
  14. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/LICENSE +0 -0
  15. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/README.md +0 -0
  16. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/azure-openai/fastagent.config.yaml +0 -0
  17. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/data-analysis/analysis-campaign.py +0 -0
  18. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/data-analysis/analysis.py +0 -0
  19. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/data-analysis/fastagent.config.yaml +0 -0
  20. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  21. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/state-transfer/agent_one.py +0 -0
  22. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/state-transfer/agent_two.py +0 -0
  23. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  24. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/vision-examples/example1.py +0 -0
  25. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/vision-examples/example2.py +0 -0
  26. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/vision-examples/example3.py +0 -0
  27. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  28. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/otel/agent.py +0 -0
  29. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/otel/agent2.py +0 -0
  30. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/otel/docker-compose.yaml +0 -0
  31. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/otel/fastagent.config.yaml +0 -0
  32. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/researcher/fastagent.config.yaml +0 -0
  33. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/researcher/researcher-eval.py +0 -0
  34. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/researcher/researcher-imp.py +0 -0
  35. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/researcher/researcher.py +0 -0
  36. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/README.md +0 -0
  37. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/agent.py +0 -0
  38. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/docker-compose.yml +0 -0
  39. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/fastagent.config.yaml +0 -0
  40. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/image_demo.py +0 -0
  41. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  42. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/tensorzero/simple_agent.py +0 -0
  43. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/chaining.py +0 -0
  44. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/evaluator.py +0 -0
  45. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/fastagent.config.yaml +0 -0
  46. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/graded_report.md +0 -0
  47. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/human_input.py +0 -0
  48. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/orchestrator.py +0 -0
  49. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/parallel.py +0 -0
  50. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/router.py +0 -0
  51. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/short_story.md +0 -0
  52. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/examples/workflows/short_story.txt +0 -0
  53. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/__init__.py +0 -0
  54. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/__init__.py +0 -0
  55. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/agent.py +0 -0
  56. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/base_agent.py +0 -0
  57. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  58. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  59. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  60. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  61. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  62. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  63. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  64. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  65. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/app.py +0 -0
  66. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/__init__.py +0 -0
  67. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/__main__.py +0 -0
  68. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/commands/go.py +0 -0
  69. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  70. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/commands/setup.py +0 -0
  71. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  72. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/main.py +0 -0
  73. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/cli/terminal.py +0 -0
  74. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/console.py +0 -0
  75. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/context.py +0 -0
  76. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/context_dependent.py +0 -0
  77. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/__init__.py +0 -0
  78. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/agent_app.py +0 -0
  79. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/agent_types.py +0 -0
  80. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/direct_decorators.py +0 -0
  81. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/direct_factory.py +0 -0
  82. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/error_handling.py +0 -0
  83. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/exceptions.py +0 -0
  84. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/fastagent.py +0 -0
  85. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/interactive_prompt.py +0 -0
  86. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/mcp_content.py +0 -0
  87. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/prompt.py +0 -0
  88. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/request_params.py +0 -0
  89. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/core/validation.py +0 -0
  90. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/event_progress.py +0 -0
  91. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/executor/__init__.py +0 -0
  92. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/executor/executor.py +0 -0
  93. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/executor/task_registry.py +0 -0
  94. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/executor/workflow_signal.py +0 -0
  95. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/human_input/__init__.py +0 -0
  96. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/human_input/handler.py +0 -0
  97. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/human_input/types.py +0 -0
  98. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/__init__.py +0 -0
  99. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/augmented_llm.py +0 -0
  100. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  101. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  102. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  103. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/memory.py +0 -0
  104. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/prompt_utils.py +0 -0
  105. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/__init__.py +0 -0
  106. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  107. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -0
  108. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
  109. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  110. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
  111. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  112. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_openai.py +0 -0
  113. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  114. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +0 -0
  115. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  116. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  117. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  118. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +0 -0
  119. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  120. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  121. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  122. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  123. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/sampling_converter.py +0 -0
  124. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  125. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/__init__.py +0 -0
  126. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/events.py +0 -0
  127. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/json_serializer.py +0 -0
  128. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/listeners.py +0 -0
  129. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/logger.py +0 -0
  130. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/rich_progress.py +0 -0
  131. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/logging/transport.py +0 -0
  132. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/__init__.py +0 -0
  133. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/common.py +0 -0
  134. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/gen_client.py +0 -0
  135. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  136. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  137. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  138. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/interfaces.py +0 -0
  139. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/logger_textio.py +0 -0
  140. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  141. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  142. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/mime_utils.py +0 -0
  143. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  144. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompt_render.py +0 -0
  145. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  146. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  147. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  148. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  149. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  150. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  151. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  152. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  153. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/resource_utils.py +0 -0
  154. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp/sampling.py +0 -0
  155. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp_server/__init__.py +0 -0
  156. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  157. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/mcp_server_registry.py +0 -0
  158. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/progress_display.py +0 -0
  159. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  160. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  161. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  162. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  163. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/in_dev/agent_build.py +0 -0
  164. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/in_dev/css-LICENSE.txt +0 -0
  165. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/in_dev/slides.py +0 -0
  166. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/agent.py +0 -0
  167. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/fastagent.config.yaml +0 -0
  168. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/history_transfer.py +0 -0
  169. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/job.py +0 -0
  170. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/prompt_category.py +0 -0
  171. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/prompt_sizing.py +0 -0
  172. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/simple.txt +0 -0
  173. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/sizer.py +0 -0
  174. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/internal/social.py +0 -0
  175. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  176. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  177. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  178. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  179. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/__init__.py +0 -0
  180. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/agent.py +0 -0
  181. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/delimited_prompt.txt +0 -0
  182. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/fastagent.config.yaml +0 -0
  183. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/image_server.py +0 -0
  184. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/prompt1.txt +0 -0
  185. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/prompting/work_with_image.py +0 -0
  186. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  187. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  188. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  189. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  190. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  191. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  192. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  193. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  194. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  195. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  196. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  197. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  198. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/tools/tool_definition.py +0 -0
  199. {fast_agent_mcp-0.2.29 → fast_agent_mcp-0.2.30}/src/mcp_agent/ui/console_display.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.29
3
+ Version: 0.2.30
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
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.2.29"
3
+ version = "0.2.30"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -226,8 +226,17 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
226
226
 
227
227
  # Determine transport type
228
228
  if "url" in server_config:
229
- server_info["transport"] = "SSE"
230
- server_info["url"] = server_config.get("url", "")
229
+ url = server_config.get("url", "")
230
+ server_info["url"] = url
231
+
232
+ # Use URL path to determine transport type
233
+ try:
234
+ from .url_parser import parse_server_url
235
+ _, transport_type, _ = parse_server_url(url)
236
+ server_info["transport"] = transport_type.upper()
237
+ except Exception:
238
+ # Fallback to HTTP if URL parsing fails
239
+ server_info["transport"] = "HTTP"
231
240
 
232
241
  # Get command and args
233
242
  command = server_config.get("command", "")
@@ -222,6 +222,15 @@ class TensorZeroSettings(BaseModel):
222
222
  model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
223
223
 
224
224
 
225
+ class HuggingFaceSettings(BaseModel):
226
+ """
227
+ Settings for HuggingFace authentication (used for MCP connections).
228
+ """
229
+
230
+ api_key: Optional[str] = None
231
+ model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
232
+
233
+
225
234
  class LoggerSettings(BaseModel):
226
235
  """
227
236
  Logger settings for the fast-agent application.
@@ -291,7 +300,7 @@ class Settings(BaseSettings):
291
300
  Default model for agents. Format is provider.model_name.<reasoning_effort>, for example openai.o3-mini.low
292
301
  Aliases are provided for common models e.g. sonnet, haiku, gpt-4.1, o3-mini etc.
293
302
  """
294
-
303
+
295
304
  auto_sampling: bool = True
296
305
  """Enable automatic sampling model selection if not explicitly configured"""
297
306
 
@@ -322,6 +331,12 @@ class Settings(BaseSettings):
322
331
  azure: AzureSettings | None = None
323
332
  """Settings for using Azure OpenAI Service in the fast-agent application"""
324
333
 
334
+ aliyun: OpenAISettings | None = None
335
+ """Settings for using Aliyun OpenAI Service in the fast-agent application"""
336
+
337
+ huggingface: HuggingFaceSettings | None = None
338
+ """Settings for HuggingFace authentication (used for MCP connections)"""
339
+
325
340
  logger: LoggerSettings | None = LoggerSettings()
326
341
  """Logger settings for the fast-agent application"""
327
342
 
@@ -2,6 +2,11 @@
2
2
  Enhanced prompt functionality with advanced prompt_toolkit features.
3
3
  """
4
4
 
5
+ import asyncio
6
+ import os
7
+ import shlex
8
+ import subprocess
9
+ import tempfile
5
10
  from importlib.metadata import version
6
11
  from typing import List, Optional
7
12
 
@@ -96,6 +101,85 @@ class AgentCompleter(Completer):
96
101
  )
97
102
 
98
103
 
104
+ # Helper function to open text in an external editor
105
+ def get_text_from_editor(initial_text: str = "") -> str:
106
+ """
107
+ Opens the user\'s configured editor ($VISUAL or $EDITOR) to edit the initial_text.
108
+ Falls back to \'nano\' (Unix) or \'notepad\' (Windows) if neither is set.
109
+ Returns the edited text, or the original text if an error occurs.
110
+ """
111
+ editor_cmd_str = os.environ.get("VISUAL") or os.environ.get("EDITOR")
112
+
113
+ if not editor_cmd_str:
114
+ if os.name == "nt": # Windows
115
+ editor_cmd_str = "notepad"
116
+ else: # Unix-like (Linux, macOS)
117
+ editor_cmd_str = "nano" # A common, usually available, simple editor
118
+
119
+ # Use shlex.split to handle editors with arguments (e.g., "code --wait")
120
+ try:
121
+ editor_cmd_list = shlex.split(editor_cmd_str)
122
+ if not editor_cmd_list: # Handle empty string from shlex.split
123
+ raise ValueError("Editor command string is empty or invalid.")
124
+ except ValueError as e:
125
+ rich_print(f"[red]Error: Invalid editor command string ('{editor_cmd_str}'): {e}[/red]")
126
+ return initial_text
127
+
128
+ # Create a temporary file for the editor to use.
129
+ # Using a suffix can help some editors with syntax highlighting or mode.
130
+ try:
131
+ with tempfile.NamedTemporaryFile(
132
+ mode="w+", delete=False, suffix=".txt", encoding="utf-8"
133
+ ) as tmp_file:
134
+ if initial_text:
135
+ tmp_file.write(initial_text)
136
+ tmp_file.flush() # Ensure content is written to disk before editor opens it
137
+ temp_file_path = tmp_file.name
138
+ except Exception as e:
139
+ rich_print(f"[red]Error: Could not create temporary file for editor: {e}[/red]")
140
+ return initial_text
141
+
142
+ try:
143
+ # Construct the full command: editor_parts + [temp_file_path]
144
+ # e.g., [\'vim\', \'/tmp/somefile.txt\'] or [\'code\', \'--wait\', \'/tmp/somefile.txt\']
145
+ full_cmd = editor_cmd_list + [temp_file_path]
146
+
147
+ # Run the editor. This is a blocking call.
148
+ subprocess.run(full_cmd, check=True)
149
+
150
+ # Read the content back from the temporary file.
151
+ with open(temp_file_path, "r", encoding="utf-8") as f:
152
+ edited_text = f.read()
153
+
154
+ except FileNotFoundError:
155
+ rich_print(
156
+ f"[red]Error: Editor command '{editor_cmd_list[0]}' not found. "
157
+ f"Please set $VISUAL or $EDITOR correctly, or install '{editor_cmd_list[0]}'.[/red]"
158
+ )
159
+ return initial_text
160
+ except subprocess.CalledProcessError as e:
161
+ rich_print(
162
+ f"[red]Error: Editor '{editor_cmd_list[0]}' closed with an error (code {e.returncode}).[/red]"
163
+ )
164
+ return initial_text
165
+ except Exception as e:
166
+ rich_print(
167
+ f"[red]An unexpected error occurred while launching or using the editor: {e}[/red]"
168
+ )
169
+ return initial_text
170
+ finally:
171
+ # Always attempt to clean up the temporary file.
172
+ if "temp_file_path" in locals() and os.path.exists(temp_file_path):
173
+ try:
174
+ os.remove(temp_file_path)
175
+ except Exception as e:
176
+ rich_print(
177
+ f"[yellow]Warning: Could not remove temporary file {temp_file_path}: {e}[/yellow]"
178
+ )
179
+
180
+ return edited_text.strip() # Added strip() to remove trailing newlines often added by editors
181
+
182
+
99
183
  def create_keybindings(on_toggle_multiline=None, app=None):
100
184
  """Create custom key bindings."""
101
185
  kb = KeyBindings()
@@ -140,6 +224,27 @@ def create_keybindings(on_toggle_multiline=None, app=None):
140
224
  """Ctrl+L: Clear the input buffer."""
141
225
  event.current_buffer.text = ""
142
226
 
227
+ @kb.add("c-e")
228
+ async def _(event) -> None:
229
+ """Ctrl+E: Edit current buffer in $EDITOR."""
230
+ current_text = event.app.current_buffer.text
231
+ try:
232
+ # Run the synchronous editor function in a thread
233
+ edited_text = await event.app.loop.run_in_executor(
234
+ None, get_text_from_editor, current_text
235
+ )
236
+ event.app.current_buffer.text = edited_text
237
+ # Optionally, move cursor to the end of the edited text
238
+ event.app.current_buffer.cursor_position = len(edited_text)
239
+ except asyncio.CancelledError:
240
+ rich_print("[yellow]Editor interaction cancelled.[/yellow]")
241
+ except Exception as e:
242
+ rich_print(f"[red]Error during editor interaction: {e}[/red]")
243
+ finally:
244
+ # Ensure the UI is updated
245
+ if event.app:
246
+ event.app.invalidate()
247
+
143
248
  return kb
144
249
 
145
250
 
@@ -10,6 +10,7 @@ from mcp_agent.llm.augmented_llm_passthrough import PassthroughLLM
10
10
  from mcp_agent.llm.augmented_llm_playback import PlaybackLLM
11
11
  from mcp_agent.llm.augmented_llm_slow import SlowLLM
12
12
  from mcp_agent.llm.provider_types import Provider
13
+ from mcp_agent.llm.providers.augmented_llm_aliyun import AliyunAugmentedLLM
13
14
  from mcp_agent.llm.providers.augmented_llm_anthropic import AnthropicAugmentedLLM
14
15
  from mcp_agent.llm.providers.augmented_llm_azure import AzureOpenAIAugmentedLLM
15
16
  from mcp_agent.llm.providers.augmented_llm_deepseek import DeepSeekAugmentedLLM
@@ -103,6 +104,10 @@ class ModelFactory:
103
104
  "gemini-2.0-flash": Provider.GOOGLE,
104
105
  "gemini-2.5-flash-preview-05-20": Provider.GOOGLE,
105
106
  "gemini-2.5-pro-preview-05-06": Provider.GOOGLE,
107
+ "qwen-turbo": Provider.ALIYUN,
108
+ "qwen-plus": Provider.ALIYUN,
109
+ "qwen-max": Provider.ALIYUN,
110
+ "qwen-long": Provider.ALIYUN,
106
111
  }
107
112
 
108
113
  MODEL_ALIASES = {
@@ -136,6 +141,7 @@ class ModelFactory:
136
141
  Provider.OPENROUTER: OpenRouterAugmentedLLM,
137
142
  Provider.TENSORZERO: TensorZeroAugmentedLLM,
138
143
  Provider.AZURE: AzureOpenAIAugmentedLLM,
144
+ Provider.ALIYUN: AliyunAugmentedLLM,
139
145
  }
140
146
 
141
147
  # Mapping of special model names to their specific LLM classes
@@ -17,6 +17,7 @@ PROVIDER_ENVIRONMENT_MAP: Dict[str, str] = {
17
17
  "google": "GOOGLE_API_KEY",
18
18
  "openrouter": "OPENROUTER_API_KEY",
19
19
  "generic": "GENERIC_API_KEY",
20
+ "huggingface": "HF_TOKEN",
20
21
  }
21
22
  API_KEY_HINT_TEXT = "<your-api-key-here>"
22
23
 
@@ -18,3 +18,5 @@ class Provider(Enum):
18
18
  OPENROUTER = "openrouter"
19
19
  TENSORZERO = "tensorzero" # For TensorZero Gateway
20
20
  AZURE = "azure" # Azure OpenAI Service
21
+ ALIYUN = "aliyun" # Aliyun Bailian OpenAI Service
22
+ HUGGINGFACE = "huggingface" # For HuggingFace MCP connections
@@ -0,0 +1,30 @@
1
+ from mcp_agent.core.request_params import RequestParams
2
+ from mcp_agent.llm.provider_types import Provider
3
+ from mcp_agent.llm.providers.augmented_llm_openai import OpenAIAugmentedLLM
4
+
5
+ ALIYUN_BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode/v1"
6
+ DEFAULT_QWEN_MODEL = "qwen-turbo"
7
+
8
+
9
+ class AliyunAugmentedLLM(OpenAIAugmentedLLM):
10
+ def __init__(self, *args, **kwargs) -> None:
11
+ super().__init__(*args, provider=Provider.ALIYUN, **kwargs)
12
+
13
+ def _initialize_default_params(self, kwargs: dict) -> RequestParams:
14
+ """Initialize Aliyun-specific default parameters"""
15
+ chosen_model = kwargs.get("model", DEFAULT_QWEN_MODEL)
16
+
17
+ return RequestParams(
18
+ model=chosen_model,
19
+ systemPrompt=self.instruction,
20
+ parallel_tool_calls=True,
21
+ max_iterations=10,
22
+ use_history=True,
23
+ )
24
+
25
+ def _base_url(self) -> str:
26
+ base_url = None
27
+ if self.context.config and self.context.config.aliyun:
28
+ base_url = self.context.config.aliyun.base_url
29
+
30
+ return base_url if base_url else ALIYUN_BASE_URL
@@ -1,4 +1,10 @@
1
- from typing import List, Tuple, Type
1
+ from copy import copy
2
+ from typing import List, Tuple, Type, cast
3
+
4
+ from openai.types.chat import (
5
+ ChatCompletionAssistantMessageParam,
6
+ ChatCompletionMessage,
7
+ )
2
8
 
3
9
  from mcp_agent.core.request_params import RequestParams
4
10
  from mcp_agent.llm.provider_types import Provider
@@ -77,3 +83,11 @@ class DeepSeekAugmentedLLM(OpenAIAugmentedLLM):
77
83
  multipart_messages, request_params
78
84
  )
79
85
  return self._structured_from_multipart(result, model)
86
+
87
+ @classmethod
88
+ def convert_message_to_message_param(cls, message: ChatCompletionMessage, **kwargs) -> ChatCompletionAssistantMessageParam:
89
+ """Convert a response object to an input parameter object to allow LLM calls to be chained."""
90
+ if hasattr(message, "reasoning_content"):
91
+ message = copy(message)
92
+ del message.reasoning_content
93
+ return cast("ChatCompletionAssistantMessageParam", message)
@@ -22,7 +22,26 @@ def is_huggingface_url(url: str) -> bool:
22
22
  return False
23
23
 
24
24
  # Check for HuggingFace domains
25
- return hostname in {"hf.co", "huggingface.co"}
25
+ if hostname in {"hf.co", "huggingface.co"}:
26
+ return True
27
+
28
+ # Check for HuggingFace Spaces (*.hf.space)
29
+ # Use endswith to match subdomains like space-name.hf.space
30
+ # but ensure exact match to prevent spoofing like evil.hf.space.com
31
+ if hostname.endswith(".hf.space") and hostname.count(".") >= 2:
32
+ # Additional validation: ensure it's a valid HF Space domain
33
+ # Format should be: {space-name}.hf.space
34
+ parts = hostname.split(".")
35
+ if len(parts) == 3 and parts[-2:] == ["hf", "space"]:
36
+ space_name = parts[0]
37
+ # Validate space name: not empty, not just hyphens/dots, no spaces
38
+ return (len(space_name) > 0 and
39
+ space_name != "-" and
40
+ not space_name.startswith(".") and
41
+ not space_name.endswith(".") and
42
+ " " not in space_name)
43
+
44
+ return False
26
45
  except Exception:
27
46
  return False
28
47
 
@@ -82,13 +82,14 @@ class MCPAggregator(ContextDependent):
82
82
  await self.context._connection_manager.__aenter__()
83
83
  self._persistent_connection_manager = self.context._connection_manager
84
84
 
85
- await self.load_servers()
86
85
  # Import the display component here to avoid circular imports
87
86
  from mcp_agent.ui.console_display import ConsoleDisplay
88
87
 
89
88
  # Initialize the display component
90
89
  self.display = ConsoleDisplay(config=self.context.config)
91
90
 
91
+ await self.load_servers()
92
+
92
93
  return self
93
94
 
94
95
  async def __aexit__(self, exc_type, exc_val, exc_tb):
File without changes