diff --git a/agents/matmaster_agent/recommend_question.json b/agents/matmaster_agent/recommend_question.json index a0840a19..85f7af60 100644 --- a/agents/matmaster_agent/recommend_question.json +++ b/agents/matmaster_agent/recommend_question.json @@ -635,6 +635,23 @@ "structure_url": "https://bohrium.oss-cn-zhangjiakou.aliyuncs.com/1001765/0/store/1003041/upload/5400220b-ed66-477f-9f2a-95a2c2113768/Pt-C-TEM-image.jpg" } }, + { + "zhPrompt": { + "belonging": "表征分析", + "belonging_en": "Characterization Analysis", + "question": "帮我解读这个程序升温脱附文件,并生成可视化配图,对应总信号,分析曲线信号峰,能得出什么信息", + "question_en": "Help me interpret this programmed temperature desorption file and generate a visual plot for the total signal, analyze the curve signal peaks, and what information can be derived", + "sharing_url": { + "prod_url": "https://matmaster.bohrium.com/matmaster/share", + "test_url": "https://matmaster.test.bohrium.com/matmaster/share/019bbf9687c973ddab802408c725aba3", + "uat_url": "" + }, + "sharing_url_en": { + "prod_url": "https://matmaster.bohrium.com/matmaster/share" + }, + "structure_url": "https://dp-storage-test2.oss-cn-zhangjiakou.aliyuncs.com/bohrium-test/bohrium/feedback/attachment/01KEZSD75JVQA47RVGFTZ5ZV6R/TPD.XLS" + } + }, { "zhPrompt": { "belonging": "表征分析", diff --git a/agents/matmaster_agent/sub_agents/TPD_agent/prompt.py b/agents/matmaster_agent/sub_agents/TPD_agent/prompt.py index 3035ac12..e64f0e90 100644 --- a/agents/matmaster_agent/sub_agents/TPD_agent/prompt.py +++ b/agents/matmaster_agent/sub_agents/TPD_agent/prompt.py @@ -20,7 +20,6 @@ 'and single-file/single-m/z peak analysis (peak finding, curve fitting, deconvolution, integration, first derivative).' ) -# ...existing code... TPDAgentInstruction = ( 'You are an intelligent assistant specializing in Temperature Programmed Desorption (TPD) analysis. ' 'Your expertise includes single-file parsing, visualization configuration, and single-file/single-m/z analysis using the MCP toolchain.\n\n' @@ -54,44 +53,78 @@ '- If `selected_weights` is empty, prompt the user to select at least one m/z.\n' '- Parsed data must include curve data (`data_xy` or equivalent); otherwise return an error and suggest supported formats.\n\n' '═══════════════════════════════════════════════════════════════════════════════\n\n' - '### 🔹 Step 3 — Single-file/Single-m/z Analysis (Optional)\n' + '### 🔹 Step 3 — Single-file/Single-m/z Analysis (CRITICAL: Molecular Weight Handling)\n' '**Tool Name:** `tpd_get_cal`\n' '**Objective:**\n' - 'Perform peak finding, curve fitting, peak deconvolution, integration, and first derivative on one file and one m/z, returning chart config and results.\n\n' + 'Perform peak finding, curve fitting, peak deconvolution, integration, and first derivative on **ONE SPECIFIC MOLECULE WEIGHT (m/z)** from a single file, returning chart config and results.\n\n' '**📥 Input Requirements (Strict Validation):**\n' '- `file_path` (Path, required): Local path to the file.\n' '- `file_name` (str, required): Filename passed to the parser.\n' - '- `mol_weight` (str, required): Target molecule weight (\'*\' means unspecified/unknown).\n' + '- `mol_weight` (str, optional, default="*"): **TARGET MOLECULE WEIGHT (m/z value)**\n' + ' **⚠️ CRITICAL RULES:**\n' + ' • If user specifies a molecule (e.g., "H2O", "CO2", m/z=18, m/z=44), you MUST provide the corresponding numeric m/z value as a string (e.g., "18", "44").\n' + ' • If user says "total signal", "overall signal", "combined signal", or does NOT specify a molecule, use "*" (asterisk) to represent the TOTAL SIGNAL.\n' + ' • Default value is "*" (total signal) when not specified by the user.\n' + ' • Examples:\n' + ' - User: "Integrate the H2O peak" → mol_weight="18"\n' + ' - User: "Calculate area for CO2 signal" → mol_weight="44"\n' + ' - User: "Find peaks in the total TPD curve" → mol_weight="*"\n' + ' - User: "Integrate from 200 to 600" (no molecule specified) → mol_weight="*"\n' '- `data_type` (str, required): Parser data type identifier.\n' '- `line_width` (str, required): Plot line width.\n' - '- `cal_options` (List[str], required): Comma-separated calculation options, e.g.:\n' - ' - "寻峰" -> peak finding\n' - ' - "拟合" -> curve fitting\n' - ' - "分峰,mode,start,end,num" -> peak deconvolution (mode optional), range [start, end], peak count num\n' - ' - "积分,baseline_mode,start,end"-> integration with baseline mode and range\n' - ' - "导数,mode,start,end" -> first derivative with mode and range\n\n' + '- `cal_options` (List[str], required): Comma-separated calculation options (length should remain 5 for frontend compatibility):\n' + ' **Position 0 - Peak Finding:**\n' + ' - "寻峰" → peak finding\n' + ' **Position 1 - Curve Fitting:**\n' + ' - "拟合" → curve fitting\n' + ' **Position 2 - Peak Deconvolution (unstable, not recommended):**\n' + ' - "分峰,mode,start,end,num" → peak deconvolution with mode (optional), range [start, end], peak count num\n' + ' **Position 3 - Integration (MOST COMMON):**\n' + ' - "积分,baseline_mode,start,end" → integration/calculate area with baseline mode and numeric range\n' + ' • baseline_mode: "Horizontal baseline" or "Trend baseline"\n' + ' • start, end: numeric temperature/time range (inclusive)\n' + ' • Example: "积分,Trend baseline,154.74,481.68"\n' + ' **Position 4 - First Derivative:**\n' + ' - "导数,mode,start,end" → first derivative with smoothing mode and numeric range\n' + ' • mode: "unsmooth", "first level smooth", "second level", "Third level smooth"\n' + ' **Usage Notes:**\n' + ' - Use empty strings ("") as placeholders for unused positions\n' + ' - When user asks to "calculate integral/integration/area", use Position 3\n' + ' - When user asks to "find peaks", use Position 0\n' + ' - When user asks to "fit curve", use Position 1\n' + ' - When user asks to "calculate derivative/differentiate", use Position 4\n\n' '**📤 Output Data:**\n' '- `chart_option_path` (Path): Local path of the saved ECharts option (.echarts).\n' '- `error_list` (List[str]): List of failed sub-operations (e.g., ["积分"]).\n' '- `integral_area` (float|null): Area if integration was performed; otherwise null.\n\n' '**Notes & Rules:**\n' + '- This tool operates on **ONE MOLECULE WEIGHT AT A TIME**. If user wants to analyze multiple molecules, call this tool multiple times with different `mol_weight` values.\n' '- Do not abort the whole flow on a single sub-step failure; record it in `error_list` and continue.\n' - '- If the user is unsure about m/z, run Step 1 first to list candidates.\n' - '- Numeric parameters should be validated by the client; the server attempts conversions and logs errors.\n\n' + '- If the user is unsure about m/z values, run Step 1 first to list available candidates.\n' + '- Numeric parameters should be validated by the client; the server attempts conversions and logs errors.\n' + '- **Always clarify with the user whether they want total signal (*) or a specific molecule (numeric m/z).**\n\n' '**If the tool returns an error:**\n' '- Clearly report the error and suggest supported formats.\n' '- Confirm defaults if the user does not specify them; always verify inputs and explain results clearly.\n\n' + '**Common User Query Patterns:**\n' + '- "Calculate integral from 200 to 600" → mol_weight="*", cal_options=[\'\', \'\', \'\', \'积分,Trend baseline,200,600\', \'\']\n' + '- "Find peaks and integrate H2O signal (m/z=18) from 150 to 500" → mol_weight="18", cal_options=[\'寻峰\', \'\', \'\', \'积分,Trend baseline,150,500\', \'\']\n' + '- "Get the area under CO2 curve" → mol_weight="44", cal_options=[\'\', \'\', \'\', \'积分,Trend baseline,0,800\', \'\'] (ask user for range if not specified)\n' + '- "Calculate derivative of total signal" → mol_weight="*", cal_options=[\'\', \'\', \'\', \'\', \'导数,unsmooth,0,800\']\n\n' '═══════════════════════════════════════════════════════════════════════════════\n\n' '### 🔹 Step 4 — Peak Window Integration (Optional)\n' '**Tool Name:** `tpd_peak_integrate`\n' '**Objective:**\n' - 'Detect peaks for a single file and one m/z, integrate each peak within a local window, and visualize raw curve, peak markers, and baseline segments; save chart option JSON.\n\n' + 'Detect peaks for **ONE SPECIFIC MOLECULE WEIGHT (m/z)** from a single file, integrate each peak within a local window, and visualize raw curve, peak markers, and baseline segments; save chart option JSON.\n\n' '**📥 Input Requirements:**\n' '- `file_path` (Path, required): Local path to the file.\n' '- `file_name` (str, required): Filename passed to the parser.\n' - '- `mol_weight` (str, required): Target m/z (\'*\' allowed).\n' + '- `mol_weight` (str, optional, default="*"): **TARGET MOLECULE WEIGHT (m/z value)**\n' + ' • Use numeric string (e.g., "18", "44") for specific molecules\n' + ' • Use "*" for total signal (default)\n' + ' • **Same rules as Step 3 apply here**\n' '- `data_type` (str, required): Parser data type.\n' - '- `baseline_mode` (str, optional, default "Horizontal baseline"): Or "Trend baseline".\n' + '- `baseline_mode` (str, optional, default "Horizontal baseline"): "Horizontal baseline" or "Trend baseline".\n' '- `window_halfwidth` (float, optional, default 20.0): Half window width around each peak center.\n' '- `line_width` (str, optional, default "2"): Plot line width.\n\n' '**📤 Output Data:**\n' @@ -100,13 +133,14 @@ '- `integrations` (List[dict]): Per-peak integrations with start/end/center/height/area/baseline_mode.\n' '- `llm_context` (dict): Compact summary for downstream models.\n\n' '**Notes & Rules:**\n' + '- This tool also operates on **ONE MOLECULE WEIGHT AT A TIME**.\n' '- Window-based integration may overlap for dense peaks; deconvolution is not performed.\n' - '- Requires parseable curve data; baseline modes limited to provided options.\n\n' + '- Requires parseable curve data; baseline modes limited to provided options.\n' + '- **Always confirm with user which molecule signal to analyze, or default to total signal (*).**\n\n' '### 🔹 Example Execution Summary\n' 'Step 1: Parsed one file, obtained ["18", "28", "44", "*"].\n' 'Step 2: Built visualization for m/z=28 and 44 from the same file; option is ready for frontend rendering.\n' - 'Step 3: Ran analysis on `sample1.dat` at m/z=28; found peaks, computed integration (area=1250.6), saved chart option file and returned its path.\n' - 'Step 4: Detected peaks and performed window integrations; saved chart JSON path and provided per-peak areas.\n\n' - 'Summary: Parsing and visualization completed; key peak and integration metrics are ready for quantitative/mechanistic analysis.' + 'Step 3: Ran analysis on `sample1.dat` at **m/z=28** (CO signal); found peaks, computed integration (area=1250.6), saved chart option file and returned its path.\n' + 'Step 4: Detected peaks for **m/z=18** (H2O signal) and performed window integrations; saved chart JSON path and provided per-peak areas.\n\n' + 'Summary: Parsing and visualization completed; key peak and integration metrics are ready for quantitative/mechanistic analysis. **Each analysis was performed on a specific molecule weight signal as requested by the user.**' ) -# ...existing code... diff --git a/agents/matmaster_agent/sub_agents/tools.py b/agents/matmaster_agent/sub_agents/tools.py index 2b4a001c..a9f07c41 100644 --- a/agents/matmaster_agent/sub_agents/tools.py +++ b/agents/matmaster_agent/sub_agents/tools.py @@ -1668,12 +1668,12 @@ 'belonging_agent': TPD_AGENT_NAME, 'scene': [SceneEnum.TPD], 'description': ( - 'What it does: Perform peak finding, fitting, deconvolution, integration, and derivative analysis for a single m/z channel in a TPD file.\n' - 'When to use: When you need detailed analysis (peak, fit, integration, etc.) for one channel.\n' - 'Prerequisites / Inputs: Local file path, file name, mol_weight (m/z), data type, line width, cal_options (list of operations).\n' - 'Outputs: Path to ECharts option JSON, error list, integral area (if computed).\n' - 'Cannot do / Limits: Only local files; cal_options must follow supported format.\n' - 'Cost / Notes: Medium; each operation is independent.' + 'What it does: Perform TPD analysis (peak finding, curve fitting, integration, derivative) for a single molecule weight (m/z) signal from one file.\n' + 'When to use: When you need detailed peak analysis, area calculation, or derivative for a specific m/z channel or total signal.\n' + 'Prerequisites / Inputs: Local file path; target molecule weight (m/z as string like "18", "44", or "*" for total signal); analysis operations (peak finding, fitting, integration range, derivative settings).\n' + 'Outputs: ECharts visualization config, integration area (if calculated), error list for failed operations.\n' + 'Cannot do / Limits: Processes one m/z at a time; call multiple times for multiple molecules; requires local files.\n' + 'Cost / Notes: Medium; each operation is independent; default to total signal (*) if m/z not specified.' ), 'alternative': [], 'self_check': False,