fast-agent-mcp 0.2.47__tar.gz → 0.2.49__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 (241) hide show
  1. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/go.py +17 -3
  4. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/main.py +2 -2
  5. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/config.py +17 -2
  6. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/model_database.py +5 -0
  7. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/model_factory.py +6 -3
  8. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/provider_types.py +1 -0
  9. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_azure.py +1 -1
  10. fast_agent_mcp-0.2.49/src/mcp_agent/llm/providers/augmented_llm_groq.py +30 -0
  11. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_openai.py +20 -7
  12. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/multipart_converter_openai.py +35 -18
  13. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/rich_progress.py +13 -4
  14. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/mcp_agent_client_session.py +5 -3
  15. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/.gitignore +0 -0
  16. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/LICENSE +0 -0
  17. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/README.md +0 -0
  18. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/azure-openai/fastagent.config.yaml +0 -0
  19. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/bedrock/fast-agent.config.yaml +0 -0
  20. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/custom-agents/agent.py +0 -0
  21. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/custom-agents/fastagent.config.yaml +0 -0
  22. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/data-analysis/analysis-campaign.py +0 -0
  23. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/data-analysis/analysis.py +0 -0
  24. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/data-analysis/fastagent.config.yaml +0 -0
  25. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  26. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  27. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  28. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  29. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  30. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  31. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/forms_demo.py +0 -0
  32. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/game_character.py +0 -0
  33. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/game_character_handler.py +0 -0
  34. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/elicitations/tool_call.py +0 -0
  35. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  36. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  37. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  38. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  39. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/state-transfer/agent_one.py +0 -0
  40. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/state-transfer/agent_two.py +0 -0
  41. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  42. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  43. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/vision-examples/cat.png +0 -0
  44. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/vision-examples/example1.py +0 -0
  45. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/vision-examples/example2.py +0 -0
  46. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/vision-examples/example3.py +0 -0
  47. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  48. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/otel/agent.py +0 -0
  49. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/otel/agent2.py +0 -0
  50. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/otel/docker-compose.yaml +0 -0
  51. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/otel/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/researcher/fastagent.config.yaml +0 -0
  53. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/researcher/researcher-eval.py +0 -0
  54. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/researcher/researcher-imp.py +0 -0
  55. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/researcher/researcher.py +0 -0
  56. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/.env.sample +0 -0
  57. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/Makefile +0 -0
  58. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/README.md +0 -0
  59. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/agent.py +0 -0
  60. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/demo_images/clam.jpg +0 -0
  61. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/demo_images/crab.png +0 -0
  62. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/demo_images/shrimp.png +0 -0
  63. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/docker-compose.yml +0 -0
  64. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/fastagent.config.yaml +0 -0
  65. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/image_demo.py +0 -0
  66. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  67. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  68. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  69. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/simple_agent.py +0 -0
  70. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  71. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  72. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  73. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/chaining.py +0 -0
  74. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/evaluator.py +0 -0
  75. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/fastagent.config.yaml +0 -0
  76. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/graded_report.md +0 -0
  77. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/human_input.py +0 -0
  78. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/orchestrator.py +0 -0
  79. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/parallel.py +0 -0
  80. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/router.py +0 -0
  81. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/short_story.md +0 -0
  82. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/examples/workflows/short_story.txt +0 -0
  83. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/hatch_build.py +0 -0
  84. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/__init__.py +0 -0
  85. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/__init__.py +0 -0
  86. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/agent.py +0 -0
  87. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/base_agent.py +0 -0
  88. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  89. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  90. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  91. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/iterative_planner.py +0 -0
  92. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  93. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  94. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  95. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  96. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  97. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/app.py +0 -0
  98. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/__init__.py +0 -0
  99. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/__main__.py +0 -0
  100. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/check_config.py +0 -0
  101. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  102. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
  103. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/setup.py +0 -0
  104. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  105. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/constants.py +0 -0
  106. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/cli/terminal.py +0 -0
  107. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/console.py +0 -0
  108. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/context.py +0 -0
  109. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/context_dependent.py +0 -0
  110. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/__init__.py +0 -0
  111. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/agent_app.py +0 -0
  112. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/agent_types.py +0 -0
  113. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/direct_decorators.py +0 -0
  114. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/direct_factory.py +0 -0
  115. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/enhanced_prompt.py +0 -0
  116. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/error_handling.py +0 -0
  117. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/exceptions.py +0 -0
  118. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/fastagent.py +0 -0
  119. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/interactive_prompt.py +0 -0
  120. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/mcp_content.py +0 -0
  121. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/mermaid_utils.py +0 -0
  122. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/prompt.py +0 -0
  123. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/request_params.py +0 -0
  124. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/usage_display.py +0 -0
  125. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/core/validation.py +0 -0
  126. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/event_progress.py +0 -0
  127. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/executor/__init__.py +0 -0
  128. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/executor/executor.py +0 -0
  129. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/executor/task_registry.py +0 -0
  130. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/executor/workflow_signal.py +0 -0
  131. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/__init__.py +0 -0
  132. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/elicitation_form.py +0 -0
  133. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
  134. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
  135. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/elicitation_state.py +0 -0
  136. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/form_fields.py +0 -0
  137. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/handler.py +0 -0
  138. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/simple_form.py +0 -0
  139. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/human_input/types.py +0 -0
  140. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/__init__.py +0 -0
  141. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/augmented_llm.py +0 -0
  142. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  143. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  144. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
  145. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  146. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/memory.py +0 -0
  147. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/prompt_utils.py +0 -0
  148. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/provider_key_manager.py +0 -0
  149. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/__init__.py +0 -0
  150. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  151. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
  152. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +0 -0
  153. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +0 -0
  154. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  155. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  156. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
  157. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  158. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  159. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +0 -0
  160. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
  161. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  162. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  163. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +0 -0
  164. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  165. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  166. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  167. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  168. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/sampling_converter.py +0 -0
  169. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  170. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/llm/usage_tracking.py +0 -0
  171. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/__init__.py +0 -0
  172. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/events.py +0 -0
  173. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/json_serializer.py +0 -0
  174. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/listeners.py +0 -0
  175. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/logger.py +0 -0
  176. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/logging/transport.py +0 -0
  177. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/__init__.py +0 -0
  178. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/common.py +0 -0
  179. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
  180. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
  181. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/gen_client.py +0 -0
  182. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  183. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  184. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  185. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/hf_auth.py +0 -0
  186. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/interfaces.py +0 -0
  187. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/logger_textio.py +0 -0
  188. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
  189. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  190. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/mime_utils.py +0 -0
  191. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  192. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompt_render.py +0 -0
  193. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  194. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  195. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  196. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  197. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  198. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  199. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  200. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  201. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/resource_utils.py +0 -0
  202. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp/sampling.py +0 -0
  203. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp_server/__init__.py +0 -0
  204. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  205. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/mcp_server_registry.py +0 -0
  206. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/progress_display.py +0 -0
  207. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/py.typed +0 -0
  208. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  209. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  210. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  211. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  212. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  213. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  214. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  215. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  216. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  217. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  218. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  219. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  220. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  221. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  222. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  223. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  224. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  225. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  226. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  227. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  228. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  229. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  230. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  231. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  232. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
  233. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  234. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  235. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  236. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  237. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
  238. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  239. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/tools/tool_definition.py +0 -0
  240. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/ui/console_display.py +0 -0
  241. {fast_agent_mcp-0.2.47 → fast_agent_mcp-0.2.49}/src/mcp_agent/ui/console_display_legacy.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.47
