fast-agent-mcp 0.0.9__py3-none-any.whl → 0.0.12__py3-none-any.whl
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.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/METADATA +17 -11
- {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/RECORD +36 -28
- mcp_agent/app.py +4 -4
- mcp_agent/cli/commands/bootstrap.py +2 -5
- mcp_agent/cli/commands/setup.py +1 -1
- mcp_agent/cli/main.py +4 -4
- mcp_agent/core/enhanced_prompt.py +315 -0
- mcp_agent/core/fastagent.py +520 -388
- mcp_agent/event_progress.py +5 -2
- mcp_agent/human_input/handler.py +6 -2
- mcp_agent/logging/rich_progress.py +10 -5
- mcp_agent/mcp/mcp_aggregator.py +2 -1
- mcp_agent/mcp/mcp_connection_manager.py +67 -37
- mcp_agent/resources/examples/internal/agent.py +17 -0
- mcp_agent/resources/examples/internal/job.py +83 -0
- mcp_agent/resources/examples/mcp_researcher/researcher-eval.py +1 -1
- mcp_agent/resources/examples/researcher/fastagent.config.yaml +53 -0
- mcp_agent/resources/examples/researcher/researcher-eval.py +53 -0
- mcp_agent/resources/examples/researcher/researcher.py +38 -0
- mcp_agent/resources/examples/workflows/agent.py +17 -0
- mcp_agent/resources/examples/workflows/agent_build.py +61 -0
- mcp_agent/resources/examples/workflows/chaining.py +0 -1
- mcp_agent/resources/examples/workflows/evaluator.py +6 -3
- mcp_agent/resources/examples/workflows/fastagent.py +22 -0
- mcp_agent/resources/examples/workflows/orchestrator.py +1 -1
- mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py +91 -92
- mcp_agent/workflows/llm/augmented_llm.py +14 -3
- mcp_agent/workflows/llm/augmented_llm_anthropic.py +8 -5
- mcp_agent/workflows/llm/augmented_llm_openai.py +20 -9
- mcp_agent/workflows/llm/model_factory.py +25 -11
- mcp_agent/workflows/orchestrator/orchestrator.py +68 -7
- mcp_agent/workflows/orchestrator/orchestrator_prompts.py +11 -6
- mcp_agent/workflows/router/router_llm.py +13 -2
- mcp_agent/resources/examples/workflows/fastagent.config.yaml +0 -9
- {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/WHEEL +0 -0
- {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/entry_points.txt +0 -0
- {fast_agent_mcp-0.0.9.dist-info → fast_agent_mcp-0.0.12.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: fast-agent-mcp
|
|
3
|
-
Version: 0.0.
|
|
3
|
+
Version: 0.0.12
|
|
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
|
|
@@ -217,6 +217,7 @@ Requires-Dist: numpy>=2.2.1
|
|
|
217
217
|
Requires-Dist: openai>=1.63.2
|
|
218
218
|
Requires-Dist: opentelemetry-distro>=0.50b0
|
|
219
219
|
Requires-Dist: opentelemetry-exporter-otlp-proto-http>=1.29.0
|
|
220
|
+
Requires-Dist: prompt-toolkit>=3.0.50
|
|
220
221
|
Requires-Dist: pydantic-settings>=2.7.0
|
|
221
222
|
Requires-Dist: pydantic>=2.10.4
|
|
222
223
|
Requires-Dist: pyyaml>=6.0.2
|
|
@@ -246,27 +247,32 @@ Description-Content-Type: text/markdown
|
|
|
246
247
|
|
|
247
248
|
## Overview
|
|
248
249
|
|
|
249
|
-
**`fast-agent`** lets you define, test and
|
|
250
|
+
**`fast-agent`** lets you define, test and interact with agents, tools and workflows in minutes.
|
|
250
251
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
Install the [uv package manager](https://docs.astral.sh/uv/).
|
|
252
|
+
The simple declarative syntax lets you concentrate on the prompts, MCP Servers and compositions to build effective agents.
|
|
254
253
|
|
|
255
|
-
|
|
254
|
+
Quickly compare how different models perform at Agent and MCP Server calling tasks, and build mixed multi-model workflows using the best provider for each task.
|
|
256
255
|
|
|
257
|
-
|
|
256
|
+
### Get started:
|
|
258
257
|
|
|
259
|
-
|
|
258
|
+
Start by installing the [uv package manager](https://docs.astral.sh/uv/) for Python. Then:
|
|
260
259
|
|
|
261
|
-
|
|
260
|
+
```bash
|
|
261
|
+
uv pip install fast-agent-mcp # install fast-agent
|
|
262
|
+
fast-agent setup # create an example agent and config files
|
|
263
|
+
uv run agent.py # run your first agent
|
|
264
|
+
uv run agent.py --model=o3-mini.low # specify a model
|
|
265
|
+
fast-agent bootstrap workflow # create "building effective agents" examples
|
|
266
|
+
```
|
|
262
267
|
|
|
263
|
-
|
|
268
|
+
Other bootstrap examples include a Researcher (with Evaluator-Optimizer workflow) and Data Analysis (similar to ChatGPT experience), demonstrating MCP Roots support.
|
|
264
269
|
|
|
265
|
-
|
|
270
|
+
> 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.
|
|
266
271
|
|
|
267
272
|
### llmindset.co.uk fork:
|
|
268
273
|
|
|
269
274
|
- "FastAgent" style prototyping, with per-agent models
|
|
275
|
+
- Api keys through Environment Variables
|
|
270
276
|
- Warm-up / Post-Workflow Agent Interactions
|
|
271
277
|
- Quick Setup
|
|
272
278
|
- Interactive Prompt Mode
|
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
mcp_agent/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
-
mcp_agent/app.py,sha256=
|
|
2
|
+
mcp_agent/app.py,sha256=0_C1xmNZlk9qZoewnNI_mC7sSfO9oJgkOyiKkQ62MHU,10606
|
|
3
3
|
mcp_agent/config.py,sha256=mShpoyIAGeyQKMH9gUCAXBZ2HNF3SM2KoMjSMpPQnmg,10210
|
|
4
4
|
mcp_agent/console.py,sha256=Gjf2QLFumwG1Lav__c07X_kZxxEUSkzV-1_-YbAwcwo,813
|
|
5
5
|
mcp_agent/context.py,sha256=qzwUrexZXVBzFiNkYI4xjztdGxuuiDWZbWrQgVhA-vE,8126
|
|
6
6
|
mcp_agent/context_dependent.py,sha256=TGqRLzYCOnsWGoaD1HtrliYtWo8MeaWCQk6ePUmyYCw,1446
|
|
7
|
-
mcp_agent/event_progress.py,sha256=
|
|
7
|
+
mcp_agent/event_progress.py,sha256=25iz0yyg-O4glMmtijcYpDdUmtUIKsCmR_8A52GgeC4,2716
|
|
8
8
|
mcp_agent/mcp_server_registry.py,sha256=5x30L1IlmC18JASl7NQbZYHMqPWS3ay0f_3U3uleaMM,9884
|
|
9
9
|
mcp_agent/progress_display.py,sha256=GeJU9VUt6qKsFVymG688hCMVCsAygG9ifiiEb5IcbN4,361
|
|
10
10
|
mcp_agent/agents/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
11
11
|
mcp_agent/agents/agent.py,sha256=utMR_QWKD1_MqWE_fYY-xqUMKtGlekW0laJfduU6Ckw,9831
|
|
12
12
|
mcp_agent/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
13
13
|
mcp_agent/cli/__main__.py,sha256=bhxe66GYqy0q78OQhi7dkuubY1Tn0bQL6hU5Nn47E34,73
|
|
14
|
-
mcp_agent/cli/main.py,sha256=
|
|
14
|
+
mcp_agent/cli/main.py,sha256=h_TqBlpIMGhsJr6pp_oxUl00x3F9d1R-JQVwJ9uAreA,2449
|
|
15
15
|
mcp_agent/cli/terminal.py,sha256=5fqrKlJvIpKEuvpvZ653OueQSYFFktBEbosjr2ucMUc,1026
|
|
16
|
-
mcp_agent/cli/commands/bootstrap.py,sha256=
|
|
16
|
+
mcp_agent/cli/commands/bootstrap.py,sha256=Q55I2gL-K3Ja8c6MmbLZMVQQ_MaOTxnEC5se09XTI2s,10742
|
|
17
17
|
mcp_agent/cli/commands/config.py,sha256=32YTS5jmsYAs9QzAhjkG70_daAHqOemf4XbZBBSMz6g,204
|
|
18
|
-
mcp_agent/cli/commands/setup.py,sha256=
|
|
18
|
+
mcp_agent/cli/commands/setup.py,sha256=dI_01B5nye707Rcd15gvZZCYlZGSiKajlnuLf6hJf2A,6197
|
|
19
19
|
mcp_agent/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
|
+
mcp_agent/core/enhanced_prompt.py,sha256=U4hbAbm5WFUwTiwmBlNR7nadbMD9oHYgKuNNQVrGdvc,11047
|
|
20
21
|
mcp_agent/core/exceptions.py,sha256=xDdhYh83ni3t0NiXQTEL0_Yyx0qQxBPQL1gSwRToeaw,1469
|
|
21
|
-
mcp_agent/core/fastagent.py,sha256=
|
|
22
|
+
mcp_agent/core/fastagent.py,sha256=Wn5uHR6DIzMXu4S93Ll8oFD7VJUcSBH4wMm4c0aofpw,48858
|
|
22
23
|
mcp_agent/core/server_validation.py,sha256=_59cn16nNT4HGPwg19HgxMtHK4MsdWYDUw_CuL-5xek,1696
|
|
23
24
|
mcp_agent/eval/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
25
|
mcp_agent/executor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -29,14 +30,14 @@ mcp_agent/executor/temporal.py,sha256=U-wyltgWlVmzJoyivT6rR0Z1U3S6TbMXpeCxyuXako
|
|
|
29
30
|
mcp_agent/executor/workflow.py,sha256=lA6r7PNEvxCVFHp4XkEJkaR0QCTf-J6iw9JwNx-tzNY,6727
|
|
30
31
|
mcp_agent/executor/workflow_signal.py,sha256=3PWwSgXhz3PhkA8SRX3u0BDVoSlQqRGqC9d1qLC25vE,11210
|
|
31
32
|
mcp_agent/human_input/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
32
|
-
mcp_agent/human_input/handler.py,sha256=
|
|
33
|
+
mcp_agent/human_input/handler.py,sha256=_gVIyvjDo53Aj8NFoKCiM8nBdQIuCxiStvgEtRBwYv8,1812
|
|
33
34
|
mcp_agent/human_input/types.py,sha256=ZvuDHvI0-wO2tFoS0bzrv8U5B83zYdxAG7g9G9jCxug,1489
|
|
34
35
|
mcp_agent/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
35
36
|
mcp_agent/logging/events.py,sha256=qfYJnrqgXdujV-nl-iOwBEBh6HMraowBI4zeAWPPU4A,3461
|
|
36
37
|
mcp_agent/logging/json_serializer.py,sha256=pa_mf0i0YKpLsGq3THuITFUdAbmae-dv1OPOLbcS0to,5782
|
|
37
38
|
mcp_agent/logging/listeners.py,sha256=lx2Pq_SE0rsG3nF3TwDSxkmsWzdXxIUjuaWct-KOtJ8,6631
|
|
38
39
|
mcp_agent/logging/logger.py,sha256=Tr009BnfGUKuZcdinnSin0Z_zIsfDNGdcnamw2rDHRQ,10604
|
|
39
|
-
mcp_agent/logging/rich_progress.py,sha256=
|
|
40
|
+
mcp_agent/logging/rich_progress.py,sha256=IEVFdFGA0nwg6pSt9Ydni5LCNYZZPKYMe-6DCi9pO4Y,4851
|
|
40
41
|
mcp_agent/logging/tracing.py,sha256=jQivxKYl870oXakmyUk7TXuTQSvsIzpHwZlSQfy4b0c,5203
|
|
41
42
|
mcp_agent/logging/transport.py,sha256=Oo7Rx5t7REZTnH-uVljK0JlehnBj-wInc_fx0zhd_zY,16139
|
|
42
43
|
mcp_agent/mcp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -44,19 +45,26 @@ mcp_agent/mcp/gen_client.py,sha256=u0HwdJiw9YCerS5JC7JDuGgBh9oTcLd7vv9vPjwibXc,3
|
|
|
44
45
|
mcp_agent/mcp/mcp_activity.py,sha256=CajXCFWZ2cKEX9s4-HfNVAj471ePTVs4NOkvmIh65tE,592
|
|
45
46
|
mcp_agent/mcp/mcp_agent_client_session.py,sha256=NtWcQhjmnnaR3yYcYj2d2lh-m563NexZUa57K1tAjeM,9477
|
|
46
47
|
mcp_agent/mcp/mcp_agent_server.py,sha256=xP09HZTeguJi4Fq0p3fjLBP55uSYe5AdqM90xCgn9Ho,1639
|
|
47
|
-
mcp_agent/mcp/mcp_aggregator.py,sha256=
|
|
48
|
-
mcp_agent/mcp/mcp_connection_manager.py,sha256=
|
|
48
|
+
mcp_agent/mcp/mcp_aggregator.py,sha256=RVsgNnSJ1IPBkqKgF_Gp-Cpv97FVBIdppPey6FRoHB0,14751
|
|
49
|
+
mcp_agent/mcp/mcp_connection_manager.py,sha256=LH9ZmK-fXC-_7exAFclzWEjfFjwwdPqO_ZERqoHI_JM,13166
|
|
49
50
|
mcp_agent/mcp/stdio.py,sha256=tW075R5rQ-UlflXWFKIFDgCbWbuhKqxhiYolWvyEkFs,3985
|
|
50
51
|
mcp_agent/resources/examples/data-analysis/analysis.py,sha256=Sp-umPPfwVjG3yNrHdQA6blGtG6jc5of1e_0oS4njYc,1379
|
|
51
52
|
mcp_agent/resources/examples/data-analysis/fastagent.config.yaml,sha256=eTKGbjnTHhDTeNRPQvG_fr9OQpEZ5Y9v7X2NyCj0V70,530
|
|
52
53
|
mcp_agent/resources/examples/data-analysis/mount-point/WA_Fn-UseC_-HR-Employee-Attrition.csv,sha256=pcMeOL1_r8m8MziE6xgbBrQbjl5Ijo98yycZn7O-dlk,227977
|
|
53
|
-
mcp_agent/resources/examples/
|
|
54
|
+
mcp_agent/resources/examples/internal/agent.py,sha256=f-jTgYabV3nWCQm0ZP9NtSEWjx3nQbRngzArRufcELg,384
|
|
55
|
+
mcp_agent/resources/examples/internal/job.py,sha256=WEKIAANMEAuKr13__rYf3PqJeTAsNB_kqYqbqVYQlUM,4093
|
|
56
|
+
mcp_agent/resources/examples/mcp_researcher/researcher-eval.py,sha256=kNPjIU-JwE0oIBQKwhv6lZsUF_SPtYVkiEEbY1ZVZxk,1807
|
|
54
57
|
mcp_agent/resources/examples/mcp_researcher/researcher.py,sha256=jPRafm7jbpHKkX_dQiYGG3Sw-e1Dm86q-JZT-WZDhM0,1425
|
|
55
|
-
mcp_agent/resources/examples/
|
|
56
|
-
mcp_agent/resources/examples/
|
|
57
|
-
mcp_agent/resources/examples/
|
|
58
|
+
mcp_agent/resources/examples/researcher/fastagent.config.yaml,sha256=2_VXZneckR6zk6RWzzL-smV_oWmgg4uSkLWqZv8jF0I,1995
|
|
59
|
+
mcp_agent/resources/examples/researcher/researcher-eval.py,sha256=kNPjIU-JwE0oIBQKwhv6lZsUF_SPtYVkiEEbY1ZVZxk,1807
|
|
60
|
+
mcp_agent/resources/examples/researcher/researcher.py,sha256=jPRafm7jbpHKkX_dQiYGG3Sw-e1Dm86q-JZT-WZDhM0,1425
|
|
61
|
+
mcp_agent/resources/examples/workflows/agent.py,sha256=f-jTgYabV3nWCQm0ZP9NtSEWjx3nQbRngzArRufcELg,384
|
|
62
|
+
mcp_agent/resources/examples/workflows/agent_build.py,sha256=vdjS02rZR88RU53WYzXxPscfFNEFFe_niHYE_i49I8Q,2396
|
|
63
|
+
mcp_agent/resources/examples/workflows/chaining.py,sha256=QD_r_PKIoDedWqOTzg7IBnTY8OVoDSMot5WnArJubnc,751
|
|
64
|
+
mcp_agent/resources/examples/workflows/evaluator.py,sha256=kC8uBcCMoeDROip4B_X6jLr-1QXXvcUB0fZ6elun7k4,3147
|
|
65
|
+
mcp_agent/resources/examples/workflows/fastagent.py,sha256=lkO3waYLt_zQtAVqGjirmIsG73jpHA5ad1WSm4BXv2I,532
|
|
58
66
|
mcp_agent/resources/examples/workflows/human_input.py,sha256=c8cBdLEPbaMXddFwsfN3Z7RFs5PZXsdrjANfvq1VTPM,605
|
|
59
|
-
mcp_agent/resources/examples/workflows/orchestrator.py,sha256=
|
|
67
|
+
mcp_agent/resources/examples/workflows/orchestrator.py,sha256=kHUDDALqjA8TRjkbsDP2MwspEj1a5DdSUOPAiI17izQ,2545
|
|
60
68
|
mcp_agent/resources/examples/workflows/parallel.py,sha256=cNYcIcsdo0-KK-S7KEPCc11aWELeVlQJdJ2LIC9xgDs,3090
|
|
61
69
|
mcp_agent/resources/examples/workflows/router.py,sha256=XT_ewCrxPxdUTMCYQGw34qZQ3GGu8TYY_v5Lige8By4,1707
|
|
62
70
|
mcp_agent/telemetry/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -67,7 +75,7 @@ mcp_agent/workflows/embedding/embedding_base.py,sha256=-c20ggQ8s7XhMxRX-WEhOgHE7
|
|
|
67
75
|
mcp_agent/workflows/embedding/embedding_cohere.py,sha256=OKTJvKD_uEafd4c2uhR5tBjprea1nyvlJOO-3FDqOnk,1540
|
|
68
76
|
mcp_agent/workflows/embedding/embedding_openai.py,sha256=dntjJ5P-FSMGYuyPZC8MuCU_ehwjXw9wDfzZZuSQN1E,1480
|
|
69
77
|
mcp_agent/workflows/evaluator_optimizer/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
70
|
-
mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py,sha256=
|
|
78
|
+
mcp_agent/workflows/evaluator_optimizer/evaluator_optimizer.py,sha256=r0ATtuc8JouBZz6iPc_dQ6g5oUZc7JXfbI9adKd2Wg8,13572
|
|
71
79
|
mcp_agent/workflows/intent_classifier/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
72
80
|
mcp_agent/workflows/intent_classifier/intent_classifier_base.py,sha256=zTbOmq6EY_abOlme4zl28HM4RWNNS6bbHl3tF7SshJ0,4004
|
|
73
81
|
mcp_agent/workflows/intent_classifier/intent_classifier_embedding.py,sha256=_bWZGukc_q9LdA_Q18UoAMSzhN8tt4K_bRHNUhy7Crw,3997
|
|
@@ -77,15 +85,15 @@ mcp_agent/workflows/intent_classifier/intent_classifier_llm.py,sha256=WSLUv2Casb
|
|
|
77
85
|
mcp_agent/workflows/intent_classifier/intent_classifier_llm_anthropic.py,sha256=Hp4454IniWFxV4ml50Ml8ip9rS1La5FBn5pd7vm1FHA,1964
|
|
78
86
|
mcp_agent/workflows/intent_classifier/intent_classifier_llm_openai.py,sha256=zj76WlTYnSCYjBQ_IDi5vFBQGmNwYaoUq1rT730sY98,1940
|
|
79
87
|
mcp_agent/workflows/llm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
80
|
-
mcp_agent/workflows/llm/augmented_llm.py,sha256=
|
|
81
|
-
mcp_agent/workflows/llm/augmented_llm_anthropic.py,sha256=
|
|
82
|
-
mcp_agent/workflows/llm/augmented_llm_openai.py,sha256=
|
|
88
|
+
mcp_agent/workflows/llm/augmented_llm.py,sha256=AjYxTn2XdBDHnibmjlCKwaVfQQlQRES9sRBMIU6NaPQ,23258
|
|
89
|
+
mcp_agent/workflows/llm/augmented_llm_anthropic.py,sha256=yrOv1V6rOfm2TTDR58fnf8YU8hBnTIpOZhB2sUgZw6o,21246
|
|
90
|
+
mcp_agent/workflows/llm/augmented_llm_openai.py,sha256=5PwTh0QJSQ29EtK0UuiltgX6snRSBoau75C35S4xQcQ,24477
|
|
83
91
|
mcp_agent/workflows/llm/llm_selector.py,sha256=G7pIybuBDwtmyxUDov_QrNYH2FoI0qFRu2JfoxWUF5Y,11045
|
|
84
|
-
mcp_agent/workflows/llm/model_factory.py,sha256=
|
|
92
|
+
mcp_agent/workflows/llm/model_factory.py,sha256=5JrMXZ5jbE8isiteF2A912gGuCyomGpjtC_BCVSAM9s,6806
|
|
85
93
|
mcp_agent/workflows/orchestrator/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
86
|
-
mcp_agent/workflows/orchestrator/orchestrator.py,sha256=
|
|
94
|
+
mcp_agent/workflows/orchestrator/orchestrator.py,sha256=Fn5r0uUGNAiUq5NLFDjaJ04t19MnGEgr9iknbUj0DSA,14733
|
|
87
95
|
mcp_agent/workflows/orchestrator/orchestrator_models.py,sha256=UWn7_HFLcqFGlcjZ1Rn2SYQfm5k9seS6QJN_FRST5Kc,4513
|
|
88
|
-
mcp_agent/workflows/orchestrator/orchestrator_prompts.py,sha256
|
|
96
|
+
mcp_agent/workflows/orchestrator/orchestrator_prompts.py,sha256=-ogkjDoCXBDOyYE9yk3qhjqq0LofsSpRvRZfWVzrVTE,4396
|
|
89
97
|
mcp_agent/workflows/parallel/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
90
98
|
mcp_agent/workflows/parallel/fan_in.py,sha256=EivpUL5-qftctws-tlfwmYS1QeSwr07POIbBUbwvwOk,13184
|
|
91
99
|
mcp_agent/workflows/parallel/fan_out.py,sha256=J-yezgjzAWxfueW_Qcgwoet4PFDRIh0h4m48lIbFA4c,7023
|
|
@@ -95,13 +103,13 @@ mcp_agent/workflows/router/router_base.py,sha256=1Qr3Fx9_KxpotMV-eaNT79etayAxWuQ
|
|
|
95
103
|
mcp_agent/workflows/router/router_embedding.py,sha256=wEU49li9OqTX-Xucm0HDUFLZjlND1WuewOcQVAo0s2E,7944
|
|
96
104
|
mcp_agent/workflows/router/router_embedding_cohere.py,sha256=aKZVzzQfBuz0by9k0zWLAA0Db_unDIMYL4ynVzzx8C4,1975
|
|
97
105
|
mcp_agent/workflows/router/router_embedding_openai.py,sha256=KqW2IFLdQoAJ2lIz1X18WQJFjXF-YSFSTtsqVnp1JeI,1975
|
|
98
|
-
mcp_agent/workflows/router/router_llm.py,sha256=
|
|
106
|
+
mcp_agent/workflows/router/router_llm.py,sha256=xRLzFt8UvJT9PZNHIVDr8DguWqHFi-MJ-uGALL5Ahzw,10639
|
|
99
107
|
mcp_agent/workflows/swarm/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
100
108
|
mcp_agent/workflows/swarm/swarm.py,sha256=-lAIeSWDqbGHGRPTvjiP9nIKWvxxy9DAojl9yQzO1Pw,11050
|
|
101
109
|
mcp_agent/workflows/swarm/swarm_anthropic.py,sha256=pW8zFx5baUWGd5Vw3nIDF2oVOOGNorij4qvGJKdYPcs,1624
|
|
102
110
|
mcp_agent/workflows/swarm/swarm_openai.py,sha256=wfteywvAGkT5bLmIxX_StHJq8144whYmCRnJASAjOes,1596
|
|
103
|
-
fast_agent_mcp-0.0.
|
|
104
|
-
fast_agent_mcp-0.0.
|
|
105
|
-
fast_agent_mcp-0.0.
|
|
106
|
-
fast_agent_mcp-0.0.
|
|
107
|
-
fast_agent_mcp-0.0.
|
|
111
|
+
fast_agent_mcp-0.0.12.dist-info/METADATA,sha256=mgH0wJrtVRReqKTn2a-ANc_reC_quUXY-texT2zGdVI,16583
|
|
112
|
+
fast_agent_mcp-0.0.12.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
113
|
+
fast_agent_mcp-0.0.12.dist-info/entry_points.txt,sha256=2IXtSmDK9XjWN__RWuRIJTgWyW17wJnJ_h-pb0pZAxo,174
|
|
114
|
+
fast_agent_mcp-0.0.12.dist-info/licenses/LICENSE,sha256=cN3FxDURL9XuzE5mhK9L2paZo82LTfjwCYVT7e3j0e4,10939
|
|
115
|
+
fast_agent_mcp-0.0.12.dist-info/RECORD,,
|
mcp_agent/app.py
CHANGED
|
@@ -135,8 +135,8 @@ class MCPApp:
|
|
|
135
135
|
"MCPAgent initialized",
|
|
136
136
|
data={
|
|
137
137
|
"progress_action": "Running",
|
|
138
|
-
"target": self.name,
|
|
139
|
-
"agent_name": "
|
|
138
|
+
"target": self.name or "mcp_application",
|
|
139
|
+
"agent_name": self.name or "fastagent loop",
|
|
140
140
|
},
|
|
141
141
|
)
|
|
142
142
|
|
|
@@ -150,8 +150,8 @@ class MCPApp:
|
|
|
150
150
|
"MCPAgent cleanup",
|
|
151
151
|
data={
|
|
152
152
|
"progress_action": ProgressAction.FINISHED,
|
|
153
|
-
"target": self.name,
|
|
154
|
-
"agent_name": "
|
|
153
|
+
"target": self.name or "mcp_application",
|
|
154
|
+
"agent_name": self.name or "fastagent loop",
|
|
155
155
|
},
|
|
156
156
|
)
|
|
157
157
|
try:
|
|
@@ -19,6 +19,7 @@ EXAMPLE_TYPES = {
|
|
|
19
19
|
"'Building Effective Agents' paper. Some agents use the 'fetch'\n"
|
|
20
20
|
"and filesystem MCP Servers.",
|
|
21
21
|
"files": [
|
|
22
|
+
"agent_build.py",
|
|
22
23
|
"chaining.py",
|
|
23
24
|
"evaluator.py",
|
|
24
25
|
"human_input.py",
|
|
@@ -32,11 +33,7 @@ EXAMPLE_TYPES = {
|
|
|
32
33
|
"description": "Research agent example with additional evaluation/optimization\n"
|
|
33
34
|
"example. Uses Brave Search and Docker MCP Servers.\n"
|
|
34
35
|
"Creates examples in a 'researcher' subdirectory.",
|
|
35
|
-
"files": [
|
|
36
|
-
"researcher.py",
|
|
37
|
-
"researcher-eval.py",
|
|
38
|
-
"mcp_agent.secrets.yaml.example",
|
|
39
|
-
],
|
|
36
|
+
"files": ["researcher.py", "researcher-eval.py", "fastagent.config.yaml"],
|
|
40
37
|
"create_subdir": True,
|
|
41
38
|
},
|
|
42
39
|
"data-analysis": {
|
mcp_agent/cli/commands/setup.py
CHANGED
|
@@ -19,7 +19,7 @@ FASTAGENT_CONFIG_TEMPLATE = """
|
|
|
19
19
|
# If not specified, defaults to "haiku".
|
|
20
20
|
# Can be overriden with a command line switch --model=<model>, or within the Agent constructor.
|
|
21
21
|
|
|
22
|
-
default_model:
|
|
22
|
+
default_model: haiku
|
|
23
23
|
|
|
24
24
|
# Logging and Console Configuration:
|
|
25
25
|
logger:
|
mcp_agent/cli/main.py
CHANGED
|
@@ -40,11 +40,11 @@ def show_welcome():
|
|
|
40
40
|
|
|
41
41
|
console.print("\n[bold]Getting Started:[/bold]")
|
|
42
42
|
console.print("1. Set up a new project:")
|
|
43
|
-
console.print("
|
|
43
|
+
console.print(" fastagent setup")
|
|
44
44
|
console.print("\n2. Try an example:")
|
|
45
|
-
console.print("
|
|
45
|
+
console.print(" fastagent bootstrap create decorator")
|
|
46
46
|
console.print("\nUse --help with any command for more information")
|
|
47
|
-
console.print("Example:
|
|
47
|
+
console.print("Example: fastagent bootstrap --help")
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
@app.callback(invoke_without_command=True)
|
|
@@ -56,7 +56,7 @@ def main(
|
|
|
56
56
|
True, "--color/--no-color", help="Enable/disable color output"
|
|
57
57
|
),
|
|
58
58
|
):
|
|
59
|
-
"""
|
|
59
|
+
"""FastAgent CLI - Build effective agents using Model Context Protocol (MCP).
|
|
60
60
|
|
|
61
61
|
Use --help with any command for detailed usage information.
|
|
62
62
|
"""
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced prompt functionality with advanced prompt_toolkit features.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
from typing import List
|
|
6
|
+
from prompt_toolkit import PromptSession
|
|
7
|
+
from prompt_toolkit.formatted_text import HTML
|
|
8
|
+
from prompt_toolkit.history import InMemoryHistory
|
|
9
|
+
from prompt_toolkit.key_binding import KeyBindings
|
|
10
|
+
from prompt_toolkit.completion import Completer, Completion
|
|
11
|
+
from prompt_toolkit.lexers import PygmentsLexer
|
|
12
|
+
from prompt_toolkit.filters import Condition
|
|
13
|
+
from pygments.lexers.python import PythonLexer
|
|
14
|
+
from rich import print as rich_print
|
|
15
|
+
|
|
16
|
+
# Map of agent names to their history
|
|
17
|
+
agent_histories = {}
|
|
18
|
+
|
|
19
|
+
# Store available agents for auto-completion
|
|
20
|
+
available_agents = set()
|
|
21
|
+
|
|
22
|
+
# Keep track of multi-line mode state
|
|
23
|
+
in_multiline_mode = False
|
|
24
|
+
|
|
25
|
+
# Track which agents have already shown welcome messages
|
|
26
|
+
agent_messages_shown = set()
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class AgentCompleter(Completer):
|
|
30
|
+
"""Provide completion for agent names and common commands."""
|
|
31
|
+
|
|
32
|
+
def __init__(self, agents: List[str], commands: List[str] = None, agent_types: dict = None):
|
|
33
|
+
self.agents = agents
|
|
34
|
+
self.commands = commands or ["help", "clear", "STOP"]
|
|
35
|
+
self.agent_types = agent_types or {}
|
|
36
|
+
|
|
37
|
+
def get_completions(self, document, complete_event):
|
|
38
|
+
"""Synchronous completions method - this is what prompt_toolkit expects by default"""
|
|
39
|
+
text = document.text_before_cursor.lower()
|
|
40
|
+
|
|
41
|
+
# Complete commands
|
|
42
|
+
if text.startswith("/"):
|
|
43
|
+
cmd = text[1:]
|
|
44
|
+
for command in self.commands:
|
|
45
|
+
if command.lower().startswith(cmd):
|
|
46
|
+
yield Completion(
|
|
47
|
+
command,
|
|
48
|
+
start_position=-len(cmd),
|
|
49
|
+
display=command,
|
|
50
|
+
display_meta="Command",
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
# Complete agent names for agent-related commands
|
|
54
|
+
elif text.startswith("@"):
|
|
55
|
+
agent_name = text[1:]
|
|
56
|
+
for agent in self.agents:
|
|
57
|
+
if agent.lower().startswith(agent_name.lower()):
|
|
58
|
+
# Get agent type or default to "Agent"
|
|
59
|
+
agent_type = self.agent_types.get(agent, "Agent")
|
|
60
|
+
yield Completion(
|
|
61
|
+
agent,
|
|
62
|
+
start_position=-len(agent_name),
|
|
63
|
+
display=agent,
|
|
64
|
+
display_meta=agent_type,
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def create_keybindings(on_toggle_multiline=None, app=None):
|
|
69
|
+
"""Create custom key bindings."""
|
|
70
|
+
kb = KeyBindings()
|
|
71
|
+
|
|
72
|
+
@kb.add("c-m", filter=Condition(lambda: not in_multiline_mode))
|
|
73
|
+
def _(event):
|
|
74
|
+
"""Enter: accept input when not in multiline mode."""
|
|
75
|
+
event.current_buffer.validate_and_handle()
|
|
76
|
+
|
|
77
|
+
@kb.add("c-m", filter=Condition(lambda: in_multiline_mode))
|
|
78
|
+
def _(event):
|
|
79
|
+
"""Enter: insert newline when in multiline mode."""
|
|
80
|
+
event.current_buffer.insert_text("\n")
|
|
81
|
+
|
|
82
|
+
@kb.add("escape", "enter")
|
|
83
|
+
def _(event):
|
|
84
|
+
"""Alt+Enter: always submit even in multiline mode."""
|
|
85
|
+
event.current_buffer.validate_and_handle()
|
|
86
|
+
|
|
87
|
+
@kb.add("c-t")
|
|
88
|
+
def _(event):
|
|
89
|
+
"""Ctrl+T: Toggle multiline mode."""
|
|
90
|
+
global in_multiline_mode
|
|
91
|
+
in_multiline_mode = not in_multiline_mode
|
|
92
|
+
|
|
93
|
+
# Force redraw the app to update toolbar
|
|
94
|
+
if event.app:
|
|
95
|
+
event.app.invalidate()
|
|
96
|
+
elif app:
|
|
97
|
+
app.invalidate()
|
|
98
|
+
|
|
99
|
+
# Call the toggle callback if provided
|
|
100
|
+
if on_toggle_multiline:
|
|
101
|
+
on_toggle_multiline(in_multiline_mode)
|
|
102
|
+
|
|
103
|
+
# Instead of printing, we'll just update the toolbar
|
|
104
|
+
# The toolbar will show the current mode
|
|
105
|
+
|
|
106
|
+
@kb.add("c-l")
|
|
107
|
+
def _(event):
|
|
108
|
+
"""Ctrl+L: Clear input."""
|
|
109
|
+
event.current_buffer.text = ""
|
|
110
|
+
|
|
111
|
+
return kb
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
async def get_enhanced_input(
|
|
115
|
+
agent_name: str,
|
|
116
|
+
default: str = "",
|
|
117
|
+
show_default: bool = False,
|
|
118
|
+
show_stop_hint: bool = False,
|
|
119
|
+
multiline: bool = False,
|
|
120
|
+
available_agent_names: List[str] = None,
|
|
121
|
+
syntax: str = None,
|
|
122
|
+
agent_types: dict = None,
|
|
123
|
+
) -> str:
|
|
124
|
+
"""
|
|
125
|
+
Enhanced input with advanced prompt_toolkit features.
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
agent_name: Name of the agent (used for prompt and history)
|
|
129
|
+
default: Default value if user presses enter
|
|
130
|
+
show_default: Whether to show the default value in the prompt
|
|
131
|
+
show_stop_hint: Whether to show the STOP hint
|
|
132
|
+
multiline: Start in multiline mode
|
|
133
|
+
available_agent_names: List of agent names for auto-completion
|
|
134
|
+
syntax: Syntax highlighting (e.g., 'python', 'sql')
|
|
135
|
+
agent_types: Dictionary mapping agent names to their types for display
|
|
136
|
+
|
|
137
|
+
Returns:
|
|
138
|
+
User input string
|
|
139
|
+
"""
|
|
140
|
+
global in_multiline_mode, available_agents
|
|
141
|
+
|
|
142
|
+
# Update global state
|
|
143
|
+
in_multiline_mode = multiline
|
|
144
|
+
if available_agent_names:
|
|
145
|
+
available_agents = set(available_agent_names)
|
|
146
|
+
|
|
147
|
+
# Get or create history object for this agent
|
|
148
|
+
if agent_name not in agent_histories:
|
|
149
|
+
agent_histories[agent_name] = InMemoryHistory()
|
|
150
|
+
|
|
151
|
+
# Define callback for multiline toggle
|
|
152
|
+
def on_multiline_toggle(enabled):
|
|
153
|
+
nonlocal session
|
|
154
|
+
if hasattr(session, "app") and session.app:
|
|
155
|
+
session.app.invalidate()
|
|
156
|
+
|
|
157
|
+
# Define toolbar function that will update dynamically
|
|
158
|
+
def get_toolbar():
|
|
159
|
+
if in_multiline_mode:
|
|
160
|
+
mode_style = "ansired" # More noticeable for multiline mode
|
|
161
|
+
mode_text = "MULTILINE"
|
|
162
|
+
toggle_text = "Normal Editing"
|
|
163
|
+
else:
|
|
164
|
+
mode_style = "ansigreen"
|
|
165
|
+
mode_text = "NORMAL"
|
|
166
|
+
toggle_text = "Multiline Editing"
|
|
167
|
+
|
|
168
|
+
shortcuts = [
|
|
169
|
+
("Ctrl+T", toggle_text),
|
|
170
|
+
("Alt+Enter", "Submit" if in_multiline_mode else ""),
|
|
171
|
+
("Ctrl+L", "Clear"),
|
|
172
|
+
("↑/↓", "History"),
|
|
173
|
+
]
|
|
174
|
+
# Only show relevant shortcuts based on mode
|
|
175
|
+
shortcuts = [(k, v) for k, v in shortcuts if v]
|
|
176
|
+
|
|
177
|
+
shortcut_text = " | ".join(f"{key}:{action}" for key, action in shortcuts)
|
|
178
|
+
return HTML(
|
|
179
|
+
f" <b>Agent:</b> <ansiblue> {agent_name} </ansiblue> | <b>Mode:</b> <{mode_style}> {mode_text} </{mode_style}> | {shortcut_text}"
|
|
180
|
+
)
|
|
181
|
+
|
|
182
|
+
# Create session with history and completions
|
|
183
|
+
session = PromptSession(
|
|
184
|
+
history=agent_histories[agent_name],
|
|
185
|
+
completer=AgentCompleter(
|
|
186
|
+
agents=list(available_agents) if available_agents else [],
|
|
187
|
+
agent_types=agent_types or {},
|
|
188
|
+
),
|
|
189
|
+
complete_while_typing=True,
|
|
190
|
+
lexer=PygmentsLexer(PythonLexer) if syntax == "python" else None,
|
|
191
|
+
multiline=Condition(lambda: in_multiline_mode),
|
|
192
|
+
complete_in_thread=True,
|
|
193
|
+
mouse_support=True,
|
|
194
|
+
bottom_toolbar=get_toolbar, # Pass the function here
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
# Create key bindings with a reference to the app
|
|
198
|
+
bindings = create_keybindings(
|
|
199
|
+
on_toggle_multiline=on_multiline_toggle, app=session.app
|
|
200
|
+
)
|
|
201
|
+
session.app.key_bindings = bindings
|
|
202
|
+
|
|
203
|
+
# Create formatted prompt text
|
|
204
|
+
prompt_text = f"<ansicyan>{agent_name}</ansicyan> > "
|
|
205
|
+
|
|
206
|
+
# Add default value display if requested
|
|
207
|
+
if show_default and default and default != "STOP":
|
|
208
|
+
prompt_text = f"{prompt_text} [<ansigreen>{default}</ansigreen>] "
|
|
209
|
+
|
|
210
|
+
# Only show hints at startup if requested
|
|
211
|
+
if show_stop_hint:
|
|
212
|
+
if default == "STOP":
|
|
213
|
+
rich_print("[yellow]Press <ENTER> to finish.[/yellow]")
|
|
214
|
+
else:
|
|
215
|
+
rich_print("Enter a prompt, or [red]STOP[/red] to finish")
|
|
216
|
+
if default:
|
|
217
|
+
rich_print(
|
|
218
|
+
f"Press <ENTER> to use the default prompt:\n[cyan]{default}[/cyan]"
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
# Mention available features but only on first usage for this agent
|
|
222
|
+
if agent_name not in agent_messages_shown:
|
|
223
|
+
rich_print(
|
|
224
|
+
"[dim]Tip: Type /help for commands, press F1 for keyboard shortcuts. Ctrl+T toggles multiline mode. @Agent to switch agent[/dim]"
|
|
225
|
+
)
|
|
226
|
+
agent_messages_shown.add(agent_name)
|
|
227
|
+
|
|
228
|
+
# Process special commands
|
|
229
|
+
def pre_process_input(text):
|
|
230
|
+
# Command processing
|
|
231
|
+
if text and text.startswith("/"):
|
|
232
|
+
cmd = text[1:].strip().lower()
|
|
233
|
+
if cmd == "help":
|
|
234
|
+
return "HELP"
|
|
235
|
+
elif cmd == "clear":
|
|
236
|
+
return "CLEAR"
|
|
237
|
+
elif cmd == "agents":
|
|
238
|
+
return "LIST_AGENTS"
|
|
239
|
+
|
|
240
|
+
# Agent switching
|
|
241
|
+
if text and text.startswith("@"):
|
|
242
|
+
return f"SWITCH:{text[1:].strip()}"
|
|
243
|
+
|
|
244
|
+
return text
|
|
245
|
+
|
|
246
|
+
# Get the input - using async version
|
|
247
|
+
try:
|
|
248
|
+
result = await session.prompt_async(HTML(prompt_text), default=default)
|
|
249
|
+
return pre_process_input(result)
|
|
250
|
+
except KeyboardInterrupt:
|
|
251
|
+
# Handle Ctrl+C gracefully
|
|
252
|
+
return "STOP"
|
|
253
|
+
except EOFError:
|
|
254
|
+
# Handle Ctrl+D gracefully
|
|
255
|
+
return "STOP"
|
|
256
|
+
except Exception as e:
|
|
257
|
+
# Log and gracefully handle other exceptions
|
|
258
|
+
print(f"\nInput error: {type(e).__name__}: {e}")
|
|
259
|
+
return "STOP"
|
|
260
|
+
|
|
261
|
+
|
|
262
|
+
async def handle_special_commands(command, agent_app=None):
|
|
263
|
+
"""Handle special input commands."""
|
|
264
|
+
# Quick guard for empty or None commands
|
|
265
|
+
if not command:
|
|
266
|
+
return False
|
|
267
|
+
|
|
268
|
+
# Check for special commands
|
|
269
|
+
if command == "HELP":
|
|
270
|
+
rich_print("\n[bold]Available Commands:[/bold]")
|
|
271
|
+
rich_print(" /help - Show this help")
|
|
272
|
+
rich_print(" /clear - Clear screen")
|
|
273
|
+
rich_print(" /agents - List available agents")
|
|
274
|
+
rich_print(" @agent_name - Switch to agent")
|
|
275
|
+
rich_print(" STOP - End session")
|
|
276
|
+
rich_print("\n[bold]Keyboard Shortcuts:[/bold]")
|
|
277
|
+
rich_print(
|
|
278
|
+
" Enter - Submit (normal mode) / New line (multiline mode)"
|
|
279
|
+
)
|
|
280
|
+
rich_print(" Alt+Enter - Always submit (even in multiline mode)")
|
|
281
|
+
rich_print(" Ctrl+T - Toggle multiline mode")
|
|
282
|
+
rich_print(" Ctrl+L - Clear input")
|
|
283
|
+
rich_print(" Up/Down - Navigate history")
|
|
284
|
+
rich_print(" F1 - Show help")
|
|
285
|
+
return True
|
|
286
|
+
|
|
287
|
+
elif command == "CLEAR":
|
|
288
|
+
# Clear screen (ANSI escape sequence)
|
|
289
|
+
print("\033c", end="")
|
|
290
|
+
return True
|
|
291
|
+
|
|
292
|
+
elif command == "LIST_AGENTS":
|
|
293
|
+
if available_agents:
|
|
294
|
+
rich_print("\n[bold]Available Agents:[/bold]")
|
|
295
|
+
for agent in sorted(available_agents):
|
|
296
|
+
rich_print(f" @{agent}")
|
|
297
|
+
else:
|
|
298
|
+
rich_print("[yellow]No agents available[/yellow]")
|
|
299
|
+
return True
|
|
300
|
+
|
|
301
|
+
elif isinstance(command, str) and command.startswith("SWITCH:"):
|
|
302
|
+
agent_name = command.split(":", 1)[1]
|
|
303
|
+
if agent_name in available_agents:
|
|
304
|
+
if agent_app:
|
|
305
|
+
rich_print(f"[green]Switching to agent: {agent_name}[/green]")
|
|
306
|
+
return {"switch_agent": agent_name}
|
|
307
|
+
else:
|
|
308
|
+
rich_print(
|
|
309
|
+
"[yellow]Agent switching not available in this context[/yellow]"
|
|
310
|
+
)
|
|
311
|
+
else:
|
|
312
|
+
rich_print(f"[red]Unknown agent: {agent_name}[/red]")
|
|
313
|
+
return True
|
|
314
|
+
|
|
315
|
+
return False
|