fast-agent-mcp 0.3.16__tar.gz → 0.3.17__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 (319) hide show
  1. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/PKG-INFO +1 -1
  2. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/textual_markdown_demo.py +4 -7
  3. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/pyproject.toml +1 -1
  4. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/mcp_agent.py +1 -1
  5. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/constants.py +2 -0
  6. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/main.py +1 -1
  7. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/interfaces.py +4 -0
  8. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_database.py +4 -1
  9. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_factory.py +4 -2
  10. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/model_info.py +19 -43
  11. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/google/llm_google_native.py +238 -7
  12. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_openai.py +229 -32
  13. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/skills/registry.py +17 -9
  14. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/tools/shell_runtime.py +4 -4
  15. fast_agent_mcp-0.3.17/src/fast_agent/ui/console_display.py +1011 -0
  16. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/enhanced_prompt.py +26 -12
  17. fast_agent_mcp-0.3.17/src/fast_agent/ui/markdown_helpers.py +104 -0
  18. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/markdown_truncator.py +103 -45
  19. fast_agent_mcp-0.3.17/src/fast_agent/ui/message_primitives.py +50 -0
  20. fast_agent_mcp-0.3.17/src/fast_agent/ui/streaming.py +638 -0
  21. fast_agent_mcp-0.3.17/src/fast_agent/ui/tool_display.py +417 -0
  22. fast_agent_mcp-0.3.16/src/fast_agent/ui/console_display.py +0 -2227
  23. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/.gitignore +0 -0
  24. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/LICENSE +0 -0
  25. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/README.md +0 -0
  26. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/a2a/agent_executor.py +0 -0
  27. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/a2a/server.py +0 -0
  28. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/azure-openai/fastagent.config.yaml +0 -0
  29. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/bedrock/fast-agent.config.yaml +0 -0
  30. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/custom-agents/agent.py +0 -0
  31. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/custom-agents/fastagent.config.yaml +0 -0
  32. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/data-analysis/analysis-campaign.py +0 -0
  33. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/data-analysis/analysis.py +0 -0
  34. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/data-analysis/fastagent.config.yaml +0 -0
  35. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  36. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/fastapi/fastapi-advanced.py +0 -0
  37. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/fastapi/fastapi-simple.py +0 -0
  38. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/fastapi/pyproject.toml +0 -0
  39. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/fastapi/readme.md +0 -0
  40. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  41. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  42. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  43. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  44. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  45. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/forms_demo.py +0 -0
  46. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/game_character.py +0 -0
  47. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/game_character_handler.py +0 -0
  48. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/elicitations/tool_call.py +0 -0
  49. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
  50. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
  51. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
  52. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
  53. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/agent_one.py +0 -0
  54. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/agent_two.py +0 -0
  55. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  56. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  57. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/cat.png +0 -0
  58. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example1.py +0 -0
  59. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example2.py +0 -0
  60. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/example3.py +0 -0
  61. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
  62. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/display_check.py +0 -0
  63. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/fastagent.config.yaml +0 -0
  64. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/simple_llm.py +0 -0
  65. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/simple_llm_advanced.py +0 -0
  66. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/new-api/simple_mcp.py +0 -0
  67. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/agent.py +0 -0
  68. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/fastagent.config.yaml +0 -0
  69. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/openapi_mcp_server.py +0 -0
  70. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/petstore.yaml +0 -0
  71. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/pyproject.toml +0 -0
  72. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/openapi/run-as-server.sh +0 -0
  73. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/otel/agent.py +0 -0
  74. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/otel/agent2.py +0 -0
  75. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/otel/docker-compose.yaml +0 -0
  76. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/otel/fastagent.config.yaml +0 -0
  77. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/researcher/fastagent.config.yaml +0 -0
  78. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/researcher/researcher-eval.py +0 -0
  79. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/researcher/researcher-imp.py +0 -0
  80. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/researcher/researcher.py +0 -0
  81. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/setup/.gitignore +0 -0
  82. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/setup/agent.py +0 -0
  83. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/setup/fastagent.config.yaml +0 -0
  84. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/setup/fastagent.secrets.yaml.example +0 -0
  85. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/setup/pyproject.toml.tmpl +0 -0
  86. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/.env.sample +0 -0
  87. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/Makefile +0 -0
  88. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/README.md +0 -0
  89. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/agent.py +0 -0
  90. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/clam.jpg +0 -0
  91. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/crab.png +0 -0
  92. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/demo_images/shrimp.png +0 -0
  93. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/docker-compose.yml +0 -0
  94. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/fastagent.config.yaml +0 -0
  95. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/image_demo.py +0 -0
  96. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/Dockerfile +0 -0
  97. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  98. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  99. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  100. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/simple_agent.py +0 -0
  101. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  102. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  103. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  104. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tool-use-agent/agent.py +0 -0
  105. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/tool-use-agent/fastagent.config.yaml +0 -0
  106. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/chaining.py +0 -0
  107. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/evaluator.py +0 -0
  108. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/fastagent.config.yaml +0 -0
  109. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/graded_report.md +0 -0
  110. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/human_input.py +0 -0
  111. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/orchestrator.py +0 -0
  112. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/parallel.py +0 -0
  113. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/router.py +0 -0
  114. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/short_story.md +0 -0
  115. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/examples/workflows/short_story.txt +0 -0
  116. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/hatch_build.py +0 -0
  117. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/__init__.py +0 -0
  118. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/__init__.py +0 -0
  119. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/agent_types.py +0 -0
  120. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/llm_agent.py +0 -0
  121. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/llm_decorator.py +0 -0
  122. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/tool_agent.py +0 -0
  123. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
  124. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
  125. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
  126. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
  127. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
  128. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
  129. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/agents/workflow/router_agent.py +0 -0
  130. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/__init__.py +0 -0
  131. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/__main__.py +0 -0
  132. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/auth.py +0 -0
  133. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/check_config.py +0 -0
  134. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/go.py +0 -0
  135. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/quickstart.py +0 -0
  136. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/server_helpers.py +0 -0
  137. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/setup.py +0 -0
  138. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/commands/url_parser.py +0 -0
  139. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/cli/terminal.py +0 -0
  140. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/config.py +0 -0
  141. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/constants.py +0 -0
  142. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/context.py +0 -0
  143. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/context_dependent.py +0 -0
  144. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/__init__.py +0 -0
  145. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/agent_app.py +0 -0
  146. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/core_app.py +0 -0
  147. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/direct_decorators.py +0 -0
  148. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/direct_factory.py +0 -0
  149. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/error_handling.py +0 -0
  150. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/exceptions.py +0 -0
  151. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/__init__.py +0 -0
  152. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/executor.py +0 -0
  153. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/task_registry.py +0 -0
  154. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/executor/workflow_signal.py +0 -0
  155. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/fastagent.py +0 -0
  156. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/__init__.py +0 -0
  157. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/events.py +0 -0
  158. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/json_serializer.py +0 -0
  159. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/listeners.py +0 -0
  160. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/logger.py +0 -0
  161. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/logging/transport.py +0 -0
  162. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/prompt.py +0 -0
  163. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/core/validation.py +0 -0
  164. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/event_progress.py +0 -0
  165. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/history/history_exporter.py +0 -0
  166. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/__init__.py +0 -0
  167. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/elicitation_handler.py +0 -0
  168. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/elicitation_state.py +0 -0
  169. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/form_fields.py +0 -0
  170. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/simple_form.py +0 -0
  171. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/human_input/types.py +0 -0
  172. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/__init__.py +0 -0
  173. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/fastagent_llm.py +0 -0
  174. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/passthrough.py +0 -0
  175. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/playback.py +0 -0
  176. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/silent.py +0 -0
  177. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/internal/slow.py +0 -0
  178. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/memory.py +0 -0
  179. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/prompt_utils.py +0 -0
  180. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
  181. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
  182. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
  183. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
  184. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
  185. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
  186. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
  187. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
  188. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
  189. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
  190. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
  191. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
  192. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
  193. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
  194. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
  195. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
  196. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
  197. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
  198. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider/openai/responses.py +0 -0
  199. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider_key_manager.py +0 -0
  200. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/provider_types.py +0 -0
  201. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/request_params.py +0 -0
  202. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/sampling_converter.py +0 -0
  203. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/llm/usage_tracking.py +0 -0
  204. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/__init__.py +0 -0
  205. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/common.py +0 -0
  206. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/elicitation_factory.py +0 -0
  207. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
  208. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/gen_client.py +0 -0
  209. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/__init__.py +0 -0
  210. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
  211. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
  212. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/hf_auth.py +0 -0
  213. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/interfaces.py +0 -0
  214. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/logger_textio.py +0 -0
  215. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
  216. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_aggregator.py +0 -0
  217. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
  218. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mcp_content.py +0 -0
  219. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/mime_utils.py +0 -0
  220. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/oauth_client.py +0 -0
  221. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt.py +0 -0
  222. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
  223. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_render.py +0 -0
  224. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompt_serialization.py +0 -0
  225. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/__init__.py +0 -0
  226. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/__main__.py +0 -0
  227. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
  228. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
  229. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
  230. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
  231. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
  232. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/resource_utils.py +0 -0
  233. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/sampling.py +0 -0
  234. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/server/__init__.py +0 -0
  235. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/server/agent_server.py +0 -0
  236. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/skybridge.py +0 -0
  237. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/sse_tracking.py +0 -0
  238. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
  239. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
  240. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/transport_tracking.py +0 -0
  241. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/types.py +0 -0
  242. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/ui_agent.py +0 -0
  243. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp/ui_mixin.py +0 -0
  244. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/mcp_server_registry.py +0 -0
  245. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/py.typed +0 -0
  246. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
  247. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
  248. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  249. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  250. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
  251. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
  252. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
  253. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
  254. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
  255. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
  256. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
  257. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
  258. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
  259. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
  260. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
  261. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
  262. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
  263. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  264. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
  265. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
  266. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
  267. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
  268. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
  269. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
  270. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
  271. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
  272. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
  273. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
  274. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
  275. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
  276. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
  277. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
  278. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
  279. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
  280. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
  281. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
  282. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
  283. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
  284. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
  285. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
  286. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
  287. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
  288. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  289. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
  290. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
  291. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
  292. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
  293. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/router.py +0 -0
  294. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
  295. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
  296. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/.gitignore +0 -0
  297. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/agent.py +0 -0
  298. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/fastagent.config.yaml +0 -0
  299. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
  300. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
  301. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/skills/__init__.py +0 -0
  302. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/tools/elicitation.py +0 -0
  303. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/types/__init__.py +0 -0
  304. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/types/llm_stop_reason.py +0 -0
  305. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/__init__.py +0 -0
  306. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/console.py +0 -0
  307. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/elicitation_form.py +0 -0
  308. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/elicitation_style.py +0 -0
  309. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/history_display.py +0 -0
  310. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/interactive_prompt.py +0 -0
  311. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mcp_display.py +0 -0
  312. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
  313. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/mermaid_utils.py +0 -0
  314. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/notification_tracker.py +0 -0
  315. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/plain_text_truncator.py +0 -0
  316. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/progress_display.py +0 -0
  317. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/rich_progress.py +0 -0
  318. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/streaming_buffer.py +0 -0
  319. {fast_agent_mcp-0.3.16 → fast_agent_mcp-0.3.17}/src/fast_agent/ui/usage_display.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.3.16
