fast-agent-mcp 0.0.15__tar.gz → 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/PKG-INFO +121 -21
  2. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/README.md +120 -20
  3. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/pyproject.toml +1 -1
  4. fast_agent_mcp-0.1.0/src/mcp_agent/cli/__main__.py +7 -0
  5. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/commands/bootstrap.py +1 -1
  6. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/commands/setup.py +4 -1
  7. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/main.py +13 -3
  8. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/config.py +19 -11
  9. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/agent_app.py +1 -1
  10. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/enhanced_prompt.py +13 -5
  11. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/fastagent.py +87 -49
  12. fast_agent_mcp-0.1.0/src/mcp_agent/resources/examples/data-analysis/analysis-campaign.py +188 -0
  13. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/data-analysis/analysis.py +26 -0
  14. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/evaluator.py +3 -3
  15. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/parallel.py +0 -4
  16. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py +229 -91
  17. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/augmented_llm_anthropic.py +16 -2
  18. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/augmented_llm_openai.py +13 -1
  19. fast_agent_mcp-0.1.0/src/mcp_agent/workflows/llm/prompt_utils.py +137 -0
  20. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/orchestrator/orchestrator.py +252 -50
  21. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/orchestrator/orchestrator_models.py +81 -9
  22. fast_agent_mcp-0.1.0/src/mcp_agent/workflows/orchestrator/orchestrator_prompts.py +188 -0
  23. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/router_base.py +113 -21
  24. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/router_llm.py +19 -5
  25. fast_agent_mcp-0.0.15/src/mcp_agent/cli/__main__.py +0 -4
  26. fast_agent_mcp-0.0.15/src/mcp_agent/workflows/orchestrator/orchestrator_prompts.py +0 -118
  27. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/.gitignore +0 -0
  28. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/LICENSE +0 -0
  29. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/__init__.py +0 -0
  30. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/agents/__init__.py +0 -0
  31. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/agents/agent.py +0 -0
  32. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/app.py +0 -0
  33. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/__init__.py +0 -0
  34. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/commands/config.py +0 -0
  35. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/cli/terminal.py +0 -0
  36. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/console.py +0 -0
  37. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/context.py +0 -0
  38. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/context_dependent.py +0 -0
  39. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/__init__.py +0 -0
  40. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/agent_types.py +0 -0
  41. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/agent_utils.py +0 -0
  42. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/error_handling.py +0 -0
  43. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/exceptions.py +0 -0
  44. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/proxies.py +0 -0
  45. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/server_validation.py +0 -0
  46. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/core/types.py +0 -0
  47. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/eval/__init__.py +0 -0
  48. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/event_progress.py +0 -0
  49. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/__init__.py +0 -0
  50. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/decorator_registry.py +0 -0
  51. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/executor.py +0 -0
  52. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/task_registry.py +0 -0
  53. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/temporal.py +0 -0
  54. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/workflow.py +0 -0
  55. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/executor/workflow_signal.py +0 -0
  56. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/human_input/__init__.py +0 -0
  57. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/human_input/handler.py +0 -0
  58. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/human_input/types.py +0 -0
  59. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/__init__.py +0 -0
  60. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/events.py +0 -0
  61. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/json_serializer.py +0 -0
  62. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/listeners.py +0 -0
  63. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/logger.py +0 -0
  64. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/rich_progress.py +0 -0
  65. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/tracing.py +0 -0
  66. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/logging/transport.py +0 -0
  67. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/__init__.py +0 -0
  68. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/gen_client.py +0 -0
  69. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/mcp_activity.py +0 -0
  70. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/mcp_agent_client_session.py +0 -0
  71. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/mcp_agent_server.py +0 -0
  72. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/mcp_aggregator.py +0 -0
  73. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/mcp_connection_manager.py +0 -0
  74. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp/stdio.py +0 -0
  75. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/mcp_server_registry.py +0 -0
  76. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/progress_display.py +0 -0
  77. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/data-analysis/fastagent.config.yaml +0 -0
  78. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv +0 -0
  79. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/internal/agent.py +0 -0
  80. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/internal/job.py +0 -0
  81. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/internal/social.py +0 -0
  82. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/mcp_researcher/researcher-eval.py +0 -0
  83. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/researcher/fastagent.config.yaml +0 -0
  84. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/researcher/researcher-eval.py +0 -0
  85. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/researcher/researcher.py +0 -0
  86. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/agent_build.py +0 -0
  87. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/chaining.py +0 -0
  88. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -0
  89. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/human_input.py +0 -0
  90. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/orchestrator.py +1 -1
  91. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/resources/examples/workflows/router.py +0 -0
  92. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/telemetry/__init__.py +0 -0
  93. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/telemetry/usage_tracking.py +0 -0
  94. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/__init__.py +0 -0
  95. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/embedding/__init__.py +0 -0
  96. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/embedding/embedding_base.py +0 -0
  97. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/embedding/embedding_cohere.py +0 -0
  98. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/embedding/embedding_openai.py +0 -0
  99. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/evaluator_optimizer/__init__.py +0 -0
  100. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/__init__.py +0 -0
  101. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_base.py +0 -0
  102. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py +0 -0
  103. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding_cohere.py +0 -0
  104. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_embedding_openai.py +0 -0
  105. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm.py +0 -0
  106. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py +0 -0
  107. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py +0 -0
  108. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/__init__.py +0 -0
  109. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/augmented_llm.py +0 -0
  110. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/llm_selector.py +0 -0
  111. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/llm/model_factory.py +0 -0
  112. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/orchestrator/__init__.py +0 -0
  113. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/parallel/__init__.py +0 -0
  114. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/parallel/fan_in.py +0 -0
  115. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/parallel/fan_out.py +0 -0
  116. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/parallel/parallel_llm.py +0 -0
  117. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/__init__.py +0 -0
  118. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/router_embedding.py +0 -0
  119. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/router_embedding_cohere.py +0 -0
  120. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/router/router_embedding_openai.py +0 -0
  121. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/swarm/__init__.py +0 -0
  122. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/swarm/swarm.py +0 -0
  123. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/swarm/swarm_anthropic.py +0 -0
  124. {fast_agent_mcp-0.0.15 → fast_agent_mcp-0.1.0}/src/mcp_agent/workflows/swarm/swarm_openai.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fast-agent-mcp
