fast-agent-mcp 0.2.34__tar.gz → 0.2.35__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.
Files changed (205) hide show
  1. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/pyproject.toml +1 -1
  3. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/config.py +8 -0
  4. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/context.py +3 -2
  5. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/agent_app.py +1 -1
  6. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/event_progress.py +22 -4
  7. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/augmented_llm.py +16 -3
  8. fast_agent_mcp-0.2.35/src/mcp_agent/llm/memory.py +223 -0
  9. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/model_database.py +2 -2
  10. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +190 -45
  11. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/usage_tracking.py +34 -17
  12. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/events.py +24 -0
  13. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/rich_progress.py +9 -1
  14. fast_agent_mcp-0.2.34/src/mcp_agent/llm/memory.py +0 -103
  15. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/.gitignore +0 -0
  16. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/LICENSE +0 -0
  17. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/README.md +0 -0
  18. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/azure-openai/fastagent.config.yaml +0 -0
  19. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/custom-agents/agent.py +0 -0
  20. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/custom-agents/fastagent.config.yaml +0 -0
  21. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/data-analysis/analysis-campaign.py +0 -0
  22. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/data-analysis/analysis.py +0 -0
  23. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/data-analysis/fastagent.config.yaml +0 -0
  24. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  25. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/state-transfer/agent_one.py +0 -0
  26. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/state-transfer/agent_two.py +0 -0
  27. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  28. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/vision-examples/example1.py +0 -0
  29. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/vision-examples/example2.py +0 -0
  30. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/vision-examples/example3.py +0 -0
  31. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  32. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/otel/agent.py +0 -0
  33. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/otel/agent2.py +0 -0
  34. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/otel/docker-compose.yaml +0 -0
  35. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/otel/fastagent.config.yaml +0 -0
  36. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/researcher/fastagent.config.yaml +0 -0
  37. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/researcher/researcher-eval.py +0 -0
  38. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/researcher/researcher-imp.py +0 -0
  39. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/researcher/researcher.py +0 -0
  40. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/README.md +0 -0
  41. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/agent.py +0 -0
  42. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/docker-compose.yml +0 -0
  43. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/fastagent.config.yaml +0 -0
  44. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/image_demo.py +0 -0
  45. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  46. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/tensorzero/simple_agent.py +0 -0
  47. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/chaining.py +0 -0
  48. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/evaluator.py +0 -0
  49. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/fastagent.config.yaml +0 -0
  50. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/graded_report.md +0 -0
  51. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/human_input.py +0 -0
  52. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/orchestrator.py +0 -0
  53. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/parallel.py +0 -0
  54. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/router.py +0 -0
  55. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/short_story.md +0 -0
  56. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/examples/workflows/short_story.txt +0 -0
  57. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/__init__.py +0 -0
  58. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/__init__.py +0 -0
  59. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/agent.py +0 -0
  60. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/base_agent.py +0 -0
  61. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/__init__.py +0 -0
  62. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
  63. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +0 -0
  64. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
  65. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
  66. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
  67. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
  68. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/agents/workflow/router_agent.py +0 -0
  69. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/app.py +0 -0
  70. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/__init__.py +0 -0
  71. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/__main__.py +0 -0
  72. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/commands/check_config.py +0 -0
  73. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/commands/go.py +0 -0
  74. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/commands/quickstart.py +0 -0
  75. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/commands/setup.py +0 -0
  76. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/commands/url_parser.py +0 -0
  77. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/main.py +0 -0
  78. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/cli/terminal.py +0 -0
  79. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/console.py +0 -0
  80. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/context_dependent.py +0 -0
  81. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/__init__.py +0 -0
  82. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/agent_types.py +0 -0
  83. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/direct_decorators.py +0 -0
  84. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/direct_factory.py +0 -0
  85. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/enhanced_prompt.py +0 -0
  86. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/error_handling.py +0 -0
  87. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/exceptions.py +0 -0
  88. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/fastagent.py +0 -0
  89. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/interactive_prompt.py +0 -0
  90. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/mcp_content.py +0 -0
  91. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/prompt.py +0 -0
  92. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/request_params.py +0 -0
  93. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/usage_display.py +0 -0
  94. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/core/validation.py +0 -0
  95. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/executor/__init__.py +0 -0
  96. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/executor/executor.py +0 -0
  97. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/executor/task_registry.py +0 -0
  98. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/executor/workflow_signal.py +0 -0
  99. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/human_input/__init__.py +0 -0
  100. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/human_input/handler.py +0 -0
  101. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/human_input/types.py +0 -0
  102. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/__init__.py +0 -0
  103. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/augmented_llm_passthrough.py +0 -0
  104. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
  105. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
  106. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/model_factory.py +0 -0
  107. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/prompt_utils.py +0 -0
  108. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/provider_key_manager.py +0 -0
  109. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/provider_types.py +0 -0
  110. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/__init__.py +0 -0
  111. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
  112. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
  113. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
  114. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
  115. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
  116. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +0 -0
  117. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
  118. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_openai.py +0 -0
  119. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
  120. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +0 -0
  121. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/google_converter.py +0 -0
  122. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +0 -0
  123. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/multipart_converter_openai.py +0 -0
  124. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +0 -0
  125. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
  126. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
  127. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
  128. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
  129. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/sampling_converter.py +0 -0
  130. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
  131. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/__init__.py +0 -0
  132. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/json_serializer.py +0 -0
  133. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/listeners.py +0 -0
  134. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/logger.py +0 -0
  135. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/logging/transport.py +0 -0
  136. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/__init__.py +0 -0
  137. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/common.py +0 -0
  138. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/gen_client.py +0 -0
  139. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
  140. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/helpers/content_helpers.py +0 -0
  141. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
  142. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/hf_auth.py +0 -0
  143. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/interfaces.py +0 -0
  144. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/logger_textio.py +0 -0
  145. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  146. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
  147. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  148. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/mime_utils.py +0 -0
  149. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompt_message_multipart.py +0 -0
  150. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompt_render.py +0 -0
  151. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
  152. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
  153. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
  154. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
  155. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
  156. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
  157. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
  158. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
  159. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/resource_utils.py +0 -0
  160. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp/sampling.py +0 -0
  161. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp_server/__init__.py +0 -0
  162. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp_server/agent_server.py +0 -0
  163. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/mcp_server_registry.py +0 -0
  164. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/progress_display.py +0 -0
  165. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  166. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
  167. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  168. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  169. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/in_dev/agent_build.py +0 -0
  170. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/in_dev/css-LICENSE.txt +0 -0
  171. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/in_dev/slides.py +0 -0
  172. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/agent.py +0 -0
  173. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/fastagent.config.yaml +0 -0
  174. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/history_transfer.py +0 -0
  175. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/job.py +0 -0
  176. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/prompt_category.py +0 -0
  177. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/prompt_sizing.py +0 -0
  178. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/simple.txt +0 -0
  179. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/sizer.py +0 -0
  180. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/internal/social.py +0 -0
  181. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  182. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  183. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  184. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  185. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/__init__.py +0 -0
  186. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/agent.py +0 -0
  187. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/delimited_prompt.txt +0 -0
  188. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/fastagent.config.yaml +0 -0
  189. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/image_server.py +0 -0
  190. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/prompt1.txt +0 -0
  191. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/prompting/work_with_image.py +0 -0
  192. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  193. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  194. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
  195. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  196. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  197. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/evaluator.py +0 -0
  198. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  199. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  200. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
  201. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
  202. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  203. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
  204. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/tools/tool_definition.py +0 -0
  205. {fast_agent_mcp-0.2.34 → fast_agent_mcp-0.2.35}/src/mcp_agent/ui/console_display.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.2.34