3
+ Version: 0.3.17
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
@@ -20,12 +20,9 @@ from fast_agent import FastAgent
20
20
  from fast_agent.constants import REASONING
21
21
  from fast_agent.mcp.helpers.content_helpers import get_text
22
22
  from fast_agent.types import PromptMessageExtended
23
- from fast_agent.ui.console_display import (
24
- MESSAGE_CONFIGS,
25
- ConsoleDisplay,
26
- MessageType,
27
- _prepare_markdown_content,
28
- )
23
+ from fast_agent.ui.console_display import ConsoleDisplay
24
+ from fast_agent.ui.markdown_helpers import prepare_markdown_content
25
+ from fast_agent.ui.message_primitives import MESSAGE_CONFIGS, MessageType
29
26
 
30
27
  if TYPE_CHECKING:
31
28
  from mcp.types import CallToolResult
@@ -208,7 +205,7 @@ class ChatDisplay(RichLog):
208
205
  if formatted:
209
206
  segments.append(Markdown(formatted))
210
207
  else:
211
- prepared = _prepare_markdown_content(content, True) if content else ""
208
+ prepared = prepare_markdown_content(content, True) if content else ""
212
209
  if prepared:
213
210
  segments.append(Markdown(prepared))
214
211
 
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.3.16"
3
+ version = "0.3.17"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -157,7 +157,7 @@ class McpAgent(ABC, ToolAgent):
157
157
  if skills_configured:
158
158
  modes.append("skills")
159
159
  if shell_flag_requested:
160
- modes.append("command switch")
160
+ modes.append("switch")
161
161
  self._shell_access_modes = tuple(modes)
162
162
  self._bash_tool = self._shell_runtime.tool
163
163
  if self._shell_runtime_enabled:
@@ -21,6 +21,8 @@ GO_SPECIFIC_OPTIONS = {
21
21
  "-c",
22
22
  "--shell",
23
23
  "-x",
24
+ "--skills",
25
+ "--skills-dir",
24
26
  }
25
27
 
26
28
  # Known subcommands that should not trigger auto-routing
@@ -8,7 +8,7 @@ from fast_agent.cli.terminal import Application
8
8
  from fast_agent.ui.console import console as shared_console
9
9
 
10
10
  app = typer.Typer(
11
- help="fast-agent - Build effective agents using Model Context Protocol",
11
+ help="Use `fast-agent go --help` for interactive shell arguments and options.",
12
12
  add_completion=False, # We'll add this later when we have more commands
13
13
  )
14
14
 
@@ -18,6 +18,7 @@ from typing import (
18
18
  Type,
19
19
  TypeVar,
20
20
  Union,
21
+ runtime_checkable,
21
22
  )
22
23
 
23
24
  from a2a.types import AgentCard
