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.
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/PKG-INFO +6 -5
- {fast_agent_mcp-0.2.43/src/mcp_agent/resources → fast_agent_mcp-0.2.45}/examples/workflows/evaluator.py +2 -2
- {fast_agent_mcp-0.2.43/src/mcp_agent/resources → fast_agent_mcp-0.2.45}/examples/workflows/router.py +1 -1
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/pyproject.toml +6 -5
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/base_agent.py +60 -22
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/evaluator_optimizer.py +39 -63
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/router_agent.py +46 -21
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/config.py +2 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/context.py +4 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/agent_app.py +15 -5
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/direct_decorators.py +4 -5
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/enhanced_prompt.py +80 -11
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/fastagent.py +9 -1
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/interactive_prompt.py +60 -1
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/usage_display.py +10 -3
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_form.py +16 -13
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm.py +5 -7
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_passthrough.py +4 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_anthropic.py +258 -98
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_bedrock.py +3 -3
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_google_native.py +4 -7
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_openai.py +5 -8
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_tensorzero.py +6 -7
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/google_converter.py +6 -9
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_anthropic.py +5 -4
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_openai.py +33 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/multipart_converter_tensorzero.py +3 -2
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/rich_progress.py +6 -2
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/transport.py +30 -36
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/content_helpers.py +26 -11
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/interfaces.py +22 -2
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_message_multipart.py +2 -3
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45/src/mcp_agent/resources}/examples/workflows/evaluator.py +2 -2
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45/src/mcp_agent/resources}/examples/workflows/router.py +1 -1
- fast_agent_mcp-0.2.45/src/mcp_agent/ui/console_display.py +635 -0
- 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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/.gitignore +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/LICENSE +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/README.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/data-analysis/fastagent.config.yaml +0 -0
- {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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/hatch_build.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/app.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/__main__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/check_config.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/go.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/constants.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/main.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/console.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/agent_types.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/mcp_content.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/request_params.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/event_progress.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/executor.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_forms.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_handler.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/handler.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_playback.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_silent.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/augmented_llm_slow.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/memory.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/model_database.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/model_factory.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/provider_key_manager.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/provider_types.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_aliyun.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_azure.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_deepseek.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_generic.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_google_oai.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_openrouter.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/augmented_llm_xai.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/openai_multipart.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/openai_utils.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/sampling_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/providers/sampling_converter_openai.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/sampling_format_converter.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/events.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/listeners.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/logging/logger.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/elicitation_factory.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp/sampling.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server/__init__.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server/agent_server.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/progress_display.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {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
- {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
- {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
- {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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {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
- {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
- {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
- {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
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/resources/examples/workflows/short_story.txt +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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.
|
|
228
|
-
Requires-Dist: opentelemetry-instrumentation-openai>=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="
|
|
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="
|
|
43
|
+
model="sonnet",
|
|
44
44
|
)
|
|
45
45
|
# Define the evaluator-optimizer workflow
|
|
46
46
|
@fast.evaluator_optimizer(
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fast-agent-mcp"
|
|
3
|
-
version = "0.2.
|
|
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.
|
|
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.
|
|
33
|
-
"opentelemetry-instrumentation-anthropic>=0.
|
|
34
|
-
"opentelemetry-instrumentation-mcp>=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
|
|
369
|
-
server_name = tool.name.split(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
521
|
-
|
|
522
|
-
|
|
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
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
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
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
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],
|
{fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/evaluator_optimizer.py
RENAMED
|
@@ -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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
286
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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>
|
|
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
|
"""
|
{fast_agent_mcp-0.2.43 → fast_agent_mcp-0.2.45}/src/mcp_agent/agents/workflow/router_agent.py
RENAMED
|
@@ -39,7 +39,7 @@ Follow these guidelines:
|
|
|
39
39
|
"""
|
|
40
40
|
|
|
41
41
|
# Default routing instruction with placeholders for context (AgentCard JSON)
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
[
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
410
|
+
instruction=instruction or ROUTING_SYSTEM_INSTRUCTION,
|
|
412
411
|
servers=servers,
|
|
413
412
|
model=model,
|
|
414
413
|
use_history=use_history,
|