fast-agent-mcp 0.2.43__tar.gz → 0.2.45__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 (235) hide show
  1. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/PKG-INFO +6 -5
  2. {fast_agent_mcp-0.2.43/src/mcp_agent/resources → fast_agent_mcp-0.2.45}/examples/workflows/evaluator.py +2 -2
  3. {fast_agent_mcp-0.2.43/src/mcp_agent/resources → fast_agent_mcp-0.2.45}/examples/workflows/router.py +1 -1
  4. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/pyproject.toml +6 -5
  5. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/base_agent.py +60 -22
  6. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +39 -63
  7. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/router_agent.py +46 -21
  8. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/config.py +2 -0
  9. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/context.py +4 -0
  10. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/agent_app.py +15 -5
  11. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/direct_decorators.py +4 -5
  12. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/enhanced_prompt.py +80 -11
  13. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/fastagent.py +9 -1
  14. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/interactive_prompt.py +60 -1
  15. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/usage_display.py +10 -3
  16. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_form.py +16 -13
  17. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm.py +5 -7
  18. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_passthrough.py +4 -0
  19. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +258 -98
  20. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +3 -3
  21. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +4 -7
  22. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_openai.py +5 -8
  23. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +6 -7
  24. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/google_converter.py +6 -9
  25. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +5 -4
  26. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_openai.py +33 -0
  27. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +3 -2
  28. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/rich_progress.py +6 -2
  29. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/transport.py +30 -36
  30. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/content_helpers.py +26 -11
  31. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/interfaces.py +22 -2
  32. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_message_multipart.py +2 -3
  33. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45/src/mcp_agent/resources}/examples/workflows/evaluator.py +2 -2
  34. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45/src/mcp_agent/resources}/examples/workflows/router.py +1 -1
  35. fast_agent_mcp-0.2.45/src/mcp_agent/ui/console_display.py +635 -0
  36. fast_agent_mcp-0.2.43/src/mcp_agent/ui/console_display.py → fast_agent_mcp-0.2.45/src/mcp_agent/ui/console_display_legacy.py +50 -63
  37. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/.gitignore +0 -0
  38. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/LICENSE +0 -0
  39. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/README.md +0 -0
  40. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/azure-openai/fastagent.config.yaml +0 -0
  41. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/bedrock/fast-agent.config.yaml +0 -0
  42. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/custom-agents/agent.py +0 -0
  43. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/custom-agents/fastagent.config.yaml +0 -0
  44. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/analysis-campaign.py +0 -0
  45. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/analysis.py +0 -0
  46. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/fastagent.config.yaml +0 -0
  47. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  48. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  49. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  50. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  51. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  52. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  53. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/forms_demo.py +0 -0
  54. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/game_character.py +0 -0
  55. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/game_character_handler.py +0 -0
  56. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/tool_call.py +0 -0
  57. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  58. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  59. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  60. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  61. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/agent_one.py +0 -0
  62. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/agent_two.py +0 -0
  63. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  64. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  65. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/cat.png +0 -0
  66. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example1.py +0 -0
  67. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example2.py +0 -0
  68. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example3.py +0 -0
  69. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  70. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/agent.py +0 -0
  71. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/agent2.py +0 -0
  72. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/docker-compose.yaml +0 -0
  73. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/fastagent.config.yaml +0 -0
  74. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/fastagent.config.yaml +0 -0
  75. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher-eval.py +0 -0
  76. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher-imp.py +0 -0
  77. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher.py +0 -0
  78. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/.env.sample +0 -0
  79. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/Makefile +0 -0
  80. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/README.md +0 -0
  81. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/agent.py +0 -0
  82. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/clam.jpg +0 -0
  83. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/crab.png +0 -0
  84. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/shrimp.png +0 -0
  85. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/docker-compose.yml +0 -0
  86. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/fastagent.config.yaml +0 -0
  87. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/image_demo.py +0 -0
  88. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  89. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  90. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  91. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/simple_agent.py +0 -0
  92. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  93. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  94. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  95. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/chaining.py +0 -0
  96. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/fastagent.config.yaml +0 -0
  97. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/graded_report.md +0 -0
  98. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/human_input.py +0 -0
  99. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/orchestrator.py +0 -0
  100. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/parallel.py +0 -0
  101. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/short_story.md +0 -0
  102. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/short_story.txt +0 -0
  103. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/hatch_build.py +0 -0
  104. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/__init__.py +0 -0
  105. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/__init__.py +0 -0
  106. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/agent.py +0 -0
  107. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  108. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  109. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  110. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  111. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  112. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  113. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/app.py +0 -0
  114. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/__init__.py +0 -0
  115. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/__main__.py +0 -0
  116. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/check_config.py +0 -0
  117. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/go.py +0 -0
  118. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  119. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
  120. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/setup.py +0 -0
  121. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  122. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/constants.py +0 -0
  123. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/main.py +0 -0
  124. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/terminal.py +0 -0
  125. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/console.py +0 -0
  126. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/context_dependent.py +0 -0
  127. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/__init__.py +0 -0
  128. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/agent_types.py +0 -0
  129. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/direct_factory.py +0 -0
  130. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/error_handling.py +0 -0
  131. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/exceptions.py +0 -0
  132. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/mcp_content.py +0 -0
  133. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/prompt.py +0 -0
  134. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/request_params.py +0 -0
  135. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/validation.py +0 -0
  136. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/event_progress.py +0 -0
  137. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/__init__.py +0 -0
  138. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/executor.py +0 -0
  139. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/task_registry.py +0 -0
  140. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/workflow_signal.py +0 -0
  141. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/__init__.py +0 -0
  142. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
  143. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
  144. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_state.py +0 -0
  145. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/handler.py +0 -0
  146. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/types.py +0 -0
  147. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/__init__.py +0 -0
  148. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  149. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
  150. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  151. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/memory.py +0 -0
  152. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/model_database.py +0 -0
  153. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/model_factory.py +0 -0
  154. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/prompt_utils.py +0 -0
  155. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/provider_key_manager.py +0 -0
  156. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/provider_types.py +0 -0
  157. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/__init__.py +0 -0
  158. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  159. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
  160. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
  161. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  162. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  163. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  164. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  165. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
  166. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  167. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  168. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  169. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  170. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/sampling_converter.py +0 -0
  171. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  172. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/usage_tracking.py +0 -0
  173. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/__init__.py +0 -0
  174. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/events.py +0 -0
  175. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/json_serializer.py +0 -0
  176. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/listeners.py +0 -0
  177. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/logger.py +0 -0
  178. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/__init__.py +0 -0
  179. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/common.py +0 -0
  180. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
  181. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
  182. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/gen_client.py +0 -0
  183. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  184. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  185. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/hf_auth.py +0 -0
  186. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/logger_textio.py +0 -0
  187. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  188. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
  189. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  190. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mime_utils.py +0 -0
  191. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_render.py +0 -0
  192. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  193. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  194. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  195. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  196. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  197. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  198. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  199. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  200. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/resource_utils.py +0 -0
  201. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/sampling.py +0 -0
  202. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server/__init__.py +0 -0
  203. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  204. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server_registry.py +0 -0
  205. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/progress_display.py +0 -0
  206. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  207. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  208. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  209. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  210. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  211. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  212. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  213. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  214. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  215. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  216. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  217. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  218. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  219. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  220. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  221. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  222. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  223. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  224. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  225. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  226. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  227. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  228. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  229. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
  230. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  231. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  232. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  233. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
  234. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  235. {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/tools/tool_definition.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.43
3
+ Version: 0.2.45
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
@@ -218,17 +218,18 @@ Requires-Dist: deprecated>=1.2.18
218
218
  Requires-Dist: email-validator>=2.2.0
219
219
  Requires-Dist: fastapi>=0.115.6
220
220
  Requires-Dist: google-genai
221
- Requires-Dist: mcp==1.10.1
221
+ Requires-Dist: mcp==1.12.0
222
222
  Requires-Dist: openai>=1.93.0
223
223
  Requires-Dist: opentelemetry-distro>=0.50b0
224
224
  Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.29.0
225
- Requires-Dist: opentelemetry-instrumentation-anthropic>=0.40.14; python_version >= '3.10' and python_version < '4.0'
225
+ Requires-Dist: opentelemetry-instrumentation-anthropic>=0.42.0; python_version >= '3.10' and python_version < '4.0'
226
226
  Requires-Dist: opentelemetry-instrumentation-google-genai>=0.2b0
227
- Requires-Dist: opentelemetry-instrumentation-mcp>=0.40.14; python_version >= '3.10' and python_version < '4.0'
228
- Requires-Dist: opentelemetry-instrumentation-openai>=0.40.14; python_version >= '3.10' and python_version < '4.0'
227
+ Requires-Dist: opentelemetry-instrumentation-mcp>=0.42.0; python_version >= '3.10' and python_version < '4.0'
228
+ Requires-Dist: opentelemetry-instrumentation-openai>=0.42.0; python_version >= '3.10' and python_version < '4.0'
229
229
  Requires-Dist: prompt-toolkit>=3.0.50
230
230
  Requires-Dist: pydantic-settings>=2.7.0
231
231
  Requires-Dist: pydantic>=2.10.4
232
+ Requires-Dist: pyperclip>=1.9.0
232
233
  Requires-Dist: pyyaml>=6.0.2
233
234
  Requires-Dist: rich>=13.9.4
234
235
  Requires-Dist: tensorzero>=2025.6.3
@@ -18,7 +18,7 @@ fast = FastAgent("Evaluator-Optimizer")
18
18
  candidate details, and company information. Tailor the response to the company and job requirements.
19
19
  """,
20
20
  servers=["fetch"],
21
- model="haiku3",
21
+ model="gpt-4.1-nano",
22
22
  use_history=True,
23
23
  )
24
24
  # Define evaluator agent
@@ -40,7 +40,7 @@ fast = FastAgent("Evaluator-Optimizer")
40
40
  Summarize your evaluation as a structured response with:
41
41
  - Overall quality rating.
42
42
  - Specific feedback and areas for improvement.""",
43
- model="gpt-4.1",
43
+ model="sonnet",
44
44
  )