@@ -59,6 +60,7 @@ class ModelFactoryFunctionProtocol(Protocol):
59
60
  def __call__(self, model: str | None = None) -> LLMFactoryProtocol: ...
60
61
 
61
62
 
63
+ @runtime_checkable
62
64
  class FastAgentLLMProtocol(Protocol):
63
65
  """Protocol defining the interface for LLMs"""
64
66
 
@@ -111,6 +113,7 @@ class FastAgentLLMProtocol(Protocol):
111
113
  def clear(self, *, clear_prompts: bool = False) -> None: ...
112
114
 
113
115
 
116
+ @runtime_checkable
114
117
  class LlmAgentProtocol(Protocol):
115
118
  """Protocol defining the minimal interface for LLM agents."""
116
119
 
@@ -132,6 +135,7 @@ class LlmAgentProtocol(Protocol):
132
135
  def pop_last_message(self) -> PromptMessageExtended | None: ...
133
136
 
134
137
 
138
+ @runtime_checkable
135
139
  class AgentProtocol(LlmAgentProtocol, Protocol):
136
140
  """Standard agent interface with flexible input types."""
137
141
 
@@ -87,7 +87,7 @@ class ModelDatabase:
87
87
  )
88
88
 
89
89
  GEMINI_PRO = ModelParameters(
90
- context_window=2097152, max_output_tokens=8192, tokenizes=GOOGLE_MULTIMODAL
90
+ context_window=1_048_576, max_output_tokens=65_536, tokenizes=GOOGLE_MULTIMODAL
91
91
  )
92
92
 
