Files
mars-mcp/prompts/material_synthesis.py
2025-04-16 11:15:01 +08:00

168 lines
6.6 KiB
Python
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from typing import Dict, List, Optional
import mcp.types as types
from mcp.server.lowlevel import Server
def create_messages(
properties: Dict[str, str] = None,
batch_size: int = 2,
) -> list[types.PromptMessage]:
"""
创建用于材料生成和合成的提示词消息。
Args:
properties: 材料性质及其值的字典,例如 {"dft_band_gap": "2.0"}
batch_size: 生成材料的数量默认为2
Returns:
提示词消息列表
"""
messages = []
# 系统消息,定义助手的角色和任务
system_message = """你是一位专业的材料科学家,擅长材料生成和合成方案设计。
你的任务是:
1. 根据用户提供的材料性质要求使用mars_toolkit中的generate_materials工具生成符合要求的材料
2. 系统地分析生成的材料的四要素:成分、结构、工艺和性能
3. 为生成的材料设计科学合理的合成方案
4. 使用mermaid语法绘制材料的合成流程图
请确保你的回答包含以下内容:
- 对用户需求的理解和分析
- 使用generate_material工具生成的材料结构
- 生成材料的四要素详细分析:
* 成分(Composition):详细的化学成分、元素比例、化学计量比
* 结构(Structure):晶体结构、空间群、晶格参数、原子位置、配位环境
* 工艺(Processing):可行的合成路线、工艺参数、关键控制因素
* 性能(Properties):预期的物理、化学、机械性能及其与结构的关系
- 详细的合成方案,包括:
* 原料选择及纯度要求
* 精确的反应条件(温度、压力、时间、气氛)
* 分步骤的合成流程及每步的理论依据
* 可能的挑战及解决方案
* 表征方法建议
- 使用mermaid语法绘制的合成流程图清晰展示从原料到最终产品的全过程
"""
messages.append(
types.PromptMessage(
role="system",
content=types.TextContent(type="text", text=system_message),
)
)
# 构建主提示词
if properties and len(properties) > 0:
properties_text = "\n".join([f"- {key}: {value}" for key, value in properties.items()])
prompt = f"""请根据以下材料性质要求,生成{batch_size}个合适的材料并设计其合成方案:
{properties_text}
请按照以下步骤进行:
1. 使用mars_toolkit中的generate_material工具生成材料参数设置为batch_size={batch_size}
2. 对生成的每种材料进行系统的四要素分析:
- 成分:详细分析元素组成、化学计量比及其理论依据
- 结构:分析晶体结构、空间群、晶格参数、原子排布及其稳定性
- 工艺:探讨可行的合成路线、工艺参数及其科学依据
- 性能:预测材料可能具有的物理、化学、机械性能及其应用前景
3. 为每种材料设计详细的合成方案,包括:
- 原料选择及纯度要求
- 精确的反应条件参数(温度、压力、时间、气氛等)
- 分步骤的合成流程及每步的理论依据
- 可能遇到的挑战及解决方案
- 推荐的表征方法
4. 使用mermaid语法绘制材料的合成流程图清晰展示从原料到最终产品的全过程包括关键工艺参数。"""
else:
prompt = f"""请生成{batch_size}种具有创新性的新型材料并设计其合成方案。
请按照以下步骤进行:
1. 使用mars_toolkit中的generate_material工具生成材料参数设置为batch_size={batch_size}
2. 对生成的每种材料进行系统的四要素分析:
- 成分:详细分析元素组成、化学计量比及其理论依据
- 结构:分析晶体结构、空间群、晶格参数、原子排布及其稳定性
- 工艺:探讨可行的合成路线、工艺参数及其科学依据
- 性能:预测材料可能具有的物理、化学、机械性能及其应用前景
3. 为每种材料设计详细的合成方案,包括:
- 原料选择及纯度要求
- 精确的反应条件参数(温度、压力、时间、气氛等)
- 分步骤的合成流程及每步的理论依据
- 可能遇到的挑战及解决方案
- 推荐的表征方法
4. 使用mermaid语法绘制材料的合成流程图清晰展示从原料到最终产品的全过程包括关键工艺参数。"""
messages.append(
types.PromptMessage(
role="user",
content=types.TextContent(type="text", text=prompt)
)
)
return messages
def register_prompt_handlers(app: Server):
"""
注册提示词处理器到MCP服务器。
Args:
app: MCP服务器实例
"""
@app.list_prompts()
async def list_prompts() -> list[types.Prompt]:
return [
types.Prompt(
name="material_synthesis",
description="基于材料四要素成分、结构、工艺、性能生成材料并设计合成方案使用mermaid绘制合成流程图",
arguments=[
types.PromptArgument(
name="properties",
description="材料性质及其值的JSON字符串例如 {\"dft_band_gap\": \"2.0\"}",
required=False,
),
types.PromptArgument(
name="batch_size",
description="生成材料的数量默认为2",
required=False,
),
],
)
]
@app.get_prompt()
async def get_prompt(
name: str, arguments: dict[str, str] | None = None
) -> types.GetPromptResult:
if name != "material_synthesis":
raise ValueError(f"未知的提示词: {name}")
if arguments is None:
arguments = {}
# 解析properties参数
properties = {}
if "properties" in arguments and arguments["properties"]:
try:
import json
properties = json.loads(arguments["properties"])
except json.JSONDecodeError:
properties = {}
# 解析batch_size参数
batch_size = 2 # 默认值
if "batch_size" in arguments and arguments["batch_size"]:
try:
batch_size = int(arguments["batch_size"])
except ValueError:
pass # 使用默认值
return types.GetPromptResult(
messages=create_messages(properties=properties, batch_size=batch_size),
description="基于材料四要素成分、结构、工艺、性能生成材料并设计合成方案使用mermaid绘制合成流程图",
)