3
+ Version: 0.2.49
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.47"
3
+ version = "0.2.49"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -19,7 +19,7 @@ app = typer.Typer(
19
19
 
20
20
 
21
21
  async def _run_agent(
22
- name: str = "FastAgent CLI",
22
+ name: str = "fast-agent cli",
23
23
  instruction: str = "You are a helpful AI Agent.",
24
24
  config_path: Optional[str] = None,
25
25
  server_list: Optional[List[str]] = None,
@@ -28,6 +28,7 @@ async def _run_agent(
28
28
  prompt_file: Optional[str] = None,
29
29
  url_servers: Optional[Dict[str, Dict[str, str]]] = None,
30
30
  stdio_servers: Optional[Dict[str, Dict[str, str]]] = None,
31
+ agent_name: Optional[str] = "agent",
31
32
  ) -> None:
32
33
  """Async implementation to run an interactive agent."""
33
34
  from pathlib import Path
@@ -35,6 +36,7 @@ async def _run_agent(
35
36
  from mcp_agent.mcp.prompts.prompt_load import load_prompt_multipart
36
37
 
37
38
  # Create the FastAgent instance
39
+
38
40
  fast_kwargs = {
39
41
  "name": name,
40
42
  "config_path": config_path,
@@ -103,6 +105,8 @@ async def _run_agent(
103
105
  # Single model - use original behavior
104
106
  # Define the agent with specified parameters
105
107
  agent_kwargs = {"instruction": instruction}
108
+ if agent_name:
109
+ agent_kwargs["name"] = agent_name
106
110
  if server_list:
107
111
  agent_kwargs["servers"] = server_list
108
112
  if model:
@@ -117,7 +121,7 @@ async def _run_agent(
117
121
  print(response)
118
122
  elif prompt_file:
119
123
  prompt = load_prompt_multipart(Path(prompt_file))
120
- response = await agent.default.generate(prompt)
124
+ response = await agent.generate(prompt)
121
125
  # Print the response text and exit
122
126
  print(response.last_text())
123
127
  else:
@@ -138,6 +142,7 @@ def run_async_agent(
138
142
  message: Optional[str] = None,
139
143
  prompt_file: Optional[str] = None,
140
144
  stdio_commands: Optional[List[str]] = None,
145
+ agent_name: Optional[str] = None,
141
146
  ):
142
147
  """Run the async agent function with proper loop handling."""
143
148
  server_list = servers.split(",") if servers else None
@@ -237,6 +242,7 @@ def run_async_agent(
237
242
  prompt_file=prompt_file,
238
243
  url_servers=url_servers,
239
244
  stdio_servers=stdio_servers,
245
+ agent_name=agent_name,
240
246
  )
241
247
  )
242
248
  finally:
@@ -258,7 +264,7 @@ def run_async_agent(
258
264
  @app.callback(invoke_without_command=True, no_args_is_help=False)
259
265
  def go(
260
266
  ctx: typer.Context,
261
- name: str = typer.Option("FastAgent CLI", "--name", help="Name for the agent"),
267
+ name: str = typer.Option("fast-agent", "--name", help="Name for the agent"),
262
268
  instruction: Optional[str] = typer.Option(
263
269
  None, "--instruction", "-i", help="Path to file or URL containing instruction for the agent"
264
270
  ),
@@ -338,6 +344,8 @@ def go(
338
344
 
339
345
  # Resolve instruction from file/URL or use default
340
346
  resolved_instruction = "You are a helpful AI Agent." # Default
347
+ agent_name = "agent"
348
+
341
349
  if instruction:
342
350
  try:
343
351
  from pathlib import Path
@@ -352,6 +360,11 @@ def go(
352
360
  else:
353
361
  # Treat as file path
354
362
  resolved_instruction = _resolve_instruction(Path(instruction))
363
+ # Extract filename without extension to use as agent name
364
+ instruction_path = Path(instruction)
365
+ if instruction_path.exists() and instruction_path.is_file():
366
+ # Get filename without extension
367
+ agent_name = instruction_path.stem
355
368
  except Exception as e:
356
369
  typer.echo(f"Error loading instruction from {instruction}: {e}", err=True)
357
370
  raise typer.Exit(1)
@@ -367,4 +380,5 @@ def go(
367
380
  message=message,
368
381
  prompt_file=prompt_file,
369
382
  stdio_commands=stdio_commands,
383
+ agent_name=agent_name,
370
384
  )
@@ -8,7 +8,7 @@ from mcp_agent.cli.commands import check_config, go, quickstart, setup
8
8
  from mcp_agent.cli.terminal import Application
9
9
 
10
10
  app = typer.Typer(
11
- help="FastAgent CLI - Build effective agents using Model Context Protocol",
11
+ help="fast-agent - Build effective agents using Model Context Protocol",
12
12
  add_completion=False, # We'll add this later when we have more commands
13
13
  )
14
14
 
@@ -60,7 +60,7 @@ def main(
60
60
  color: bool = typer.Option(True, "--color/--no-color", help="Enable/disable color output"),
61
61
  version: bool = typer.Option(False, "--version", help="Show version and exit"),
62
62
  ) -> None:
63
- """FastAgent CLI - Build effective agents using Model Context Protocol (MCP).
63
+ """fast-agent - Build effective agents using Model Context Protocol (MCP).
64
64
 
65
65
  Use --help with any command for detailed usage information.
66
66
  """
@@ -8,6 +8,7 @@ import re
8
8
  from pathlib import Path
9
9
  from typing import Any, Dict, List, Literal, Optional, Tuple
10
10
 
11
+ from mcp import Implementation
11
12
  from pydantic import BaseModel, ConfigDict, field_validator
12
13
  from pydantic_settings import BaseSettings, SettingsConfigDict
13
14
 
@@ -61,11 +62,9 @@ class MCPServerSettings(BaseModel):
61
62
  Represents the configuration for an individual server.
62
63
  """
63
64
 
64
- # TODO: saqadri - server name should be something a server can provide itself during initialization
65
65
  name: str | None = None
66
66
  """The name of the server."""
67
67
 
68
- # TODO: saqadri - server description should be something a server can provide itself during initialization
69
68
  description: str | None = None
70
69
  """The description of the server."""
71
70
 
@@ -108,6 +107,8 @@ class MCPServerSettings(BaseModel):
108
107
  cwd: str | None = None
109
108
  """Working directory for the executed server command."""
110
109
 
110
+ implementation: Implementation | None = None
111
+
111
112
 
112
113
  class MCPSettings(BaseModel):
113
114
  """Configuration for all MCP servers."""
@@ -224,6 +225,17 @@ class AzureSettings(BaseModel):
224
225
  model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
225
226
 
226
227
 
228
+ class GroqSettings(BaseModel):
229
+ """
230
+ Settings for using xAI Grok models in the fast-agent application.
231
+ """
232
+
233
+ api_key: str | None = None
234
+ base_url: str | None = "https://api.groq.com/openai/v1"
235
+
236
+ model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
237
+
238
+
227
239
  class OpenTelemetrySettings(BaseModel):
228
240
  """
229
241
  OTEL settings for the fast-agent application.
@@ -441,6 +453,9 @@ class Settings(BaseSettings):
441
453
  huggingface: HuggingFaceSettings | None = None
442
454
  """Settings for HuggingFace authentication (used for MCP connections)"""
443
455
 
456
+ groq: GroqSettings | None = None
457
+ """Settings for using the Groq provider in the fast-agent application"""
458
+
444
459
  logger: LoggerSettings | None = LoggerSettings()
445
460
  """Logger settings for the fast-agent application"""
446
461
 
@@ -129,6 +129,10 @@ class ModelDatabase:
129
129
  context_window=2097152, max_output_tokens=8192, tokenizes=GOOGLE_MULTIMODAL
130
130
  )
131
131
 
132
+ KIMI_MOONSHOT = ModelParameters(
133
+ context_window=131072, max_output_tokens=16384, tokenizes=TEXT_ONLY
134
+ )
135
+
132
136
  # FIXME: xAI has not documented the max output tokens for Grok 4. Using Grok 3 as a placeholder. Will need to update when available (if ever)
133
137
  GROK_4 = ModelParameters(context_window=256000, max_output_tokens=16385, tokenizes=XAI_VISION)
134
138
 
@@ -209,6 +213,7 @@ class ModelDatabase:
209
213
  "grok-3-mini": GROK_3,
210
214
  "grok-3-fast": GROK_3,
211
215
  "grok-3-mini-fast": GROK_3,
216
+ "moonshotai/kimi-k2-instruct": KIMI_MOONSHOT,
212
217
  }
213
218
 
214
219
  @classmethod
@@ -19,6 +19,7 @@ from mcp_agent.llm.providers.augmented_llm_deepseek import DeepSeekAugmentedLLM
19
19
  from mcp_agent.llm.providers.augmented_llm_generic import GenericAugmentedLLM
20
20
  from mcp_agent.llm.providers.augmented_llm_google_native import GoogleNativeAugmentedLLM
21
21
  from mcp_agent.llm.providers.augmented_llm_google_oai import GoogleOaiAugmentedLLM
22
+ from mcp_agent.llm.providers.augmented_llm_groq import GroqAugmentedLLM
22
23
  from mcp_agent.llm.providers.augmented_llm_openai import OpenAIAugmentedLLM
23
24
  from mcp_agent.llm.providers.augmented_llm_openrouter import OpenRouterAugmentedLLM
24
25
  from mcp_agent.llm.providers.augmented_llm_tensorzero import TensorZeroAugmentedLLM
@@ -43,6 +44,7 @@ LLMClass = Union[
43
44
  Type[GenericAugmentedLLM],
44
45
  Type[AzureOpenAIAugmentedLLM],
45
46
  Type[BedrockAugmentedLLM],
47
+ Type[GroqAugmentedLLM],
46
48
  ]
47
49
 
48
50
 
@@ -122,7 +124,6 @@ class ModelFactory:
122
124
  "qwen-plus": Provider.ALIYUN,
123
125
  "qwen-max": Provider.ALIYUN,
124
126
  "qwen-long": Provider.ALIYUN,
125
-
126
127
  }
127
128
 
128
129
  MODEL_ALIASES = {
@@ -142,6 +143,7 @@ class ModelFactory:
142
143
  "gemini2": "gemini-2.0-flash",
143
144
  "gemini25": "gemini-2.5-flash-preview-05-20",
144
145
  "gemini25pro": "gemini-2.5-pro-preview-05-06",
146
+ "kimi": "groq.moonshotai/kimi-k2-instruct",
145
147
  }
146
148
 
147
149
  # Mapping of providers to their LLM classes
@@ -159,6 +161,7 @@ class ModelFactory:
159
161
  Provider.AZURE: AzureOpenAIAugmentedLLM,
160
162
  Provider.ALIYUN: AliyunAugmentedLLM,
161
163
  Provider.BEDROCK: BedrockAugmentedLLM,
164
+ Provider.GROQ: GroqAugmentedLLM,
162
165
  }
163
166
 
164
167
  # Mapping of special model names to their specific LLM classes
@@ -213,11 +216,11 @@ class ModelFactory:
213
216
  # If provider still None, try to get from DEFAULT_PROVIDERS using the model_name_str
214
217
  if provider is None:
215
218
  provider = cls.DEFAULT_PROVIDERS.get(model_name_str)
216
-
219
+
217
220
  # If still None, try pattern matching for Bedrock models
218
221
  if provider is None and BedrockAugmentedLLM.matches_model_pattern(model_name_str):
219
222
  provider = Provider.BEDROCK
220
-
223
+
221
224
  if provider is None:
222
225
  raise ModelConfigError(
223
226
  f"Unknown model or provider for: {model_string}. Model name parsed as '{model_name_str}'"
@@ -28,3 +28,4 @@ class Provider(Enum):
28
28
  HUGGINGFACE = ("huggingface", "HuggingFace") # For HuggingFace MCP connections
29
29
  XAI = ("xai", "XAI") # For xAI Grok models
30
30
  BEDROCK = ("bedrock", "Bedrock")
31
+ GROQ = ("groq", "Groq")
@@ -18,7 +18,7 @@ def _extract_resource_name(url: str) -> str | None:
18
18
  return host.replace(suffix, "") if host.endswith(suffix) else None
19
19
 
20
20
 
21
- DEFAULT_AZURE_API_VERSION = "2023-05-15"
21
+ DEFAULT_AZURE_API_VERSION = "2024-10-21"
22
22
 
23
23
 
24
24
  class AzureOpenAIAugmentedLLM(OpenAIAugmentedLLM):
@@ -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
+ GROQ_BASE_URL = "https://api.groq.com/openai/v1"
6
+ DEFAULT_GROQ_MODEL = ""
7
+
8
+
9
+ class GroqAugmentedLLM(OpenAIAugmentedLLM):
10
+ def __init__(self, *args, **kwargs) -> None:
11
+ super().__init__(*args, provider=Provider.GROQ, **kwargs)
12
+
13
+ def _initialize_default_params(self, kwargs: dict) -> RequestParams:
14
+ """Initialize Groq default parameters"""
15
+ chosen_model = kwargs.get("model", DEFAULT_GROQ_MODEL)
16
+
17
+ return RequestParams(
18
+ model=chosen_model,
19
+ systemPrompt=self.instruction,
20
+ parallel_tool_calls=False,
21
+ max_iterations=20,
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.groq:
28
+ base_url = self.context.config.groq.base_url
29
+
30
+ return base_url if base_url else GROQ_BASE_URL
@@ -388,7 +388,10 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
388
388
 
389
389
  # ParsedChatCompletionMessage is compatible with ChatCompletionMessage
390
390
  # since it inherits from it, so we can use it directly
391
- messages.append(message)
391
+ # Convert to dict and remove None values
392
+ message_dict = message.model_dump()
393
+ message_dict = {k: v for k, v in message_dict.items() if v is not None}
394
+ messages.append(message_dict)
392
395
 
393
396
  message_text = message.content
394
397
  if await self._is_tool_stop_reason(choice.finish_reason) and message.tool_calls:
@@ -409,7 +412,9 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
409
412
  )
410
413
 
411
414
  tool_results = []
415
+
412
416
  for tool_call in message.tool_calls:
417
+
413
418
  self.show_tool_call(
414
419
  available_tools,
415
420
  tool_call.function.name,
@@ -425,12 +430,20 @@ class OpenAIAugmentedLLM(AugmentedLLM[ChatCompletionMessageParam, ChatCompletion
425
430
  else from_json(tool_call.function.arguments, allow_partial=True),
426
431
  ),
427
432
  )
428
- result = await self.call_tool(tool_call_request, tool_call.id)
429
- self.show_tool_result(result)
430
-
431
- tool_results.append((tool_call.id, result))
432
- responses.extend(result.content)
433
- messages.extend(OpenAIConverter.convert_function_results_to_openai(tool_results))
433
+
434
+ try:
435
+ result = await self.call_tool(tool_call_request, tool_call.id)
436
+ self.show_tool_result(result)
437
+ tool_results.append((tool_call.id, result))
438
+ responses.extend(result.content)
439
+ except Exception as e:
440
+ self.logger.error(f"Tool call {tool_call.id} failed with error: {e}")
441
+ # Still add the tool_call_id with an error result to prevent missing responses
442
+ error_result = CallToolResult(content=[TextContent(type="text", text=f"Tool call failed: {str(e)}")])
443
+ tool_results.append((tool_call.id, error_result))
444
+
445
+ converted_messages = OpenAIConverter.convert_function_results_to_openai(tool_results)
446
+ messages.extend(converted_messages)
434
447
 
435
448
  self.logger.debug(
436
449
  f"Iteration {i}: Tool call results: {str(tool_results) if tool_results else 'None'}"
@@ -441,9 +441,6 @@ class OpenAIConverter:
441
441
  # Convert to OpenAI format
442
442
  user_message = OpenAIConverter.convert_to_openai(non_text_multipart)
443
443
 
444
- # We need to add tool_call_id manually
445
- user_message["tool_call_id"] = tool_call_id
446
-
447
444
  return (tool_message, [user_message])
448
445
 
449
446
  @staticmethod
@@ -461,22 +458,42 @@ class OpenAIConverter:
461
458
  Returns:
462
459
  List of OpenAI API messages for tool responses
463
460
  """
464
- messages = []
461
+ tool_messages = []
462
+ user_messages = []
463
+ has_mixed_content = False
465
464
 
466
465
  for tool_call_id, result in results:
467
- converted = OpenAIConverter.convert_tool_result_to_openai(
468
- tool_result=result,
469
- tool_call_id=tool_call_id,
470
- concatenate_text_blocks=concatenate_text_blocks,
471
- )
472
-
473
- # Handle the case where we have mixed content and get back a tuple
474
- if isinstance(converted, tuple):
475
- tool_message, additional_messages = converted
476
- messages.append(tool_message)
477
- messages.extend(additional_messages)
478
- else:
479
- # Single message case (text-only)
480
- messages.append(converted)
466
+ try:
467
+ converted = OpenAIConverter.convert_tool_result_to_openai(
468
+ tool_result=result,
469
+ tool_call_id=tool_call_id,
470
+ concatenate_text_blocks=concatenate_text_blocks,
471
+ )
481
472
 
473
+ # Handle the case where we have mixed content and get back a tuple
474
+ if isinstance(converted, tuple):
475
+ tool_message, additional_messages = converted
476
+ tool_messages.append(tool_message)
477
+ user_messages.extend(additional_messages)
478
+ has_mixed_content = True
479
+ else:
480
+ # Single message case (text-only)
481
+ tool_messages.append(converted)
482
+ except Exception as e:
483
+ _logger.error(f"Failed to convert tool_call_id={tool_call_id}: {e}")
484
+ # Create a basic tool response to prevent missing tool_call_id error
485
+ fallback_message = {
486
+ "role": "tool",
487
+ "tool_call_id": tool_call_id,
488
+ "content": f"[Conversion error: {str(e)}]",
489
+ }
490
+ tool_messages.append(fallback_message)
491
+
492
+ # CONDITIONAL REORDERING: Only reorder if there are user messages (mixed content)
493
+ if has_mixed_content and user_messages:
494
+ # Reorder: All tool messages first (OpenAI sequence), then user messages (vision context)
495
+ messages = tool_messages + user_messages
496
+ else:
497
+ # Pure tool responses - keep original order to preserve context (snapshots, etc.)
498
+ messages = tool_messages
482
499
  return messages
@@ -21,7 +21,7 @@ class RichProgressDisplay:
21
21
  self._progress = Progress(
22
22
  SpinnerColumn(spinner_name="simpleDotsScrolling"),
23
23
  TextColumn(
24
- "[progress.description]{task.description}|",
24
+ "[progress.description]{task.description}",
25
25
  # table_column=Column(max_width=16),
26
26
  ),
27
27
  TextColumn(text_format="{task.fields[target]:<16}", style="Bold Blue"),
@@ -77,7 +77,7 @@ class RichProgressDisplay:
77
77
  ProgressAction.LOADED: "dim green",
78
78
  ProgressAction.INITIALIZED: "dim green",
79
79
  ProgressAction.CHATTING: "bold blue",
80
- ProgressAction.STREAMING: "bold blue", # Same color as chatting
80
+ ProgressAction.STREAMING: "bold green", # Assistant Colour
81
81
  ProgressAction.ROUTING: "bold blue",
82
82
  ProgressAction.PLANNING: "bold blue",
83
83
  ProgressAction.READY: "dim green",
@@ -107,10 +107,19 @@ class RichProgressDisplay:
107
107
  # Ensure no None values in the update
108
108
  # For streaming, use custom description immediately to avoid flashing
109
109
  if event.action == ProgressAction.STREAMING and event.streaming_tokens:
110
- formatted_tokens = f"↓ {event.streaming_tokens.strip()}".ljust(15)
110
+ # Account for [dim][/dim] tags (11 characters) in padding calculation
111
+ formatted_tokens = f"▎[dim]◀[/dim] {event.streaming_tokens.strip()}".ljust(17 + 11)
111
112
  description = f"[{self._get_action_style(event.action)}]{formatted_tokens}"
113
+ elif event.action == ProgressAction.CHATTING:
114
+ # Add special formatting for chatting with dimmed arrow
115
+ formatted_text = f"▎[dim]▶[/dim] {event.action.value.strip()}".ljust(17 + 11)
116
+ description = f"[{self._get_action_style(event.action)}]{formatted_text}"
117
+ elif event.action == ProgressAction.CALLING_TOOL:
118
+ # Add special formatting for calling tool with dimmed arrow
119
+ formatted_text = f"▎[dim]◀[/dim] {event.action.value}".ljust(17 + 11)
120
+ description = f"[{self._get_action_style(event.action)}]{formatted_text}"
112
121
  else:
113
- description = f"[{self._get_action_style(event.action)}]{event.action.value:<15}"
122
+ description = f"[{self._get_action_style(event.action)}]{event.action.value:<15}"
114
123
 
115
124
  self._progress.update(
116
125
  task_id,
@@ -66,9 +66,6 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
66
66
  # Extract server_name if provided in kwargs
67
67
  from importlib.metadata import version
68
68
 
69
- version = version("fast-agent-mcp") or "dev"
70
- fast_agent: Implementation = Implementation(name="fast-agent-mcp", version=version)
71
-
72
69
  self.session_server_name = kwargs.pop("server_name", None)
73
70
  # Extract the notification callbacks if provided
74
71
  self._tool_list_changed_callback = kwargs.pop("tool_list_changed_callback", None)
@@ -83,6 +80,11 @@ class MCPAgentClientSession(ClientSession, ContextDependent):
83
80
  # Extract custom elicitation handler if provided
84
81
  custom_elicitation_handler = kwargs.pop("elicitation_handler", None)
85
82
 
83
+ version = version("fast-agent-mcp") or "dev"
84
+ fast_agent: Implementation = Implementation(name="fast-agent-mcp", version=version)
85
+ if self.server_config and self.server_config.implementation:
86
+ fast_agent = self.server_config.implementation
87
+
86
88
  # Only register callbacks if the server_config has the relevant settings
87
89
  list_roots_cb = list_roots if (self.server_config and self.server_config.roots) else None
88
90
 
File without changes