93
93
  QWEN_STANDARD = ModelParameters(
@@ -245,6 +245,9 @@ class ModelDatabase:
245
245
  "gemini-2.5-pro-preview": GEMINI_2_5_PRO,
246
246
  "gemini-2.5-flash-preview-05-20": GEMINI_FLASH,
247
247
  "gemini-2.5-pro-preview-05-06": GEMINI_PRO,
248
+ "gemini-2.5-pro": GEMINI_PRO,
249
+ "gemini-2.5-flash-preview-09-2025": GEMINI_FLASH,
250
+ "gemini-2.5-flash": GEMINI_FLASH,
248
251
  # xAI Grok Models
249
252
  "grok-4-fast-reasoning": GROK_4_VLM,
250
253
  "grok-4-fast-non-reasoning": GROK_4_VLM,
@@ -90,7 +90,9 @@ class ModelFactory:
90
90
  "deepseek-chat": Provider.DEEPSEEK,
91
91
  "gemini-2.0-flash": Provider.GOOGLE,
92
92
  "gemini-2.5-flash-preview-05-20": Provider.GOOGLE,
93
+ "gemini-2.5-flash-preview-09-2025": Provider.GOOGLE,
93
94
  "gemini-2.5-pro-preview-05-06": Provider.GOOGLE,
95
+ "gemini-2.5-pro": Provider.GOOGLE,
94
96
  "grok-4": Provider.XAI,
95
97
  "grok-4-0709": Provider.XAI,
96
98
  "grok-3": Provider.XAI,
@@ -120,8 +122,8 @@ class ModelFactory:
120
122
  "deepseekv3": "deepseek-chat",
121
123
  "deepseek": "deepseek-chat",
122
124
  "gemini2": "gemini-2.0-flash",
123
- "gemini25": "gemini-2.5-flash-preview-05-20",
124
- "gemini25pro": "gemini-2.5-pro-preview-05-06",
125
+ "gemini25": "gemini-2.5-flash-preview-09-2025",
126
+ "gemini25pro": "gemini-2.5-pro",
125
127
  "kimi": "groq.moonshotai/kimi-k2-instruct-0905",
126
128
  "gpt-oss": "groq.openai/gpt-oss-120b",
127
129
  "gpt-oss-20b": "groq.openai/gpt-oss-20b",
@@ -8,14 +8,15 @@ capabilities (Text/Document/Vision), backed by the model database.
8
8
  from __future__ import annotations
9
9
 
10
10
  from dataclasses import dataclass
11
- from typing import TYPE_CHECKING, List, Optional, Union
11
+ from typing import TYPE_CHECKING, List, Optional
12
12
 
13
13
  from fast_agent.llm.model_database import ModelDatabase
14
+ from fast_agent.llm.model_factory import ModelFactory
14
15
  from fast_agent.llm.provider_types import Provider
15
16
 
16
17
  if TYPE_CHECKING:
17
18
  # Import behind TYPE_CHECKING to avoid import cycles at runtime
18
- from fast_agent.interfaces import AgentProtocol, FastAgentLLMProtocol
19
+ from fast_agent.interfaces import FastAgentLLMProtocol
19
20
 
20
21
 
21
22
  @dataclass(frozen=True)
@@ -32,16 +33,24 @@ class ModelInfo:
32
33
 
33
34
  @property
34
35
  def supports_text(self) -> bool:
36
+ if "text/plain" in (self.tokenizes or []):
37
+ return True
35
38
  return ModelDatabase.supports_mime(self.name, "text/plain")
36
39
 
37
40
  @property
38
41
  def supports_document(self) -> bool:
39
42
  # Document support currently keyed off PDF support
43
+ if "application/pdf" in (self.tokenizes or []):
44
+ return True
40
45
  return ModelDatabase.supports_mime(self.name, "pdf")
41
46
 
42
47
  @property
43
48
  def supports_vision(self) -> bool:
44
49
  # Any common image format indicates vision support
50
+ tokenizes = self.tokenizes or []
51
+ if any(mt in tokenizes for mt in ("image/jpeg", "image/png", "image/webp")):
52
+ return True
53
+
45
54
  return any(
46
55
  ModelDatabase.supports_mime(self.name, mt)
47
56
  for mt in ("image/jpeg", "image/png", "image/webp")
@@ -62,14 +71,15 @@ class ModelInfo:
62
71
 
63
72
  @classmethod
64
73
  def from_name(cls, name: str, provider: Provider | None = None) -> Optional["ModelInfo"]:
65
- params = ModelDatabase.get_model_params(name)
74
+ canonical_name = ModelFactory.MODEL_ALIASES.get(name, name)
75
+ params = ModelDatabase.get_model_params(canonical_name)
66
76
  if not params:
67
77
  # Unknown model: return a conservative default that supports text only.
68
78
  # This matches the desired behavior for TDV display fallbacks.
69
79
  if provider is None:
70
80
  provider = Provider.GENERIC
71
81
  return ModelInfo(
72
- name=name,
82
+ name=canonical_name,
73
83
  provider=provider,
74
84
  context_window=None,
75
85
  max_output_tokens=None,
@@ -78,49 +88,15 @@ class ModelInfo:
78
88
  reasoning=None,
79
89
  )
80
90
 
91
+ if provider is None:
92
+ provider = ModelFactory.DEFAULT_PROVIDERS.get(canonical_name, Provider.GENERIC)
93
+
81
94
  return ModelInfo(
82
- name=name,
83
- provider=provider or Provider.GENERIC,
95
+ name=canonical_name,
96
+ provider=provider,
84
97
  context_window=params.context_window,
85
98
  max_output_tokens=params.max_output_tokens,
86
99
  tokenizes=params.tokenizes,
87
100
  json_mode=params.json_mode,
88
101
  reasoning=params.reasoning,
89
102
  )
90
-
91
-
92
- def get_model_info(
93
- subject: Union["AgentProtocol", "FastAgentLLMProtocol", str, None],
94
- provider: Provider | None = None,
95
- ) -> Optional[ModelInfo]:
96
- """Resolve a ModelInfo from an Agent, LLM, or model name.
97
-
98
- Keeps the public API small while enabling type-safe access to model
99
- capabilities across the codebase.
100
- """
101
- if subject is None:
102
- return None
103
-
104
- # Agent → LLM
105
- try:
106
- from fast_agent.interfaces import AgentProtocol as _AgentProtocol
107
- except Exception:
108
- _AgentProtocol = None # type: ignore
109
-
110
- if _AgentProtocol and isinstance(subject, _AgentProtocol): # type: ignore[arg-type]
111
- return ModelInfo.from_llm(subject.llm)
112
-
113
- # LLM → ModelInfo
114
- try:
115
- from fast_agent.interfaces import FastAgentLLMProtocol as _LLMProtocol
116
- except Exception:
117
- _LLMProtocol = None # type: ignore
118
-
119
- if _LLMProtocol and isinstance(subject, _LLMProtocol): # type: ignore[arg-type]
120
- return ModelInfo.from_llm(subject)
121
-
122
- # String model name
123
- if isinstance(subject, str):
124
- return ModelInfo.from_name(subject, provider)
125
-
126
- return None
@@ -1,3 +1,4 @@
1
+ import json
1
2
  import secrets
2
3
  from typing import Dict, List
3
4
 
@@ -49,8 +50,6 @@ class GoogleNativeLLM(FastAgentLLM[types.Content, types.Content]):
49
50
 
50
51
  def __init__(self, *args, **kwargs) -> None:
51
52
  super().__init__(*args, provider=Provider.GOOGLE, **kwargs)
52
- # Initialize the google.genai client
53
- self._google_client = self._initialize_google_client()
54
53
  # Initialize the converter
55
54
  self._converter = GoogleConverter()
56
55
 
@@ -109,6 +108,218 @@ class GoogleNativeLLM(FastAgentLLM[types.Content, types.Content]):
109
108
  # Include other relevant default parameters
110
109
  )
111
110
 
111
+ async def _stream_generate_content(
112
+ self,
113
+ *,
114
+ model: str,
115
+ contents: List[types.Content],
116
+ config: types.GenerateContentConfig,
117
+ client: genai.Client,
118
+ ) -> types.GenerateContentResponse | None:
119
+ """Stream Gemini responses and return the final aggregated completion."""
120
+ try:
121
+ response_stream = await client.aio.models.generate_content_stream(
122
+ model=model,
123
+ contents=contents,
124
+ config=config,
125
+ )
126
+ except AttributeError:
127
+ # Older SDKs might not expose streaming; fall back to non-streaming.
128
+ return None
129
+ except errors.APIError:
130
+ raise
131
+ except Exception as exc: # pragma: no cover - defensive fallback
132
+ self.logger.warning(
133
+ "Google streaming failed during setup; falling back to non-streaming",
134
+ exc_info=exc,
135
+ )
136
+ return None
137
+
138
+ return await self._consume_google_stream(response_stream, model=model)
139
+
140
+ async def _consume_google_stream(
141
+ self,
142
+ response_stream,
143
+ *,
144
+ model: str,
145
+ ) -> types.GenerateContentResponse | None:
146
+ """Consume the async streaming iterator and aggregate the final response."""
147
+ estimated_tokens = 0
148
+ timeline: List[tuple[str, int | None, str]] = []
149
+ tool_streams: Dict[int, Dict[str, str]] = {}
150
+ active_tool_index: int | None = None
151
+ tool_counter = 0
152
+ usage_metadata = None
153
+ last_chunk: types.GenerateContentResponse | None = None
154
+
155
+ try:
156
+ async for chunk in response_stream:
157
+ last_chunk = chunk
158
+ if getattr(chunk, "usage_metadata", None):
159
+ usage_metadata = chunk.usage_metadata
160
+
161
+ if not getattr(chunk, "candidates", None):
162
+ continue
163
+
164
+ candidate = chunk.candidates[0]
165
+ content = getattr(candidate, "content", None)
166
+ if content is None or not getattr(content, "parts", None):
167
+ continue
168
+
169
+ for part in content.parts:
170
+ if getattr(part, "text", None):
171
+ text = part.text or ""
172
+ if text:
173
+ if timeline and timeline[-1][0] == "text":
174
+ prev_type, prev_index, prev_text = timeline[-1]
175
+ timeline[-1] = (prev_type, prev_index, prev_text + text)
176
+ else:
177
+ timeline.append(("text", None, text))
178
+ estimated_tokens = self._update_streaming_progress(
179
+ text,
180
+ model,
181
+ estimated_tokens,
182
+ )
183
+ self._notify_tool_stream_listeners(
184
+ "text",
185
+ {
186
+ "chunk": text,
187
+ "streams_arguments": False,
188
+ },
189
+ )
190
+
191
+ if getattr(part, "function_call", None):
192
+ function_call = part.function_call
193
+ name = getattr(function_call, "name", None) or "tool"
194
+ args = getattr(function_call, "args", None) or {}
195
+
196
+ if active_tool_index is None:
197
+ active_tool_index = tool_counter
198
+ tool_counter += 1
199
+ tool_use_id = f"tool_{self.chat_turn()}_{active_tool_index}"
200
+ tool_streams[active_tool_index] = {
201
+ "name": name,
202
+ "tool_use_id": tool_use_id,
203
+ "buffer": "",
204
+ }
205
+ self._notify_tool_stream_listeners(
206
+ "start",
207
+ {
208
+ "tool_name": name,
209
+ "tool_use_id": tool_use_id,
210
+ "index": active_tool_index,
211
+ "streams_arguments": False,
212
+ },
213
+ )
214
+ timeline.append(("tool_call", active_tool_index, ""))
215
+
216
+ stream_info = tool_streams.get(active_tool_index)
217
+ if not stream_info:
218
+ continue
219
+
220
+ try:
221
+ serialized_args = json.dumps(args, separators=(",", ":"))
222
+ except Exception:
223
+ serialized_args = str(args)
224
+
225
+ previous = stream_info.get("buffer", "")
226
+ if isinstance(previous, str) and serialized_args.startswith(previous):
227
+ delta = serialized_args[len(previous) :]
228
+ else:
229
+ delta = serialized_args
230
+ stream_info["buffer"] = serialized_args
231
+
232
+ if delta:
233
+ self._notify_tool_stream_listeners(
234
+ "delta",
235
+ {
236
+ "tool_name": stream_info["name"],
237
+ "tool_use_id": stream_info["tool_use_id"],
238
+ "index": active_tool_index,
239
+ "chunk": delta,
240
+ "streams_arguments": False,
241
+ },
242
+ )
243
+
244
+ finish_reason = getattr(candidate, "finish_reason", None)
245
+ if finish_reason:
246
+ finish_value = str(finish_reason).split(".")[-1].upper()
247
+ if finish_value in {"FUNCTION_CALL", "STOP"} and active_tool_index is not None:
248
+ stream_info = tool_streams.get(active_tool_index)
249
+ if stream_info:
250
+ self._notify_tool_stream_listeners(
251
+ "stop",
252
+ {
253
+ "tool_name": stream_info["name"],
254
+ "tool_use_id": stream_info["tool_use_id"],
255
+ "index": active_tool_index,
256
+ "streams_arguments": False,
257
+ },
258
+ )
259
+ active_tool_index = None
260
+ finally:
261
+ stream_close = getattr(response_stream, "aclose", None)
262
+ if callable(stream_close):
263
+ try:
264
+ await stream_close()
265
+ except Exception:
266
+ pass
267
+
268
+ if active_tool_index is not None:
269
+ stream_info = tool_streams.get(active_tool_index)
270
+ if stream_info:
271
+ self._notify_tool_stream_listeners(
272
+ "stop",
273
+ {
274
+ "tool_name": stream_info["name"],
275
+ "tool_use_id": stream_info["tool_use_id"],
276
+ "index": active_tool_index,
277
+ "streams_arguments": False,
278
+ },
279
+ )
280
+
281
+ if not timeline and last_chunk is None:
282
+ return None
283
+
284
+ final_parts: List[types.Part] = []
285
+ for entry_type, index, payload in timeline:
286
+ if entry_type == "text":
287
+ final_parts.append(types.Part.from_text(text=payload))
288
+ elif entry_type == "tool_call" and index is not None:
289
+ stream_info = tool_streams.get(index)
290
+ if not stream_info:
291
+ continue
292
+ buffer = stream_info.get("buffer", "")
293
+ try:
294
+ args_obj = json.loads(buffer) if buffer else {}
295
+ except json.JSONDecodeError:
296
+ args_obj = {"__raw": buffer}
297
+ final_parts.append(
298
+ types.Part.from_function_call(
299
+ name=str(stream_info.get("name") or "tool"),
300
+ args=args_obj,
301
+ )
302
+ )
303
+
304
+ final_content = types.Content(role="model", parts=final_parts)
305
+
306
+ if last_chunk is not None:
307
+ final_response = last_chunk.model_copy(deep=True)
308
+ if getattr(final_response, "candidates", None):
309
+ final_candidate = final_response.candidates[0]
310
+ final_candidate.content = final_content
311
+ else:
312
+ final_response.candidates = [types.Candidate(content=final_content)]
313
+ else:
314
+ final_response = types.GenerateContentResponse(
315
+ candidates=[types.Candidate(content=final_content)]
316
+ )
317
+
318
+ if usage_metadata:
319
+ final_response.usage_metadata = usage_metadata
320
+
321
+ return final_response
322
+
112
323
  async def _google_completion(
113
324
  self,
114
325
  message: List[types.Content] | None,
@@ -163,13 +374,24 @@ class GoogleNativeLLM(FastAgentLLM[types.Content, types.Content]):
163
374
  )
164
375
 
165
376
  # 3. Call the google.genai API
377
+ client = self._initialize_google_client()
166
378
  try:
167
379
  # Use the async client
168
- api_response = await self._google_client.aio.models.generate_content(
169
- model=request_params.model,
170
- contents=conversation_history, # Full conversational context for this turn
171
- config=generate_content_config,
172
- )
380
+ api_response = None
381
+ streaming_supported = response_schema is None and response_mime_type is None
382
+ if streaming_supported:
383
+ api_response = await self._stream_generate_content(
384
+ model=request_params.model,
385
+ contents=conversation_history,
386
+ config=generate_content_config,
387
+ client=client,
388
+ )
389
+ if api_response is None:
390
+ api_response = await client.aio.models.generate_content(
391
+ model=request_params.model,
392
+ contents=conversation_history, # Full conversational context for this turn
393
+ config=generate_content_config,
394
+ )
173
395
  self.logger.debug("Google generate_content response:", data=api_response)
174
396
 
175
397
  # Track usage if response is valid and has usage data
@@ -195,6 +417,15 @@ class GoogleNativeLLM(FastAgentLLM[types.Content, types.Content]):
195
417
  self.logger.error(f"Error during Google generate_content call: {e}")
196
418
  # Decide how to handle other exceptions - potentially re-raise or return an error message
197
419
  raise e
420
+ finally:
421
+ try:
422
+ await client.aio.aclose()
423
+ except Exception:
424
+ pass
425
+ try:
426
+ client.close()
427
+ except Exception:
428
+ pass
198
429
 
199
430
  # 4. Process the API response
200
431
  if not api_response.candidates: