fast-agent-mcp 0.3.13__tar.gz → 0.3.14__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.13 → fast_agent_mcp-0.3.14}/PKG-INFO +2 -2
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/setup/fastagent.config.yaml +5 -0
- {fast_agent_mcp-0.3.13/src/fast_agent/resources → fast_agent_mcp-0.3.14}/examples/workflows/router.py +1 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/pyproject.toml +2 -2
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/llm_agent.py +14 -33
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/llm_decorator.py +13 -2
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/mcp_agent.py +18 -2
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/tool_agent.py +8 -10
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/check_config.py +45 -1
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/config.py +63 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/constants.py +3 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/context.py +42 -9
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/listeners.py +1 -1
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/event_progress.py +2 -3
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/interfaces.py +9 -2
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_factory.py +4 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider_key_manager.py +1 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider_types.py +1 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/request_params.py +3 -1
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_aggregator.py +313 -40
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_connection_manager.py +39 -9
- fast_agent_mcp-0.3.14/src/fast_agent/mcp/skybridge.py +45 -0
- fast_agent_mcp-0.3.14/src/fast_agent/mcp/sse_tracking.py +287 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/transport_tracking.py +37 -3
- fast_agent_mcp-0.3.14/src/fast_agent/mcp/types.py +24 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14/src/fast_agent/resources}/examples/workflows/router.py +1 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/fastagent.config.yaml +5 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/console_display.py +295 -18
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/enhanced_prompt.py +107 -58
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/interactive_prompt.py +57 -34
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mcp_display.py +108 -27
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/rich_progress.py +4 -1
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/.gitignore +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/LICENSE +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/README.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/a2a/agent_executor.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/a2a/server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/azure-openai/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/bedrock/fast-agent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/custom-agents/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/custom-agents/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/fastapi/fastapi-advanced.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/fastapi/fastapi-simple.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/fastapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/fastapi/readme.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/mcp-filtering/test_mcp_filtering.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/cat.png +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example1.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example2.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/example3.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/mcp/vision-examples/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/new-api/display_check.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/new-api/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/new-api/simple_llm.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/new-api/simple_llm_advanced.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/new-api/simple_mcp.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/openapi_mcp_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/petstore.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/openapi/run-as-server.sh +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/otel/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/otel/agent2.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/otel/docker-compose.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/otel/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tool-use-agent/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/tool-use-agent/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/hatch_build.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/agent_types.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/chain_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/evaluator_optimizer.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/iterative_planner.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/orchestrator_models.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/orchestrator_prompts.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/parallel_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/agents/workflow/router_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/__main__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/auth.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/go.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/quickstart.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/server_helpers.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/setup.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/commands/url_parser.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/constants.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/main.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/cli/terminal.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/context_dependent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/agent_app.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/core_app.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/direct_decorators.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/direct_factory.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/error_handling.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/exceptions.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/executor.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/task_registry.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/executor/workflow_signal.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/fastagent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/events.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/json_serializer.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/logger.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/logging/transport.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/prompt.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/core/validation.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/history/history_exporter.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/elicitation_handler.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/elicitation_state.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/form_fields.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/simple_form.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/human_input/types.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/fastagent_llm.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/passthrough.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/playback.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/silent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/internal/slow.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/memory.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_database.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/model_info.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/prompt_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/anthropic_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/llm_anthropic.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/anthropic/multipart_converter_anthropic.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/bedrock/bedrock_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/bedrock/llm_bedrock.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/google/google_converter.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/google/llm_google_native.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_aliyun.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_azure.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_deepseek.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_generic.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_google_oai.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_groq.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_openai.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_openrouter.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_tensorzero_openai.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/llm_xai.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/multipart_converter_openai.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/openai_multipart.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/provider/openai/openai_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/sampling_converter.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/llm/usage_tracking.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/common.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/elicitation_factory.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/elicitation_handlers.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/gen_client.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/content_helpers.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/helpers/server_config_helpers.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/hf_auth.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/interfaces.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/logger_textio.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_agent_client_session.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mcp_content.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/mime_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/oauth_client.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_message_extended.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_render.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompt_serialization.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/__main__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_constants.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_helpers.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_load.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/prompts/prompt_template.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/resource_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/sampling.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/server/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/server/agent_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/stdio_tracking_simple.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/streamable_http_tracking.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/ui_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp/ui_mixin.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/mcp_server_registry.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/py.typed +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/analysis-campaign.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/analysis.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_account_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_forms_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/elicitation_game_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/forms_demo.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/game_character.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/game_character_handler.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/elicitations/tool_call.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/agent_one.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/agent_two.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/mcp/state-transfer/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher-eval.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher-imp.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/researcher/researcher.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/.env.sample +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/Makefile +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/README.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/clam.jpg +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/crab.png +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/demo_images/shrimp.png +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/docker-compose.yml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/image_demo.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/.python-version +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/Dockerfile +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/entrypoint.sh +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/mcp_server.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/mcp_server/pyproject.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/simple_agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_schema.json +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/system_template.minijinja +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/tensorzero/tensorzero_config/tensorzero.toml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/chaining.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/evaluator.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/graded_report.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/human_input.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/orchestrator.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/parallel.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/short_story.md +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/examples/workflows/short_story.txt +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/.gitignore +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/agent.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/fastagent.secrets.yaml.example +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/resources/setup/pyproject.toml.tmpl +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/tools/elicitation.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/types/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/types/llm_stop_reason.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/__init__.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/console.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/elicitation_form.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/elicitation_style.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/history_display.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mcp_ui_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/mermaid_utils.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/notification_tracker.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/src/fast_agent/ui/progress_display.py +0 -0
- {fast_agent_mcp-0.3.13 → fast_agent_mcp-0.3.14}/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.14
|
|
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
|
|
@@ -219,7 +219,7 @@ Requires-Dist: email-validator>=2.2.0
|
|
|
219
219
|
Requires-Dist: fastapi>=0.115.6
|
|
220
220
|
Requires-Dist: google-genai>=1.33.0
|
|
221
221
|
Requires-Dist: keyring>=24.3.1
|
|
222
|
-
Requires-Dist: mcp==1.
|
|
222
|
+
Requires-Dist: mcp==1.17.0
|
|
223
223
|
Requires-Dist: openai>=2.1.0
|
|
224
224
|
Requires-Dist: opentelemetry-distro>=0.55b0
|
|
225
225
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.7.0
|
|
@@ -15,6 +15,11 @@ default_model: gpt-5-mini.low
|
|
|
15
15
|
# mcp_ui_output_dir: ".fast-agent/ui" # Where to write MCP-UI HTML files (relative to CWD if not absolute)
|
|
16
16
|
# mcp_ui_mode: enabled
|
|
17
17
|
|
|
18
|
+
# MCP timeline display (adjust activity window/intervals in MCP UI + fast-agent check)
|
|
19
|
+
#mcp_timeline:
|
|
20
|
+
# steps: 20 # number of timeline buckets to render
|
|
21
|
+
# step_seconds: 30 # seconds per bucket (accepts values like "45s", "2m")
|
|
22
|
+
|
|
18
23
|
# Logging and Console Configuration:
|
|
19
24
|
logger:
|
|
20
25
|
# 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.14"
|
|
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.17.0",
|
|
19
19
|
"opentelemetry-distro>=0.55b0",
|
|
20
20
|
"opentelemetry-exporter-otlp-proto-http>=1.7.0",
|
|
21
21
|
"pydantic-settings>=2.7.0",
|
|
@@ -58,7 +58,16 @@ class LlmAgent(LlmDecorator):
|
|
|
58
58
|
super().__init__(config=config, context=context)
|
|
59
59
|
|
|
60
60
|
# Initialize display component
|
|
61
|
-
self.
|
|
61
|
+
self._display = ConsoleDisplay(config=self._context.config if self._context else None)
|
|
62
|
+
|
|
63
|
+
@property
|
|
64
|
+
def display(self) -> ConsoleDisplay:
|
|
65
|
+
"""UI display helper for presenting messages and tool activity."""
|
|
66
|
+
return self._display
|
|
67
|
+
|
|
68
|
+
@display.setter
|
|
69
|
+
def display(self, value: ConsoleDisplay) -> None:
|
|
70
|
+
self._display = value
|
|
62
71
|
|
|
63
72
|
async def show_assistant_message(
|
|
64
73
|
self,
|
|
@@ -139,7 +148,10 @@ class LlmAgent(LlmDecorator):
|
|
|
139
148
|
else:
|
|
140
149
|
# Fallback if we couldn't extract text
|
|
141
150
|
additional_segments.append(
|
|
142
|
-
Text(
|
|
151
|
+
Text(
|
|
152
|
+
f"\n\nError details: {str(error_blocks[0])}",
|
|
153
|
+
style="dim red italic",
|
|
154
|
+
)
|
|
143
155
|
)
|
|
144
156
|
else:
|
|
145
157
|
# Fallback if no detailed error is available
|
|
@@ -219,7 +231,6 @@ class LlmAgent(LlmDecorator):
|
|
|
219
231
|
if "user" == messages[-1].role:
|
|
220
232
|
self.show_user_message(message=messages[-1])
|
|
221
233
|
|
|
222
|
-
# TODO -- we should merge the request parameters here with the LLM defaults?
|
|
223
234
|
# TODO - manage error catch, recovery, pause
|
|
224
235
|
result, summary = await self._generate_with_summary(messages, request_params, tools)
|
|
225
236
|
|
|
@@ -243,33 +254,3 @@ class LlmAgent(LlmDecorator):
|
|
|
243
254
|
summary_text = Text(f"\n\n{summary.message}", style="dim red italic") if summary else None
|
|
244
255
|
await self.show_assistant_message(message=message, additional_message=summary_text)
|
|
245
256
|
return result, message
|
|
246
|
-
|
|
247
|
-
# async def show_prompt_loaded(
|
|
248
|
-
# self,
|
|
249
|
-
# prompt_name: str,
|
|
250
|
-
# description: Optional[str] = None,
|
|
251
|
-
# message_count: int = 0,
|
|
252
|
-
# arguments: Optional[dict[str, str]] = None,
|
|
253
|
-
# ) -> None:
|
|
254
|
-
# """
|
|
255
|
-
# Display information about a loaded prompt template.
|
|
256
|
-
|
|
257
|
-
# Args:
|
|
258
|
-
# prompt_name: The name of the prompt
|
|
259
|
-
# description: Optional description of the prompt
|
|
260
|
-
# message_count: Number of messages in the prompt
|
|
261
|
-
# arguments: Optional dictionary of arguments passed to the prompt
|
|
262
|
-
# """
|
|
263
|
-
# # Get aggregator from attached LLM if available
|
|
264
|
-
# aggregator = None
|
|
265
|
-
# if self._llm and hasattr(self._llm, "aggregator"):
|
|
266
|
-
# aggregator = self._llm.aggregator
|
|
267
|
-
|
|
268
|
-
# await self.display.show_prompt_loaded(
|
|
269
|
-
# prompt_name=prompt_name,
|
|
270
|
-
# description=description,
|
|
271
|
-
# message_count=message_count,
|
|
272
|
-
# agent_name=self.name,
|
|
273
|
-
# aggregator=aggregator,
|
|
274
|
-
# arguments=arguments,
|
|
275
|
-
# )
|
|
@@ -110,6 +110,11 @@ class LlmDecorator(AgentProtocol):
|
|
|
110
110
|
self._llm: Optional[FastAgentLLMProtocol] = None
|
|
111
111
|
self._initialized = False
|
|
112
112
|
|
|
113
|
+
@property
|
|
114
|
+
def context(self) -> Context | None:
|
|
115
|
+
"""Optional execution context supplied at construction time."""
|
|
116
|
+
return self._context
|
|
117
|
+
|
|
113
118
|
@property
|
|
114
119
|
def initialized(self) -> bool:
|
|
115
120
|
"""Check if the agent is initialized."""
|
|
@@ -243,9 +248,12 @@ class LlmDecorator(AgentProtocol):
|
|
|
243
248
|
"""
|
|
244
249
|
# Normalize all input types to a list of PromptMessageExtended
|
|
245
250
|
multipart_messages = normalize_to_extended_list(messages)
|
|
251
|
+
final_request_params = (
|
|
252
|
+
self.llm.get_request_params(request_params) if self._llm else request_params
|
|
253
|
+
)
|
|
246
254
|
|
|
247
255
|
with self._tracer.start_as_current_span(f"Agent: '{self._name}' generate"):
|
|
248
|
-
return await self.generate_impl(multipart_messages,
|
|
256
|
+
return await self.generate_impl(multipart_messages, final_request_params, tools)
|
|
249
257
|
|
|
250
258
|
async def generate_impl(
|
|
251
259
|
self,
|
|
@@ -352,9 +360,12 @@ class LlmDecorator(AgentProtocol):
|
|
|
352
360
|
"""
|
|
353
361
|
# Normalize all input types to a list of PromptMessageExtended
|
|
354
362
|
multipart_messages = normalize_to_extended_list(messages)
|
|
363
|
+
final_request_params = (
|
|
364
|
+
self.llm.get_request_params(request_params) if self._llm else request_params
|
|
365
|
+
)
|
|
355
366
|
|
|
356
367
|
with self._tracer.start_as_current_span(f"Agent: '{self._name}' structured"):
|
|
357
|
-
return await self.structured_impl(multipart_messages, model,
|
|
368
|
+
return await self.structured_impl(multipart_messages, model, final_request_params)
|
|
358
369
|
|
|
359
370
|
async def structured_impl(
|
|
360
371
|
self,
|
|
@@ -169,6 +169,11 @@ class McpAgent(ABC, ToolAgent):
|
|
|
169
169
|
return {}
|
|
170
170
|
return await self._aggregator.collect_server_status()
|
|
171
171
|
|
|
172
|
+
@property
|
|
173
|
+
def aggregator(self) -> MCPAggregator:
|
|
174
|
+
"""Expose the MCP aggregator for UI integrations."""
|
|
175
|
+
return self._aggregator
|
|
176
|
+
|
|
172
177
|
@property
|
|
173
178
|
def initialized(self) -> bool:
|
|
174
179
|
"""Check if both the agent and aggregator are initialized."""
|
|
@@ -664,7 +669,18 @@ class McpAgent(ABC, ToolAgent):
|
|
|
664
669
|
tool_results[correlation_id] = result
|
|
665
670
|
|
|
666
671
|
# Show tool result (like ToolAgent does)
|
|
667
|
-
|
|
672
|
+
skybridge_config = None
|
|
673
|
+
if namespaced_tool:
|
|
674
|
+
skybridge_config = await self._aggregator.get_skybridge_config(
|
|
675
|
+
namespaced_tool.server_name
|
|
676
|
+
)
|
|
677
|
+
|
|
678
|
+
self.display.show_tool_result(
|
|
679
|
+
name=self._name,
|
|
680
|
+
result=result,
|
|
681
|
+
tool_name=display_tool_name,
|
|
682
|
+
skybridge_config=skybridge_config,
|
|
683
|
+
)
|
|
668
684
|
|
|
669
685
|
self.logger.debug(f"MCP tool {display_tool_name} executed successfully")
|
|
670
686
|
except Exception as e:
|
|
@@ -675,7 +691,7 @@ class McpAgent(ABC, ToolAgent):
|
|
|
675
691
|
)
|
|
676
692
|
tool_results[correlation_id] = error_result
|
|
677
693
|
|
|
678
|
-
# Show error result too
|
|
694
|
+
# Show error result too (no need for skybridge config on errors)
|
|
679
695
|
self.display.show_tool_result(name=self._name, result=error_result)
|
|
680
696
|
|
|
681
697
|
return self._finalize_tool_results(tool_results)
|
|
@@ -5,7 +5,11 @@ from mcp.types import CallToolResult, ListToolsResult, Tool
|
|
|
5
5
|
|
|
6
6
|
from fast_agent.agents.agent_types import AgentConfig
|
|
7
7
|
from fast_agent.agents.llm_agent import LlmAgent
|
|
8
|
-
from fast_agent.constants import
|
|
8
|
+
from fast_agent.constants import (
|
|
9
|
+
DEFAULT_MAX_ITERATIONS,
|
|
10
|
+
FAST_AGENT_ERROR_CHANNEL,
|
|
11
|
+
HUMAN_INPUT_TOOL_NAME,
|
|
12
|
+
)
|
|
9
13
|
from fast_agent.context import Context
|
|
10
14
|
from fast_agent.core.logging.logger import get_logger
|
|
11
15
|
from fast_agent.mcp.helpers.content_helpers import text_content
|
|
@@ -15,13 +19,6 @@ from fast_agent.types.llm_stop_reason import LlmStopReason
|
|
|
15
19
|
|
|
16
20
|
logger = get_logger(__name__)
|
|
17
21
|
|
|
18
|
-
DEFAULT_MAX_TOOL_CALLS = 20
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
# should we have MAX_TOOL_CALLS instead to constrain by number of tools rather than turns...?
|
|
22
|
-
DEFAULT_MAX_ITERATIONS = 20
|
|
23
|
-
"""Maximum number of User/Assistant turns to take"""
|
|
24
|
-
|
|
25
22
|
|
|
26
23
|
class ToolAgent(LlmAgent):
|
|
27
24
|
"""
|
|
@@ -91,6 +88,7 @@ class ToolAgent(LlmAgent):
|
|
|
91
88
|
tools = (await self.list_tools()).tools
|
|
92
89
|
|
|
93
90
|
iterations = 0
|
|
91
|
+
max_iterations = request_params.max_iterations if request_params else DEFAULT_MAX_ITERATIONS
|
|
94
92
|
|
|
95
93
|
while True:
|
|
96
94
|
result = await super().generate_impl(
|
|
@@ -115,7 +113,7 @@ class ToolAgent(LlmAgent):
|
|
|
115
113
|
break
|
|
116
114
|
|
|
117
115
|
iterations += 1
|
|
118
|
-
if iterations >
|
|
116
|
+
if iterations > max_iterations:
|
|
119
117
|
logger.warning("Max iterations reached, stopping tool loop")
|
|
120
118
|
break
|
|
121
119
|
return result
|
|
@@ -170,7 +168,7 @@ class ToolAgent(LlmAgent):
|
|
|
170
168
|
# Delegate to call_tool for execution (overridable by subclasses)
|
|
171
169
|
result = await self.call_tool(tool_name, tool_args)
|
|
172
170
|
tool_results[correlation_id] = result
|
|
173
|
-
self.display.show_tool_result(name=self.name, result=result)
|
|
171
|
+
self.display.show_tool_result(name=self.name, result=result, tool_name=tool_name)
|
|
174
172
|
|
|
175
173
|
return self._finalize_tool_results(tool_results)
|
|
176
174
|
|
|
@@ -144,7 +144,7 @@ def get_fastagent_version() -> str:
|
|
|
144
144
|
|
|
145
145
|
def get_config_summary(config_path: Optional[Path]) -> dict:
|
|
146
146
|
"""Extract key information from the configuration file."""
|
|
147
|
-
from fast_agent.config import Settings
|
|
147
|
+
from fast_agent.config import MCPTimelineSettings, Settings
|
|
148
148
|
|
|
149
149
|
# Get actual defaults from Settings class
|
|
150
150
|
default_settings = Settings()
|
|
@@ -163,6 +163,10 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
|
|
|
163
163
|
"enable_markup": default_settings.logger.enable_markup,
|
|
164
164
|
},
|
|
165
165
|
"mcp_ui_mode": default_settings.mcp_ui_mode,
|
|
166
|
+
"timeline": {
|
|
167
|
+
"steps": default_settings.mcp_timeline.steps,
|
|
168
|
+
"step_seconds": default_settings.mcp_timeline.step_seconds,
|
|
169
|
+
},
|
|
166
170
|
"mcp_servers": [],
|
|
167
171
|
}
|
|
168
172
|
|
|
@@ -211,6 +215,22 @@ def get_config_summary(config_path: Optional[Path]) -> dict:
|
|
|
211
215
|
if "mcp_ui_mode" in config:
|
|
212
216
|
result["mcp_ui_mode"] = config["mcp_ui_mode"]
|
|
213
217
|
|
|
218
|
+
# Get timeline settings
|
|
219
|
+
if "mcp_timeline" in config:
|
|
220
|
+
try:
|
|
221
|
+
timeline_override = MCPTimelineSettings(**(config.get("mcp_timeline") or {}))
|
|
222
|
+
except Exception as exc: # pragma: no cover - defensive
|
|
223
|
+
console.print(
|
|
224
|
+
"[yellow]Warning:[/yellow] Invalid mcp_timeline configuration; "
|
|
225
|
+
"using defaults."
|
|
226
|
+
)
|
|
227
|
+
console.print(f"[yellow]Details:[/yellow] {exc}")
|
|
228
|
+
else:
|
|
229
|
+
result["timeline"] = {
|
|
230
|
+
"steps": timeline_override.steps,
|
|
231
|
+
"step_seconds": timeline_override.step_seconds,
|
|
232
|
+
}
|
|
233
|
+
|
|
214
234
|
# Get MCP server info
|
|
215
235
|
if "mcp" in config and "servers" in config["mcp"]:
|
|
216
236
|
for server_name, server_config in config["mcp"]["servers"].items():
|
|
@@ -385,6 +405,28 @@ def show_check_summary() -> None:
|
|
|
385
405
|
else:
|
|
386
406
|
mcp_ui_display = f"[green]{mcp_ui_mode}[/green]"
|
|
387
407
|
|
|
408
|
+
timeline_settings = config_summary.get("timeline", {})
|
|
409
|
+
timeline_steps = timeline_settings.get("steps", 20)
|
|
410
|
+
timeline_step_seconds = timeline_settings.get("step_seconds", 30)
|
|
411
|
+
|
|
412
|
+
def format_step_interval(seconds: int) -> str:
|
|
413
|
+
try:
|
|
414
|
+
total = int(seconds)
|
|
415
|
+
except (TypeError, ValueError):
|
|
416
|
+
return str(seconds)
|
|
417
|
+
if total <= 0:
|
|
418
|
+
return "0s"
|
|
419
|
+
if total % 86400 == 0:
|
|
420
|
+
return f"{total // 86400}d"
|
|
421
|
+
if total % 3600 == 0:
|
|
422
|
+
return f"{total // 3600}h"
|
|
423
|
+
if total % 60 == 0:
|
|
424
|
+
return f"{total // 60}m"
|
|
425
|
+
minutes, secs = divmod(total, 60)
|
|
426
|
+
if minutes:
|
|
427
|
+
return f"{minutes}m{secs:02d}s"
|
|
428
|
+
return f"{secs}s"
|
|
429
|
+
|
|
388
430
|
# Prepare all settings as pairs
|
|
389
431
|
settings_data = [
|
|
390
432
|
("Log Level", logger.get("level", "warning (default)")),
|
|
@@ -395,6 +437,8 @@ def show_check_summary() -> None:
|
|
|
395
437
|
("Show Tools", bool_to_symbol(logger.get("show_tools", True))),
|
|
396
438
|
("Truncate Tools", bool_to_symbol(logger.get("truncate_tools", True))),
|
|
397
439
|
("Enable Markup", bool_to_symbol(logger.get("enable_markup", True))),
|
|
440
|
+
("Timeline Steps", f"[green]{timeline_steps}[/green]"),
|
|
441
|
+
("Timeline Interval", f"[green]{format_step_interval(timeline_step_seconds)}[/green]"),
|
|
398
442
|
]
|
|
399
443
|
|
|
400
444
|
# Add rows in two-column layout, styling some values in green
|
|
@@ -49,6 +49,66 @@ class MCPElicitationSettings(BaseModel):
|
|
|
49
49
|
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
class MCPTimelineSettings(BaseModel):
|
|
53
|
+
"""Configuration for MCP activity timeline display."""
|
|
54
|
+
|
|
55
|
+
steps: int = 20
|
|
56
|
+
"""Number of timeline buckets to render."""
|
|
57
|
+
|
|
58
|
+
step_seconds: int = 30
|
|
59
|
+
"""Duration of each timeline bucket in seconds."""
|
|
60
|
+
|
|
61
|
+
model_config = ConfigDict(extra="allow", arbitrary_types_allowed=True)
|
|
62
|
+
|
|
63
|
+
@staticmethod
|
|
64
|
+
def _parse_duration(value: str) -> int:
|
|
65
|
+
"""Parse simple duration strings like '30s', '2m', '1h' into seconds."""
|
|
66
|
+
pattern = re.compile(r"^\s*(\d+)\s*([smhd]?)\s*$", re.IGNORECASE)
|
|
67
|
+
match = pattern.match(value)
|
|
68
|
+
if not match:
|
|
69
|
+
raise ValueError("Expected duration in seconds (e.g. 30, '45s', '2m').")
|
|
70
|
+
amount = int(match.group(1))
|
|
71
|
+
unit = match.group(2).lower()
|
|
72
|
+
multiplier = {
|
|
73
|
+
"": 1,
|
|
74
|
+
"s": 1,
|
|
75
|
+
"m": 60,
|
|
76
|
+
"h": 3600,
|
|
77
|
+
"d": 86400,
|
|
78
|
+
}.get(unit)
|
|
79
|
+
if multiplier is None:
|
|
80
|
+
raise ValueError("Duration unit must be one of s, m, h, or d.")
|
|
81
|
+
return amount * multiplier
|
|
82
|
+
|
|
83
|
+
@field_validator("steps", mode="before")
|
|
84
|
+
@classmethod
|
|
85
|
+
def _coerce_steps(cls, value: Any) -> int:
|
|
86
|
+
if isinstance(value, str):
|
|
87
|
+
if not value.strip().isdigit():
|
|
88
|
+
raise ValueError("Timeline steps must be a positive integer.")
|
|
89
|
+
value = int(value.strip())
|
|
90
|
+
elif isinstance(value, float):
|
|
91
|
+
value = int(value)
|
|
92
|
+
if not isinstance(value, int):
|
|
93
|
+
raise TypeError("Timeline steps must be an integer.")
|
|
94
|
+
if value <= 0:
|
|
95
|
+
raise ValueError("Timeline steps must be greater than zero.")
|
|
96
|
+
return value
|
|
97
|
+
|
|
98
|
+
@field_validator("step_seconds", mode="before")
|
|
99
|
+
@classmethod
|
|
100
|
+
def _coerce_step_seconds(cls, value: Any) -> int:
|
|
101
|
+
if isinstance(value, str):
|
|
102
|
+
value = cls._parse_duration(value)
|
|
103
|
+
elif isinstance(value, (int, float)):
|
|
104
|
+
value = int(value)
|
|
105
|
+
else:
|
|
106
|
+
raise TypeError("Timeline step duration must be a number of seconds.")
|
|
107
|
+
if value <= 0:
|
|
108
|
+
raise ValueError("Timeline step duration must be greater than zero.")
|
|
109
|
+
return value
|
|
110
|
+
|
|
111
|
+
|
|
52
112
|
class MCPRootSettings(BaseModel):
|
|
53
113
|
"""Represents a root directory configuration for an MCP server."""
|
|
54
114
|
|
|
@@ -528,6 +588,9 @@ class Settings(BaseSettings):
|
|
|
528
588
|
mcp_ui_output_dir: str = ".fast-agent/ui"
|
|
529
589
|
"""Directory where MCP-UI HTML files are written. Relative paths are resolved from CWD."""
|
|
530
590
|
|
|
591
|
+
mcp_timeline: MCPTimelineSettings = MCPTimelineSettings()
|
|
592
|
+
"""Display settings for MCP activity timelines."""
|
|
593
|
+
|
|
531
594
|
@classmethod
|
|
532
595
|
def find_config(cls) -> Path | None:
|
|
533
596
|
"""Find the config file in the current directory or parent directories."""
|
|
@@ -8,3 +8,6 @@ MCP_UI = "mcp-ui"
|
|
|
8
8
|
REASONING = "reasoning"
|
|
9
9
|
FAST_AGENT_ERROR_CHANNEL = "fast-agent-error"
|
|
10
10
|
FAST_AGENT_REMOVED_METADATA_CHANNEL = "fast-agent-removed-meta"
|
|
11
|
+
# should we have MAX_TOOL_CALLS instead to constrain by number of tools rather than turns...?
|
|
12
|
+
DEFAULT_MAX_ITERATIONS = 20
|
|
13
|
+
"""Maximum number of User/Assistant turns to take"""
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
A central context object to store global state that is shared across the application.
|
|
3
|
-
"""
|
|
1
|
+
from __future__ import annotations
|
|
4
2
|
|
|
5
3
|
import asyncio
|
|
6
4
|
import concurrent.futures
|
|
5
|
+
import logging
|
|
7
6
|
import uuid
|
|
7
|
+
from pathlib import Path
|
|
8
8
|
from typing import TYPE_CHECKING, Any, Optional, Union
|
|
9
9
|
|
|
10
10
|
from opentelemetry import trace
|
|
@@ -29,12 +29,18 @@ from fast_agent.mcp_server_registry import ServerRegistry
|
|
|
29
29
|
|
|
30
30
|
if TYPE_CHECKING:
|
|
31
31
|
from fast_agent.core.executor.workflow_signal import SignalWaitCallback
|
|
32
|
+
from fast_agent.mcp.mcp_connection_manager import MCPConnectionManager
|
|
32
33
|
else:
|
|
33
34
|
# Runtime placeholders for the types
|
|
34
35
|
SignalWaitCallback = Any
|
|
36
|
+
MCPConnectionManager = Any
|
|
35
37
|
|
|
36
38
|
logger = get_logger(__name__)
|
|
37
39
|
|
|
40
|
+
"""
|
|
41
|
+
A central context object to store global state that is shared across the application.
|
|
42
|
+
"""
|
|
43
|
+
|
|
38
44
|
|
|
39
45
|
class Context(BaseModel):
|
|
40
46
|
"""
|
|
@@ -52,6 +58,7 @@ class Context(BaseModel):
|
|
|
52
58
|
task_registry: Optional[ActivityRegistry] = None
|
|
53
59
|
|
|
54
60
|
tracer: trace.Tracer | None = None
|
|
61
|
+
_connection_manager: "MCPConnectionManager | None" = None
|
|
55
62
|
|
|
56
63
|
model_config = ConfigDict(
|
|
57
64
|
extra="allow",
|
|
@@ -130,16 +137,42 @@ async def configure_logger(config: "Settings") -> None:
|
|
|
130
137
|
"""
|
|
131
138
|
Configure logging and tracing based on the application config.
|
|
132
139
|
"""
|
|
140
|
+
settings = config.logger
|
|
141
|
+
|
|
142
|
+
# Configure the standard Python logger used by LoggingListener so it respects settings.
|
|
143
|
+
python_logger = logging.getLogger("fast_agent")
|
|
144
|
+
python_logger.handlers.clear()
|
|
145
|
+
python_logger.setLevel(settings.level.upper())
|
|
146
|
+
python_logger.propagate = False
|
|
147
|
+
|
|
148
|
+
handler: logging.Handler
|
|
149
|
+
if settings.type == "console":
|
|
150
|
+
handler = logging.StreamHandler()
|
|
151
|
+
elif settings.type == "file":
|
|
152
|
+
log_path = Path(settings.path)
|
|
153
|
+
if log_path.parent:
|
|
154
|
+
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
155
|
+
handler = logging.FileHandler(log_path)
|
|
156
|
+
elif settings.type == "none":
|
|
157
|
+
handler = logging.NullHandler()
|
|
158
|
+
else:
|
|
159
|
+
# For transports that handle output elsewhere (e.g., HTTP), suppress console output.
|
|
160
|
+
handler = logging.NullHandler()
|
|
161
|
+
|
|
162
|
+
handler.setLevel(settings.level.upper())
|
|
163
|
+
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
164
|
+
python_logger.addHandler(handler)
|
|
165
|
+
|
|
133
166
|
# Use StreamingExclusionFilter to prevent streaming events from flooding logs
|
|
134
|
-
event_filter: EventFilter = StreamingExclusionFilter(min_level=
|
|
135
|
-
logger.info(f"Configuring logger with level: {
|
|
136
|
-
transport = create_transport(settings=
|
|
167
|
+
event_filter: EventFilter = StreamingExclusionFilter(min_level=settings.level)
|
|
168
|
+
logger.info(f"Configuring logger with level: {settings.level}")
|
|
169
|
+
transport = create_transport(settings=settings, event_filter=event_filter)
|
|
137
170
|
await LoggingConfig.configure(
|
|
138
171
|
event_filter=event_filter,
|
|
139
172
|
transport=transport,
|
|
140
|
-
batch_size=
|
|
141
|
-
flush_interval=
|
|
142
|
-
progress_display=
|
|
173
|
+
batch_size=settings.batch_size,
|
|
174
|
+
flush_interval=settings.flush_interval,
|
|
175
|
+
progress_display=settings.progress_display,
|
|
143
176
|
)
|
|
144
177
|
|
|
145
178
|
|
|
@@ -70,7 +70,7 @@ def convert_log_event(event: Event) -> "ProgressEvent | None":
|
|
|
70
70
|
|
|
71
71
|
# Extract streaming token count for STREAMING actions
|
|
72
72
|
streaming_tokens = None
|
|
73
|
-
if progress_action == ProgressAction.STREAMING:
|
|
73
|
+
if progress_action == ProgressAction.STREAMING or progress_action == ProgressAction.THINKING:
|
|
74
74
|
streaming_tokens = event_data.get("details", "")
|
|
75
75
|
|
|
76
76
|
# Extract progress data for TOOL_PROGRESS actions
|
|
@@ -14,6 +14,7 @@ class ProgressAction(str, Enum):
|
|
|
14
14
|
INITIALIZED = "Initialized"
|
|
15
15
|
CHATTING = "Chatting"
|
|
16
16
|
STREAMING = "Streaming" # Special action for real-time streaming updates
|
|
17
|
+
THINKING = "Thinking" # Special action for real-time thinking updates
|
|
17
18
|
ROUTING = "Routing"
|
|
18
19
|
PLANNING = "Planning"
|
|
19
20
|
READY = "Ready"
|
|
@@ -53,9 +54,7 @@ class ProgressEvent(BaseModel):
|
|
|
53
54
|
base = f"{self.action.ljust(11)}. {self.target}"
|
|
54
55
|
if self.details:
|
|
55
56
|
base += f" - {self.details}"
|
|
56
|
-
|
|
57
|
+
|
|
57
58
|
if self.agent_name:
|
|
58
59
|
base = f"[{self.agent_name}] {base}"
|
|
59
60
|
return base
|
|
60
|
-
|
|
61
|
-
|
|
@@ -21,7 +21,7 @@ from typing import (
|
|
|
21
21
|
|
|
22
22
|
from a2a.types import AgentCard
|
|
23
23
|
from mcp import Tool
|
|
24
|
-
from mcp.types import GetPromptResult, Prompt, PromptMessage, ReadResourceResult
|
|
24
|
+
from mcp.types import GetPromptResult, ListToolsResult, Prompt, PromptMessage, ReadResourceResult
|
|
25
25
|
from pydantic import BaseModel
|
|
26
26
|
from rich.text import Text
|
|
27
27
|
|
|
@@ -79,6 +79,11 @@ class FastAgentLLMProtocol(Protocol):
|
|
|
79
79
|
self, prompt_result: "GetPromptResult", prompt_name: str
|
|
80
80
|
) -> str: ...
|
|
81
81
|
|
|
82
|
+
def get_request_params(
|
|
83
|
+
self,
|
|
84
|
+
request_params: RequestParams | None = None,
|
|
85
|
+
) -> RequestParams: ...
|
|
86
|
+
|
|
82
87
|
@property
|
|
83
88
|
def message_history(self) -> List[PromptMessageExtended]: ...
|
|
84
89
|
|
|
@@ -116,7 +121,7 @@ class LlmAgentProtocol(Protocol):
|
|
|
116
121
|
def clear(self, *, clear_prompts: bool = False) -> None: ...
|
|
117
122
|
|
|
118
123
|
|
|
119
|
-
class AgentProtocol(LlmAgentProtocol):
|
|
124
|
+
class AgentProtocol(LlmAgentProtocol, Protocol):
|
|
120
125
|
"""Standard agent interface with flexible input types."""
|
|
121
126
|
|
|
122
127
|
async def __call__(
|
|
@@ -190,6 +195,8 @@ class AgentProtocol(LlmAgentProtocol):
|
|
|
190
195
|
|
|
191
196
|
async def list_mcp_tools(self, namespace: str | None = None) -> Mapping[str, List[Tool]]: ...
|
|
192
197
|
|
|
198
|
+
async def list_tools(self) -> ListToolsResult: ...
|
|
199
|
+
|
|
193
200
|
async def get_resource(
|
|
194
201
|
self, resource_uri: str, namespace: str | None = None
|
|
195
202
|
) -> ReadResourceResult: ...
|
|
@@ -317,6 +317,10 @@ class ModelFactory:
|
|
|
317
317
|
from fast_agent.llm.provider.openai.llm_groq import GroqLLM
|
|
318
318
|
|
|
319
319
|
return GroqLLM
|
|
320
|
+
if provider == Provider.RESPONSES:
|
|
321
|
+
from fast_agent.llm.provider.openai.responses import ResponsesLLM
|
|
322
|
+
return ResponsesLLM
|
|
323
|
+
|
|
320
324
|
except Exception as e:
|
|
321
325
|
raise ModelConfigError(
|
|
322
326
|
f"Provider '{provider.value}' is unavailable or missing dependencies: {e}"
|
|
@@ -14,6 +14,7 @@ PROVIDER_ENVIRONMENT_MAP: Dict[str, str] = {
|
|
|
14
14
|
# default behaviour in _get_env_key_name is to capitalize the
|
|
15
15
|
# provider name and suffix "_API_KEY" - so no specific mapping needed unless overriding
|
|
16
16
|
"huggingface": "HF_TOKEN",
|
|
17
|
+
"responses": "OPENAI_API_KEY", # Temporary workaround
|
|
17
18
|
}
|
|
18
19
|
API_KEY_HINT_TEXT = "<your-api-key-here>"
|
|
19
20
|
|
|
@@ -8,6 +8,8 @@ from mcp import SamplingMessage
|
|
|
8
8
|
from mcp.types import CreateMessageRequestParams
|
|
9
9
|
from pydantic import Field
|
|
10
10
|
|
|
11
|
+
from fast_agent.constants import DEFAULT_MAX_ITERATIONS
|
|
12
|
+
|
|
11
13
|
|
|
12
14
|
class RequestParams(CreateMessageRequestParams):
|
|
13
15
|
"""
|
|
@@ -34,7 +36,7 @@ class RequestParams(CreateMessageRequestParams):
|
|
|
34
36
|
Agent/LLM maintains conversation history. Does not include applied Prompts
|
|
35
37
|
"""
|
|
36
38
|
|
|
37
|
-
max_iterations: int =
|
|
39
|
+
max_iterations: int = DEFAULT_MAX_ITERATIONS
|
|
38
40
|
"""
|
|
39
41
|
The maximum number of tool calls allowed in a conversation turn
|
|
40
42
|
"""
|