3
+ Version: 0.2.35
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.34"
3
+ version = "0.2.35"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -115,6 +115,14 @@ class AnthropicSettings(BaseModel):
115
115
 
116
116
  base_url: str | None = None
117
117
 
118
+ cache_mode: Literal["off", "prompt", "auto"] = "auto"
119
+ """
120
+ Controls how caching is applied for Anthropic models when prompt_caching is enabled globally.
121
+ - "off": No caching, even if global prompt_caching is true.
122
+ - "prompt": Caches tools+system prompt (1 block) and template content. Useful for large, static prompts.
123
+ - "auto": Currently same as "prompt" - caches tools+system prompt (1 block) and template content.
124
+ """
125
+
118
126
  model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
119
127
 
120
128
 
@@ -25,7 +25,7 @@ from pydantic import BaseModel, ConfigDict
25
25
  from mcp_agent.config import Settings, get_settings
26
26
  from mcp_agent.executor.executor import AsyncioExecutor, Executor
27
27
  from mcp_agent.executor.task_registry import ActivityRegistry
28
- from mcp_agent.logging.events import EventFilter
28
+ from mcp_agent.logging.events import EventFilter, StreamingExclusionFilter
29
29
  from mcp_agent.logging.logger import LoggingConfig, get_logger
30
30
  from mcp_agent.logging.transport import create_transport
