fast-agent-mcp 0.3.15__tar.gz → 0.3.16__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.3.15 → fast_agent_mcp-0.3.16}/PKG-INFO +8 -7
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/textual_markdown_demo.py +50 -8
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/agent.py +2 -5
- {fast_agent_mcp-0.3.15/src/fast_agent/resources → fast_agent_mcp-0.3.16/examples}/setup/agent.py +2 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/setup/fastagent.config.yaml +6 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/pyproject.toml +8 -7
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/__init__.py +2 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/agent_types.py +5 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/llm_agent.py +7 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/llm_decorator.py +6 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/mcp_agent.py +134 -10
- fast_agent_mcp-0.3.16/src/fast_agent/cli/__main__.py +73 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/check_config.py +85 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/go.py +100 -36
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/constants.py +13 -1
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/main.py +1 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/config.py +39 -10
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/constants.py +8 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/context.py +24 -15
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/direct_decorators.py +9 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/fastagent.py +101 -1
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/listeners.py +8 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/interfaces.py +8 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/fastagent_llm.py +45 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/memory.py +26 -1
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +112 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_openai.py +184 -18
- fast_agent_mcp-0.3.16/src/fast_agent/llm/provider/openai/responses.py +133 -0
- {fast_agent_mcp-0.3.15/examples → fast_agent_mcp-0.3.16/src/fast_agent/resources}/setup/agent.py +2 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/setup/fastagent.config.yaml +6 -0
- fast_agent_mcp-0.3.16/src/fast_agent/skills/__init__.py +9 -0
- fast_agent_mcp-0.3.16/src/fast_agent/skills/registry.py +200 -0
- fast_agent_mcp-0.3.16/src/fast_agent/tools/shell_runtime.py +404 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/console_display.py +396 -129
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/elicitation_form.py +76 -24
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/elicitation_style.py +2 -2
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/enhanced_prompt.py +81 -25
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/history_display.py +20 -5
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/interactive_prompt.py +108 -3
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/markdown_truncator.py +1 -1
- fast_agent_mcp-0.3.15/src/fast_agent/cli/__main__.py +0 -38
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/.gitignore +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/LICENSE +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/README.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/a2a/agent_executor.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/a2a/server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/fastapi/fastapi-advanced.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/fastapi/fastapi-simple.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/fastapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/fastapi/readme.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/display_check.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/simple_llm.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/simple_llm_advanced.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/new-api/simple_mcp.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/openapi_mcp_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/petstore.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/openapi/run-as-server.sh +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tool-use-agent/agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/tool-use-agent/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/hatch_build.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/tool_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/agents/workflow/router_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/auth.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/agent_app.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/core_app.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/executor/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/executor/executor.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/events.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/logger.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/logging/transport.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/event_progress.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/history/history_exporter.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/elicitation_handler.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/form_fields.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/simple_form.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/internal/passthrough.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/internal/playback.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/internal/silent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/internal/slow.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/model_database.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/model_factory.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/model_info.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider_key_manager.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/provider_types.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/request_params.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/elicitation_factory.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/interfaces.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/mcp_aggregator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/mcp_connection_manager.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/mcp_content.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/oauth_client.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompt.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/sampling.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/server/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/server/agent_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/skybridge.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/sse_tracking.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/transport_tracking.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/types.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/ui_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp/ui_mixin.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/py.typed +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/router.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/tools/elicitation.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/types/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/types/llm_stop_reason.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/__init__.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/console.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/mcp_display.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/mermaid_utils.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/notification_tracker.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/plain_text_truncator.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/progress_display.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/rich_progress.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/src/fast_agent/ui/streaming_buffer.py +0 -0
- {fast_agent_mcp-0.3.15 → fast_agent_mcp-0.3.16}/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.
|
|
3
|
+
Version: 0.3.16
|
|
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
|
|
@@ -209,18 +209,18 @@ Classifier: License :: OSI Approved :: Apache Software License
|
|
|
209
209
|
Classifier: Operating System :: OS Independent
|
|
210
210
|
Classifier: Programming Language :: Python :: 3
|
|
211
211
|
Requires-Python: <3.14,>=3.13.5
|
|
212
|
-
Requires-Dist: a2a-sdk>=0.3.
|
|
213
|
-
Requires-Dist: aiohttp>=3.
|
|
214
|
-
Requires-Dist: anthropic>=0.
|
|
212
|
+
Requires-Dist: a2a-sdk>=0.3.10
|
|
213
|
+
Requires-Dist: aiohttp>=3.13.1
|
|
214
|
+
Requires-Dist: anthropic>=0.71.0
|
|
215
215
|
Requires-Dist: azure-identity>=1.14.0
|
|
216
216
|
Requires-Dist: boto3>=1.35.0
|
|
217
217
|
Requires-Dist: deprecated>=1.2.18
|
|
218
218
|
Requires-Dist: email-validator>=2.2.0
|
|
219
219
|
Requires-Dist: fastapi>=0.115.6
|
|
220
|
-
Requires-Dist: google-genai>=1.
|
|
220
|
+
Requires-Dist: google-genai>=1.46.0
|
|
221
221
|
Requires-Dist: keyring>=24.3.1
|
|
222
|
-
Requires-Dist: mcp==1.
|
|
223
|
-
Requires-Dist: openai>=2.
|
|
222
|
+
Requires-Dist: mcp==1.19.0
|
|
223
|
+
Requires-Dist: openai[aiohttp]>=2.6.1
|
|
224
224
|
Requires-Dist: opentelemetry-distro>=0.55b0
|
|
225
225
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
|
|
226
226
|
Requires-Dist: opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'
|
|
@@ -231,6 +231,7 @@ Requires-Dist: prompt-toolkit>=3.0.52
|
|
|
231
231
|
Requires-Dist: pydantic-settings>=2.7.0
|
|
232
232
|
Requires-Dist: pydantic>=2.10.4
|
|
233
233
|
Requires-Dist: pyperclip>=1.9.0
|
|
234
|
+
Requires-Dist: python-frontmatter>=1.1.0
|
|
234
235
|
Requires-Dist: pyyaml>=6.0.2
|
|
235
236
|
Requires-Dist: rich>=14.1.0
|
|
236
237
|
Requires-Dist: tensorzero>=2025.7.5
|
|
@@ -362,6 +362,7 @@ class TextualDisplay(ConsoleDisplay):
|
|
|
362
362
|
name: str | None = None,
|
|
363
363
|
highlight_index: int | None = None,
|
|
364
364
|
max_item_length: int | None = None,
|
|
365
|
+
metadata: dict | None = None,
|
|
365
366
|
) -> None:
|
|
366
367
|
self._app.handle_display_tool_call(
|
|
367
368
|
agent_name=name,
|
|
@@ -370,6 +371,7 @@ class TextualDisplay(ConsoleDisplay):
|
|
|
370
371
|
bottom_items=bottom_items,
|
|
371
372
|
highlight_index=highlight_index,
|
|
372
373
|
max_item_length=max_item_length,
|
|
374
|
+
metadata=metadata,
|
|
373
375
|
)
|
|
374
376
|
|
|
375
377
|
def show_tool_result(
|
|
@@ -680,23 +682,63 @@ class MarkdownLLMApp(App[None]):
|
|
|
680
682
|
bottom_items: list[str] | None,
|
|
681
683
|
highlight_index: int | None,
|
|
682
684
|
max_item_length: int | None,
|
|
685
|
+
metadata: dict | None,
|
|
683
686
|
) -> None:
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
687
|
+
metadata = metadata or {}
|
|
688
|
+
|
|
689
|
+
if metadata.get("variant") == "shell":
|
|
690
|
+
command = metadata.get("command") or tool_args.get("command")
|
|
691
|
+
command_display = command if isinstance(command, str) and command.strip() else None
|
|
692
|
+
if command_display:
|
|
693
|
+
content = f"```shell\n$ {command_display}\n```"
|
|
694
|
+
else:
|
|
695
|
+
content = "_No shell command provided._"
|
|
696
|
+
|
|
697
|
+
details: list[str] = []
|
|
698
|
+
shell_name = metadata.get("shell_name")
|
|
699
|
+
shell_path = metadata.get("shell_path")
|
|
700
|
+
if shell_name or shell_path:
|
|
701
|
+
if shell_name and shell_path and shell_path != shell_name:
|
|
702
|
+
details.append(f"shell: {shell_name} ({shell_path})")
|
|
703
|
+
elif shell_path:
|
|
704
|
+
details.append(f"shell: {shell_path}")
|
|
705
|
+
elif shell_name:
|
|
706
|
+
details.append(f"shell: {shell_name}")
|
|
707
|
+
working_dir = metadata.get("working_dir_display") or metadata.get("working_dir")
|
|
708
|
+
if working_dir:
|
|
709
|
+
details.append(f"cwd: {working_dir}")
|
|
710
|
+
|
|
711
|
+
capability_bits: list[str] = []
|
|
712
|
+
if metadata.get("streams_output"):
|
|
713
|
+
capability_bits.append("streams stdout/stderr")
|
|
714
|
+
if metadata.get("returns_exit_code"):
|
|
715
|
+
capability_bits.append("reports exit code")
|
|
716
|
+
|
|
717
|
+
if capability_bits:
|
|
718
|
+
details.append("; ".join(capability_bits))
|
|
719
|
+
|
|
720
|
+
if details:
|
|
721
|
+
bullet_points = "\n".join(f"- {line}" for line in details)
|
|
722
|
+
content = f"{content}\n\n{bullet_points}"
|
|
690
723
|
else:
|
|
691
|
-
|
|
724
|
+
if tool_args:
|
|
725
|
+
try:
|
|
726
|
+
args_text = json.dumps(tool_args, indent=2, sort_keys=True)
|
|
727
|
+
except TypeError: # pragma: no cover - fallback for unserializable args
|
|
728
|
+
args_text = str(tool_args)
|
|
729
|
+
content = f"```json\n{args_text}\n```"
|
|
730
|
+
else:
|
|
731
|
+
content = "_No arguments provided._"
|
|
692
732
|
|
|
693
733
|
self._active_assistant_message = None
|
|
694
734
|
|
|
735
|
+
right_info = "shell command" if metadata.get("variant") == "shell" else f"tool request - {tool_name}"
|
|
736
|
+
|
|
695
737
|
message = ChatMessage(
|
|
696
738
|
role="tool_call",
|
|
697
739
|
content=content,
|
|
698
740
|
name=agent_name or "Tool",
|
|
699
|
-
right_info=
|
|
741
|
+
right_info=right_info,
|
|
700
742
|
bottom_metadata=bottom_items,
|
|
701
743
|
highlight_index=highlight_index,
|
|
702
744
|
max_item_length=max_item_length,
|
|
@@ -1,16 +1,13 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
|
|
3
3
|
from fast_agent import FastAgent
|
|
4
|
+
from fast_agent.constants import DEFAULT_AGENT_INSTRUCTION
|
|
4
5
|
|
|
5
6
|
# Create the application
|
|
6
7
|
fast = FastAgent("fast-agent example")
|
|
7
8
|
|
|
8
9
|
|
|
9
|
-
default_instruction =
|
|
10
|
-
|
|
11
|
-
{{serverInstructions}}
|
|
12
|
-
|
|
13
|
-
The current date is {{currentDate}}."""
|
|
10
|
+
default_instruction = DEFAULT_AGENT_INSTRUCTION
|
|
14
11
|
|
|
15
12
|
|
|
16
13
|
# Define the agent
|
|
@@ -20,6 +20,12 @@ mcp_timeline:
|
|
|
20
20
|
steps: 20 # number of timeline buckets to render
|
|
21
21
|
step_seconds: 15 # seconds per bucket (accepts values like "45s", "2m")
|
|
22
22
|
|
|
23
|
+
#shell_execution:
|
|
24
|
+
# length of time before terminating subprocess
|
|
25
|
+
# timeout_seconds: 20
|
|
26
|
+
# warning interval if no output seen
|
|
27
|
+
# warning_seconds: 5
|
|
28
|
+
|
|
23
29
|
# Logging and Console Configuration:
|
|
24
30
|
logger:
|
|
25
31
|
# level: "debug" | "info" | "warning" | "error"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "fast-agent-mcp"
|
|
3
|
-
version = "0.3.
|
|
3
|
+
version = "0.3.16"
|
|
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.13.5,<3.14"
|
|
16
16
|
dependencies = [
|
|
17
17
|
"fastapi>=0.115.6",
|
|
18
|
-
"mcp==1.
|
|
18
|
+
"mcp==1.19.0",
|
|
19
19
|
"opentelemetry-distro>=0.55b0",
|
|
20
20
|
"opentelemetry-exporter-otlp-proto-http>=1.7.0",
|
|
21
21
|
"pydantic-settings>=2.7.0",
|
|
@@ -23,24 +23,25 @@ dependencies = [
|
|
|
23
23
|
"pyyaml>=6.0.2",
|
|
24
24
|
"rich>=14.1.0",
|
|
25
25
|
"typer>=0.15.1",
|
|
26
|
-
"anthropic>=0.
|
|
27
|
-
"openai>=2.
|
|
26
|
+
"anthropic>=0.71.0",
|
|
27
|
+
"openai[aiohttp]>=2.6.1",
|
|
28
28
|
"azure-identity>=1.14.0",
|
|
29
29
|
"boto3>=1.35.0",
|
|
30
30
|
"prompt-toolkit>=3.0.52",
|
|
31
|
-
"aiohttp>=3.
|
|
31
|
+
"aiohttp>=3.13.1",
|
|
32
32
|
"opentelemetry-instrumentation-openai>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
|
|
33
33
|
"opentelemetry-instrumentation-anthropic>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
|
|
34
34
|
"opentelemetry-instrumentation-mcp>=0.43.1; python_version >= '3.10' and python_version < '4.0'",
|
|
35
|
-
"google-genai>=1.
|
|
35
|
+
"google-genai>=1.46.0",
|
|
36
36
|
"opentelemetry-instrumentation-google-genai>=0.3b0",
|
|
37
37
|
"tensorzero>=2025.7.5",
|
|
38
38
|
"deprecated>=1.2.18",
|
|
39
|
-
"a2a-sdk>=0.3.
|
|
39
|
+
"a2a-sdk>=0.3.10",
|
|
40
40
|
"email-validator>=2.2.0",
|
|
41
41
|
"pyperclip>=1.9.0",
|
|
42
42
|
"keyring>=24.3.1",
|
|
43
43
|
"textual>=6.2.1",
|
|
44
|
+
"python-frontmatter>=1.1.0",
|
|
44
45
|
]
|
|
45
46
|
|
|
46
47
|
# For Azure OpenAI with DefaultAzureCredential support, install with: pip install fast-agent-mcp[azure]
|
|
@@ -23,6 +23,7 @@ from fast_agent.config import (
|
|
|
23
23
|
OpenRouterSettings,
|
|
24
24
|
OpenTelemetrySettings,
|
|
25
25
|
Settings,
|
|
26
|
+
SkillsSettings,
|
|
26
27
|
TensorZeroSettings,
|
|
27
28
|
XAISettings,
|
|
28
29
|
)
|
|
@@ -126,6 +127,7 @@ __all__ = [
|
|
|
126
127
|
"BedrockSettings",
|
|
127
128
|
"HuggingFaceSettings",
|
|
128
129
|
"LoggerSettings",
|
|
130
|
+
"SkillsSettings",
|
|
129
131
|
# Progress and event tracking (lazy loaded)
|
|
130
132
|
"ProgressAction",
|
|
131
133
|
"ProgressEvent",
|
|
@@ -4,10 +4,13 @@ Type definitions for agents and agent configurations.
|
|
|
4
4
|
|
|
5
5
|
from dataclasses import dataclass, field
|
|
6
6
|
from enum import StrEnum, auto
|
|
7
|
+
from pathlib import Path
|
|
7
8
|
from typing import Dict, List, Optional
|
|
8
9
|
|
|
9
10
|
from mcp.client.session import ElicitationFnT
|
|
10
11
|
|
|
12
|
+
from fast_agent.skills import SkillManifest, SkillRegistry
|
|
13
|
+
|
|
11
14
|
# Forward imports to avoid circular dependencies
|
|
12
15
|
from fast_agent.types import RequestParams
|
|
13
16
|
|
|
@@ -36,6 +39,8 @@ class AgentConfig:
|
|
|
36
39
|
tools: Optional[Dict[str, List[str]]] = None
|
|
37
40
|
resources: Optional[Dict[str, List[str]]] = None
|
|
38
41
|
prompts: Optional[Dict[str, List[str]]] = None
|
|
42
|
+
skills: SkillManifest | SkillRegistry | Path | str | None = None
|
|
43
|
+
skill_manifests: List[SkillManifest] = field(default_factory=list, repr=False)
|
|
39
44
|
model: str | None = None
|
|
40
45
|
use_history: bool = True
|
|
41
46
|
default_request_params: RequestParams | None = None
|
|
@@ -246,6 +246,7 @@ class LlmAgent(LlmDecorator):
|
|
|
246
246
|
display_model = self.llm.model_name if self._llm else None
|
|
247
247
|
|
|
248
248
|
remove_listener: Callable[[], None] | None = None
|
|
249
|
+
remove_tool_listener: Callable[[], None] | None = None
|
|
249
250
|
|
|
250
251
|
with self.display.streaming_assistant_message(
|
|
251
252
|
name=display_name,
|
|
@@ -253,8 +254,12 @@ class LlmAgent(LlmDecorator):
|
|
|
253
254
|
) as stream_handle:
|
|
254
255
|
try:
|
|
255
256
|
remove_listener = self.llm.add_stream_listener(stream_handle.update)
|
|
257
|
+
remove_tool_listener = self.llm.add_tool_stream_listener(
|
|
258
|
+
stream_handle.handle_tool_event
|
|
259
|
+
)
|
|
256
260
|
except Exception:
|
|
257
261
|
remove_listener = None
|
|
262
|
+
remove_tool_listener = None
|
|
258
263
|
|
|
259
264
|
try:
|
|
260
265
|
result, summary = await self._generate_with_summary(
|
|
@@ -263,6 +268,8 @@ class LlmAgent(LlmDecorator):
|
|
|
263
268
|
finally:
|
|
264
269
|
if remove_listener:
|
|
265
270
|
remove_listener()
|
|
271
|
+
if remove_tool_listener:
|
|
272
|
+
remove_tool_listener()
|
|
266
273
|
|
|
267
274
|
if summary:
|
|
268
275
|
summary_text = Text(f"\n\n{summary.message}", style="dim red italic")
|
|
@@ -718,6 +718,12 @@ class LlmDecorator(AgentProtocol):
|
|
|
718
718
|
return self._llm.message_history
|
|
719
719
|
return []
|
|
720
720
|
|
|
721
|
+
def pop_last_message(self) -> PromptMessageExtended | None:
|
|
722
|
+
"""Remove and return the most recent message from the conversation history."""
|
|
723
|
+
if self._llm:
|
|
724
|
+
return self._llm.pop_last_message()
|
|
725
|
+
return None
|
|
726
|
+
|
|
721
727
|
@property
|
|
722
728
|
def usage_accumulator(self) -> UsageAccumulator | None:
|
|
723
729
|
"""
|
|
@@ -42,12 +42,15 @@ from fast_agent.core.exceptions import PromptExitError
|
|
|
42
42
|
from fast_agent.core.logging.logger import get_logger
|
|
43
43
|
from fast_agent.interfaces import FastAgentLLMProtocol
|
|
44
44
|
from fast_agent.mcp.mcp_aggregator import MCPAggregator, ServerStatus
|
|
45
|
+
from fast_agent.skills.registry import format_skills_for_prompt
|
|
45
46
|
from fast_agent.tools.elicitation import (
|
|
46
47
|
get_elicitation_tool,
|
|
47
48
|
run_elicitation_form,
|
|
48
49
|
set_elicitation_input_callback,
|
|
49
50
|
)
|
|
51
|
+
from fast_agent.tools.shell_runtime import ShellRuntime
|
|
50
52
|
from fast_agent.types import PromptMessageExtended, RequestParams
|
|
53
|
+
from fast_agent.ui import console
|
|
51
54
|
|
|
52
55
|
# Define a TypeVar for models
|
|
53
56
|
ModelT = TypeVar("ModelT", bound=BaseModel)
|
|
@@ -59,6 +62,7 @@ if TYPE_CHECKING:
|
|
|
59
62
|
|
|
60
63
|
from fast_agent.context import Context
|
|
61
64
|
from fast_agent.llm.usage_tracking import UsageAccumulator
|
|
65
|
+
from fast_agent.skills import SkillManifest
|
|
62
66
|
|
|
63
67
|
|
|
64
68
|
class McpAgent(ABC, ToolAgent):
|
|
@@ -73,7 +77,6 @@ class McpAgent(ABC, ToolAgent):
|
|
|
73
77
|
self,
|
|
74
78
|
config: AgentConfig,
|
|
75
79
|
connection_persistence: bool = True,
|
|
76
|
-
# legacy human_input_callback removed
|
|
77
80
|
context: "Context | None" = None,
|
|
78
81
|
**kwargs,
|
|
79
82
|
) -> None:
|
|
@@ -96,6 +99,69 @@ class McpAgent(ABC, ToolAgent):
|
|
|
96
99
|
self.instruction = self.config.instruction
|
|
97
100
|
self.executor = context.executor if context else None
|
|
98
101
|
self.logger = get_logger(f"{__name__}.{self._name}")
|
|
102
|
+
manifests: List[SkillManifest] = list(getattr(self.config, "skill_manifests", []) or [])
|
|
103
|
+
if not manifests and context and getattr(context, "skill_registry", None):
|
|
104
|
+
try:
|
|
105
|
+
manifests = list(context.skill_registry.load_manifests()) # type: ignore[assignment]
|
|
106
|
+
except Exception:
|
|
107
|
+
manifests = []
|
|
108
|
+
|
|
109
|
+
self._skill_manifests = list(manifests)
|
|
110
|
+
self._skill_map: Dict[str, SkillManifest] = {
|
|
111
|
+
manifest.name: manifest for manifest in manifests
|
|
112
|
+
}
|
|
113
|
+
self._agent_skills_warning_shown = False
|
|
114
|
+
shell_flag_requested = bool(context and getattr(context, "shell_runtime", False))
|
|
115
|
+
skills_configured = bool(self._skill_manifests)
|
|
116
|
+
self._shell_runtime_activation_reason: str | None = None
|
|
117
|
+
|
|
118
|
+
if shell_flag_requested and skills_configured:
|
|
119
|
+
self._shell_runtime_activation_reason = (
|
|
120
|
+
"via --shell flag and agent skills configuration"
|
|
121
|
+
)
|
|
122
|
+
elif shell_flag_requested:
|
|
123
|
+
self._shell_runtime_activation_reason = "via --shell flag"
|
|
124
|
+
elif skills_configured:
|
|
125
|
+
self._shell_runtime_activation_reason = "because agent skills are configured"
|
|
126
|
+
|
|
127
|
+
# Get timeout configuration from context
|
|
128
|
+
timeout_seconds = 90 # default
|
|
129
|
+
warning_interval_seconds = 30 # default
|
|
130
|
+
if context and context.config:
|
|
131
|
+
shell_config = getattr(context.config, "shell_execution", None)
|
|
132
|
+
if shell_config:
|
|
133
|
+
timeout_seconds = getattr(shell_config, "timeout_seconds", 90)
|
|
134
|
+
warning_interval_seconds = getattr(shell_config, "warning_interval_seconds", 30)
|
|
135
|
+
|
|
136
|
+
# Derive skills directory from this agent's manifests (respects per-agent config)
|
|
137
|
+
skills_directory = None
|
|
138
|
+
if self._skill_manifests:
|
|
139
|
+
# Get the skills directory from the first manifest's path
|
|
140
|
+
# Path structure: .fast-agent/skills/skill-name/SKILL.md
|
|
141
|
+
# So we need parent.parent of the manifest path
|
|
142
|
+
first_manifest = self._skill_manifests[0]
|
|
143
|
+
if first_manifest.path:
|
|
144
|
+
skills_directory = first_manifest.path.parent.parent
|
|
145
|
+
|
|
146
|
+
self._shell_runtime = ShellRuntime(
|
|
147
|
+
self._shell_runtime_activation_reason,
|
|
148
|
+
self.logger,
|
|
149
|
+
timeout_seconds=timeout_seconds,
|
|
150
|
+
warning_interval_seconds=warning_interval_seconds,
|
|
151
|
+
skills_directory=skills_directory,
|
|
152
|
+
)
|
|
153
|
+
self._shell_runtime_enabled = self._shell_runtime.enabled
|
|
154
|
+
self._shell_access_modes: tuple[str, ...] = ()
|
|
155
|
+
if self._shell_runtime_enabled:
|
|
156
|
+
modes: list[str] = ["[red]direct[/red]"]
|
|
157
|
+
if skills_configured:
|
|
158
|
+
modes.append("skills")
|
|
159
|
+
if shell_flag_requested:
|
|
160
|
+
modes.append("command switch")
|
|
161
|
+
self._shell_access_modes = tuple(modes)
|
|
162
|
+
self._bash_tool = self._shell_runtime.tool
|
|
163
|
+
if self._shell_runtime_enabled:
|
|
164
|
+
self._shell_runtime.announce()
|
|
99
165
|
|
|
100
166
|
# Store the default request params from config
|
|
101
167
|
self._default_request_params = self.config.default_request_params
|
|
@@ -207,6 +273,24 @@ class McpAgent(ABC, ToolAgent):
|
|
|
207
273
|
"{{serverInstructions}}", server_instructions
|
|
208
274
|
)
|
|
209
275
|
|
|
276
|
+
skills_placeholder_present = "{{agentSkills}}" in self.instruction
|
|
277
|
+
|
|
278
|
+
if skills_placeholder_present:
|
|
279
|
+
agent_skills = format_skills_for_prompt(self._skill_manifests)
|
|
280
|
+
self.instruction = self.instruction.replace("{{agentSkills}}", agent_skills)
|
|
281
|
+
self._agent_skills_warning_shown = True
|
|
282
|
+
elif self._skill_manifests and not self._agent_skills_warning_shown:
|
|
283
|
+
warning_message = (
|
|
284
|
+
"Agent skills are configured but the system prompt does not include {{agentSkills}}. "
|
|
285
|
+
"Skill descriptions will not be added to the system prompt."
|
|
286
|
+
)
|
|
287
|
+
self.logger.warning(warning_message)
|
|
288
|
+
try:
|
|
289
|
+
console.console.print(f"[yellow]{warning_message}[/yellow]")
|
|
290
|
+
except Exception: # pragma: no cover - console fallback
|
|
291
|
+
pass
|
|
292
|
+
self._agent_skills_warning_shown = True
|
|
293
|
+
|
|
210
294
|
# Update default request params to match
|
|
211
295
|
if self._default_request_params:
|
|
212
296
|
self._default_request_params.systemPrompt = self.instruction
|
|
@@ -315,11 +399,12 @@ class McpAgent(ABC, ToolAgent):
|
|
|
315
399
|
"""
|
|
316
400
|
# Get all tools from the aggregator
|
|
317
401
|
result = await self._aggregator.list_tools()
|
|
402
|
+
aggregator_tools = list(result.tools)
|
|
318
403
|
|
|
319
404
|
# Apply filtering if tools are specified in config
|
|
320
405
|
if self.config.tools is not None:
|
|
321
406
|
filtered_tools = []
|
|
322
|
-
for tool in
|
|
407
|
+
for tool in aggregator_tools:
|
|
323
408
|
# Extract server name from tool name, handling server names with hyphens
|
|
324
409
|
server_name = None
|
|
325
410
|
for configured_server in self.config.tools.keys():
|
|
@@ -334,7 +419,12 @@ class McpAgent(ABC, ToolAgent):
|
|
|
334
419
|
if self._matches_pattern(tool.name, pattern, server_name):
|
|
335
420
|
filtered_tools.append(tool)
|
|
336
421
|
break
|
|
337
|
-
|
|
422
|
+
aggregator_tools = filtered_tools
|
|
423
|
+
|
|
424
|
+
result.tools = aggregator_tools
|
|
425
|
+
|
|
426
|
+
if self._bash_tool and all(tool.name != self._bash_tool.name for tool in result.tools):
|
|
427
|
+
result.tools.append(self._bash_tool)
|
|
338
428
|
|
|
339
429
|
# Append human input tool if enabled and available
|
|
340
430
|
if self.config.human_input and getattr(self, "_human_input_tool", None):
|
|
@@ -353,6 +443,9 @@ class McpAgent(ABC, ToolAgent):
|
|
|
353
443
|
Returns:
|
|
354
444
|
Result of the tool call
|
|
355
445
|
"""
|
|
446
|
+
if self._shell_runtime.tool and name == self._shell_runtime.tool.name:
|
|
447
|
+
return await self._shell_runtime.execute(arguments)
|
|
448
|
+
|
|
356
449
|
if name == HUMAN_INPUT_TOOL_NAME:
|
|
357
450
|
# Call the elicitation-backed human input tool
|
|
358
451
|
return await self._call_human_input_tool(arguments)
|
|
@@ -615,6 +708,10 @@ class McpAgent(ABC, ToolAgent):
|
|
|
615
708
|
namespaced_tool.tool.name
|
|
616
709
|
for namespaced_tool in self._aggregator._namespaced_tool_map.values()
|
|
617
710
|
]
|
|
711
|
+
if self._shell_runtime.tool:
|
|
712
|
+
available_tools.append(self._shell_runtime.tool.name)
|
|
713
|
+
|
|
714
|
+
available_tools = list(dict.fromkeys(available_tools))
|
|
618
715
|
|
|
619
716
|
# Process each tool call using our aggregator
|
|
620
717
|
for correlation_id, tool_request in request.tool_calls.items():
|
|
@@ -628,6 +725,8 @@ class McpAgent(ABC, ToolAgent):
|
|
|
628
725
|
tool_available = False
|
|
629
726
|
if tool_name == HUMAN_INPUT_TOOL_NAME:
|
|
630
727
|
tool_available = True
|
|
728
|
+
elif self._bash_tool and tool_name == self._bash_tool.name:
|
|
729
|
+
tool_available = True
|
|
631
730
|
elif namespaced_tool:
|
|
632
731
|
tool_available = True
|
|
633
732
|
else:
|
|
@@ -654,6 +753,14 @@ class McpAgent(ABC, ToolAgent):
|
|
|
654
753
|
# Tool not found in list, no highlighting
|
|
655
754
|
pass
|
|
656
755
|
|
|
756
|
+
metadata: dict[str, Any] | None = None
|
|
757
|
+
if (
|
|
758
|
+
self._shell_runtime_enabled
|
|
759
|
+
and self._shell_runtime.tool
|
|
760
|
+
and display_tool_name == self._shell_runtime.tool.name
|
|
761
|
+
):
|
|
762
|
+
metadata = self._shell_runtime.metadata(tool_args.get("command"))
|
|
763
|
+
|
|
657
764
|
self.display.show_tool_call(
|
|
658
765
|
name=self._name,
|
|
659
766
|
tool_args=tool_args,
|
|
@@ -661,10 +768,11 @@ class McpAgent(ABC, ToolAgent):
|
|
|
661
768
|
tool_name=display_tool_name,
|
|
662
769
|
highlight_index=highlight_index,
|
|
663
770
|
max_item_length=12,
|
|
771
|
+
metadata=metadata,
|
|
664
772
|
)
|
|
665
773
|
|
|
666
774
|
try:
|
|
667
|
-
# Use
|
|
775
|
+
# Use the appropriate handler for this tool
|
|
668
776
|
result = await self.call_tool(tool_name, tool_args)
|
|
669
777
|
tool_results[correlation_id] = result
|
|
670
778
|
|
|
@@ -675,12 +783,13 @@ class McpAgent(ABC, ToolAgent):
|
|
|
675
783
|
namespaced_tool.server_name
|
|
676
784
|
)
|
|
677
785
|
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
786
|
+
if not getattr(result, "_suppress_display", False):
|
|
787
|
+
self.display.show_tool_result(
|
|
788
|
+
name=self._name,
|
|
789
|
+
result=result,
|
|
790
|
+
tool_name=display_tool_name,
|
|
791
|
+
skybridge_config=skybridge_config,
|
|
792
|
+
)
|
|
684
793
|
|
|
685
794
|
self.logger.debug(f"MCP tool {display_tool_name} executed successfully")
|
|
686
795
|
except Exception as e:
|
|
@@ -873,6 +982,9 @@ class McpAgent(ABC, ToolAgent):
|
|
|
873
982
|
|
|
874
983
|
result[special_server_name].append(self._human_input_tool)
|
|
875
984
|
|
|
985
|
+
# if self._skill_lookup_tool:
|
|
986
|
+
# result.setdefault("__skills__", []).append(self._skill_lookup_tool)
|
|
987
|
+
|
|
876
988
|
return result
|
|
877
989
|
|
|
878
990
|
@property
|
|
@@ -985,6 +1097,18 @@ class McpAgent(ABC, ToolAgent):
|
|
|
985
1097
|
Convert a Tool to an AgentSkill.
|
|
986
1098
|
"""
|
|
987
1099
|
|
|
1100
|
+
if tool.name in self._skill_map:
|
|
1101
|
+
manifest = self._skill_map[tool.name]
|
|
1102
|
+
return AgentSkill(
|
|
1103
|
+
id=f"skill:{manifest.name}",
|
|
1104
|
+
name=manifest.name,
|
|
1105
|
+
description=manifest.description or "",
|
|
1106
|
+
tags=["skill"],
|
|
1107
|
+
examples=None,
|
|
1108
|
+
input_modes=None,
|
|
1109
|
+
output_modes=None,
|
|
1110
|
+
)
|
|
1111
|
+
|
|
988
1112
|
_, tool_without_namespace = await self._parse_resource_name(tool.name, "tool")
|
|
989
1113
|
return AgentSkill(
|
|
990
1114
|
id=tool.name,
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import json
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
from fast_agent.cli.constants import GO_SPECIFIC_OPTIONS, KNOWN_SUBCOMMANDS
|
|
6
|
+
from fast_agent.cli.main import app
|
|
7
|
+
|
|
8
|
+
# if the arguments would work with "go" we'll just route to it
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def main():
|
|
12
|
+
"""Main entry point that handles auto-routing to 'go' command."""
|
|
13
|
+
try:
|
|
14
|
+
loop = asyncio.get_event_loop()
|
|
15
|
+
|
|
16
|
+
def _log_asyncio_exception(loop: asyncio.AbstractEventLoop, context: dict) -> None:
|
|
17
|
+
import logging
|
|
18
|
+
|
|
19
|
+
logger = logging.getLogger("fast_agent.asyncio")
|
|
20
|
+
|
|
21
|
+
message = context.get("message", "(no message)")
|
|
22
|
+
task = context.get("task")
|
|
23
|
+
future = context.get("future")
|
|
24
|
+
handle = context.get("handle")
|
|
25
|
+
source_traceback = context.get("source_traceback")
|
|
26
|
+
exception = context.get("exception")
|
|
27
|
+
|
|
28
|
+
details = {
|
|
29
|
+
"message": message,
|
|
30
|
+
"task": repr(task) if task else None,
|
|
31
|
+
"future": repr(future) if future else None,
|
|
32
|
+
"handle": repr(handle) if handle else None,
|
|
33
|
+
"source_traceback": [str(frame) for frame in source_traceback] if source_traceback else None,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
logger.error("Unhandled asyncio error: %s", message)
|
|
37
|
+
logger.error("Asyncio context: %s", json.dumps(details, indent=2))
|
|
38
|
+
|
|
39
|
+
if exception:
|
|
40
|
+
logger.exception("Asyncio exception", exc_info=exception)
|
|
41
|
+
|
|
42
|
+
loop.set_exception_handler(_log_asyncio_exception)
|
|
43
|
+
except RuntimeError:
|
|
44
|
+
# No running loop yet (rare for sync entry), safe to ignore
|
|
45
|
+
pass
|
|
46
|
+
# Check if we should auto-route to 'go'
|
|
47
|
+
if len(sys.argv) > 1:
|
|
48
|
+
# Check if first arg is not already a subcommand
|
|
49
|
+
first_arg = sys.argv[1]
|
|
50
|
+
|
|
51
|
+
# Only auto-route if any known go-specific options are present
|
|
52
|
+
has_go_options = any(
|
|
53
|
+
(arg in GO_SPECIFIC_OPTIONS) or any(arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS)
|
|
54
|
+
for arg in sys.argv[1:]
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
if first_arg not in KNOWN_SUBCOMMANDS and has_go_options:
|
|
58
|
+
# Find where to insert 'go' - before the first go-specific option
|
|
59
|
+
insert_pos = 1
|
|
60
|
+
for i, arg in enumerate(sys.argv[1:], 1):
|
|
61
|
+
if (arg in GO_SPECIFIC_OPTIONS) or any(
|
|
62
|
+
arg.startswith(opt + "=") for opt in GO_SPECIFIC_OPTIONS
|
|
63
|
+
):
|
|
64
|
+
insert_pos = i
|
|
65
|
+
break
|
|
66
|
+
# Auto-route to go command
|
|
67
|
+
sys.argv.insert(insert_pos, "go")
|
|
68
|
+
|
|
69
|
+
app()
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
if __name__ == "__main__":
|
|
73
|
+
main()
|