liuzhiheng hai 8 horas
pai
achega
86d1d1b551

+ 120 - 38
knowledge_v2/visualization/workflow_visualization.py

@@ -16,7 +16,9 @@ from pathlib import Path
 
 # 硬编码的文件路径列表(相对于项目根目录)
 DATA_FILE_PATHS = [
-    "../.cache/9f510b2a8348/execution_record.json",
+    "../.cache/dd8dd68ebf0c/execution_record.json",
+    "../.cache/70a208f70a7e/execution_record.json",
+    "../.cache/996e626b9c85/execution_record.json",
     # 可以在这里添加更多文件路径
 ]
 
@@ -56,51 +58,97 @@ def parse_workflow_data(data):
             'persona_info': data['input'].get('persona_info', '')
         }
     
-    # 提取执行流程
-    if 'execution' in data and 'modules' in data['execution']:
-        function_knowledge = data['execution']['modules'].get('function_knowledge', {})
+    # 提取执行流程(新格式:execution 直接包含各步骤,不再有 modules.function_knowledge)
+    if 'execution' in data:
+        execution = data['execution']
         
         # 步骤1: 生成query
-        if 'generate_query' in function_knowledge:
-            generate_query = function_knowledge['generate_query']
+        if 'generate_query' in execution:
+            generate_query = execution['generate_query']
             workflow['steps'].append({
                 'step': 'generate_query',
                 'name': '生成查询',
-                'query': generate_query.get('query', ''),
+                'query': generate_query.get('query', '') or generate_query.get('response', ''),
                 'prompt': generate_query.get('prompt', '')
             })
         
         # 步骤2: 选择工具
-        if 'select_tool' in function_knowledge:
-            select_tool = function_knowledge['select_tool']
+        if 'select_tool' in execution:
+            select_tool = execution['select_tool']
             response = select_tool.get('response', {})
             workflow['steps'].append({
                 'step': 'select_tool',
                 'name': '选择工具',
                 'prompt': select_tool.get('prompt', ''),
-                'tool_name': response.get('工具名', ''),
-                'tool_id': response.get('工具调用ID', ''),
-                'tool_usage': response.get('使用方法', '')
+                'tool_name': response.get('工具名', '') if isinstance(response, dict) else '',
+                'tool_id': response.get('工具调用ID', '') if isinstance(response, dict) else '',
+                'tool_usage': response.get('使用方法', '') if isinstance(response, dict) else ''
             })
         
-        # 步骤3: 提取参数
-        if 'extract_params' in function_knowledge:
-            extract_params = function_knowledge['extract_params']
-            workflow['steps'].append({
-                'step': 'extract_params',
-                'name': '提取参数',
-                'prompt': extract_params.get('prompt', ''),
-                'params': extract_params.get('params', {})
-            })
-        
-        # 步骤4: 执行工具
-        if 'execute_tool' in function_knowledge:
-            execute_tool = function_knowledge['execute_tool']
-            workflow['steps'].append({
-                'step': 'execute_tool',
-                'name': '执行工具',
-                'response': execute_tool.get('response', '')
-            })
+        # 判断是否选择了工具(如果 response 为空字典或没有工具信息,则没有选择到工具)
+        has_tool = False
+        if 'select_tool' in execution:
+            select_tool = execution['select_tool']
+            response = select_tool.get('response', {})
+            if isinstance(response, dict) and response.get('工具名'):
+                has_tool = True
+        
+        # 如果选择了工具,执行工具调用流程
+        if has_tool:
+            # 步骤3: 提取参数
+            if 'extract_params' in execution:
+                extract_params = execution['extract_params']
+                workflow['steps'].append({
+                    'step': 'extract_params',
+                    'name': '提取参数',
+                    'prompt': extract_params.get('prompt', ''),
+                    'params': extract_params.get('params', {})
+                })
+            
+            # 步骤4: 执行工具(新格式:tool_call 替代 execute_tool)
+            if 'tool_call' in execution:
+                tool_call = execution['tool_call']
+                # 优先使用 result,如果没有则使用 response
+                result = tool_call.get('result', '')
+                if not result and tool_call.get('response'):
+                    # 如果 response 是字典,尝试提取其中的 result
+                    response = tool_call.get('response', {})
+                    if isinstance(response, dict):
+                        result = response.get('result', response)
+                    else:
+                        result = response
+                workflow['steps'].append({
+                    'step': 'execute_tool',
+                    'name': '执行工具',
+                    'response': result or tool_call.get('response', '')
+                })
+        
+        # 如果没有选择到工具,进行知识搜索流程
+        else:
+            if 'knowledge_search' in execution:
+                knowledge_search = execution['knowledge_search']
+                
+                # 步骤3: LLM搜索(大模型+search 渠道的搜索过程)
+                if 'llm_search' in knowledge_search:
+                    llm_search = knowledge_search['llm_search']
+                    search_results = llm_search.get('search_results', [])
+                    workflow['steps'].append({
+                        'step': 'llm_search',
+                        'name': 'LLM搜索',
+                        'search_results': search_results
+                    })
+                
+                # 步骤4: 多渠道搜索结果整合
+                if 'multi_search_merge' in knowledge_search:
+                    multi_search_merge = knowledge_search['multi_search_merge']
+                    workflow['steps'].append({
+                        'step': 'multi_search_merge',
+                        'name': '多渠道搜索结果整合',
+                        'prompt': multi_search_merge.get('prompt', ''),
+                        'response': multi_search_merge.get('response', ''),
+                        'sources_count': multi_search_merge.get('sources_count', 0),
+                        'valid_sources_count': multi_search_merge.get('valid_sources_count', 0)
+                    })
     
     # 提取输出信息
     if 'output' in data:
@@ -578,20 +626,27 @@ def generate_html(workflows):
                     html += '                        </div>\n'
             
             elif step['step'] == 'select_tool':
+                # 判断是否选择了工具
                 if step.get('tool_name'):
                     html += '                        <div class="step-detail">\n'
                     html += '                            <span class="step-detail-label">工具名称:</span>\n'
                     html += f'                            <div class="step-detail-content">{escape_html(step["tool_name"])}</div>\n'
                     html += '                        </div>\n'
-                if step.get('tool_id'):
+                    if step.get('tool_id'):
+                        html += '                        <div class="step-detail">\n'
+                        html += '                            <span class="step-detail-label">工具调用ID:</span>\n'
+                        html += f'                            <div class="step-detail-content">{escape_html(step["tool_id"])}</div>\n'
+                        html += '                        </div>\n'
+                    if step.get('tool_usage'):
+                        html += '                        <div class="step-detail">\n'
+                        html += '                            <span class="step-detail-label">使用方法:</span>\n'
+                        html += f'                            <div class="step-detail-content">{escape_html(step["tool_usage"])}</div>\n'
+                        html += '                        </div>\n'
+                else:
+                    # 无工具选择时显示提示
                     html += '                        <div class="step-detail">\n'
-                    html += '                            <span class="step-detail-label">工具调用ID:</span>\n'
-                    html += f'                            <div class="step-detail-content">{escape_html(step["tool_id"])}</div>\n'
-                    html += '                        </div>\n'
-                if step.get('tool_usage'):
-                    html += '                        <div class="step-detail">\n'
-                    html += '                            <span class="step-detail-label">使用方法:</span>\n'
-                    html += f'                            <div class="step-detail-content">{escape_html(step["tool_usage"])}</div>\n'
+                    html += '                            <span class="step-detail-label">选择结果:</span>\n'
+                    html += '                            <div class="step-detail-content" style="color: #dc3545; font-weight: 500;">无匹配工具</div>\n'
                     html += '                        </div>\n'
             
             elif step['step'] == 'extract_params':
@@ -610,6 +665,33 @@ def generate_html(workflows):
                     html += f'                            <div class="step-detail-content json-content">{escape_html(response_str)}</div>\n'
                     html += '                        </div>\n'
             
+            elif step['step'] == 'llm_search':
+                search_results = step.get('search_results', [])
+                if search_results:
+                    html += '                        <div class="step-detail">\n'
+                    html += '                            <span class="step-detail-label">搜索结果:</span>\n'
+                    for idx, result in enumerate(search_results, 1):
+                        query = result.get('query', '')
+                        content = result.get('content', '')
+                        html += '                            <div style="margin-bottom: 15px; padding: 12px; background: #f0f8ff; border-radius: 6px; border-left: 3px solid #4a90e2;">\n'
+                        html += f'                                <div style="font-weight: 600; color: #2c3e50; margin-bottom: 8px;">查询 {idx}: {escape_html(query)}</div>\n'
+                        html += f'                                <div style="color: #555; line-height: 1.6; white-space: pre-wrap;">{escape_html(content)}</div>\n'
+                        html += '                            </div>\n'
+                    html += '                        </div>\n'
+            
+            elif step['step'] == 'multi_search_merge':
+                if step.get('sources_count') is not None:
+                    html += '                        <div class="step-detail">\n'
+                    html += '                            <span class="step-detail-label">来源统计:</span>\n'
+                    html += f'                            <div class="step-detail-content">总来源数: {step.get("sources_count", 0)}, 有效来源数: {step.get("valid_sources_count", 0)}</div>\n'
+                    html += '                        </div>\n'
+                if step.get('response'):
+                    html += '                        <div class="step-detail">\n'
+                    html += '                            <span class="step-detail-label">整合结果:</span>\n'
+                    response_str = format_json_for_display(step['response'])
+                    html += f'                            <div class="step-detail-content">{escape_html(response_str)}</div>\n'
+                    html += '                        </div>\n'
+            
             # Prompt放在最后,默认隐藏
             if step.get('prompt'):
                 html += f'                        <button class="prompt-toggle-btn" onclick="togglePrompt(\'{prompt_id}\')">显示 Prompt</button>\n'

+ 0 - 702
knowledge_v2/visualization/workflow_visualization_20251205_102946.html

