分形mcp
支持MCP工具和科学的代理服务器
](https://badge.fury.io/py/fractale-mcp)
设计
我们创建了一个健壮的异步服务器,可以注册和加载感兴趣的工具。这里的项目最初包含两个“桶”资产:工具(功能、提示、资源)和编排(代理框架和与模型配对的后端)。这些现在(在很大程度上)被分成模块化项目,并根据需要添加工具:
抽象
这里的库有以下抽象。
- 计划 是任何代理都可以读取和部署的YAML清单。
- 发动机:实例化代理的编排引擎(本机状态机、langchain、autogen)。
环境
可以在环境中设置以下变量。
| 名称 | 描述 | 默认值 |
|---|---|---|
FRACTALE_MCP_PORT | 如果使用http变体 | 8089,端口MCP服务器已打开 |
FRACTALE_MCP_TOKEN | 服务器令牌 | 未设置 |
FRACTALE_LLM_PROVIDER | LLM后端使用(双子座、奥派、骆驼) | 双子座 |
OPENAI_API_KEY | OpenAI模型的API密钥 | 未设置 |
OPENAI_BASE_URL | OpenAI的基本url | 未设置 |
代理
这 fractale agent 命令提供了运行构建、作业生成和部署代理的方法。 在我们 第一版,代理对应于一种任务(例如构建)。对于这个重构版本,代理的概念在提示或角色中表示,可以由具有某种模型后端的通用MCP代理(例如Gemini、Llama或OpenAI)部署。对于该框架,我们正在对状态机(原生)方法LangChain和AutoGen进行原型设计,并选择从AutoGen开始。除了调用工具外,它没有增加太多内容,目前还可以。其他人将返回。
用法
服务器
让我们安装 mcp服务器 使用我们需要的功能启动服务器。
pip install --break-system-packages git+https://github.com/converged-computing/mcp-server.git#egg=mcp-serveDocker构建
让我们测试一下构建。我在安装了Docker的本地机器上运行这个,我使用的是Gemini。
export GEMINI_API_TOKEN=xxxxxxxxxx同时安装以下功能 hpc-mcp:
pip install hpc-mcp --break-system-packages
pip install -e . --break-system-packages使用我们需要的函数和提示启动服务器:
mcpserver start --config ./examples/servers/docker-build.yaml然后执行计划。请注意,我们目前专注于AutoGen。
自动生成
# In the other, run the plan
fractale agent --engine autogen ./examples/plans/build-lammps.yaml要使用状态机,请删除 --engine 旗帜。添加 langchain LangChain。 这在Google Cloud(Gemini)中非常有效。我不相信我们的本地模型会轻易选择合适的工具。因此,下一个设计。如果你定义一个 tool 在任何步骤中,这将限制LLM的选择仅限于您感兴趣的工具。我们希望这能奏效。
设计很简单,因为每个代理都对错误与成功的状态做出响应。在 第一版 在我们的库中,代理形成了一个自定义图。在这个变体中,我们重构为使用MCP服务器工具。它具有与管理器相同的顶层设计,但每个步骤代理都像一个由LLM管理的小型状态机,可以访问MCP工具和资源。
Flux JobSpec翻译
要使用Flux进行原型制作,请在devcontainer中打开代码。安装库并启动flux实例。
pip install -e .[all] --break-system-packages
pip install flux-mcp IPython mcp-serve --break-system-packages
flux start我们需要启动服务器并添加验证函数和提示。使用我们需要的函数和提示启动服务器:
mcpserver start --config ./examples/servers/flux-gemini.yaml自动生成
请注意,这需要在带有Flux的环境中运行。我在DevContainer中运行这两个。
fractale agent --engine autogen ./examples/plans/transform-retry.yaml设计选择
以下是一些设计选择(当然可能会发生变化)。我从用这个框架重新实现我们的分形代理开始。为此,我们将有一个灵活的代理类,可以根据所选的提示更改函数,而不是将代理绑定到特定的函数(作为其代理函数上的类)。它将使用mcp函数、提示和资源。此外:
- 我选择使用autogen。AssistantAgent(较旧)优于autogen_chatagent等效物(增加了更多的库依赖性)
- 每个框架(在全球范围内)都是一个“引擎”,这意味着
Manager每个类都在engine.py下。 - 此处托管的工具是库所需的内部工具。例如,我们有一个提示,允许在工具做得不好的情况下获取输出的最终状态。
- 对于这里托管的那些,我们不直接使用mcp.tool(和相关函数),而是手动将它们添加到mcp中,以允许动态加载。
- 我们目前专注于autogen(其他语言链和原生语言需要更新)
- 更通用的工具在extral库下提供(例如flux mcp和hpc mcp)
- 函数docstring暴露给LLM(所以写一些好的!)
- 我们可以使用mcp.mount来扩展服务器以包含其他服务器,或者代理的等效服务器(我还没有测试过)。
- 异步很烦人,但我正在使用它。这意味着调试主要是打印语句,而不是交互式的。
- 我们使用 mcp服务器 作为MCP服务器。
许可证
HPCIC DevTools根据MIT许可证的条款进行分发。 所有新的贡献都必须根据此许可证进行。
SPDX 许可证标识符: (MIT)
LLNL-CODE-842614