45
45
  # Define the evaluator-optimizer workflow
46
46
  @fast.evaluator_optimizer(
@@ -43,7 +43,7 @@ SAMPLE_REQUESTS = [
43
43
  )
44
44
  @fast.router(
45
45
  name="route",
46
- model="sonnet",
46
+ model="gpt-4.1",
47
47
  agents=["code_expert", "general_assistant", "fetcher"],
48
48
  )
49
49
  async def main() -> None:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.2.43"
3
+ version = "0.2.45"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -15,7 +15,7 @@ classifiers = [
15
15
  requires-python = ">=3.12"
16
16
  dependencies = [
17
17
  "fastapi>=0.115.6",
18
- "mcp==1.10.1",
18
+ "mcp==1.12.0",
19
19
  "opentelemetry-distro>=0.50b0",
20
20
  "opentelemetry-exporter-otlp-proto-http>=1.29.0",
21
21
  "pydantic-settings>=2.7.0",
@@ -29,15 +29,16 @@ dependencies = [
29
29
  "boto3>=1.35.0",
30
30
  "prompt-toolkit>=3.0.50",
31
31
  "aiohttp>=3.11.13",
32
- "opentelemetry-instrumentation-openai>=0.40.14; python_version >= '3.10' and python_version < '4.0'",
33
- "opentelemetry-instrumentation-anthropic>=0.40.14; python_version >= '3.10' and python_version < '4.0'",
34
- "opentelemetry-instrumentation-mcp>=0.40.14; python_version >= '3.10' and python_version < '4.0'",
32
+ "opentelemetry-instrumentation-openai>=0.42.0; python_version >= '3.10' and python_version < '4.0'",
33
+ "opentelemetry-instrumentation-anthropic>=0.42.0; python_version >= '3.10' and python_version < '4.0'",
34
+ "opentelemetry-instrumentation-mcp>=0.42.0; python_version >= '3.10' and python_version < '4.0'",
35
35
  "google-genai",
36
36
  "opentelemetry-instrumentation-google-genai>=0.2b0",
37
37
  "tensorzero>=2025.6.3",
38
38
  "deprecated>=1.2.18",
39
39
  "a2a-sdk>=0.2.9",
40
40
  "email-validator>=2.2.0",
41
+ "pyperclip>=1.9.0",
41
42
  ]
42
43
 
43
44
  [project.optional-dependencies]
@@ -330,12 +330,12 @@ class BaseAgent(MCPAggregator, AgentProtocol):
330
330
  def _matches_pattern(self, name: str, pattern: str, server_name: str) -> bool:
331
331
  """
332
332
  Check if a name matches a pattern for a specific server.
333
-
333
+
334
334
  Args:
335
335
  name: The name to match (could be tool name, resource URI, or prompt name)
336
336
  pattern: The pattern to match against (e.g., "add", "math*", "resource://math/*")
337
337
  server_name: The server name (used for tool name prefixing)
338
-
338
+
339
339
  Returns:
340
340
  True if the name matches the pattern
341
341
  """
@@ -343,7 +343,7 @@ class BaseAgent(MCPAggregator, AgentProtocol):
343
343
  if name.startswith(f"{server_name}-"):
344
344
  full_pattern = f"{server_name}-{pattern}"
345
345
  return fnmatch.fnmatch(name, full_pattern)
346
-
346
+
347
347
  # For resources and prompts, match directly against the pattern
348
348
  return fnmatch.fnmatch(name, pattern)
349
349
 
@@ -365,9 +365,9 @@ class BaseAgent(MCPAggregator, AgentProtocol):
365
365
  filtered_tools = []
366
366
  for tool in result.tools:
367
367
  # Extract server name from tool name (e.g., "mathematics-add" -> "mathematics")
368
- if '-' in tool.name:
369
- server_name = tool.name.split('-', 1)[0]
370
-
368
+ if "-" in tool.name:
369
+ server_name = tool.name.split("-", 1)[0]
370
+
371
371
  # Check if this server has tool filters
372
372
  if server_name in self.config.tools:
373
373
  # Check if tool matches any pattern for this server
@@ -495,48 +495,70 @@ class BaseAgent(MCPAggregator, AgentProtocol):
495
495
 
496
496
  async def apply_prompt(
497
497
  self,
498
- prompt_name: str,
498
+ prompt: Union[str, GetPromptResult],
499
499
  arguments: Dict[str, str] | None = None,
500
500
  agent_name: str | None = None,
501
501
  server_name: str | None = None,
502
+ as_template: bool = False,
502
503
  ) -> str:
503
504
  """
504
- Apply an MCP Server Prompt by name and return the assistant's response.
505
+ Apply an MCP Server Prompt by name or GetPromptResult and return the assistant's response.
505
506
  Will search all available servers for the prompt if not namespaced and no server_name provided.
506
507
 
507
508
  If the last message in the prompt is from a user, this will automatically
508
509
  generate an assistant response to ensure we always end with an assistant message.
509
510
 
510
511
  Args:
511
- prompt_name: The name of the prompt to apply
512
+ prompt: The name of the prompt to apply OR a GetPromptResult object
512
513
  arguments: Optional dictionary of string arguments to pass to the prompt template
513
514
  agent_name: Optional agent name (ignored at this level, used by multi-agent apps)
514
515
  server_name: Optional name of the server to get the prompt from
516
+ as_template: If True, store as persistent template (always included in context)
515
517
 
516
518
  Returns:
517
519
  The assistant's response or error message
518
520
  """
519
521
 
520
- # Get the prompt - this will search all servers if needed
521
- self.logger.debug(f"Loading prompt '{prompt_name}'")
522
- prompt_result: GetPromptResult = await self.get_prompt(prompt_name, arguments, server_name)
522
+ # Handle both string and GetPromptResult inputs
523
+ if isinstance(prompt, str):
524
+ prompt_name = prompt
525
+ # Get the prompt - this will search all servers if needed
526
+ self.logger.debug(f"Loading prompt '{prompt_name}'")
527
+ prompt_result: GetPromptResult = await self.get_prompt(
528
+ prompt_name, arguments, server_name
529
+ )
530
+
531
+ if not prompt_result or not prompt_result.messages:
532
+ error_msg = f"Prompt '{prompt_name}' could not be found or contains no messages"
533
+ self.logger.warning(error_msg)
534
+ return error_msg
523
535
 
524
- if not prompt_result or not prompt_result.messages:
525
- error_msg = f"Prompt '{prompt_name}' could not be found or contains no messages"
526
- self.logger.warning(error_msg)
527
- return error_msg
536
+ # Get the display name (namespaced version)
537
+ namespaced_name = getattr(prompt_result, "namespaced_name", prompt_name)
538
+ else:
539
+ # prompt is a GetPromptResult object
540
+ prompt_result = prompt
541
+ if not prompt_result or not prompt_result.messages:
542
+ error_msg = "Provided GetPromptResult contains no messages"
543
+ self.logger.warning(error_msg)
544
+ return error_msg
545
+
546
+ # Use a reasonable display name
547
+ namespaced_name = getattr(prompt_result, "namespaced_name", "provided_prompt")
528
548
 
529
- # Get the display name (namespaced version)
530
- namespaced_name = getattr(prompt_result, "namespaced_name", prompt_name)
531
549
  self.logger.debug(f"Using prompt '{namespaced_name}'")
532
550
 
533
551
  # Convert prompt messages to multipart format using the safer method
534
552
  multipart_messages = PromptMessageMultipart.from_get_prompt_result(prompt_result)
535
553
 
536
- # Always call generate to ensure LLM implementations can handle prompt templates
537
- # This is critical for stateful LLMs like PlaybackLLM
538
- response = await self.generate(multipart_messages, None)
539
- return response.first_text()
554
+ if as_template:
555
+ # Use apply_prompt_template to store as persistent prompt messages
556
+ return await self.apply_prompt_template(prompt_result, namespaced_name)
557
+ else:
558
+ # Always call generate to ensure LLM implementations can handle prompt templates
559
+ # This is critical for stateful LLMs like PlaybackLLM
560
+ response = await self.generate(multipart_messages, None)
561
+ return response.first_text()
540
562
 
541
563
  async def get_embedded_resources(
542
564
  self, resource_uri: str, server_name: str | None = None
@@ -636,6 +658,22 @@ class BaseAgent(MCPAggregator, AgentProtocol):
636
658
  with self.tracer.start_as_current_span(f"Agent: '{self.name}' generate"):
637
659
  return await self._llm.generate(multipart_messages, request_params)
638
660
 
661
+ async def apply_prompt_template(self, prompt_result: GetPromptResult, prompt_name: str) -> str:
662
+ """
663
+ Apply a prompt template as persistent context that will be included in all future conversations.
664
+ Delegates to the attached LLM.
665
+
666
+ Args:
667
+ prompt_result: The GetPromptResult containing prompt messages
668
+ prompt_name: The name of the prompt being applied
669
+
670
+ Returns:
671
+ String representation of the assistant's response if generated
672
+ """
673
+ assert self._llm
674
+ with self.tracer.start_as_current_span(f"Agent: '{self.name}' apply_prompt_template"):
675
+ return await self._llm.apply_prompt_template(prompt_result, prompt_name)
676
+
639
677
  async def structured(
640
678
  self,
641
679
  multipart_messages: List[PromptMessageMultipart],
@@ -33,16 +33,14 @@ class QualityRating(str, Enum):
33
33
  GOOD = "GOOD" # Minor improvements possible
34
34
  EXCELLENT = "EXCELLENT" # No improvements needed
35
35
 
36
- # Map string values to integer values for comparisons
37
- @property
38
- def value(self) -> int:
39
- """Convert string enum values to integers for comparison."""
40
- return {
41
- "POOR": 0,
42
- "FAIR": 1,
43
- "GOOD": 2,
44
- "EXCELLENT": 3,
45
- }[self._value_]
36
+
37
+ # Separate mapping for quality ratings to numerical values
38
+ QUALITY_RATING_VALUES = {
39
+ QualityRating.POOR: 0,
40
+ QualityRating.FAIR: 1,
41
+ QualityRating.GOOD: 2,
42
+ QualityRating.EXCELLENT: 3,
43
+ }
46
44
 
47
45
 
48
46
  class EvaluationResult(BaseModel):
@@ -140,7 +138,7 @@ class EvaluatorOptimizerAgent(BaseAgent):
140
138
 
141
139
  # Evaluate current response
142
140
  eval_prompt = self._build_eval_prompt(
143
- request=request, response=response.all_text(), iteration=refinement_count
141
+ request=request, response=response.last_text(), iteration=refinement_count
144
142
  )
145
143
 
146
144
  # Create evaluation message and get structured evaluation result
@@ -171,7 +169,7 @@ class EvaluatorOptimizerAgent(BaseAgent):
171
169
  logger.debug(f"Evaluation result: {evaluation_result.rating}")
172
170
 
173
171
  # Track best response based on rating
174
- if evaluation_result.rating.value > best_rating.value:
172
+ if QUALITY_RATING_VALUES[evaluation_result.rating] > QUALITY_RATING_VALUES[best_rating]:
175
173
  best_rating = evaluation_result.rating
176
174
  best_response = response
177
175
  logger.debug(f"New best response (rating: {best_rating})")
@@ -183,14 +181,17 @@ class EvaluatorOptimizerAgent(BaseAgent):
183
181
  best_response = response
184
182
  break
185
183
 
186
- if evaluation_result.rating.value >= self.min_rating.value:
184
+ if (
185
+ QUALITY_RATING_VALUES[evaluation_result.rating]
186
+ >= QUALITY_RATING_VALUES[self.min_rating]
187
+ ):
187
188
  logger.debug(f"Acceptable quality reached ({evaluation_result.rating})")
188
189
  break
189
190
 
190
191
  # Generate refined response
191
192
  refinement_prompt = self._build_refinement_prompt(
192
193
  request=request,
193
- response=response.all_text(),
194
+ response=response.last_text(), ## only if there is no history?
194
195
  feedback=evaluation_result,
195
196
  iteration=refinement_count,
196
197
  )
@@ -270,48 +271,21 @@ class EvaluatorOptimizerAgent(BaseAgent):
270
271
  return f"""
271
272
  You are an expert evaluator for content quality. Your task is to evaluate a response against the user's original request.
272
273
 
273
- Evaluate the response for iteration {iteration + 1} and provide structured feedback on its quality and areas for improvement.
274
+ Evaluate the response for iteration {iteration + 1} and provide feedback on its quality and areas for improvement.
274
275
 
276
+ ```
275
277
  <fastagent:data>
276
- <fastagent:request>
278
+ <fastagent:request>
277
279
  {request}
278
- </fastagent:request>
280
+ </fastagent:request>
279
281
 
280
- <fastagent:response>
282
+ <fastagent:response>
281
283
  {response}
282
- </fastagent:response>
284
+ </fastagent:response>
283
285
  </fastagent:data>
284
286
 
285
- <fastagent:instruction>
286
- Your response MUST be valid JSON matching this exact format (no other text, markdown, or explanation):
287
-
288
- {{
289
- "rating": "RATING",
290
- "feedback": "DETAILED FEEDBACK",
291
- "needs_improvement": BOOLEAN,
292
- "focus_areas": ["FOCUS_AREA_1", "FOCUS_AREA_2", "FOCUS_AREA_3"]
293
- }}
294
-
295
- Where:
296
- - RATING: Must be one of: "EXCELLENT", "GOOD", "FAIR", or "POOR"
297
- - EXCELLENT: No improvements needed
298
- - GOOD: Only minor improvements possible
299
- - FAIR: Several improvements needed
300
- - POOR: Major improvements needed
301
- - DETAILED FEEDBACK: Specific, actionable feedback (as a single string)
302
- - BOOLEAN: true or false (lowercase, no quotes) indicating if further improvement is needed
303
- - FOCUS_AREAS: Array of 1-3 specific areas to focus on (empty array if no improvement needed)
304
-
305
- Example of valid response (DO NOT include the triple backticks in your response):
306
- {{
307
- "rating": "GOOD",
308
- "feedback": "The response is clear but could use more supporting evidence.",
309
- "needs_improvement": true,
310
- "focus_areas": ["Add more examples", "Include data points"]
311
- }}
312
-
313
- IMPORTANT: Your response should be ONLY the JSON object without any code fences, explanations, or other text.
314
- </fastagent:instruction>
287
+ ```
288
+
315
289
  """
316
290
 
317
291
  def _build_refinement_prompt(
@@ -333,28 +307,27 @@ IMPORTANT: Your response should be ONLY the JSON object without any code fences,
333
307
  Returns:
334
308
  Formatted refinement prompt
335
309
  """
336
- focus_areas = ", ".join(feedback.focus_areas) if feedback.focus_areas else "None specified"
310
+
311
+ # Format focus areas as bulleted list with each item on a separate line
312
+ if feedback.focus_areas:
313
+ focus_areas = "\n".join(f" * {area}" for area in feedback.focus_areas)
314
+ else:
315
+ focus_areas = "None specified"
337
316
 
338
317
  return f"""
339
- You are tasked with improving a response based on expert feedback. This is iteration {iteration + 1} of the refinement process.
318
+ You are tasked with improving your previous response based on expert feedback. This is iteration {iteration + 1} of the refinement process.
340
319
 
341
320
  Your goal is to address all feedback points while maintaining accuracy and relevance to the original request.
342
321
 
343
- <fastagent:data>
344
- <fastagent:request>
345
- {request}
346
- </fastagent:request>
347
-
348
- <fastagent:previous-response>
349
- {response}
350
- </fastagent:previous-response>
322
+ ```
351
323
 
352
324
  <fastagent:feedback>
353
- <rating>{feedback.rating}</rating>
354
- <details>{feedback.feedback}</details>
355
- <focus-areas>{focus_areas}</focus-areas>
325
+ <rating>{feedback.rating.name}</rating>
326
+ <details>{feedback.feedback}</details>
327
+ <focus-areas>
328
+ {focus_areas}
329
+ </focus-areas>
356
330
  </fastagent:feedback>
357
- </fastagent:data>
358
331
 
359
332
  <fastagent:instruction>
360
333
  Create an improved version of the response that:
@@ -365,4 +338,7 @@ Create an improved version of the response that:
365
338
 
366
339
  Provide your complete improved response without explanations or commentary.
367
340
  </fastagent:instruction>
341
+
342
+ ```
343
+
368
344
  """
@@ -39,7 +39,7 @@ Follow these guidelines:
39
39
  """
40
40
 
41
41
  # Default routing instruction with placeholders for context (AgentCard JSON)
42
- DEFAULT_ROUTING_INSTRUCTION = """
42
+ ROUTING_AGENT_INSTRUCTION = """
43
43
  Select from the following agents to handle the request:
44
44
  <fastagent:agents>
45
45
  [
@@ -100,7 +100,7 @@ class RouterAgent(BaseAgent):
100
100
  self.routing_instruction = routing_instruction
101
101
  self.agent_map = {agent.name: agent for agent in agents}
102
102
 
103
- # Set up base router request parameters
103
+ # Set up base router request parameters with just the base instruction for now
104
104
  base_params = {"systemPrompt": ROUTING_SYSTEM_INSTRUCTION, "use_history": False}
105
105
 
106
106
  if default_request_params:
@@ -120,6 +120,18 @@ class RouterAgent(BaseAgent):
120
120
  if not getattr(agent, "initialized", False):
121
121
  await agent.initialize()
122
122
 
123
+ complete_routing_instruction = await self._generate_routing_instruction(
124
+ self.agents, self.routing_instruction
125
+ )
126
+
127
+ # Update the system prompt to include the routing instruction with agent cards
128
+ combined_system_prompt = (
129
+ ROUTING_SYSTEM_INSTRUCTION + "\n\n" + complete_routing_instruction
130
+ )
131
+ self._default_request_params.systemPrompt = combined_system_prompt
132
+ self.instruction = combined_system_prompt
133
+ self._routing_instruction_generated = True
134
+
123
135
  self.initialized = True
124
136
 
125
137
  async def shutdown(self) -> None:
@@ -133,6 +145,36 @@ class RouterAgent(BaseAgent):
133
145
  except Exception as e:
134
146
  logger.warning(f"Error shutting down agent: {str(e)}")
135
147
 
148
+ @staticmethod
149
+ async def _generate_routing_instruction(
150
+ agents: List[Agent], routing_instruction: Optional[str] = None
151
+ ) -> str:
152
+ """
153
+ Generate the complete routing instruction with agent cards.
154
+
155
+ Args:
156
+ agents: List of agents to include in routing instruction
157
+ routing_instruction: Optional custom routing instruction template
158
+
159
+ Returns:
160
+ Complete routing instruction with agent cards formatted
161
+ """
162
+ # Generate agent descriptions
163
+ agent_descriptions = []
164
+ for agent in agents:
165
+ agent_card: AgentCard = await agent.agent_card()
166
+ agent_descriptions.append(
167
+ agent_card.model_dump_json(
168
+ include={"name", "description", "skills"}, exclude_none=True
169
+ )
170
+ )
171
+
172
+ context = ",\n".join(agent_descriptions)
173
+
174
+ # Format the routing instruction
175
+ instruction_template = routing_instruction or ROUTING_AGENT_INSTRUCTION
176
+ return instruction_template.format(context=context)
177
+
136
178
  async def attach_llm(
137
179
  self,
138
180
  llm_factory: type[AugmentedLLMProtocol] | Callable[..., AugmentedLLMProtocol],
@@ -227,27 +269,10 @@ class RouterAgent(BaseAgent):
227
269
  agent=self.agents[0].name, confidence="high", reasoning="Only one agent available"
228
270
  ), None
229
271
 
230
- # Generate agent descriptions for the context
231
- agent_descriptions = []
232
- for agent in self.agents:
233
- agent_card: AgentCard = await agent.agent_card()
234
- agent_descriptions.append(
235
- agent_card.model_dump_json(
236
- include={"name", "description", "skills"}, exclude_none=True
237
- )
238
- )
239
-
240
- context = ",\n".join(agent_descriptions)
241
-
242
- # Format the routing prompt
243
- routing_instruction = self.routing_instruction or DEFAULT_ROUTING_INSTRUCTION
244
- routing_instruction = routing_instruction.format(context=context)
245
-
246
272
  assert self._llm
247
- mutated = message.model_copy(deep=True)
248
- mutated.add_text(routing_instruction)
273
+ # No need to add routing instruction here - it's already in the system prompt
249
274
  response, _ = await self._llm.structured(
250
- [mutated],
275
+ [message],
251
276
  RoutingResponse,
252
277
  self._default_request_params,
253
278
  )
@@ -319,6 +319,8 @@ class LoggerSettings(BaseModel):
319
319
  """Truncate display of long tool calls"""
320
320
  enable_markup: bool = True
321
321
  """Enable markup in console output. Disable for outputs that may conflict with rich console formatting"""
322
+ use_legacy_display: bool = False
323
+ """Use the legacy console display instead of the new style display"""
322
324
 
323
325
 
324
326
  def find_fastagent_config_files(start_path: Path) -> Tuple[Optional[Path], Optional[Path]]:
@@ -10,7 +10,11 @@ from typing import TYPE_CHECKING, Any, Optional, Union
10
10
  from mcp import ServerSession
11
11
  from opentelemetry import trace
12
12
  from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
13
+
14
+ # from opentelemetry.instrumentation.anthropic import AnthropicInstrumentor
13
15
  from opentelemetry.instrumentation.google_genai import GoogleGenAiSdkInstrumentor
16
+
17
+ # from opentelemetry.instrumentation.mcp import McpInstrumentor
14
18
  from opentelemetry.instrumentation.openai import OpenAIInstrumentor
15
19
  from opentelemetry.propagate import set_global_textmap
16
20
  from opentelemetry.sdk.resources import Resource
@@ -5,7 +5,7 @@ Direct AgentApp implementation for interacting with agents without proxies.
5
5
  from typing import Dict, List, Optional, Union
6
6
 
7
7
  from deprecated import deprecated
8
- from mcp.types import PromptMessage
8
+ from mcp.types import GetPromptResult, PromptMessage
9
9
  from rich import print as rich_print
10
10
 
11
11
  from mcp_agent.agents.agent import Agent
@@ -108,22 +108,26 @@ class AgentApp:
108
108
 
109
109
  async def apply_prompt(
110
110
  self,
111
- prompt_name: str,
111
+ prompt: Union[str, GetPromptResult],
112
112
  arguments: Dict[str, str] | None = None,
113
113
  agent_name: str | None = None,
114
+ as_template: bool = False,
114
115
  ) -> str:
115
116
  """
116
117
  Apply a prompt template to an agent (default agent if not specified).
117
118
 
118
119
  Args:
119
- prompt_name: Name of the prompt template to apply
120
+ prompt: Name of the prompt template to apply OR a GetPromptResult object
120
121
  arguments: Optional arguments for the prompt template
121
122
  agent_name: Name of the agent to send to
123
+ as_template: If True, store as persistent template (always included in context)
122
124
 
123
125
  Returns:
124
126
  The agent's response as a string
125
127
  """
126
- return await self._agent(agent_name).apply_prompt(prompt_name, arguments)
128
+ return await self._agent(agent_name).apply_prompt(
129
+ prompt, arguments, as_template=as_template
130
+ )
127
131
 
128
132
  async def list_prompts(self, server_name: str | None = None, agent_name: str | None = None):
129
133
  """
@@ -235,7 +239,12 @@ class AgentApp:
235
239
  """
236
240
  return await self.interactive(agent_name=agent_name, default_prompt=default_prompt)
237
241
 
238
- async def interactive(self, agent_name: str | None = None, default_prompt: str = "", pretty_print_parallel: bool = False) -> str:
242
+ async def interactive(
243
+ self,
244
+ agent_name: str | None = None,
245
+ default_prompt: str = "",
246
+ pretty_print_parallel: bool = False,
247
+ ) -> str:
239
248
  """
240
249
  Interactive prompt for sending messages with advanced features.
241
250
 
@@ -283,6 +292,7 @@ class AgentApp:
283
292
  agent = self._agents.get(agent_name)
284
293
  if agent and agent.agent_type == AgentType.PARALLEL:
285
294
  from mcp_agent.ui.console_display import ConsoleDisplay
295
+
286
296
  display = ConsoleDisplay(config=None)
287
297
  display.show_parallel_results(agent)
288
298
 
@@ -23,6 +23,9 @@ from typing import (
23
23
  from mcp.client.session import ElicitationFnT
24
24
 
25
25
  from mcp_agent.agents.agent import AgentConfig
26
+ from mcp_agent.agents.workflow.router_agent import (
27
+ ROUTING_SYSTEM_INSTRUCTION,
28
+ )
26
29
  from mcp_agent.core.agent_types import AgentType
27
30
  from mcp_agent.core.request_params import RequestParams
28
31
 
@@ -397,10 +400,6 @@ def router(
397
400
  Returns:
398
401
  A decorator that registers the router with proper type annotations
399
402
  """
400
- default_instruction = """
401
- You are a router that determines which specialized agent should handle a given query.
402
- Analyze the query and select the most appropriate agent to handle it.
403
- """
404
403
 
405
404
  return cast(
406
405
  "Callable[[AgentCallable[P, R]], DecoratedRouterProtocol[P, R]]",
@@ -408,7 +407,7 @@ def router(
408
407
  self,
409
408
  AgentType.ROUTER,
410
409
  name=name,
411
- instruction=instruction or default_instruction,
410
+ instruction=instruction or ROUTING_SYSTEM_INSTRUCTION,
412
411
  servers=servers,
413
412
  model=model,
414
413
  use_history=use_history,