@@ -1,702 +0,0 @@
-<!DOCTYPE html>
-<html lang="zh-CN">
-<head>
-    <meta charset="UTF-8">
-    <meta name="viewport" content="width=device-width, initial-scale=1.0">
-    <title>知识获取工作流可视化</title>
-    <style>
-        * {
-            margin: 0;
-            padding: 0;
-            box-sizing: border-box;
-        }
-        
-        body {
-            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: #333;
-            line-height: 1.6;
-            min-height: 100vh;
-        }
-        
-        .container {
-            max-width: 1400px;
-            margin: 0 auto;
-            padding: 30px 20px;
-        }
-        
-        h1 {
-            text-align: center;
-            color: white;
-            margin-bottom: 40px;
-            font-size: 32px;
-            font-weight: 600;
-            text-shadow: 0 2px 10px rgba(0,0,0,0.2);
-            letter-spacing: 1px;
-        }
-        
-        .tabs {
-            display: flex;
-            background: white;
-            border-radius: 12px 12px 0 0;
-            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
-            overflow-x: auto;
-            padding: 5px;
-        }
-        
-        .tab {
-            padding: 16px 28px;
-            cursor: pointer;
-            border: none;
-            background: transparent;
-            color: #666;
-            font-size: 14px;
-            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
-            white-space: nowrap;
-            border-radius: 8px;
-            margin: 0 4px;
-            position: relative;
-            font-weight: 500;
-        }
-        
-        .tab:hover {
-            background: #f0f0f0;
-            color: #333;
-        }
-        
-        .tab.active {
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
-        }
-        
-        .tab-content {
-            display: none;
-            background: white;
-            padding: 40px;
-            border-radius: 0 0 12px 12px;
-            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
-            margin-bottom: 20px;
-            animation: fadeIn 0.3s ease-in;
-        }
-        
-        @keyframes fadeIn {
-            from { opacity: 0; transform: translateY(10px); }
-            to { opacity: 1; transform: translateY(0); }
-        }
-        
-        .tab-content.active {
-            display: block;
-        }
-        
-        .input-section {
-            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
-            padding: 28px;
-            border-radius: 12px;
-            margin-bottom: 35px;
-            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
-            border: 1px solid rgba(255,255,255,0.5);
-        }
-        
-        .input-section h3 {
-            color: #2c3e50;
-            margin-bottom: 20px;
-            font-size: 20px;
-            font-weight: 600;
-            display: flex;
-            align-items: center;
-            gap: 10px;
-        }
-        
-        .input-section h3::before {
-            content: '📋';
-            font-size: 24px;
-        }
-        
-        .input-item {
-            margin-bottom: 16px;
-            padding: 12px;
-            background: rgba(255,255,255,0.7);
-            border-radius: 8px;
-            transition: all 0.3s;
-        }
-        
-        .input-item:hover {
-            background: rgba(255,255,255,0.9);
-            transform: translateX(5px);
-        }
-        
-        .input-item strong {
-            color: #495057;
-            display: inline-block;
-            width: 110px;
-            font-weight: 600;
-        }
-        
-        .input-item .placeholder {
-            color: #999;
-            font-style: italic;
-        }
-        
-        .workflow {
-            position: relative;
-        }
-        
-        .workflow-step {
-            background: white;
-            border: 2px solid #e0e0e0;
-            border-radius: 12px;
-            margin-bottom: 25px;
-            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
-            overflow: hidden;
-            box-shadow: 0 2px 8px rgba(0,0,0,0.08);
-        }
-        
-        .workflow-step.active {
-            border-color: #667eea;
-            box-shadow: 0 8px 24px rgba(102, 126, 234, 0.25);
-            transform: translateY(-2px);
-        }
-        
-        .step-header {
-            padding: 20px 24px;
-            background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
-            cursor: pointer;
-            display: flex;
-            justify-content: space-between;
-            align-items: center;
-            user-select: none;
-            transition: all 0.3s;
-        }
-        
-        .step-header:hover {
-            background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%);
-        }
-        
-        .workflow-step.active .step-header {
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-        }
-        
-        .workflow-step.active .step-name {
-            color: white;
-        }
-        
-        .workflow-step.active .step-toggle {
-            color: white;
-        }
-        
-        .step-title {
-            display: flex;
-            align-items: center;
-            gap: 15px;
-        }
-        
-        .step-number {
-            display: inline-flex;
-            align-items: center;
-            justify-content: center;
-            width: 36px;
-            height: 36px;
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            border-radius: 50%;
-            font-size: 16px;
-            font-weight: bold;
-            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
-        }
-        
-        .workflow-step.active .step-number {
-            background: white;
-            color: #667eea;
-            box-shadow: 0 4px 12px rgba(255,255,255,0.3);
-        }
-        
-        .step-name {
-            font-size: 18px;
-            font-weight: 600;
-            color: #2c3e50;
-        }
-        
-        .step-toggle {
-            color: #6c757d;
-            font-size: 20px;
-            transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
-        }
-        
-        .step-toggle.expanded {
-            transform: rotate(180deg);
-        }
-        
-        .step-content {
-            padding: 0 20px;
-            max-height: 0;
-            overflow: hidden;
-            transition: max-height 0.3s ease-out, padding 0.3s;
-        }
-        
-        .step-content.expanded {
-            max-height: 5000px;
-            padding: 20px;
-        }
-        
-        .step-detail {
-            margin-bottom: 20px;
-        }
-        
-        .step-detail-label {
-            font-weight: 600;
-            color: #495057;
-            margin-bottom: 10px;
-            display: block;
-            font-size: 14px;
-            text-transform: uppercase;
-            letter-spacing: 0.5px;
-        }
-        
-        .step-detail-content {
-            background: #f8f9fa;
-            padding: 16px;
-            border-radius: 8px;
-            border-left: 4px solid #667eea;
-            font-size: 14px;
-            line-height: 1.8;
-            white-space: pre-wrap;
-            word-wrap: break-word;
-            max-height: 400px;
-            overflow-y: auto;
-            box-shadow: 0 2px 8px rgba(0,0,0,0.05);
-        }
-        
-        .json-content {
-            font-family: 'SF Mono', 'Monaco', 'Courier New', monospace;
-            background: #1e1e1e;
-            color: #d4d4d4;
-            padding: 20px;
-            border-radius: 8px;
-            overflow-x: auto;
-            border-left: 4px solid #667eea;
-            box-shadow: 0 4px 12px rgba(0,0,0,0.15);
-        }
-        
-        .prompt-toggle-btn {
-            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-            color: white;
-            border: none;
-            padding: 10px 20px;
-            border-radius: 6px;
-            cursor: pointer;
-            font-size: 13px;
-            font-weight: 500;
-            margin-top: 15px;
-            transition: all 0.3s;
-            box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
-        }
-        
-        .prompt-toggle-btn:hover {
-            transform: translateY(-2px);
-            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
-        }
-        
-        .prompt-content {
-            display: none;
-            margin-top: 15px;
-            padding: 16px;
-            background: #fff3cd;
-            border-radius: 8px;
-            border-left: 4px solid #ffc107;
-            font-size: 13px;
-            line-height: 1.8;
-            white-space: pre-wrap;
-            word-wrap: break-word;
-            max-height: 500px;
-            overflow-y: auto;
-        }
-        
-        .prompt-content.show {
-            display: block;
-            animation: slideDown 0.3s ease-out;
-        }
-        
-        @keyframes slideDown {
-            from {
-                opacity: 0;
-                max-height: 0;
-            }
-            to {
-                opacity: 1;
-                max-height: 500px;
-            }
-        }
-        
-        .output-section {
-            background: linear-gradient(135deg, #e0f2fe 0%, #bae6fd 100%);
-            padding: 28px;
-            border-radius: 12px;
-            margin-top: 35px;
-            border-left: 4px solid #0ea5e9;
-            box-shadow: 0 4px 15px rgba(14, 165, 233, 0.2);
-        }
-        
-        .output-section h3 {
-            color: #0369a1;
-            margin-bottom: 20px;
-            font-size: 20px;
-            font-weight: 600;
-            display: flex;
-            align-items: center;
-            gap: 10px;
-        }
-        
-        .output-section h3::before {
-            content: '✨';
-            font-size: 24px;
-        }
-        
-        .arrow {
-            text-align: center;
-            color: #667eea;
-            font-size: 32px;
-            margin: -15px 0;
-            position: relative;
-            z-index: 1;
-            filter: drop-shadow(0 2px 4px rgba(102, 126, 234, 0.3));
-        }
-        
-        .arrow::before {
-            content: '↓';
-        }
-        
-        @media (max-width: 768px) {
-            .container {
-                padding: 10px;
-            }
-            
-            .tab {
-                padding: 12px 15px;
-                font-size: 13px;
-            }
-            
-            .tab-content {
-                padding: 20px;
-            }
-        }
-    </style>
-</head>
-<body>
-    <div class="container">
-        <h1>知识获取工作流可视化</h1>
-        <div class="tabs" id="tabs">
-            <button class="tab active" onclick="switchTab(0)">教资查分这个信息怎么来的</button>
-        </div>
-        <div class="tab-content active" id="tab-0">
-            <div class="input-section">
-                <h3>输入信息</h3>
-                <div class="input-item"><strong>问题:</strong> 教资查分这个信息怎么来的</div>
-                <div class="input-item"><strong>帖子信息:</strong> 发帖时间:2025.11.07</div>
-                <div class="input-item"><strong>人设信息:</strong> <span class="placeholder">(无)</span></div>
-            </div>
-            <div class="workflow">
-                <div class="workflow-step" id="step-0-0">
-                    <div class="step-header" onclick="toggleStep('step-0-0')">
-                        <div class="step-title">
-                            <span class="step-number">1</span>
-                            <span class="step-name">生成查询</span>
-                        </div>
-                        <span class="step-toggle">▼</span>
-                    </div>
-                    <div class="step-content" id="content-step-0-0">
-                        <div class="step-detail">
-                            <span class="step-detail-label">生成的Query:</span>
-                            <div class="step-detail-content">用什么工具获取教资查分这个信息</div>
-                        </div>
-                    </div>
-                </div>
-                <div class="arrow"></div>
-                <div class="workflow-step" id="step-0-1">
-                    <div class="step-header" onclick="toggleStep('step-0-1')">
-                        <div class="step-title">
-                            <span class="step-number">2</span>
-                            <span class="step-name">选择工具</span>
-                        </div>
-                        <span class="step-toggle">▼</span>
-                    </div>
-                    <div class="step-content" id="content-step-0-1">
-                        <div class="step-detail">
-                            <span class="step-detail-label">工具名称:</span>
-                            <div class="step-detail-content">新红热搜词搜索</div>
-                        </div>
-                        <div class="step-detail">
-                            <span class="step-detail-label">工具调用ID:</span>
-                            <div class="step-detail-content">new_red_hot_search_words_search</div>
-                        </div>
-                        <div class="step-detail">
-                            <span class="step-detail-label">使用方法:</span>
-                            <div class="step-detail-content">输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天热度趋势曲线、声量概览及相关搜索结果,全面了解该信息的关注度和趋势。</div>
-                        </div>
-                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-0-1')">显示 Prompt</button>
-                        <div class="prompt-content" id="prompt-step-0-1"># 角色定位
-你是一个工具匹配专家,负责根据用户需求从MCP工具库中找到最合适的工具。
-
-# 核心任务
-1. 接收上游输入的需求用什么工具获取教资查分这个信息
-2. 理解需求的核心意图(用户想找什么、解决什么问题)
-3. 查询MCP工具库,匹配最相关的工具
-4. 返回工具信息或&quot;无工具&quot;
-
-# MCP工具库信息
-
-工具名:新红话题榜单
-工具调用ID:xh_newrank_hottopics
-工具介绍:提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。
-
-工具名:新红话题搜索
-工具调用ID:new_red_TopicSearch
-工具介绍:提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。
-
-工具名:新红热搜词榜单
-工具调用ID:xh_newrank_hotwords
-工具介绍:提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。
-
-工具名:新红热搜词搜索
-工具调用ID:new_red_hot_search_words_search
-工具介绍:提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。
-
-# 匹配规则
-
-## 匹配逻辑
-1. **需求本质识别**:理解需求背后的真实意图
-   - 示例:&quot;谐音梗这个选题灵感怎么来的&quot; → 真实意图是&quot;寻找热门选题的来源/依据&quot;
-   - 不关注具体关键词(如&quot;谐音梗&quot;),而关注用户想解决什么问题
-2. **需求类型分类**:判断需求属于哪种类型
-   - 寻找灵感/选题来源 → 需要热搜词/榜单类工具
-   - 分析特定词的热度/趋势 → 需要趋势分析类工具
-   - 寻找内容案例/参考 → 需要内容搜索/爬取类工具
-   - 生成创意内容 → 需要大模型/AI生成类工具
-3. **工具能力匹配**:根据需求类型,对比工具的核心能力
-   - 看工具能否解决该类型的问题(如&quot;提供热门选题&quot;)
-4. **选择最优工具**:返回能力最匹配的1个工具,无匹配则返回&quot;无工具&quot;
-
-## 匹配标准
-- 关键词匹配:需求核心词是否在工具介绍中出现或相关
-- 功能匹配:工具能力是否覆盖需求要解决的问题
-
-### 需求意图映射表
-| 需求意图关键信号 | 需求类型 | 对应工具类型 |
-|----------------|---------|------------|
-| &quot;灵感怎么来的&quot;、&quot;选题来源&quot;、&quot;找选题&quot; | 寻找选题灵感 | 热搜词榜单工具 |
-| &quot;这个词热不热&quot;、&quot;趋势如何&quot;、&quot;热度分析&quot; | 关键词趋势分析 | 热搜词搜索工具 |
-| &quot;找案例&quot;、&quot;参考内容&quot;、&quot;爆款笔记&quot; | 内容案例搜索 | 内容爬取工具 |
-
-## 无匹配判定
-当MCP工具库中没有任何工具能解决该需求时,直接返回空json对象。
-
-# 输出格式
-json格式,字段定义如下:
-&#39;&#39;&#39;json
-{
-    &quot;工具名&quot;: &quot;工具名称&quot;,
-    &quot;工具调用ID&quot;: &quot;调用ID&quot;,
-    &quot;使用方法&quot;: &quot;简要说明如何使用该工具解决用户需求&quot;
-}
-&#39;&#39;&#39;
-
-## 无匹配时
-&#39;&#39;&#39;json
-{
-
-}
-&#39;&#39;&#39;
-
-# 执行要求
-1. 只返回1个最优工具,不返回多个备选
-2. 严格按照输出格式返回结果
-3. 使用方法要具体,说明如何用该工具解决当前需求
-
-# 示例
-
-## 示例1:成功匹配
-需求输入:什么工具能找到教资查分这个灵感点?
-
-输出:
-工具名:新红热搜词搜索
-工具调用ID:new_red_hot_search_words_search
-使用方法:输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。
-{
-    &quot;工具名&quot;: &quot;新红热搜词搜索&quot;,
-    &quot;工具调用ID&quot;: &quot;工具调用ID:new_red_hot_search_words_search&quot;,
-    &quot;使用方法&quot;: &quot;输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。&quot;
-}
-
-## 示例2:无匹配
-需求输入:哪里可以找到股票实时行情数据?
-
-输出:
-{
-
-}
-
-# 上游输入的需求用什么工具获取教资查分这个信息
-{用什么工具获取教资查分这个信息}</div>
-                    </div>
-                </div>
-                <div class="arrow"></div>
-                <div class="workflow-step" id="step-0-2">
-                    <div class="step-header" onclick="toggleStep('step-0-2')">
-                        <div class="step-title">
-                            <span class="step-number">3</span>
-                            <span class="step-name">提取参数</span>
-                        </div>
-                        <span class="step-toggle">▼</span>
-                    </div>
-                    <div class="step-content" id="content-step-0-2">
-                        <div class="step-detail">
-                            <span class="step-detail-label">提取的参数:</span>
-                            <div class="step-detail-content json-content">{
-  &quot;prompt&quot;: &quot;教资查分&quot;
-}</div>
-                        </div>
-                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-0-2')">显示 Prompt</button>
-                        <div class="prompt-content" id="prompt-step-0-2">你是一个API调用专家。你的任务是根据工具的信息和用户的查询,生成正确的调用参数。
-
-查询内容:
-用什么工具获取教资查分这个信息
-
-工具信息:
-{
-    &quot;name&quot;: &quot;新红热搜词搜索&quot;,
-    &quot;description&quot;: &quot;提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。&quot;,
-    &quot;inputSchema&quot;: {
-        &quot;type&quot;: &quot;object&quot;,
-        &quot;properties&quot;: {
-            &quot;prompt&quot;: {
-                &quot;type&quot;: &quot;string&quot;,
-                &quot;description&quot;: &quot;提示词prompt,包含完整的输入信息,图片、音频等多媒体需要url表示&quot;
-            }
-        },
-        &quot;required&quot;: [
-            &quot;prompt&quot;
-        ]
-    }
-}
-
-请分析工具的参数要求,根据查询内容提取或推断出合适的参数值。
-
-输出格式:请以 JSON 格式输出参数字典,例如:
-{
-    &quot;param1&quot;: &quot;value1&quot;,
-    &quot;param2&quot;: &quot;value2&quot;
-}
-
-注意事项:
-1. 只输出参数的JSON字典,不要包含任何解释
-2. 参数名必须与工具定义中的参数名完全一致
-3. 参数值要从查询中提取或合理推断
-4. 不要添加工具定义中没有的参数
-5. 如果某个参数无法从查询中获取,使用合理的默认值或省略该参数
-
-只输出JSON,不要包含markdown标记。</div>
-                    </div>
-                </div>
-                <div class="arrow"></div>
-                <div class="workflow-step" id="step-0-3">
-                    <div class="step-header" onclick="toggleStep('step-0-3')">
-                        <div class="step-title">
-                            <span class="step-number">4</span>
-                            <span class="step-name">执行工具</span>
-                        </div>
-                        <span class="step-toggle">▼</span>
-                    </div>
-                    <div class="step-content" id="content-step-0-3">
-                        <div class="step-detail">
-                            <span class="step-detail-label">执行结果:</span>
-                            <div class="step-detail-content json-content">{
-  &quot;result&quot;: {
-    &quot;image_url&quot;: [],
-    &quot;content&quot;: &quot;## \&quot;教资查分\&quot;关键词数据表现和趋势分析\n\n### 热度值\n- 近30天热度值超过96.14%全站其他词\n- 近30天热度值超过95.86%教育领域其他词\n\n### 声量概览\n- **笔记数**: 16篇(环比增长700.00%)\n- **总热度**: 4082(环比增长408100.00%)\n- **热门天数**: 4/30天\n- **近30天热门内容领域**:\n  - 教育: 56.25%\n  - 职场: 31.25%\n  - 运动健身: 6.25%\n- **高频搭配词**: 暂无相关数据\n\n### 热度值趋势\n- **整体趋势**: 下降趋势\n- **效果分析**:\n  - TOP1下降趋势: 2025-11-07 至 2025-11-08\n  - TOP2下降趋势: 2025-11-04 至 2025-11-05\n\n### 相关搜索结果\n- 共1条搜索结果\n- 内容领域分布: 教育、职场等领域为主\n\n从数据可以看出,\&quot;教资查分\&quot;这个关键词在近期有显著的热度增长,但目前呈现下降趋势。该关键词主要与教育和职场领域相关,这符合教师资格证查询分数的实际应用场景。虽然笔记数量不多(16篇),但环比增长非常高,表明这是一个短期内突然受到关注的话题。&quot;,
-    &quot;video_url&quot;: []
-  },
-  &quot;success&quot;: true,
-  &quot;error&quot;: &quot;&quot;
-}</div>
-                        </div>
-                    </div>
-                </div>
-            </div>
-            <div class="output-section">
-                <h3>最终输出</h3>
-                <div class="step-detail-content json-content">{
-  &quot;result&quot;: {
-    &quot;image_url&quot;: [],
-    &quot;content&quot;: &quot;## \&quot;教资查分\&quot;关键词数据表现和趋势分析\n\n### 热度值\n- 近30天热度值超过96.14%全站其他词\n- 近30天热度值超过95.86%教育领域其他词\n\n### 声量概览\n- **笔记数**: 16篇(环比增长700.00%)\n- **总热度**: 4082(环比增长408100.00%)\n- **热门天数**: 4/30天\n- **近30天热门内容领域**:\n  - 教育: 56.25%\n  - 职场: 31.25%\n  - 运动健身: 6.25%\n- **高频搭配词**: 暂无相关数据\n\n### 热度值趋势\n- **整体趋势**: 下降趋势\n- **效果分析**:\n  - TOP1下降趋势: 2025-11-07 至 2025-11-08\n  - TOP2下降趋势: 2025-11-04 至 2025-11-05\n\n### 相关搜索结果\n- 共1条搜索结果\n- 内容领域分布: 教育、职场等领域为主\n\n从数据可以看出,\&quot;教资查分\&quot;这个关键词在近期有显著的热度增长,但目前呈现下降趋势。该关键词主要与教育和职场领域相关,这符合教师资格证查询分数的实际应用场景。虽然笔记数量不多(16篇),但环比增长非常高,表明这是一个短期内突然受到关注的话题。&quot;,
-    &quot;video_url&quot;: []
-  },
-  &quot;success&quot;: true,
-  &quot;error&quot;: &quot;&quot;
-}</div>
-            </div>
-        </div>
-    </div>
-    
-    <script>
-        function switchTab(index) {
-            // 隐藏所有tab内容
-            const contents = document.querySelectorAll('.tab-content');
-            contents.forEach(content => content.classList.remove('active'));
-            
-            // 移除所有tab的active状态
-            const tabs = document.querySelectorAll('.tab');
-            tabs.forEach(tab => tab.classList.remove('active'));
-            
-            // 显示选中的tab内容
-            document.getElementById('tab-' + index).classList.add('active');
-            tabs[index].classList.add('active');
-        }
-        
-        function toggleStep(stepId) {
-            const step = document.getElementById(stepId);
-            const content = document.getElementById('content-' + stepId);
-            const toggle = step.querySelector('.step-toggle');
-            
-            if (content.classList.contains('expanded')) {
-                content.classList.remove('expanded');
-                toggle.classList.remove('expanded');
-                step.classList.remove('active');
-            } else {
-                content.classList.add('expanded');
-                toggle.classList.add('expanded');
-                step.classList.add('active');
-            }
-        }
-        
-        function togglePrompt(promptId) {
-            const promptContent = document.getElementById(promptId);
-            const btn = promptContent.previousElementSibling;
-            
-            if (promptContent.classList.contains('show')) {
-                promptContent.classList.remove('show');
-                btn.textContent = '显示 Prompt';
-            } else {
-                promptContent.classList.add('show');
-                btn.textContent = '隐藏 Prompt';
-            }
-        }
-        
-        // 页面加载时高亮第一个步骤
-        window.addEventListener('load', function() {
-            const firstSteps = document.querySelectorAll('.workflow-step');
-            firstSteps.forEach((step, index) => {
-                if (index === 0 || index % (firstSteps.length / document.querySelectorAll('.tab-content').length) === 0) {
-                    step.classList.add('active');
-                    const content = step.querySelector('.step-content');
-                    const toggle = step.querySelector('.step-toggle');
-                    if (content) {
-                        content.classList.add('expanded');
-                        toggle.classList.add('expanded');
-                    }
-                }
-            });
-        });
-    </script>
-</body>
-</html>

+ 1429 - 0
knowledge_v2/visualization/workflow_visualization_20251205_144231.html

@@ -0,0 +1,1429 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>知识获取工作流可视化</title>
+    <style>
+        * {
+            margin: 0;
+            padding: 0;
+            box-sizing: border-box;
+        }
+        
+        body {
+            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', sans-serif;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: #333;
+            line-height: 1.6;
+            min-height: 100vh;
+        }
+        
+        .container {
+            max-width: 1400px;
+            margin: 0 auto;
+            padding: 30px 20px;
+        }
+        
+        h1 {
+            text-align: center;
+            color: white;
+            margin-bottom: 40px;
+            font-size: 32px;
+            font-weight: 600;
+            text-shadow: 0 2px 10px rgba(0,0,0,0.2);
+            letter-spacing: 1px;
+        }
+        
+        .tabs {
+            display: flex;
+            background: white;
+            border-radius: 12px 12px 0 0;
+            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
+            overflow-x: auto;
+            padding: 5px;
+        }
+        
+        .tab {
+            padding: 16px 28px;
+            cursor: pointer;
+            border: none;
+            background: transparent;
+            color: #666;
+            font-size: 14px;
+            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+            white-space: nowrap;
+            border-radius: 8px;
+            margin: 0 4px;
+            position: relative;
+            font-weight: 500;
+        }
+        
+        .tab:hover {
+            background: #f0f0f0;
+            color: #333;
+        }
+        
+        .tab.active {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+        }
+        
+        .tab-content {
+            display: none;
+            background: white;
+            padding: 40px;
+            border-radius: 0 0 12px 12px;
+            box-shadow: 0 4px 20px rgba(0,0,0,0.15);
+            margin-bottom: 20px;
+            animation: fadeIn 0.3s ease-in;
+        }
+        
+        @keyframes fadeIn {
+            from { opacity: 0; transform: translateY(10px); }
+            to { opacity: 1; transform: translateY(0); }
+        }
+        
+        .tab-content.active {
+            display: block;
+        }
+        
+        .input-section {
+            background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+            padding: 28px;
+            border-radius: 12px;
+            margin-bottom: 35px;
+            box-shadow: 0 4px 15px rgba(0,0,0,0.1);
+            border: 1px solid rgba(255,255,255,0.5);
+        }
+        
+        .input-section h3 {
+            color: #2c3e50;
+            margin-bottom: 20px;
+            font-size: 20px;
+            font-weight: 600;
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+        
+        .input-section h3::before {
+            content: '📋';
+            font-size: 24px;
+        }
+        
+        .input-item {
+            margin-bottom: 16px;
+            padding: 12px;
+            background: rgba(255,255,255,0.7);
+            border-radius: 8px;
+            transition: all 0.3s;
+        }
+        
+        .input-item:hover {
+            background: rgba(255,255,255,0.9);
+            transform: translateX(5px);
+        }
+        
+        .input-item strong {
+            color: #495057;
+            display: inline-block;
+            width: 110px;
+            font-weight: 600;
+        }
+        
+        .input-item .placeholder {
+            color: #999;
+            font-style: italic;
+        }
+        
+        .workflow {
+            position: relative;
+        }
+        
+        .workflow-step {
+            background: white;
+            border: 2px solid #e0e0e0;
+            border-radius: 12px;
+            margin-bottom: 25px;
+            transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+            overflow: hidden;
+            box-shadow: 0 2px 8px rgba(0,0,0,0.08);
+        }
+        
+        .workflow-step.active {
+            border-color: #667eea;
+            box-shadow: 0 8px 24px rgba(102, 126, 234, 0.25);
+            transform: translateY(-2px);
+        }
+        
+        .step-header {
+            padding: 20px 24px;
+            background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
+            cursor: pointer;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            user-select: none;
+            transition: all 0.3s;
+        }
+        
+        .step-header:hover {
+            background: linear-gradient(135deg, #e9ecef 0%, #dee2e6 100%);
+        }
+        
+        .workflow-step.active .step-header {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+        }
+        
+        .workflow-step.active .step-name {
+            color: white;
+        }
+        
+        .workflow-step.active .step-toggle {
+            color: white;
+        }
+        
+        .step-title {
+            display: flex;
+            align-items: center;
+            gap: 15px;
+        }
+        
+        .step-number {
+            display: inline-flex;
+            align-items: center;
+            justify-content: center;
+            width: 36px;
+            height: 36px;
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+            border-radius: 50%;
+            font-size: 16px;
+            font-weight: bold;
+            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
+        }
+        
+        .workflow-step.active .step-number {
+            background: white;
+            color: #667eea;
+            box-shadow: 0 4px 12px rgba(255,255,255,0.3);
+        }
+        
+        .step-name {
+            font-size: 18px;
+            font-weight: 600;
+            color: #2c3e50;
+        }
+        
+        .step-toggle {
+            color: #6c757d;
+            font-size: 20px;
+            transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+        }
+        
+        .step-toggle.expanded {
+            transform: rotate(180deg);
+        }
+        
+        .step-content {
+            padding: 0 20px;
+            max-height: 0;
+            overflow: hidden;
+            transition: max-height 0.3s ease-out, padding 0.3s;
+        }
+        
+        .step-content.expanded {
+            max-height: 5000px;
+            padding: 20px;
+        }
+        
+        .step-detail {
+            margin-bottom: 20px;
+        }
+        
+        .step-detail-label {
+            font-weight: 600;
+            color: #495057;
+            margin-bottom: 10px;
+            display: block;
+            font-size: 14px;
+            text-transform: uppercase;
+            letter-spacing: 0.5px;
+        }
+        
+        .step-detail-content {
+            background: #f8f9fa;
+            padding: 16px;
+            border-radius: 8px;
+            border-left: 4px solid #667eea;
+            font-size: 14px;
+            line-height: 1.8;
+            white-space: pre-wrap;
+            word-wrap: break-word;
+            max-height: 400px;
+            overflow-y: auto;
+            box-shadow: 0 2px 8px rgba(0,0,0,0.05);
+        }
+        
+        .json-content {
+            font-family: 'SF Mono', 'Monaco', 'Courier New', monospace;
+            background: #1e1e1e;
+            color: #d4d4d4;
+            padding: 20px;
+            border-radius: 8px;
+            overflow-x: auto;
+            border-left: 4px solid #667eea;
+            box-shadow: 0 4px 12px rgba(0,0,0,0.15);
+        }
+        
+        .prompt-toggle-btn {
+            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
+            color: white;
+            border: none;
+            padding: 10px 20px;
+            border-radius: 6px;
+            cursor: pointer;
+            font-size: 13px;
+            font-weight: 500;
+            margin-top: 15px;
+            transition: all 0.3s;
+            box-shadow: 0 2px 8px rgba(102, 126, 234, 0.3);
+        }
+        
+        .prompt-toggle-btn:hover {
+            transform: translateY(-2px);
+            box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
+        }
+        
+        .prompt-content {
+            display: none;
+            margin-top: 15px;
+            padding: 16px;
+            background: #fff3cd;
+            border-radius: 8px;
+            border-left: 4px solid #ffc107;
+            font-size: 13px;
+            line-height: 1.8;
+            white-space: pre-wrap;
+            word-wrap: break-word;
+            max-height: 500px;
+            overflow-y: auto;
+        }
+        
+        .prompt-content.show {
+            display: block;
+            animation: slideDown 0.3s ease-out;
+        }
+        
+        @keyframes slideDown {
+            from {
+                opacity: 0;
+                max-height: 0;
+            }
+            to {
+                opacity: 1;
+                max-height: 500px;
+            }
+        }
+        
+        .output-section {
+            background: linear-gradient(135deg, #e0f2fe 0%, #bae6fd 100%);
+            padding: 28px;
+            border-radius: 12px;
+            margin-top: 35px;
+            border-left: 4px solid #0ea5e9;
+            box-shadow: 0 4px 15px rgba(14, 165, 233, 0.2);
+        }
+        
+        .output-section h3 {
+            color: #0369a1;
+            margin-bottom: 20px;
+            font-size: 20px;
+            font-weight: 600;
+            display: flex;
+            align-items: center;
+            gap: 10px;
+        }
+        
+        .output-section h3::before {
+            content: '✨';
+            font-size: 24px;
+        }
+        
+        .arrow {
+            text-align: center;
+            color: #667eea;
+            font-size: 32px;
+            margin: -15px 0;
+            position: relative;
+            z-index: 1;
+            filter: drop-shadow(0 2px 4px rgba(102, 126, 234, 0.3));
+        }
+        
+        .arrow::before {
+            content: '↓';
+        }
+        
+        @media (max-width: 768px) {
+            .container {
+                padding: 10px;
+            }
+            
+            .tab {
+                padding: 12px 15px;
+                font-size: 13px;
+            }
+            
+            .tab-content {
+                padding: 20px;
+            }
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>知识获取工作流可视化</h1>
+        <div class="tabs" id="tabs">
+            <button class="tab active" onclick="switchTab(0)">教资查分这个选题点怎么来的</button>
+            <button class="tab " onclick="switchTab(1)">女儿的生日派对这个选题点怎么来的</button>
+            <button class="tab " onclick="switchTab(2)">花艺造型蛋糕这个选题点怎么来的</button>
+        </div>
+        <div class="tab-content active" id="tab-0">
+            <div class="input-section">
+                <h3>输入信息</h3>
+                <div class="input-item"><strong>问题:</strong> 教资查分这个选题点怎么来的</div>
+                <div class="input-item"><strong>帖子信息:</strong> 发帖时间:2025.11.07</div>
+                <div class="input-item"><strong>人设信息:</strong> <span class="placeholder">(无)</span></div>
+            </div>
+            <div class="workflow">
+                <div class="workflow-step" id="step-0-0">
+                    <div class="step-header" onclick="toggleStep('step-0-0')">
+                        <div class="step-title">
+                            <span class="step-number">1</span>
+                            <span class="step-name">生成查询</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-0-0">
+                        <div class="step-detail">
+                            <span class="step-detail-label">生成的Query:</span>
+                            <div class="step-detail-content">用什么工具获取 教资查分这个选题点</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-0-0')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-0-0">你是一个问题转换助手。你的任务是将用户的问题,转换一个用于搜索或调用工具的查询语句(Query)。
+
+用户问题:
+教资查分这个选题点怎么来的
+
+转换规则:
+- 提取问题中的 主体对象
+- 将问题转换成 用什么工具获取 [主体对象] query格式
+
+示例:
+用户问题: “教资查分”这个选题点怎么来的
+主体对象: “教资查分”选题点
+转换的Query: 用什么工具获取“教资查分”选题点
+
+请分析上述信息,按要求生成Query语句。
+只输出Query语句,不要包含任何解释。</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-0-1">
+                    <div class="step-header" onclick="toggleStep('step-0-1')">
+                        <div class="step-title">
+                            <span class="step-number">2</span>
+                            <span class="step-name">选择工具</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-0-1">
+                        <div class="step-detail">
+                            <span class="step-detail-label">工具名称:</span>
+                            <div class="step-detail-content">新红热搜词搜索</div>
+                        </div>
+                        <div class="step-detail">
+                            <span class="step-detail-label">工具调用ID:</span>
+                            <div class="step-detail-content">new_red_hot_search_words_search</div>
+                        </div>
+                        <div class="step-detail">
+                            <span class="step-detail-label">使用方法:</span>
+                            <div class="step-detail-content">输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、声量概览及近90天热度值趋势曲线,以评估其作为选题点的流量潜力和趋势。</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-0-1')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-0-1"># 角色定位
+你是一个工具匹配专家,负责根据用户需求从MCP工具库中找到最合适的工具。
+
+# 核心任务
+1. 接收上游传入的需求用什么工具获取 教资查分这个选题点
+2. 理解需求的核心意图(用户想找什么、解决什么问题)
+3. **判断需求内容是否在工具覆盖范围内**
+4. 查询MCP工具库,匹配最相关的工具
+5. 返回工具信息或&quot;无工具&quot;
+
+# MCP工具库信息
+
+工具名:新红话题榜单
+工具调用ID:xh_newrank_hottopics
+工具介绍:提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。
+
+工具名:新红话题搜索
+工具调用ID:new_red_TopicSearch
+工具介绍:提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。
+
+工具名:新红热搜词榜单
+工具调用ID:xh_newrank_hotwords
+工具介绍:提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。
+
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+工具介绍:提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。
+
+# 匹配规则
+
+## 匹配逻辑(按顺序执行)
+
+### 第一步:需求本质识别
+理解需求背后的真实意图:
+- 示例:&quot;谐音梗这个选题灵感怎么来的&quot; → 真实意图是&quot;寻找热门选题的来源/方法&quot;
+- 示例:&quot;女儿生日派对这个选题点怎么来的&quot; → 真实意图是&quot;寻找选题的灵感来源&quot;
+- 不关注具体关键词,而关注用户想解决什么问题
+
+### 第二步:内容适用性判断(关键!)
+用什么工具能寻找到来源方法
+**在匹配工具前,必须先判断选题内容是否在工具覆盖范围内**
+
+#### 热搜词工具适用的内容类型:
+- ✅ **大众话题**:教资查分、高考、春节、双十一等
+- ✅ **社会热点**:政策变化、明星事件、流行趋势
+- ✅ **行业热点**:美妆新品、穿搭流行、热门景点
+- ✅ **周期性事件**:节日、考试、季节性话题
+- ✅ **群体性关注**:大多数人都可能关注的话题
+
+#### 热搜词工具不适用的内容类型:
+- ❌ **个人化场景**:我的生日、女儿生日派对、我的婚礼
+- ❌ **私人事件**:家庭聚会、个人旅行、朋友聚餐
+- ❌ **特定个体**:某个具体的人、某个具体的宠物、某个具体的家庭
+- ❌ **小众话题**:极少数人关注的专业话题
+- ❌ **虚构内容**:不存在的事件、假设的场景
+
+**判断标准**:
+- 这个选题是否有可能出现在小红书热搜榜上?
+- 这个选题是否是大众普遍关注的?
+- 这个选题是否具有&quot;群体性&quot;而非&quot;个体性&quot;?
+
+**如果内容不在适用范围,直接返回&quot;无工具&quot;,不再继续匹配。**
+
+### 第三步:需求类型分类
+判断需求属于哪种类型:
+- 寻找灵感/选题来源 → 需要热搜词/榜单类工具
+- 分析特定词的热度/趋势 → 需要趋势分析类工具
+- 寻找内容案例/参考 → 需要内容搜索/爬取类工具
+- 生成创意内容 → 需要大模型/AI生成类工具
+
+### 第四步:工具能力匹配
+根据需求类型,对比工具的核心能力:
+- 工具能否解决该类型的问题(如&quot;提供热门选题&quot;)
+
+### 第五步:选择最优工具
+返回能力最匹配的1个工具,无匹配则返回&quot;无工具&quot;
+
+## 匹配标准
+- 功能匹配:工具能力是否覆盖需求要解决的问题
+
+
+## 无匹配判定
+当满足以下任一条件时,返回&quot;无工具&quot;:
+1. 需求内容不在工具覆盖范围内(如非常个人化场景)
+2. MCP工具库中没有工具能解决该需求
+3. 需求涉及的领域完全不在工具库范围
+
+# 输出格式
+json格式,字段定义如下:
+&#39;&#39;&#39;json
+{
+    &quot;工具名&quot;: &quot;工具名称&quot;,
+    &quot;工具调用ID&quot;: &quot;调用ID&quot;,
+    &quot;使用方法&quot;: &quot;简要说明如何使用该工具解决用户需求&quot;
+}
+&#39;&#39;&#39;
+
+## 无匹配时
+&#39;&#39;&#39;json
+{
+
+}
+&#39;&#39;&#39;
+
+# 执行要求
+1. **必须先执行&quot;内容适用性判断&quot;**,再进行工具匹配
+2. 只返回1个最优工具,不返回多个备选
+3. 严格按照输出格式返回结果
+4. 使用方法要具体,说明如何用该工具解决当前需求
+
+# 示例
+
+## 示例1:成功匹配
+需求输入:什么工具能找到教资查分这个灵感点?
+
+输出:
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+使用方法:输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。
+{
+    &quot;工具名&quot;: &quot;新红热搜词搜索&quot;,
+    &quot;工具调用ID&quot;: &quot;工具调用ID:new_red_hot_search_words_search&quot;,
+    &quot;使用方法&quot;: &quot;输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。&quot;
+}
+
+## 示例2:无匹配
+需求输入:哪里可以找到股票实时行情数据?
+
+输出:
+{
+
+}
+
+# 上游输入的需求用什么工具获取 教资查分这个选题点
+{用什么工具获取 教资查分这个选题点}</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-0-2">
+                    <div class="step-header" onclick="toggleStep('step-0-2')">
+                        <div class="step-title">
+                            <span class="step-number">3</span>
+                            <span class="step-name">提取参数</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-0-2">
+                        <div class="step-detail">
+                            <span class="step-detail-label">提取的参数:</span>
+                            <div class="step-detail-content json-content">{
+  &quot;prompt&quot;: &quot;输入关键词\&quot;教资查分\&quot;,获取该词在小红书的热度值、近90天热度值趋势曲线、声量概览及相关搜索结果,从而判断其作为选题点的热度和趋势,辅助选题决策。&quot;
+}</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-0-2')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-0-2">你是一个API调用专家。你的任务是根据已经选择的工具及使用方法信息生成正确的调用参数。
+
+选择的工具调用ID:
+new_red_hot_search_words_search
+选择的工具使用方法:
+输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天热度值趋势曲线、声量概览及相关搜索结果,从而判断其作为选题点的热度和趋势,辅助选题决策。
+
+所有的工具参数定义:
+{
+    &quot;name&quot;: &quot;新红热搜词搜索&quot;,
+    &quot;description&quot;: &quot;提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。&quot;,
+    &quot;inputSchema&quot;: {
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;properties&quot;: {
+            &quot;prompt&quot;: {
+                &quot;type&quot;: &quot;string&quot;,
+                &quot;description&quot;: &quot;用户使用方法,包括输入的关键词&quot;
+            }
+        },
+        &quot;required&quot;: [
+            &quot;prompt&quot;
+        ]
+    }
+}
+
+请分析工具的参数要求,根据查询内容提取或推断出合适的参数值。
+
+输出格式:请以 JSON 格式输出参数字典,例如:
+{
+    &quot;param1&quot;: &quot;value1&quot;,
+    &quot;param2&quot;: &quot;value2&quot;
+}
+
+注意事项:
+1. 只输出参数的JSON字典,不要包含任何解释
+2. 参数名必须与工具定义中的参数名完全一致
+3. 参数值要从查询中提取或合理推断
+4. 不要添加工具定义中没有的参数
+5. 如果某个参数无法从查询中获取,使用合理的默认值或省略该参数
+
+只输出JSON,不要包含markdown标记。</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-0-3">
+                    <div class="step-header" onclick="toggleStep('step-0-3')">
+                        <div class="step-title">
+                            <span class="step-number">4</span>
+                            <span class="step-name">执行工具</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-0-3">
+                        <div class="step-detail">
+                            <span class="step-detail-label">执行结果:</span>
+                            <div class="step-detail-content json-content">## &quot;教资查分&quot;关键词数据表现和趋势分析
+
+### 热度值
+- 近30天热度值超过96.14%全站其他词
+- 近30天热度值超过95.86%教育领域其他词
+
+### 声量概览
+- **笔记数**: 16篇(环比增长700.00%)
+- **总热度**: 4082(环比增长408100.00%)
+- **热门天数**: 4/30天
+- **近30天热门内容领域**:
+  - 教育: 56.25%
+  - 职场: 31.25%
+  - 运动健身: 6.25%
+- **高频搭配词**: 暂无相关数据
+
+### 热度值趋势
+- **整体趋势**: 下降趋势
+- **效果分析**:
+  - TOP1下降趋势: 2025-11-07 至 2025-11-08
+  - TOP2下降趋势: 2025-11-04 至 2025-11-05
+
+### 相关搜索结果
+- 共1条搜索结果
+- 内容领域分布: 教育、职场等领域为主
+
+从数据可以看出,&quot;教资查分&quot;这个关键词在近期有显著的热度增长,但目前呈现下降趋势。该关键词主要与教育和职场领域相关,这符合教师资格证查询分数的实际应用场景。虽然笔记数量不多(16篇),但环比增长非常高,表明这是一个短期内突然受到关注的话题。</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="output-section">
+                <h3>最终输出</h3>
+                <div class="step-detail-content json-content">## &quot;教资查分&quot;关键词数据表现和趋势分析
+
+### 热度值
+- 近30天热度值超过96.14%全站其他词
+- 近30天热度值超过95.86%教育领域其他词
+
+### 声量概览
+- **笔记数**: 16篇(环比增长700.00%)
+- **总热度**: 4082(环比增长408100.00%)
+- **热门天数**: 4/30天
+- **近30天热门内容领域**:
+  - 教育: 56.25%
+  - 职场: 31.25%
+  - 运动健身: 6.25%
+- **高频搭配词**: 暂无相关数据
+
+### 热度值趋势
+- **整体趋势**: 下降趋势
+- **效果分析**:
+  - TOP1下降趋势: 2025-11-07 至 2025-11-08
+  - TOP2下降趋势: 2025-11-04 至 2025-11-05
+
+### 相关搜索结果
+- 共1条搜索结果
+- 内容领域分布: 教育、职场等领域为主
+
+从数据可以看出,&quot;教资查分&quot;这个关键词在近期有显著的热度增长,但目前呈现下降趋势。该关键词主要与教育和职场领域相关,这符合教师资格证查询分数的实际应用场景。虽然笔记数量不多(16篇),但环比增长非常高,表明这是一个短期内突然受到关注的话题。</div>
+            </div>
+        </div>
+        <div class="tab-content " id="tab-1">
+            <div class="input-section">
+                <h3>输入信息</h3>
+                <div class="input-item"><strong>问题:</strong> 女儿的生日派对这个选题点怎么来的</div>
+                <div class="input-item"><strong>帖子信息:</strong> 发帖时间:2025-09-16</div>
+                <div class="input-item"><strong>人设信息:</strong> <span class="placeholder">(无)</span></div>
+            </div>
+            <div class="workflow">
+                <div class="workflow-step" id="step-1-0">
+                    <div class="step-header" onclick="toggleStep('step-1-0')">
+                        <div class="step-title">
+                            <span class="step-number">1</span>
+                            <span class="step-name">生成查询</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-1-0">
+                        <div class="step-detail">
+                            <span class="step-detail-label">生成的Query:</span>
+                            <div class="step-detail-content">用什么工具获取女儿的生日派对这个选题点 query</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-1-0')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-1-0">你是一个问题转换助手。你的任务是将用户的问题,转换一个用于搜索或调用工具的查询语句(Query)。
+
+用户问题:
+女儿的生日派对这个选题点怎么来的
+
+转换规则:
+- 提取问题中的 主体对象
+- 将问题转换成 用什么工具获取 [主体对象] query格式
+
+示例:
+用户问题: “教资查分”这个选题点怎么来的
+主体对象: “教资查分”选题点
+转换的Query: 用什么工具获取“教资查分”选题点
+
+请分析上述信息,按要求生成Query语句。
+只输出Query语句,不要包含任何解释。</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-1-1">
+                    <div class="step-header" onclick="toggleStep('step-1-1')">
+                        <div class="step-title">
+                            <span class="step-number">2</span>
+                            <span class="step-name">选择工具</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-1-1">
+                        <div class="step-detail">
+                            <span class="step-detail-label">选择结果:</span>
+                            <div class="step-detail-content" style="color: #dc3545; font-weight: 500;">无匹配工具</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-1-1')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-1-1"># 角色定位
+你是一个工具匹配专家,负责根据用户需求从MCP工具库中找到最合适的工具。
+
+# 核心任务
+1. 接收上游传入的需求用什么工具获取女儿的生日派对这个选题点 query
+2. 理解需求的核心意图(用户想找什么、解决什么问题)
+3. **判断需求内容是否在工具覆盖范围内**
+4. 查询MCP工具库,匹配最相关的工具
+5. 返回工具信息或&quot;无工具&quot;
+
+# MCP工具库信息
+
+工具名:新红话题榜单
+工具调用ID:xh_newrank_hottopics
+工具介绍:提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。
+
+工具名:新红话题搜索
+工具调用ID:new_red_TopicSearch
+工具介绍:提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。
+
+工具名:新红热搜词榜单
+工具调用ID:xh_newrank_hotwords
+工具介绍:提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。
+
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+工具介绍:提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。
+
+# 匹配规则
+
+## 匹配逻辑(按顺序执行)
+
+### 第一步:需求本质识别
+理解需求背后的真实意图:
+- 示例:&quot;谐音梗这个选题灵感怎么来的&quot; → 真实意图是&quot;寻找热门选题的来源/方法&quot;
+- 示例:&quot;女儿生日派对这个选题点怎么来的&quot; → 真实意图是&quot;寻找选题的灵感来源&quot;
+- 不关注具体关键词,而关注用户想解决什么问题
+
+### 第二步:内容适用性判断(关键!)
+用什么工具能寻找到来源方法
+**在匹配工具前,必须先判断选题内容是否在工具覆盖范围内**
+
+#### 热搜词工具适用的内容类型:
+- ✅ **大众话题**:教资查分、高考、春节、双十一等
+- ✅ **社会热点**:政策变化、明星事件、流行趋势
+- ✅ **行业热点**:美妆新品、穿搭流行、热门景点
+- ✅ **周期性事件**:节日、考试、季节性话题
+- ✅ **群体性关注**:大多数人都可能关注的话题
+
+#### 热搜词工具不适用的内容类型:
+- ❌ **个人化场景**:我的生日、女儿生日派对、我的婚礼
+- ❌ **私人事件**:家庭聚会、个人旅行、朋友聚餐
+- ❌ **特定个体**:某个具体的人、某个具体的宠物、某个具体的家庭
+- ❌ **小众话题**:极少数人关注的专业话题
+- ❌ **虚构内容**:不存在的事件、假设的场景
+
+**判断标准**:
+- 这个选题是否有可能出现在小红书热搜榜上?
+- 这个选题是否是大众普遍关注的?
+- 这个选题是否具有&quot;群体性&quot;而非&quot;个体性&quot;?
+
+**如果内容不在适用范围,直接返回&quot;无工具&quot;,不再继续匹配。**
+
+### 第三步:需求类型分类
+判断需求属于哪种类型:
+- 寻找灵感/选题来源 → 需要热搜词/榜单类工具
+- 分析特定词的热度/趋势 → 需要趋势分析类工具
+- 寻找内容案例/参考 → 需要内容搜索/爬取类工具
+- 生成创意内容 → 需要大模型/AI生成类工具
+
+### 第四步:工具能力匹配
+根据需求类型,对比工具的核心能力:
+- 工具能否解决该类型的问题(如&quot;提供热门选题&quot;)
+
+### 第五步:选择最优工具
+返回能力最匹配的1个工具,无匹配则返回&quot;无工具&quot;
+
+## 匹配标准
+- 功能匹配:工具能力是否覆盖需求要解决的问题
+
+
+## 无匹配判定
+当满足以下任一条件时,返回&quot;无工具&quot;:
+1. 需求内容不在工具覆盖范围内(如非常个人化场景)
+2. MCP工具库中没有工具能解决该需求
+3. 需求涉及的领域完全不在工具库范围
+
+# 输出格式
+json格式,字段定义如下:
+&#39;&#39;&#39;json
+{
+    &quot;工具名&quot;: &quot;工具名称&quot;,
+    &quot;工具调用ID&quot;: &quot;调用ID&quot;,
+    &quot;使用方法&quot;: &quot;简要说明如何使用该工具解决用户需求&quot;
+}
+&#39;&#39;&#39;
+
+## 无匹配时
+&#39;&#39;&#39;json
+{
+
+}
+&#39;&#39;&#39;
+
+# 执行要求
+1. **必须先执行&quot;内容适用性判断&quot;**,再进行工具匹配
+2. 只返回1个最优工具,不返回多个备选
+3. 严格按照输出格式返回结果
+4. 使用方法要具体,说明如何用该工具解决当前需求
+
+# 示例
+
+## 示例1:成功匹配
+需求输入:什么工具能找到教资查分这个灵感点?
+
+输出:
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+使用方法:输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。
+{
+    &quot;工具名&quot;: &quot;新红热搜词搜索&quot;,
+    &quot;工具调用ID&quot;: &quot;工具调用ID:new_red_hot_search_words_search&quot;,
+    &quot;使用方法&quot;: &quot;输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。&quot;
+}
+
+## 示例2:无匹配
+需求输入:哪里可以找到股票实时行情数据?
+
+输出:
+{
+
+}
+
+# 上游输入的需求用什么工具获取女儿的生日派对这个选题点 query
+{用什么工具获取女儿的生日派对这个选题点 query}</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-1-2">
+                    <div class="step-header" onclick="toggleStep('step-1-2')">
+                        <div class="step-title">
+                            <span class="step-number">3</span>
+                            <span class="step-name">LLM搜索</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-1-2">
+                        <div class="step-detail">
+                            <span class="step-detail-label">搜索结果:</span>
+                            <div style="margin-bottom: 15px; padding: 12px; background: #f0f8ff; border-radius: 6px; border-left: 3px solid #4a90e2;">
+                                <div style="font-weight: 600; color: #2c3e50; margin-bottom: 8px;">查询 1: 用什么工具获取女儿的生日派对这个选题点 query</div>
+                                <div style="color: #555; line-height: 1.6; white-space: pre-wrap;">根据搜索结果,要围绕“女儿的生日派对”这个选题点进行内容创作或策划,可以使用以下几类工具和方法来获取灵感、信息和执行方案:
+
+**1. 灵感与创意获取工具:**
+*   **社交媒体平台:** 如小红书、Instagram、Pinterest(需科学上网)等。这些平台上有大量用户分享的真实派对照片、视频和经验贴,是获取最新流行主题(如独角兽、小黄鸭、公主风等)、布置创意和DIY点子的绝佳来源。
+*   **视频平台:** 如YouTube、Bilibili。可以搜索“低成本生日派对”、“XX岁女孩生日派对”等关键词,观看详细的策划和布置过程视频,非常直观且具有可操作性。
+
+**2. 实用策划与执行工具:**
+*   **在线邀请函制作工具:** 如Canva、金数据、腾讯问卷等。可以轻松创建精美的电子邀请函,并附带RSVP(请回复)功能,方便统计人数。
+*   **清单与项目管理工具:** 如滴答清单(TickTick)、微软To Do、甚至简单的Excel表格。用于制定详细的待办事项清单,包括预算、采购清单、时间安排等,确保不遗漏任何环节。
+*   **本地生活服务平台:** 如大众点评、美团。用于搜索和预订附近的亲子餐厅、室内游乐场、派对策划公司、蛋糕房等服务。
+
+**3. 信息查询与学习工具:**
+*   **搜索引擎:** 直接使用百度、谷歌等搜索引擎,输入具体的疑问,例如“4岁女孩生日派对游戏”、“低预算生日派对食物”、“生日派对注意事项”等,可以找到大量博客文章、论坛讨论(如知乎、Reddit)和专业指南,了解不同年龄段孩子的派对要点、避坑指南和花费参考。
+
+总而言之,将**社交媒体/视频平台**作为灵感库,用**在线工具**处理邀请和规划,并通过**搜索引擎**解决具体问题,就能高效地完成“女儿生日派对”的选题策划。</div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-1-3">
+                    <div class="step-header" onclick="toggleStep('step-1-3')">
+                        <div class="step-title">
+                            <span class="step-number">4</span>
+                            <span class="step-name">多渠道搜索结果整合</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-1-3">
+                        <div class="step-detail">
+                            <span class="step-detail-label">来源统计:</span>
+                            <div class="step-detail-content">总来源数: 1, 有效来源数: 1</div>
+                        </div>
+                        <div class="step-detail">
+                            <span class="step-detail-label">整合结果:</span>
+                            <div class="step-detail-content">女儿的生日派对这一选题点,可以通过以下工具和方法进行灵感获取、信息查询及策划执行,从而使内容或派对本身得以具体化和完善:
+
+### 1. 灵感与创意获取
+
+*   **社交媒体平台:** 小红书、Instagram、Pinterest等平台汇集了大量用户分享的派对照片、视频和经验贴,是发现最新流行主题(如独角兽、小黄鸭、公主风)、布置创意和DIY点子的宝库。
+*   **视频平台:** YouTube、Bilibili等平台可搜索“低成本生日派对”、“XX岁女孩生日派对”等关键词,通过观看详细的策划和布置过程视频,获取直观且可操作的灵感。
+
+### 2. 实用策划与执行
+
+*   **在线邀请函制作工具:** Canva、金数据、腾讯问卷等工具可用于轻松创建精美的电子邀请函,并支持RSVP(请回复)功能,便于统计派对人数。
+*   **清单与项目管理工具:** 滴答清单(TickTick)、微软To Do或Excel表格等,有助于制定详细的待办事项清单,包括预算、采购清单和时间安排,确保派对筹备不遗漏任何环节。
+*   **本地生活服务平台:** 大众点评、美团等平台可用于搜索和预订附近的亲子餐厅、室内游乐场、派对策划公司、蛋糕房等服务。
+
+### 3. 信息查询与学习
+
+*   **搜索引擎:** 百度、谷歌等搜索引擎是解答具体疑问的强大工具。输入“4岁女孩生日派对游戏”、“低预算生日派对食物”、“生日派对注意事项”等关键词,可以找到大量博客文章、论坛讨论(如知乎、Reddit)和专业指南,了解不同年龄段孩子派对的要点、避坑指南及花费参考。
+
+总而言之,通过将社交媒体/视频平台作为灵感来源,利用在线工具进行邀请和规划,并通过搜索引擎解决具体问题,可以高效地展开和完善“女儿生日派对”这个选题点。</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-1-3')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-1-3">你是一个知识整合专家。你的任务是根据用户的问题,将来自不同渠道(如LLM搜索、小红书搜索等)的知识文本进行整合,生成一份全面、准确、逻辑清晰的回答。
+
+用户问题:
+女儿的生日派对这个选题点怎么来的||发帖时间:2025-09-16||
+
+以下是来自不同渠道的知识文本:
+【来源:LLM Search】
+根据搜索结果,要围绕“女儿的生日派对”这个选题点进行内容创作或策划,可以使用以下几类工具和方法来获取灵感、信息和执行方案:
+
+**1. 灵感与创意获取工具:**
+*   **社交媒体平台:** 如小红书、Instagram、Pinterest(需科学上网)等。这些平台上有大量用户分享的真实派对照片、视频和经验贴,是获取最新流行主题(如独角兽、小黄鸭、公主风等)、布置创意和DIY点子的绝佳来源。
+*   **视频平台:** 如YouTube、Bilibili。可以搜索“低成本生日派对”、“XX岁女孩生日派对”等关键词,观看详细的策划和布置过程视频,非常直观且具有可操作性。
+
+**2. 实用策划与执行工具:**
+*   **在线邀请函制作工具:** 如Canva、金数据、腾讯问卷等。可以轻松创建精美的电子邀请函,并附带RSVP(请回复)功能,方便统计人数。
+*   **清单与项目管理工具:** 如滴答清单(TickTick)、微软To Do、甚至简单的Excel表格。用于制定详细的待办事项清单,包括预算、采购清单、时间安排等,确保不遗漏任何环节。
+*   **本地生活服务平台:** 如大众点评、美团。用于搜索和预订附近的亲子餐厅、室内游乐场、派对策划公司、蛋糕房等服务。
+
+**3. 信息查询与学习工具:**
+*   **搜索引擎:** 直接使用百度、谷歌等搜索引擎,输入具体的疑问,例如“4岁女孩生日派对游戏”、“低预算生日派对食物”、“生日派对注意事项”等,可以找到大量博客文章、论坛讨论(如知乎、Reddit)和专业指南,了解不同年龄段孩子的派对要点、避坑指南和花费参考。
+
+总而言之,将**社交媒体/视频平台**作为灵感库,用**在线工具**处理邀请和规划,并通过**搜索引擎**解决具体问题,就能高效地完成“女儿生日派对”的选题策划。
+
+
+
+请遵循以下原则进行整合:
+1. **全面性**:涵盖所有渠道提供的关键信息,不要遗漏重要细节。
+2. **准确性**:如果不同渠道的信息存在冲突,请尝试分析原因并给出最合理的解释,或者同时呈现不同的观点并说明来源。
+3. **逻辑性**:将信息组织成结构清晰的文章,使用恰当的标题、列表和段落。
+4. **可读性**:语言通顺流畅,易于理解。
+5. **去重**:去除重复的信息。
+
+请直接输出整合后的知识文本,不要包含任何解释性的话语。</div>
+                    </div>
+                </div>
+            </div>
+        </div>
+        <div class="tab-content " id="tab-2">
+            <div class="input-section">
+                <h3>输入信息</h3>
+                <div class="input-item"><strong>问题:</strong> 花艺造型蛋糕这个选题点怎么来的</div>
+                <div class="input-item"><strong>帖子信息:</strong> 发帖时间:2025-09-16</div>
+                <div class="input-item"><strong>人设信息:</strong> <span class="placeholder">(无)</span></div>
+            </div>
+            <div class="workflow">
+                <div class="workflow-step" id="step-2-0">
+                    <div class="step-header" onclick="toggleStep('step-2-0')">
+                        <div class="step-title">
+                            <span class="step-number">1</span>
+                            <span class="step-name">生成查询</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-2-0">
+                        <div class="step-detail">
+                            <span class="step-detail-label">生成的Query:</span>
+                            <div class="step-detail-content">用什么工具获取花艺造型蛋糕这个选题点</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-2-0')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-2-0">你是一个问题转换助手。你的任务是将用户的问题,转换一个用于搜索或调用工具的查询语句(Query)。
+
+用户问题:
+花艺造型蛋糕这个选题点怎么来的
+
+转换规则:
+- 提取问题中的 主体对象
+- 将问题转换成 用什么工具获取 [主体对象] query格式
+
+示例:
+用户问题: “教资查分”这个选题点怎么来的
+主体对象: “教资查分”选题点
+转换的Query: 用什么工具获取“教资查分”选题点
+
+请分析上述信息,按要求生成Query语句。
+只输出Query语句,不要包含任何解释。</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-2-1">
+                    <div class="step-header" onclick="toggleStep('step-2-1')">
+                        <div class="step-title">
+                            <span class="step-number">2</span>
+                            <span class="step-name">选择工具</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-2-1">
+                        <div class="step-detail">
+                            <span class="step-detail-label">工具名称:</span>
+                            <div class="step-detail-content">新红热搜词搜索</div>
+                        </div>
+                        <div class="step-detail">
+                            <span class="step-detail-label">工具调用ID:</span>
+                            <div class="step-detail-content">new_red_hot_search_words_search</div>
+                        </div>
+                        <div class="step-detail">
+                            <span class="step-detail-label">使用方法:</span>
+                            <div class="step-detail-content">输入关键词&quot;花艺造型蛋糕&quot;,获取该词在小红书的热度值、近90天趋势曲线、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词),以此评估其作为选题点的潜力与创作方向。</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-2-1')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-2-1"># 角色定位
+你是一个工具匹配专家,负责根据用户需求从MCP工具库中找到最合适的工具。
+
+# 核心任务
+1. 接收上游传入的需求用什么工具获取花艺造型蛋糕这个选题点
+2. 理解需求的核心意图(用户想找什么、解决什么问题)
+3. **判断需求内容是否在工具覆盖范围内**
+4. 查询MCP工具库,匹配最相关的工具
+5. 返回工具信息或&quot;无工具&quot;
+
+# MCP工具库信息
+
+工具名:新红话题榜单
+工具调用ID:xh_newrank_hottopics
+工具介绍:提供小红书平台热门话题全景榜单数据,覆盖排名、话题名称及核心简介、参与人数增量、浏览量增量、笔记增量、互动增量(点赞 / 收藏 / 评论综合统计)等核心维度。支持精准筛选与高效应用。话题类型涵盖美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直领域,统计时间可选择日榜(近 7 天)、周榜(近 4 周)、月榜(近 5 个月),满足不同周期的热点追踪需求。榜单数据实时更新,同步呈现官方流量扶持话题标识,助力品牌、达人快速锁定高曝光赛道;便于拆解爆款逻辑、制定内容选题策略,提升运营效率。
+
+工具名:新红话题搜索
+工具调用ID:new_red_TopicSearch
+工具介绍:提供小红书平台话题精准检索服务,输入关键词即可匹配相关话题完整列表,核心数据包含话题名称及简介、总浏览量、总参与人数、近 30 天笔记增量、近 30 天互动增量。支持按参与人数、浏览量等指标排序筛选,可精准定位品牌发起话题或官方扶持话题,清晰展示话题流量趋势与内容创作方向。无论是达人寻找高适配性话题蹭流,还是品牌监测竞品话题布局,均能通过数据支撑快速决策,降低内容试错成本。
+
+工具名:新红热搜词榜单
+工具调用ID:xh_newrank_hotwords
+工具介绍:提供小红书平台热搜词权威榜单数据,核心维度包括实时排名、热搜词、主要覆盖内容领域、相关笔记总量、爆文数(高互动笔记占比)、热度值(综合搜索量与互动率计算)。支持按统计时间(日榜 / 周榜 / 月榜)及 美妆,美容个护,鞋包潮玩,穿搭打扮,美食,母婴育儿,旅游出行,家居家装,教育,生活,运动健身,兴趣爱好,影视综,婚嫁,摄影摄像,萌宠,情感星座,科技互联网,资讯,健康养生,科学科普,职场,交通工具,其他 24 个垂直内容领域筛选。榜单每日更新,助力用户第一时间捕捉流量风口。可直接应用于选题规划、竞品投放策略分析。
+
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+工具介绍:提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。
+
+# 匹配规则
+
+## 匹配逻辑(按顺序执行)
+
+### 第一步:需求本质识别
+理解需求背后的真实意图:
+- 示例:&quot;谐音梗这个选题灵感怎么来的&quot; → 真实意图是&quot;寻找热门选题的来源/方法&quot;
+- 示例:&quot;女儿生日派对这个选题点怎么来的&quot; → 真实意图是&quot;寻找选题的灵感来源&quot;
+- 不关注具体关键词,而关注用户想解决什么问题
+
+### 第二步:内容适用性判断(关键!)
+用什么工具能寻找到来源方法
+**在匹配工具前,必须先判断选题内容是否在工具覆盖范围内**
+
+#### 热搜词工具适用的内容类型:
+- ✅ **大众话题**:教资查分、高考、春节、双十一等
+- ✅ **社会热点**:政策变化、明星事件、流行趋势
+- ✅ **行业热点**:美妆新品、穿搭流行、热门景点
+- ✅ **周期性事件**:节日、考试、季节性话题
+- ✅ **群体性关注**:大多数人都可能关注的话题
+
+#### 热搜词工具不适用的内容类型:
+- ❌ **个人化场景**:我的生日、女儿生日派对、我的婚礼
+- ❌ **私人事件**:家庭聚会、个人旅行、朋友聚餐
+- ❌ **特定个体**:某个具体的人、某个具体的宠物、某个具体的家庭
+- ❌ **小众话题**:极少数人关注的专业话题
+- ❌ **虚构内容**:不存在的事件、假设的场景
+
+**判断标准**:
+- 这个选题是否有可能出现在小红书热搜榜上?
+- 这个选题是否是大众普遍关注的?
+- 这个选题是否具有&quot;群体性&quot;而非&quot;个体性&quot;?
+
+**如果内容不在适用范围,直接返回&quot;无工具&quot;,不再继续匹配。**
+
+### 第三步:需求类型分类
+判断需求属于哪种类型:
+- 寻找灵感/选题来源 → 需要热搜词/榜单类工具
+- 分析特定词的热度/趋势 → 需要趋势分析类工具
+- 寻找内容案例/参考 → 需要内容搜索/爬取类工具
+- 生成创意内容 → 需要大模型/AI生成类工具
+
+### 第四步:工具能力匹配
+根据需求类型,对比工具的核心能力:
+- 工具能否解决该类型的问题(如&quot;提供热门选题&quot;)
+
+### 第五步:选择最优工具
+返回能力最匹配的1个工具,无匹配则返回&quot;无工具&quot;
+
+## 匹配标准
+- 功能匹配:工具能力是否覆盖需求要解决的问题
+
+
+## 无匹配判定
+当满足以下任一条件时,返回&quot;无工具&quot;:
+1. 需求内容不在工具覆盖范围内(如非常个人化场景)
+2. MCP工具库中没有工具能解决该需求
+3. 需求涉及的领域完全不在工具库范围
+
+# 输出格式
+json格式,字段定义如下:
+&#39;&#39;&#39;json
+{
+    &quot;工具名&quot;: &quot;工具名称&quot;,
+    &quot;工具调用ID&quot;: &quot;调用ID&quot;,
+    &quot;使用方法&quot;: &quot;简要说明如何使用该工具解决用户需求&quot;
+}
+&#39;&#39;&#39;
+
+## 无匹配时
+&#39;&#39;&#39;json
+{
+
+}
+&#39;&#39;&#39;
+
+# 执行要求
+1. **必须先执行&quot;内容适用性判断&quot;**,再进行工具匹配
+2. 只返回1个最优工具,不返回多个备选
+3. 严格按照输出格式返回结果
+4. 使用方法要具体,说明如何用该工具解决当前需求
+
+# 示例
+
+## 示例1:成功匹配
+需求输入:什么工具能找到教资查分这个灵感点?
+
+输出:
+工具名:新红热搜词搜索
+工具调用ID:new_red_hot_search_words_search
+使用方法:输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。
+{
+    &quot;工具名&quot;: &quot;新红热搜词搜索&quot;,
+    &quot;工具调用ID&quot;: &quot;工具调用ID:new_red_hot_search_words_search&quot;,
+    &quot;使用方法&quot;: &quot;输入关键词&quot;教资查分&quot;,获取该词在小红书的热度值、近90天趋势曲线、相关笔记数据,判断是否为热门选题点。&quot;
+}
+
+## 示例2:无匹配
+需求输入:哪里可以找到股票实时行情数据?
+
+输出:
+{
+
+}
+
+# 上游输入的需求用什么工具获取花艺造型蛋糕这个选题点
+{用什么工具获取花艺造型蛋糕这个选题点}</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-2-2">
+                    <div class="step-header" onclick="toggleStep('step-2-2')">
+                        <div class="step-title">
+                            <span class="step-number">3</span>
+                            <span class="step-name">提取参数</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-2-2">
+                        <div class="step-detail">
+                            <span class="step-detail-label">提取的参数:</span>
+                            <div class="step-detail-content json-content">{
+  &quot;prompt&quot;: &quot;输入关键词\&quot;花艺造型蛋糕\&quot;,获取该词在小红书的热度值、近90天趋势曲线、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词),以此评估其作为选题点的潜力与创作方向。&quot;
+}</div>
+                        </div>
+                        <button class="prompt-toggle-btn" onclick="togglePrompt('prompt-step-2-2')">显示 Prompt</button>
+                        <div class="prompt-content" id="prompt-step-2-2">你是一个API调用专家。你的任务是根据已经选择的工具及使用方法信息生成正确的调用参数。
+
+选择的工具调用ID:
+new_red_hot_search_words_search
+选择的工具使用方法:
+输入关键词&quot;花艺造型蛋糕&quot;,获取该词在小红书的热度值、近90天趋势曲线、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词),以此评估其作为选题点的潜力与创作方向。
+
+所有的工具参数定义:
+{
+    &quot;name&quot;: &quot;新红热搜词搜索&quot;,
+    &quot;description&quot;: &quot;提供小红书热搜词深度检索与趋势分析服务,输入关键词即可获取全维度数据表现:核心包含热度值(实时动态更新)、声量概览(笔记数、总热度、热门天数、热门内容领域、高频搭配词)、近 90 天热度值趋势曲线(支持自定义时间区间)、相关搜索结果。可直观呈现关键词种草趋势、流量峰值时段、高转化内容特征,帮助用户优化笔记标题关键词布局、预判话题生命周期。&quot;,
+    &quot;inputSchema&quot;: {
+        &quot;type&quot;: &quot;object&quot;,
+        &quot;properties&quot;: {
+            &quot;prompt&quot;: {
+                &quot;type&quot;: &quot;string&quot;,
+                &quot;description&quot;: &quot;用户使用方法,包括输入的关键词&quot;
+            }
+        },
+        &quot;required&quot;: [
+            &quot;prompt&quot;
+        ]
+    }
+}
+
+请分析工具的参数要求,根据查询内容提取或推断出合适的参数值。
+
+输出格式:请以 JSON 格式输出参数字典,例如:
+{
+    &quot;param1&quot;: &quot;value1&quot;,
+    &quot;param2&quot;: &quot;value2&quot;
+}
+
+注意事项:
+1. 只输出参数的JSON字典,不要包含任何解释
+2. 参数名必须与工具定义中的参数名完全一致
+3. 参数值要从查询中提取或合理推断
+4. 不要添加工具定义中没有的参数
+5. 如果某个参数无法从查询中获取,使用合理的默认值或省略该参数
+
+只输出JSON,不要包含markdown标记。</div>
+                    </div>
+                </div>
+                <div class="arrow"></div>
+                <div class="workflow-step" id="step-2-3">
+                    <div class="step-header" onclick="toggleStep('step-2-3')">
+                        <div class="step-title">
+                            <span class="step-number">4</span>
+                            <span class="step-name">执行工具</span>
+                        </div>
+                        <span class="step-toggle">▼</span>
+                    </div>
+                    <div class="step-content" id="content-step-2-3">
+                        <div class="step-detail">
+                            <span class="step-detail-label">执行结果:</span>
+                            <div class="step-detail-content json-content">## &quot;花艺造型蛋糕&quot;关键词数据分析结果
+
+**关键词**: 花艺造型蛋糕
+
+**平台**: 小红书
+
+**主要发现**:
+1. **热度值**: 该关键词未达到小红书热搜榜单的门槛,无法获取具体的热度值数据
+2. **趋势曲线**: 由于未上榜,近90天的趋势曲线数据不可用
+3. **声量概览**:
+   - 笔记数: 数据不可用(未达到展示门槛)
+   - 总热度: 数据不可用(未达到展示门槛)
+   - 热门天数: 数据不可用(未达到展示门槛)
+   - 热门内容领域: 数据不可用(未达到展示门槛)
+   - 高频搭配词: 数据不可用(未达到展示门槛)
+
+**选题潜力评估**:
+- **热度水平**: 较低。该关键词在小红书平台上的讨论度和关注度不足以进入热搜榜单
+- **创作方向建议**:
+  1. 考虑使用更热门的相关关键词,如&quot;蛋糕&quot;、&quot;花艺&quot;、&quot;甜品&quot;等单独词汇
+  2. 或者尝试组合其他热门元素,如&quot;ins风花艺蛋糕&quot;、&quot;网红花艺蛋糕&quot;等
+  3. 可以关注页面推荐的热门热搜词,如&quot;美食VLOG&quot;、&quot;美食制作&quot;等,将花艺蛋糕内容融入这些热门话题中
+
+**建议**:
+由于&quot;花艺造型蛋糕&quot;关键词热度较低,建议调整选题策略:
+1. 扩大关键词范围,使用更通用的词汇
+2. 关注相关但更热门的话题标签
+3. 结合当前热门趋势(如页面显示的&quot;美食VLOG&quot;、&quot;美食制作&quot;等)来包装花艺蛋糕内容
+
+这个结果表明,虽然花艺造型蛋糕可能是一个有创意的内容方向,但在小红书平台上目前的热度不足以支撑作为独立的热门选题点.</div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+            <div class="output-section">
+                <h3>最终输出</h3>
+                <div class="step-detail-content json-content">## &quot;花艺造型蛋糕&quot;关键词数据分析结果
+
+**关键词**: 花艺造型蛋糕
+
+**平台**: 小红书
+
+**主要发现**:
+1. **热度值**: 该关键词未达到小红书热搜榜单的门槛,无法获取具体的热度值数据
+2. **趋势曲线**: 由于未上榜,近90天的趋势曲线数据不可用
+3. **声量概览**:
+   - 笔记数: 数据不可用(未达到展示门槛)
+   - 总热度: 数据不可用(未达到展示门槛)
+   - 热门天数: 数据不可用(未达到展示门槛)
+   - 热门内容领域: 数据不可用(未达到展示门槛)
+   - 高频搭配词: 数据不可用(未达到展示门槛)
+
+**选题潜力评估**:
+- **热度水平**: 较低。该关键词在小红书平台上的讨论度和关注度不足以进入热搜榜单
+- **创作方向建议**:
+  1. 考虑使用更热门的相关关键词,如&quot;蛋糕&quot;、&quot;花艺&quot;、&quot;甜品&quot;等单独词汇
+  2. 或者尝试组合其他热门元素,如&quot;ins风花艺蛋糕&quot;、&quot;网红花艺蛋糕&quot;等
+  3. 可以关注页面推荐的热门热搜词,如&quot;美食VLOG&quot;、&quot;美食制作&quot;等,将花艺蛋糕内容融入这些热门话题中
+
+**建议**:
+由于&quot;花艺造型蛋糕&quot;关键词热度较低,建议调整选题策略:
+1. 扩大关键词范围,使用更通用的词汇
+2. 关注相关但更热门的话题标签
+3. 结合当前热门趋势(如页面显示的&quot;美食VLOG&quot;、&quot;美食制作&quot;等)来包装花艺蛋糕内容
+
+这个结果表明,虽然花艺造型蛋糕可能是一个有创意的内容方向,但在小红书平台上目前的热度不足以支撑作为独立的热门选题点.</div>
+            </div>
+        </div>
+    </div>
+    
+    <script>
+        function switchTab(index) {
+            // 隐藏所有tab内容
+            const contents = document.querySelectorAll('.tab-content');
+            contents.forEach(content => content.classList.remove('active'));
+            
+            // 移除所有tab的active状态
+            const tabs = document.querySelectorAll('.tab');
+            tabs.forEach(tab => tab.classList.remove('active'));
+            
+            // 显示选中的tab内容
+            document.getElementById('tab-' + index).classList.add('active');
+            tabs[index].classList.add('active');
+        }
+        
+        function toggleStep(stepId) {
+            const step = document.getElementById(stepId);
+            const content = document.getElementById('content-' + stepId);
+            const toggle = step.querySelector('.step-toggle');
+            
+            if (content.classList.contains('expanded')) {
+                content.classList.remove('expanded');
+                toggle.classList.remove('expanded');
+                step.classList.remove('active');
+            } else {
+                content.classList.add('expanded');
+                toggle.classList.add('expanded');
+                step.classList.add('active');
+            }
+        }
+        
+        function togglePrompt(promptId) {
+            const promptContent = document.getElementById(promptId);
+            const btn = promptContent.previousElementSibling;
+            
+            if (promptContent.classList.contains('show')) {
+                promptContent.classList.remove('show');
+                btn.textContent = '显示 Prompt';
+            } else {
+                promptContent.classList.add('show');
+                btn.textContent = '隐藏 Prompt';
+            }
+        }
+        
+        // 页面加载时高亮第一个步骤
+        window.addEventListener('load', function() {
+            const firstSteps = document.querySelectorAll('.workflow-step');
+            firstSteps.forEach((step, index) => {
+                if (index === 0 || index % (firstSteps.length / document.querySelectorAll('.tab-content').length) === 0) {
+                    step.classList.add('active');
+                    const content = step.querySelector('.step-content');
+                    const toggle = step.querySelector('.step-toggle');
+                    if (content) {
+                        content.classList.add('expanded');
+                        toggle.classList.add('expanded');
+                    }
+                }
+            });
+        });
+    </script>
+</body>
+</html>