31
31
  from mcp_agent.mcp_server_registry import ServerRegistry
@@ -124,7 +124,8 @@ async def configure_logger(config: "Settings") -> None:
124
124
  """
125
125
  Configure logging and tracing based on the application config.
126
126
  """
127
- event_filter: EventFilter = EventFilter(min_level=config.logger.level)
127
+ # Use StreamingExclusionFilter to prevent streaming events from flooding logs
128
+ event_filter: EventFilter = StreamingExclusionFilter(min_level=config.logger.level)
128
129
  logger.info(f"Configuring logger with level: {config.logger.level}")
129
130
  transport = create_transport(settings=config.logger, event_filter=event_filter)
130
131
  await LoggingConfig.configure(
@@ -302,7 +302,7 @@ class AgentApp:
302
302
  return
303
303
 
304
304
  last_turn = turns[-1]
305
- input_tokens = last_turn.input_tokens
305
+ input_tokens = last_turn.display_input_tokens
306
306
  output_tokens = last_turn.output_tokens
307
307
 
308
308
  # Build cache indicators with bright colors
@@ -15,6 +15,7 @@ class ProgressAction(str, Enum):
15
15
  LOADED = "Loaded"
16
16
  INITIALIZED = "Initialized"
17
17
  CHATTING = "Chatting"
18
+ STREAMING = "Streaming" # Special action for real-time streaming updates
18
19
  ROUTING = "Routing"
19
20
  PLANNING = "Planning"
20
21
  READY = "Ready"
@@ -33,12 +34,22 @@ class ProgressEvent(BaseModel):
33
34
  target: str
34
35
  details: Optional[str] = None
35
36
  agent_name: Optional[str] = None
37
+ streaming_tokens: Optional[str] = None # Special field for streaming token count
36
38
 
37
39
  def __str__(self) -> str:
38
40
  """Format the progress event for display."""
39
- base = f"{self.action.ljust(11)}. {self.target}"
40
- if self.details:
41
- base += f" - {self.details}"
41
+ # Special handling for streaming - show token count in action position
42
+ if self.action == ProgressAction.STREAMING and self.streaming_tokens:
43
+ # For streaming, show just the token count instead of "Streaming"
44
+ action_display = self.streaming_tokens.ljust(11)
45
+ base = f"{action_display}. {self.target}"
46
+ if self.details:
47
+ base += f" - {self.details}"
48
+ else:
49
+ base = f"{self.action.ljust(11)}. {self.target}"
50
+ if self.details:
51
+ base += f" - {self.details}"
52
+
42
53
  if self.agent_name:
43
54
  base = f"[{self.agent_name}] {base}"
44
55
  return base
@@ -78,7 +89,8 @@ def convert_log_event(event: Event) -> Optional[ProgressEvent]:
78
89
 
79
90
  elif "augmented_llm" in namespace:
80
91
  model = event_data.get("model", "")
81
-
92
+
93
+ # For all augmented_llm events, put model info in details column
82
94
  details = f"{model}"
83
95
  chat_turn = event_data.get("chat_turn")
84
96
  if chat_turn is not None:
@@ -87,9 +99,15 @@ def convert_log_event(event: Event) -> Optional[ProgressEvent]:
87
99
  if not target:
88
100
  target = event_data.get("target", "unknown")
89
101
 
102
+ # Extract streaming token count for STREAMING actions
103
+ streaming_tokens = None
104
+ if progress_action == ProgressAction.STREAMING:
105
+ streaming_tokens = event_data.get("details", "")
106
+
90
107
  return ProgressEvent(
91
108
  action=ProgressAction(progress_action),
92
109
  target=target or "unknown",
93
110
  details=details,
94
111
  agent_name=event_data.get("agent_name"),
112
+ streaming_tokens=streaming_tokens,
95
113
  )
@@ -97,6 +97,7 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
97
97
  PARAM_USE_HISTORY = "use_history"
98
98
  PARAM_MAX_ITERATIONS = "max_iterations"
99
99
  PARAM_TEMPLATE_VARS = "template_vars"
100
+
100
101
  # Base set of fields that should always be excluded
101
102
  BASE_EXCLUDE_FIELDS = {PARAM_METADATA}
102
103
 
@@ -371,16 +372,28 @@ class AugmentedLLM(ContextDependent, AugmentedLLMProtocol, Generic[MessageParamT
371
372
  # Start with base arguments
372
373
  arguments = base_args.copy()
373
374
 
374
- # Use provided exclude_fields or fall back to base exclusions
375
- exclude_fields = exclude_fields or self.BASE_EXCLUDE_FIELDS.copy()
375
+ # Combine base exclusions with provider-specific exclusions
376
+ final_exclude_fields = self.BASE_EXCLUDE_FIELDS.copy()
377
+ if exclude_fields:
378
+ final_exclude_fields.update(exclude_fields)
376
379
 
377
380
  # Add all fields from params that aren't explicitly excluded
378
- params_dict = request_params.model_dump(exclude=exclude_fields)
381
+ # Ensure model_dump only includes set fields if that's the desired behavior,
382
+ # or adjust exclude_unset=True/False as needed.
383
+ # Default Pydantic v2 model_dump is exclude_unset=False
384
+ params_dict = request_params.model_dump(exclude=final_exclude_fields)
385
+
379
386
  for key, value in params_dict.items():
387
+ # Only add if not None and not already in base_args (base_args take precedence)
388
+ # or if None is a valid value for the provider, this logic might need adjustment.
380
389
  if value is not None and key not in arguments:
381
390
  arguments[key] = value
391
+ elif value is not None and key in arguments and arguments[key] is None:
392
+ # Allow overriding a None in base_args with a set value from params
393
+ arguments[key] = value
382
394
 
383
395
  # Finally, add any metadata fields as a last layer of overrides
396
+ # This ensures metadata can override anything previously set if keys conflict.
384
397
  if request_params.metadata:
385
398
  arguments.update(request_params.metadata)
386
399
 
@@ -0,0 +1,223 @@
1
+ from typing import Generic, List, Protocol, TypeVar
2
+
3
+ # Define our own type variable for implementation use
4
+ MessageParamT = TypeVar("MessageParamT")
5
+
6
+
7
+ class Memory(Protocol, Generic[MessageParamT]):
8
+ """
9
+ Simple memory management for storing past interactions in-memory.
10
+ """
11
+
12
+ # TODO: saqadri - add checkpointing and other advanced memory capabilities
13
+
14
+ def __init__(self) -> None: ...
15
+
16
+ def extend(self, messages: List[MessageParamT], is_prompt: bool = False) -> None: ...
17
+
18
+ def set(self, messages: List[MessageParamT], is_prompt: bool = False) -> None: ...
19
+
20
+ def append(self, message: MessageParamT, is_prompt: bool = False) -> None: ...
21
+
22
+ def get(self, include_completion_history: bool = True) -> List[MessageParamT]: ...
23
+
24
+ def clear(self, clear_prompts: bool = False) -> None: ...
25
+
26
+
27
+ class SimpleMemory(Memory, Generic[MessageParamT]):
28
+ """
29
+ Simple memory management for storing past interactions in-memory.
30
+
31
+ Maintains both prompt messages (which are always included) and
32
+ generated conversation history (which is included based on use_history setting).
33
+ """
34
+
35
+ def __init__(self) -> None:
36
+ self.history: List[MessageParamT] = []
37
+ self.prompt_messages: List[MessageParamT] = [] # Always included
38
+ self.conversation_cache_positions: List[int] = [] # Track active conversation cache positions
39
+ self.cache_walk_distance: int = 6 # Messages between cache blocks
40
+ self.max_conversation_cache_blocks: int = 2 # Maximum conversation cache blocks
41
+
42
+ def extend(self, messages: List[MessageParamT], is_prompt: bool = False) -> None:
43
+ """
44
+ Add multiple messages to history.
45
+
46
+ Args:
47
+ messages: Messages to add
48
+ is_prompt: If True, add to prompt_messages instead of regular history
49
+ """
50
+ if is_prompt:
51
+ self.prompt_messages.extend(messages)
52
+ else:
53
+ self.history.extend(messages)
54
+
55
+ def set(self, messages: List[MessageParamT], is_prompt: bool = False) -> None:
56
+ """
57
+ Replace messages in history.
58
+
59
+ Args:
60
+ messages: Messages to set
61
+ is_prompt: If True, replace prompt_messages instead of regular history
62
+ """
63
+ if is_prompt:
64
+ self.prompt_messages = messages.copy()
65
+ else:
66
+ self.history = messages.copy()
67
+
68
+ def append(self, message: MessageParamT, is_prompt: bool = False) -> None:
69
+ """
70
+ Add a single message to history.
71
+
72
+ Args:
73
+ message: Message to add
74
+ is_prompt: If True, add to prompt_messages instead of regular history
75
+ """
76
+ if is_prompt:
77
+ self.prompt_messages.append(message)
78
+ else:
79
+ self.history.append(message)
80
+
81
+ def get(self, include_completion_history: bool = True) -> List[MessageParamT]:
82
+ """
83
+ Get all messages in memory.
84
+
85
+ Args:
86
+ include_history: If True, include regular history messages
87
+ If False, only return prompt messages
88
+
89
+ Returns:
90
+ Combined list of prompt messages and optionally history messages
91
+ """
92
+ if include_completion_history:
93
+ return self.prompt_messages + self.history
94
+ else:
95
+ return self.prompt_messages.copy()
96
+
97
+ def clear(self, clear_prompts: bool = False) -> None:
98
+ """
99
+ Clear history and optionally prompt messages.
100
+
101
+ Args:
102
+ clear_prompts: If True, also clear prompt messages
103
+ """
104
+ self.history = []
105
+ self.conversation_cache_positions = [] # Reset cache positions
106
+ if clear_prompts:
107
+ self.prompt_messages = []
108
+
109
+ def should_apply_conversation_cache(self) -> bool:
110
+ """
111
+ Determine if conversation caching should be applied based on walking algorithm.
112
+
113
+ Returns:
114
+ True if we should add or update cache blocks
115
+ """
116
+ total_messages = len(self.history)
117
+
118
+ # Need at least cache_walk_distance messages to start caching
119
+ if total_messages < self.cache_walk_distance:
120
+ return False
121
+
122
+ # Check if we need to add a new cache block
123
+ return len(self._calculate_cache_positions(total_messages)) != len(self.conversation_cache_positions)
124
+
125
+ def _calculate_cache_positions(self, total_conversation_messages: int) -> List[int]:
126
+ """
127
+ Calculate where cache blocks should be placed using walking algorithm.
128
+
129
+ Args:
130
+ total_conversation_messages: Number of conversation messages (not including prompts)
131
+
132
+ Returns:
133
+ List of positions (relative to conversation start) where cache should be placed
134
+ """
135
+ positions = []
136
+
137
+ # Place cache blocks every cache_walk_distance messages
138
+ for i in range(self.cache_walk_distance - 1, total_conversation_messages, self.cache_walk_distance):
139
+ positions.append(i)
140
+ if len(positions) >= self.max_conversation_cache_blocks:
141
+ break
142
+
143
+ # Keep only the most recent cache blocks (walking behavior)
144
+ if len(positions) > self.max_conversation_cache_blocks:
145
+ positions = positions[-self.max_conversation_cache_blocks:]
146
+
147
+ return positions
148
+
149
+ def get_conversation_cache_updates(self) -> dict:
150
+ """
151
+ Get cache position updates needed for the walking algorithm.
152
+
153
+ Returns:
154
+ Dict with 'add', 'remove', and 'active' position lists (relative to full message array)
155
+ """
156
+ total_conversation_messages = len(self.history)
157
+ new_positions = self._calculate_cache_positions(total_conversation_messages)
158
+
159
+ # Convert to absolute positions (including prompt messages)
160
+ prompt_offset = len(self.prompt_messages)
161
+ new_absolute_positions = [pos + prompt_offset for pos in new_positions]
162
+
163
+ old_positions_set = set(self.conversation_cache_positions)
164
+ new_positions_set = set(new_absolute_positions)
165
+
166
+ return {
167
+ 'add': sorted(new_positions_set - old_positions_set),
168
+ 'remove': sorted(old_positions_set - new_positions_set),
169
+ 'active': sorted(new_absolute_positions)
170
+ }
171
+
172
+ def apply_conversation_cache_updates(self, updates: dict) -> None:
173
+ """
174
+ Apply cache position updates.
175
+
176
+ Args:
177
+ updates: Dict from get_conversation_cache_updates()
178
+ """
179
+ self.conversation_cache_positions = updates['active'].copy()
180
+
181
+ def remove_cache_control_from_messages(self, messages: List[MessageParamT], positions: List[int]) -> None:
182
+ """
183
+ Remove cache control from specified message positions.
184
+
185
+ Args:
186
+ messages: The message array to modify
187
+ positions: List of positions to remove cache control from
188
+ """
189
+ for pos in positions:
190
+ if pos < len(messages):
191
+ message = messages[pos]
192
+ if isinstance(message, dict) and "content" in message:
193
+ content_list = message["content"]
194
+ if isinstance(content_list, list):
195
+ for content_block in content_list:
196
+ if isinstance(content_block, dict) and "cache_control" in content_block:
197
+ del content_block["cache_control"]
198
+
199
+ def add_cache_control_to_messages(self, messages: List[MessageParamT], positions: List[int]) -> int:
200
+ """
201
+ Add cache control to specified message positions.
202
+
203
+ Args:
204
+ messages: The message array to modify
205
+ positions: List of positions to add cache control to
206
+
207
+ Returns:
208
+ Number of cache blocks successfully applied
209
+ """
210
+ applied_count = 0
211
+ for pos in positions:
212
+ if pos < len(messages):
213
+ message = messages[pos]
214
+ if isinstance(message, dict) and "content" in message:
215
+ content_list = message["content"]
216
+ if isinstance(content_list, list) and content_list:
217
+ # Apply cache control to the last content block
218
+ for content_block in reversed(content_list):
219
+ if isinstance(content_block, dict):
220
+ content_block["cache_control"] = {"type": "ephemeral"}
221
+ applied_count += 1
222
+ break
223
+ return applied_count
@@ -109,11 +109,11 @@ class ModelDatabase:
109
109
 
110
110
  # TODO update to 32000
111
111
  ANTHROPIC_OPUS_4_VERSIONED = ModelParameters(
112
- context_window=200000, max_output_tokens=16384, tokenizes=ANTHROPIC_MULTIMODAL
112
+ context_window=200000, max_output_tokens=32000, tokenizes=ANTHROPIC_MULTIMODAL
113
113
  )
114
114
  # TODO update to 64000
115
115
  ANTHROPIC_SONNET_4_VERSIONED = ModelParameters(
116
- context_window=200000, max_output_tokens=16384, tokenizes=ANTHROPIC_MULTIMODAL
116
+ context_window=200000, max_output_tokens=64000, tokenizes=ANTHROPIC_MULTIMODAL
117
117
  )
118
118
 
119
119
  DEEPSEEK_CHAT_STANDARD = ModelParameters(