3
- Version: 0.0.15
3
+ Version: 0.1.0
4
4
  Summary: Define, Prompt and Test MCP enabled Agents and Workflows
5
5
  Author-email: Shaun Smith <fastagent@llmindset.co.uk>, Sarmad Qadri <sarmad@lastmileai.dev>
6
6
  License: Apache License
@@ -235,7 +235,7 @@ Provides-Extra: temporal
235
235
  Requires-Dist: temporalio>=1.8.0; extra == 'temporal'
236
236
  Description-Content-Type: text/markdown
237
237
 
238
- ## FastAgent
238
+ ## fast-agent
239
239
 
240
240
  <p align="center">
241
241
  <a href="https://pypi.org/project/fast-agent-mcp/"><img src="https://img.shields.io/pypi/v/fast-agent-mcp?color=%2334D058&label=pypi" /></a>
@@ -259,14 +259,17 @@ Prompts and configurations that define your Agent Applications are stored in sim
259
259
 
260
260
  Chat with individual Agents and Components before, during and after workflow execution to tune and diagnose your application.
261
261
 
262
- Simple model selection makes testing Model <-> MCP Server interaction painless.
262
+ Simple model selection makes testing Model <-> MCP Server interaction painless. You can read more about the motivation behind this project [here](https://llmindset.co.uk/resources/fast-agent/)
263
+
264
+ ![fast-agent](https://github.com/user-attachments/assets/3e692103-bf97-489a-b519-2d0fee036369)
263
265
 
264
266
  ## Get started:
265
267
 
266
268
  Start by installing the [uv package manager](https://docs.astral.sh/uv/) for Python. Then:
267
269
 
268
270
  ```bash
269
- uv pip install fast-agent-mcp # install fast-agent
271
+ uv pip install fast-agent-mcp # install fast-agent!
272
+
270
273
  fast-agent setup # create an example agent and config files
271
274
  uv run agent.py # run your first agent
272
275
  uv run agent.py --model=o3-mini.low # specify a model
@@ -275,6 +278,7 @@ fast-agent bootstrap workflow # create "building effective agents" example
275
278
 
276
279
  Other bootstrap examples include a Researcher Agent (with Evaluator-Optimizer workflow) and Data Analysis Agent (similar to the ChatGPT experience), demonstrating MCP Roots support.
277
280
 
281
+ > [!TIP]
278
282
  > Windows Users - there are a couple of configuration changes needed for the Filesystem and Docker MCP Servers - necessary changes are detailed within the configuration files.
279
283
 
280
284
  ### Basic Agents
@@ -354,7 +358,7 @@ async def main():
354
358
  )
355
359
  ```
356
360
 
357
- All Agents and Workflows respond to `.send("message")` and `.prompt()` to begin a chat session.
361
+ All Agents and Workflows respond to `.send("message")` or `.prompt()` to begin a chat session.
358
362
 
359
363
  Saved as `social.py` we can now run this workflow from the command line with:
360
364
 
@@ -362,7 +366,7 @@ Saved as `social.py` we can now run this workflow from the command line with:
362
366
  uv run social.py --agent social_media --message "<url>"
363
367
  ```
364
368
 
365
- Add the `--quiet` switch to only return the final response.
369
+ Add the `--quiet` switch to only return the final response, which is useful for simple automations.
366
370
 
367
371
  ## Workflows
368
372
 
@@ -383,7 +387,7 @@ async with fast.run() as agent:
383
387
 
384
388
  ```
385
389
 
386
- This starts an interactive session, which produces a short social media post for a given URL. If a _chain_ is prompted, by default it returns to a chat with last Agent in the chain.
390
+ This starts an interactive session, which produces a short social media post for a given URL. If a _chain_ is prompted it returns to a chat with last Agent in the chain. You can switch the agent to prompt by typing `@agent-name`.
387
391
 
388
392
  Chains can be incorporated in other workflows, or contain other workflow elements (including other Chains). You can set an `instruction` to precisely describe it's capabilities to other workflow steps if needed.
389
393
 
@@ -407,13 +411,17 @@ The Parallel Workflow sends the same message to multiple Agents simultaneously (
407
411
  )
408
412
  ```
409
413
 
410
- Look at the `parallel.py` workflow example for more examples. If you don't specify a `fan-in` agent, the `parallel` returns Agent results verbatim.
414
+ Look at the `parallel.py` workflow example for more examples. If you don't specify a `fan-in` agent, the `parallel` returns the combined Agent results verbatim.
415
+
416
+ `parallel` is also useful to ensemble ideas from different LLMs.
411
417
 
412
- The Parallel is also useful to ensemble ideas from different LLMs.
418
+ When using `parallel` in other workflows, specify an `instruction` to describe its operation.
413
419
 
414
420
  ### Evaluator-Optimizer
415
421
 
416
- Evaluator-Optimizers combine 2 agents: one to generate content (the `generator`), and the other to judge that content and provide actionable feedback (the `evaluator`). Messages are sent to the generator first, then the pair run in a loop until either the evaluator is satisfied with the quality, or the maximum number of refinements is reached.
422
+ Evaluator-Optimizers combine 2 agents: one to generate content (the `generator`), and the other to judge that content and provide actionable feedback (the `evaluator`). Messages are sent to the generator first, then the pair run in a loop until either the evaluator is satisfied with the quality, or the maximum number of refinements is reached. The final result from the Generator is returned.
423
+
424
+ If the Generator has `use_history` off, the previous iteration is returned when asking for improvements - otherwise conversational context is used.
417
425
 
418
426
  ```python
419
427
  @fast.evaluator_optimizer(
@@ -428,6 +436,8 @@ async with fast.run() as agent:
428
436
  await agent.researcher.send("produce a report on how to make the perfect espresso")
429
437
  ```
430
438
 
439
+ When used in a workflow, it returns the last `generator` message as the result.
440
+
431
441
  See the `evaluator.py` workflow example, or `fast-agent bootstrap researcher` for a more complete example.
432
442
 
433
443
  ### Router
@@ -458,20 +468,107 @@ See `orchestrator.py` in the workflow examples.
458
468
 
459
469
  ## Agent Features
460
470
 
471
+ ### Calling Agents
472
+
473
+ All definitions allow omitting the name and instructions arguments for brevity:
474
+
475
+ ```python
476
+ @fast.agent("You are a helpful agent") # Create an agent with a default name.
477
+ @fast.agent("greeter","Respond cheerfully!") # Create an agent with the name "greeter"
478
+
479
+ moon_size = await agent("the moon") # Call the default (first defined agent) with a message
480
+
481
+ result = await agent.greeter("Good morning!") # Send a message to an agent by name using dot notation
482
+ result = await agent.greeter.send("Hello!") # You can call 'send' explicitly
483
+
484
+ await agent.greeter() # If no message is specified, a chat session will open
485
+ await agent.greeter.prompt() # that can be made more explicit
486
+ await agent.greeter.prompt(default_prompt="OK") # and supports setting a default prompt
487
+
488
+ agent["greeter"].send("Good Evening!") # Dictionary access is supported if preferred
489
+ ```
490
+
491
+ ### Defining Agents
492
+
493
+ #### Basic Agent
494
+
461
495
  ```python
462
496
  @fast.agent(
463
- name="agent",
464
- instructions="instructions",
465
- servers=["filesystem"], # list of MCP Servers for the agent, configured in fastagent.config.yaml
466
- model="o3-mini.high", # specify a model for the agent
467
- use_history=True, # agent can maintain chat history
468
- human_input=True, # agent can request human input
497
+ name="agent", # name of the agent
498
+ instruction="You are a helpful Agent", # base instruction for the agent
499
+ servers=["filesystem"], # list of MCP Servers for the agent
500
+ model="o3-mini.high", # specify a model for the agent
501
+ use_history=True, # agent maintains chat history
502
+ request_params={"temperature": 0.7}, # additional parameters for the LLM (or RequestParams())
503
+ human_input=True, # agent can request human input
469
504
  )
470
505
  ```
471
506
 
472
- ### Human Input
507
+ #### Chain
508
+
509
+ ```python
510
+ @fast.chain(
511
+ name="chain", # name of the chain
512
+ sequence=["agent1", "agent2", ...], # list of agents in execution order
513
+ instruction="instruction", # instruction to describe the chain for other workflows
514
+ continue_with_final=True, # open chat with agent at end of chain after prompting
515
+ )
516
+ ```
473
517
 
474
- When `human_input` is set to true for an Agent, it is presented with the option to prompt the User for input.
518
+ #### Parallel
519
+
520
+ ```python
521
+ @fast.parallel(
522
+ name="parallel", # name of the parallel workflow
523
+ fan_out=["agent1", "agent2"], # list of agents to run in parallel
524
+ fan_in="aggregator", # name of agent that combines results (optional)
525
+ instruction="instruction", # instruction to describe the parallel for other workflows
526
+ include_request=True, # include original request in fan-in message
527
+ )
528
+ ```
529
+
530
+ #### Evaluator-Optimizer
531
+
532
+ ```python
533
+ @fast.evaluator_optimizer(
534
+ name="researcher", # name of the workflow
535
+ generator="web_searcher", # name of the content generator agent
536
+ evaluator="quality_assurance", # name of the evaluator agent
537
+ min_rating="GOOD", # minimum acceptable quality (EXCELLENT, GOOD, FAIR, POOR)
538
+ max_refinements=3, # maximum number of refinement iterations
539
+ )
540
+ ```
541
+
542
+ #### Router
543
+
544
+ ```python
545
+ @fast.router(
546
+ name="route", # name of the router
547
+ agents=["agent1", "agent2", "agent3"], # list of agent names router can delegate to
548
+ model="o3-mini.high", # specify routing model
549
+ use_history=False, # router maintains conversation history
550
+ human_input=False, # whether router can request human input
551
+ )
552
+ ```
553
+
554
+ #### Orchestrator
555
+
556
+ ```python
557
+ @fast.orchestrator(
558
+ name="orchestrator", # name of the orchestrator
559
+ instruction="instruction", # base instruction for the orchestrator
560
+ agents=["agent1", "agent2"], # list of agent names this orchestrator can use
561
+ model="o3-mini.high", # specify orchestrator planning model
562
+ use_history=False, # orchestrator doesn't maintain chat history by default
563
+ human_input=False, # whether orchestrator can request human input
564
+ plan_type="full", # planning approach: "full" or "iterative"
565
+ )
566
+ ```
567
+
568
+ ### Secrets File
569
+
570
+ > [!TIP]
571
+ > fast-agent will look recursively for a fastagent.secrets.yaml file, so you only need to manage this at the root folder of your agent definitions.
475
572
 
476
573
  ## Project Notes
477
574
 
@@ -479,8 +576,12 @@ When `human_input` is set to true for an Agent, it is presented with the option
479
576
 
480
577
  ### llmindset.co.uk fork:
481
578
 
579
+ - Overhaul of Eval/Opt for Conversation Management
580
+ - Remove instructor use for Orchestrator
581
+ - Improved handling of Parallel/Fan-In and respose option
582
+ - XML based generated prompts
482
583
  - "FastAgent" style prototyping, with per-agent models
483
- - Api keys through Environment Variables
584
+ - API keys through Environment Variables
484
585
  - Warm-up / Post-Workflow Agent Interactions
485
586
  - Quick Setup
486
587
  - Interactive Prompt Mode
@@ -493,7 +594,6 @@ When `human_input` is set to true for an Agent, it is presented with the option
493
594
  - OpenAI o1/o3-mini support with reasoning level
494
595
  - Enhanced Human Input Messaging and Handling
495
596
  - Declarative workflows
597
+ - Numerous defect fixes
496
598
 
497
599
  ### Features to add.
498
-
499
- - Chat History Clear.
@@ -1,4 +1,4 @@
1
- ## FastAgent
1
+ ## fast-agent
2
2
 
3
3
  <p align="center">
4
4
  <a href="https://pypi.org/project/fast-agent-mcp/"><img src="https://img.shields.io/pypi/v/fast-agent-mcp?color=%2334D058&label=pypi" /></a>
@@ -22,14 +22,17 @@ Prompts and configurations that define your Agent Applications are stored in sim
22
22
 
23
23
  Chat with individual Agents and Components before, during and after workflow execution to tune and diagnose your application.
24
24
 
25
- Simple model selection makes testing Model <-> MCP Server interaction painless.
25
+ Simple model selection makes testing Model <-> MCP Server interaction painless. You can read more about the motivation behind this project [here](https://llmindset.co.uk/resources/fast-agent/)
26
+
27
+ ![fast-agent](https://github.com/user-attachments/assets/3e692103-bf97-489a-b519-2d0fee036369)
26
28
 
27
29
  ## Get started:
28
30
 
29
31
  Start by installing the [uv package manager](https://docs.astral.sh/uv/) for Python. Then:
30
32
 
31
33
  ```bash
32
- uv pip install fast-agent-mcp # install fast-agent
34
+ uv pip install fast-agent-mcp # install fast-agent!
35
+
33
36
  fast-agent setup # create an example agent and config files
34
37
  uv run agent.py # run your first agent
35
38
  uv run agent.py --model=o3-mini.low # specify a model
@@ -38,6 +41,7 @@ fast-agent bootstrap workflow # create "building effective agents" example
38
41
 
39
42
  Other bootstrap examples include a Researcher Agent (with Evaluator-Optimizer workflow) and Data Analysis Agent (similar to the ChatGPT experience), demonstrating MCP Roots support.
40
43
 
44
+ > [!TIP]
41
45
  > Windows Users - there are a couple of configuration changes needed for the Filesystem and Docker MCP Servers - necessary changes are detailed within the configuration files.
42
46
 
43
47
  ### Basic Agents
@@ -117,7 +121,7 @@ async def main():
117
121
  )
118
122
  ```
119
123
 
120
- All Agents and Workflows respond to `.send("message")` and `.prompt()` to begin a chat session.
124
+ All Agents and Workflows respond to `.send("message")` or `.prompt()` to begin a chat session.
121
125
 
122
126
  Saved as `social.py` we can now run this workflow from the command line with:
123
127
 
@@ -125,7 +129,7 @@ Saved as `social.py` we can now run this workflow from the command line with:
125
129
  uv run social.py --agent social_media --message "<url>"
126
130
  ```
127
131
 
128
- Add the `--quiet` switch to only return the final response.
132
+ Add the `--quiet` switch to only return the final response, which is useful for simple automations.
129
133
 
130
134
  ## Workflows
131
135
 
@@ -146,7 +150,7 @@ async with fast.run() as agent:
146
150
 
147
151
  ```
148
152
 
149
- This starts an interactive session, which produces a short social media post for a given URL. If a _chain_ is prompted, by default it returns to a chat with last Agent in the chain.
153
+ This starts an interactive session, which produces a short social media post for a given URL. If a _chain_ is prompted it returns to a chat with last Agent in the chain. You can switch the agent to prompt by typing `@agent-name`.
150
154
 
151
155
  Chains can be incorporated in other workflows, or contain other workflow elements (including other Chains). You can set an `instruction` to precisely describe it's capabilities to other workflow steps if needed.
152
156
 
@@ -170,13 +174,17 @@ The Parallel Workflow sends the same message to multiple Agents simultaneously (
170
174
  )
171
175
  ```
172
176
 
173
- Look at the `parallel.py` workflow example for more examples. If you don't specify a `fan-in` agent, the `parallel` returns Agent results verbatim.
177
+ Look at the `parallel.py` workflow example for more examples. If you don't specify a `fan-in` agent, the `parallel` returns the combined Agent results verbatim.
178
+
179
+ `parallel` is also useful to ensemble ideas from different LLMs.
174
180
 
175
- The Parallel is also useful to ensemble ideas from different LLMs.
181
+ When using `parallel` in other workflows, specify an `instruction` to describe its operation.
176
182
 
177
183
  ### Evaluator-Optimizer
178
184
 
179
- Evaluator-Optimizers combine 2 agents: one to generate content (the `generator`), and the other to judge that content and provide actionable feedback (the `evaluator`). Messages are sent to the generator first, then the pair run in a loop until either the evaluator is satisfied with the quality, or the maximum number of refinements is reached.
185
+ Evaluator-Optimizers combine 2 agents: one to generate content (the `generator`), and the other to judge that content and provide actionable feedback (the `evaluator`). Messages are sent to the generator first, then the pair run in a loop until either the evaluator is satisfied with the quality, or the maximum number of refinements is reached. The final result from the Generator is returned.
186
+
187
+ If the Generator has `use_history` off, the previous iteration is returned when asking for improvements - otherwise conversational context is used.
180
188
 
181
189
  ```python
182
190
  @fast.evaluator_optimizer(
@@ -191,6 +199,8 @@ async with fast.run() as agent:
191
199
  await agent.researcher.send("produce a report on how to make the perfect espresso")
192
200
  ```
193
201
 
202
+ When used in a workflow, it returns the last `generator` message as the result.
203
+
194
204
  See the `evaluator.py` workflow example, or `fast-agent bootstrap researcher` for a more complete example.
195
205
 
196
206
  ### Router
@@ -221,20 +231,107 @@ See `orchestrator.py` in the workflow examples.
221
231
 
222
232
  ## Agent Features
223
233
 
234
+ ### Calling Agents
235
+
236
+ All definitions allow omitting the name and instructions arguments for brevity:
237
+
238
+ ```python
239
+ @fast.agent("You are a helpful agent") # Create an agent with a default name.
240
+ @fast.agent("greeter","Respond cheerfully!") # Create an agent with the name "greeter"
241
+
242
+ moon_size = await agent("the moon") # Call the default (first defined agent) with a message
243
+
244
+ result = await agent.greeter("Good morning!") # Send a message to an agent by name using dot notation
245
+ result = await agent.greeter.send("Hello!") # You can call 'send' explicitly
246
+
247
+ await agent.greeter() # If no message is specified, a chat session will open
248
+ await agent.greeter.prompt() # that can be made more explicit
249
+ await agent.greeter.prompt(default_prompt="OK") # and supports setting a default prompt
250
+
251
+ agent["greeter"].send("Good Evening!") # Dictionary access is supported if preferred
252
+ ```
253
+
254
+ ### Defining Agents
255
+
256
+ #### Basic Agent
257
+
224
258
  ```python
225
259
  @fast.agent(
226
- name="agent",
227
- instructions="instructions",
228
- servers=["filesystem"], # list of MCP Servers for the agent, configured in fastagent.config.yaml
229
- model="o3-mini.high", # specify a model for the agent
230
- use_history=True, # agent can maintain chat history
231
- human_input=True, # agent can request human input
260
+ name="agent", # name of the agent
261
+ instruction="You are a helpful Agent", # base instruction for the agent
262
+ servers=["filesystem"], # list of MCP Servers for the agent
263
+ model="o3-mini.high", # specify a model for the agent
264
+ use_history=True, # agent maintains chat history
265
+ request_params={"temperature": 0.7}, # additional parameters for the LLM (or RequestParams())
266
+ human_input=True, # agent can request human input
232
267
  )
233
268
  ```
234
269
 
235
- ### Human Input
270
+ #### Chain
271
+
272
+ ```python
273
+ @fast.chain(
274
+ name="chain", # name of the chain
275
+ sequence=["agent1", "agent2", ...], # list of agents in execution order
276
+ instruction="instruction", # instruction to describe the chain for other workflows
277
+ continue_with_final=True, # open chat with agent at end of chain after prompting
278
+ )
279
+ ```
236
280
 
237
- When `human_input` is set to true for an Agent, it is presented with the option to prompt the User for input.
281
+ #### Parallel
282
+
283
+ ```python
284
+ @fast.parallel(
285
+ name="parallel", # name of the parallel workflow
286
+ fan_out=["agent1", "agent2"], # list of agents to run in parallel
287
+ fan_in="aggregator", # name of agent that combines results (optional)
288
+ instruction="instruction", # instruction to describe the parallel for other workflows
289
+ include_request=True, # include original request in fan-in message
290
+ )
291
+ ```
292
+
293
+ #### Evaluator-Optimizer
294
+
295
+ ```python
296
+ @fast.evaluator_optimizer(
297
+ name="researcher", # name of the workflow
298
+ generator="web_searcher", # name of the content generator agent
299
+ evaluator="quality_assurance", # name of the evaluator agent
300
+ min_rating="GOOD", # minimum acceptable quality (EXCELLENT, GOOD, FAIR, POOR)
301
+ max_refinements=3, # maximum number of refinement iterations
302
+ )
303
+ ```
304
+
305
+ #### Router
306
+
307
+ ```python
308
+ @fast.router(
309
+ name="route", # name of the router
310
+ agents=["agent1", "agent2", "agent3"], # list of agent names router can delegate to
311
+ model="o3-mini.high", # specify routing model
312
+ use_history=False, # router maintains conversation history
313
+ human_input=False, # whether router can request human input
314
+ )
315
+ ```
316
+
317
+ #### Orchestrator
318
+
319
+ ```python
320
+ @fast.orchestrator(
321
+ name="orchestrator", # name of the orchestrator
322
+ instruction="instruction", # base instruction for the orchestrator
323
+ agents=["agent1", "agent2"], # list of agent names this orchestrator can use
324
+ model="o3-mini.high", # specify orchestrator planning model
325
+ use_history=False, # orchestrator doesn't maintain chat history by default
326
+ human_input=False, # whether orchestrator can request human input
327
+ plan_type="full", # planning approach: "full" or "iterative"
328
+ )
329
+ ```
330
+
331
+ ### Secrets File
332
+
333
+ > [!TIP]
334
+ > fast-agent will look recursively for a fastagent.secrets.yaml file, so you only need to manage this at the root folder of your agent definitions.
238
335
 
239
336
  ## Project Notes
240
337
 
@@ -242,8 +339,12 @@ When `human_input` is set to true for an Agent, it is presented with the option
242
339
 
243
340
  ### llmindset.co.uk fork:
244
341
 
342
+ - Overhaul of Eval/Opt for Conversation Management
343
+ - Remove instructor use for Orchestrator
344
+ - Improved handling of Parallel/Fan-In and respose option
345
+ - XML based generated prompts
245
346
  - "FastAgent" style prototyping, with per-agent models
246
- - Api keys through Environment Variables
347
+ - API keys through Environment Variables
247
348
  - Warm-up / Post-Workflow Agent Interactions
248
349
  - Quick Setup
249
350
  - Interactive Prompt Mode
@@ -256,7 +357,6 @@ When `human_input` is set to true for an Agent, it is presented with the option
256
357
  - OpenAI o1/o3-mini support with reasoning level
257
358
  - Enhanced Human Input Messaging and Handling
258
359
  - Declarative workflows
360
+ - Numerous defect fixes
259
361
 
260
362
  ### Features to add.
261
-
262
- - Chat History Clear.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "fast-agent-mcp"
3
- version = "0.0.15"
3
+ version = "0.1.0"
4
4
  description = "Define, Prompt and Test MCP enabled Agents and Workflows"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -0,0 +1,7 @@
1
+ from mcp_agent.cli.main import app
2
+
3
+ # This must be here for the console entry points defined in pyproject.toml
4
+ # DO NOT REMOVE!
5
+
6
+ if __name__ == "__main__":
7
+ app()
@@ -135,7 +135,7 @@ def copy_example_files(
135
135
 
136
136
  def show_overview():
137
137
  """Display an overview of available examples in a nicely formatted table."""
138
- console.print("\n[bold cyan]FastAgent Example Applications[/bold cyan]")
138
+ console.print("\n[bold cyan]fast-agent Example Applications[/bold cyan]")
139
139
  console.print("Build agents and compose workflows through practical examples\n")
140
140
 
141
141
  # Create a table for better organization
@@ -185,7 +185,7 @@ def init(
185
185
  # Check for existing .gitignore
186
186
  needs_gitignore = not find_gitignore(config_path)
187
187
 
188
- console.print("\n[bold]FastAgent Setup[/bold]\n")
188
+ console.print("\n[bold]fast-agent Setup[/bold]\n")
189
189
  console.print("This will create the following files:")
190
190
  console.print(f" - {config_path}/fastagent.config.yaml")
191
191
  console.print(f" - {config_path}/fastagent.secrets.yaml")
@@ -227,6 +227,9 @@ def init(
227
227
  console.print(
228
228
  "2. Keep fastagent.secrets.yaml secure and never commit it to version control"
229
229
  )
230
+ console.print(
231
+ "3. Update fastagent.config.yaml to set a default model (currently system default is 'haiku')"
232
+ )
230
233
  console.print("\nTo get started, run:")
231
234
  console.print(" uv run agent.py")
232
235
  else:
@@ -22,7 +22,14 @@ console = Console()
22
22
 
23
23
  def show_welcome():
24
24
  """Show a welcome message with available commands."""
25
- console.print("\n[bold]Welcome to MCP Agent![/bold]")
25
+ from importlib.metadata import version
26
+
27
+ try:
28
+ app_version = version("fast-agent-mcp")
29
+ except: # noqa: E722
30
+ app_version = "unknown"
31
+
32
+ console.print(f"\n[bold]fast-agent (fast-agent-mcp) {app_version}[/bold]")
26
33
  console.print("Build effective agents using Model Context Protocol (MCP)")
27
34
 
28
35
  # Create a table for commands
@@ -41,8 +48,11 @@ def show_welcome():
41
48
  console.print("\n[bold]Getting Started:[/bold]")
42
49
  console.print("1. Set up a new project:")
43
50
  console.print(" fastagent setup")
44
- console.print("\n2. Try an example workflow:")
45
- console.print(" fastagent bootstrap create workflow")
51
+ console.print("\n2. Create Building Effective Agents workflow examples:")
52
+ console.print(" fastagent bootstrap workflow")
53
+ console.print("\n3. Explore other examples:")
54
+ console.print(" fastagent bootstrap")
55
+
46
56
  console.print("\nUse --help with any command for more information")
47
57
  console.print("Example: fastagent bootstrap --help")
48
58
 
@@ -313,17 +313,25 @@ def get_settings(config_path: str | None = None) -> Settings:
313
313
  with open(config_file, "r", encoding="utf-8") as f:
314
314
  yaml_settings = yaml.safe_load(f) or {}
315
315
  merged_settings = yaml_settings
316
-
317
- # Look for secrets file in the same directory
318
- for secrets_file in [
319
- config_file.parent / "mcp-agent.secrets.yaml",
320
- config_file.parent / "mcp_agent.secrets.yaml",
321
- config_file.parent / "fastagent.secrets.yaml",
322
- ]:
323
- if secrets_file.exists():
324
- with open(secrets_file, "r", encoding="utf-8") as f:
325
- yaml_secrets = yaml.safe_load(f) or {}
326
- merged_settings = deep_merge(merged_settings, yaml_secrets)
316
+ # Look for secrets files recursively up the directory tree
317
+ # but stop after finding the first one
318
+ current_dir = config_file.parent
319
+ found_secrets = False
320
+ while current_dir != current_dir.parent and not found_secrets:
321
+ for secrets_filename in [
322
+ "mcp-agent.secrets.yaml",
323
+ "mcp_agent.secrets.yaml",
324
+ "fastagent.secrets.yaml",
325
+ ]:
326
+ secrets_file = current_dir / secrets_filename
327
+ if secrets_file.exists():
328
+ with open(secrets_file, "r", encoding="utf-8") as f:
329
+ yaml_secrets = yaml.safe_load(f) or {}
330
+ merged_settings = deep_merge(merged_settings, yaml_secrets)
331
+ found_secrets = True
332
+ break
333
+ if not found_secrets:
334
+ current_dir = current_dir.parent
327
335
 
328
336
  _settings = Settings(**merged_settings)
329
337
  return _settings
@@ -129,7 +129,7 @@ class AgentApp:
129
129
  continue
130
130
 
131
131
  result = await self.send(agent, user_input)
132
-
132
+
133
133
  # Check if current agent is a chain that should continue with final agent
134
134
  if agent_types.get(agent) == "Chain":
135
135
  proxy = self._agents[agent]
@@ -3,6 +3,7 @@ Enhanced prompt functionality with advanced prompt_toolkit features.
3
3
  """
4
4
 
5
5
  from typing import List
6
+ from importlib.metadata import version
6
7
  from prompt_toolkit import PromptSession
7
8
  from prompt_toolkit.formatted_text import HTML
8
9
  from prompt_toolkit.history import InMemoryHistory
@@ -15,6 +16,12 @@ from rich import print as rich_print
15
16
 
16
17
  from mcp_agent.core.exceptions import PromptExitError
17
18
 
19
+ # Get the application version
20
+ try:
21
+ app_version = version("fast-agent-mcp")
22
+ except: # noqa: E722
23
+ app_version = "unknown"
24
+
18
25
  # Map of agent names to their history
19
26
  agent_histories = {}
20
27
 
@@ -45,7 +52,7 @@ class AgentCompleter(Completer):
45
52
  "clear": "Clear the screen",
46
53
  "agents": "List available agents",
47
54
  "STOP": "Stop this prompting session and move to next workflow step",
48
- "EXIT": "Exit FastAgent, terminating any running workflows",
55
+ "EXIT": "Exit fast-agent, terminating any running workflows",
49
56
  **(commands or {}), # Allow custom commands to be passed in
50
57
  }
51
58
  if is_human_input:
@@ -204,7 +211,7 @@ async def get_enhanced_input(
204
211
 
205
212
  shortcut_text = " | ".join(f"{key}:{action}" for key, action in shortcuts)
206
213
  return HTML(
207
- f" <{toolbar_color}> {agent_name} </{toolbar_color}> | <b>Mode:</b> <{mode_style}> {mode_text} </{mode_style}> {newline} | {shortcut_text}"
214
+ f" <{toolbar_color}> {agent_name} </{toolbar_color}> | <b>Mode:</b> <{mode_style}> {mode_text} </{mode_style}> {newline} | {shortcut_text} | <dim>v{app_version}</dim>"
208
215
  )
209
216
 
210
217
  # Create session with history and completions
@@ -312,13 +319,14 @@ async def handle_special_commands(command, agent_app=None):
312
319
  rich_print(" @agent_name - Switch to agent")
313
320
  rich_print(" STOP - Return control back to the workflow")
314
321
  rich_print(
315
- " EXIT - Exit FastAgent, terminating any running workflows"
322
+ " EXIT - Exit fast-agent, terminating any running workflows"
316
323
  )
317
324
  rich_print("\n[bold]Keyboard Shortcuts:[/bold]")
318
325
  rich_print(
319
326
  " Enter - Submit (normal mode) / New line (multiline mode)"
320
327
  )
321
- rich_print(" Ctrl+Enter - Always submit (even in multiline mode)")
328
+ rich_print(" \\ + Enter - Insert new line in normal mode")
329
+ rich_print(" Ctrl+Enter - Always submit (in any mode)")
322
330
  rich_print(" Ctrl+T - Toggle multiline mode")
323
331
  rich_print(" Ctrl+L - Clear input")
324
332
  rich_print(" Up/Down - Navigate history")
@@ -330,7 +338,7 @@ async def handle_special_commands(command, agent_app=None):
330
338
  return True
331
339
 
332
340
  elif command == "EXIT":
333
- raise PromptExitError("User requested to exit FastAgent session")
341
+ raise PromptExitError("User requested to exit fast-agent session")
334
342
 
335
343
  elif command == "LIST_AGENTS":
336
344
  if available_agents: