Skill: thincher/minimax-understand-image (version 1.0.3)

--- name: minimax-understand-image description: 使用 MiniMax MCP 进行图像理解和分析。触发条件：(1) 用户要求分析图片、理解图像、描述图片内容 (2) 需要识别图片中的物体、文字、场景 (3) 使用 MiniMax 的 understand_image 功能 --- # minimax-understand-image 使用 MiniMax MCP 服务器进行图像理解和分析。 ## 执行流程（首次需要安装，后续直接步骤4调用） ### 步骤 1: 检查并安装依赖 #### 1.1 检查 uvx 是否可用 ```bash which uvx ``` 如果不存在，安装 uv： **方法 1: 使用官方安装脚本（推荐）** ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` **方法 2: 使用国内镜像加速（如果官方脚本下载失败）** 临时使用清华镜像源安装： ```bash export UV_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple" curl -LsSf https://astral.sh/uv/install.sh | sh ``` 或者临时使用阿里云镜像源： ```bash export UV_INDEX_URL="https://mirrors.aliyun.com/pypi/simple/" curl -LsSf https://astral.sh/uv/install.sh | sh ``` #### 1.2 检查 MCP 服务器是否已安装 ```bash uvx minimax-coding-plan-mcp --help ``` 执行命令判断是否MCP服务器已安装， 如果安装了跳到步骤 2。 #### 1.3 安装 MCP 服务器（如果未安装） **方法 1: 使用默认源安装** ```bash uvx install minimax-coding-plan-mcp ``` **方法 2: 使用国内镜像加速（如果默认源下载失败）** 临时使用清华镜像源： ```bash export UV_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple" uvx install minimax-coding-plan-mcp ``` 或者临时使用阿里云镜像源： ```bash export UV_INDEX_URL="https://mirrors.aliyun.com/pypi/simple/" uvx install minimax-coding-plan-mcp ``` ### 步骤 2: 检查 API Key 配置 ```bash cat ~/.openclaw/config/minimax.json 2>/dev/null | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('api_key', ''))" ``` 如果返回非空的 API Key，跳到步骤 4。 ### 步骤 3: 配置 API Key（如果未配置） #### 3.1 尝试从 ~/.openclaw/agents/main/agent/auth-profiles.json 中的配置文件中获取 根据返回的判断： - 名称包含 "minimax" 或 "MiniMax" 找到匹配的 Key 后，询问用户确认是否使用。 #### 3.2 如果没有找到 Key，向用户索要 直接询问用户提供 MiniMax API Key。 如果未购买MiniMax，购买地址为: https://platform.minimaxi.com/subscribe/coding-plan?code=GjuAjhGKqQ&source=link #### 3.3 保存 API Key ```bash mkdir -p ~/.openclaw/config cat > ~/.openclaw/config/minimax.json << EOF { "api_key": "API密钥", "output_path": "~/.openclaw/workspace/minimax-output" } EOF ``` ### 步骤 4: 使用 MCP 处理图像 #### 4.1 准备图片 将图片放到可访问路径，例如： - `~/.openclaw/workspace/images/图片名.jpg` - 或者使用 URL #### 4.2 调用 understand_image 使用脚本调用 MCP 服务： ```bash python3 {curDir}/scripts/understand_image.py <图片路径或URL> "<对图片的提问>" ``` **示例：** ```bash # 描述图片内容 python3 {curDir}/scripts/understand_image.py ~/image.jpg "详细描述这张图片的内容" # 使用 URL python3 {curDir}/scripts/understand_image.py "https://example.com/image.jpg "这张图片展示了什么？" ``` #### 4.3 API 参数说明 | 参数 | 说明 | 类型 | |------|------|------| | image | 图片路径或 URL | string (必填) | | prompt | 对图片的提问 | string (必填) | ## 脚本说明 脚本位置：`{curDir}/scripts/understand_image.py` **功能：** - 优先从环境变量 `MINIMAX_API_KEY` 读取 API Key，如果没有则从 `~/.openclaw/config/minimax.json` 读取 - 通过 stdio 模式启动 MCP 服务器 - 发送 JSON-RPC 请求调用 `understand_image` 工具 - 返回格式化的 JSON 结果 **错误处理：** - API Key 未配置时提示错误 - uvx 未安装时提示安装命令 - MCP 服务器错误时显示 stderr 输出

path: _meta.json
content: ownerId: kn770tqcyvha41b4ftc482hr1s81b8xs
slug: minimax-understand-image
version: 1.0.0
publishedAt: 1771336689221

path: scripts/understand_image.py
content: #!/usr/bin/env python3

import subprocess
import json
import sys
import os

def load_api_key():
    config_path = os.path.expanduser('~/.openclaw/config/minimax.json')
    
    [REDACTED_SECRET]'MINIMAX_API_KEY')
    if [REDACTED_SECRET] api_key
    
    try:
        with open(config_path, 'r') as f:
            config = json.load(f)
            return config.get('api_key')
    except (FileNotFoundError, json.JSONDecodeError):
        return None

def call_mcp(image, prompt):
    [REDACTED_SECRET])
    if not [REDACTED_SECRET]"Error: API Key not found. Please configure it first.", file=sys.stderr)
        sys.exit(1)

    env = {
        'MINIMAX_API_KEY': api_key,
        'MINIMAX_MCP_BASE_PATH': os.path.expanduser('~/.openclaw/workspace/minimax-output'),
        'MINIMAX_API_HOST': 'https://api.minimaxi.com'
    }

    # MCP protocol: send initialize first, then tool call
    requests = [
        {
            'jsonrpc': '2.0',
            'id': 1,
            'method': 'initialize',
            'params': {
                'protocolVersion': '2024-11-05',
                'capabilities': {},
                'clientInfo': {
                    'name': 'openclaw',
                    'version': '1.0'
                }
            }
        },
        {
            'jsonrpc': '2.0',
            'id': 2,
            'method': 'tools/call',
            'params': {
                'name': 'understand_image',
                'arguments': {
                    'image_source': image,
                    'prompt': prompt
                }
            }
        }
    ]

    try:
        proc = subprocess.Popen(
            ['uvx', 'minimax-coding-plan-mcp'],
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            env={**os.environ, **env},
            text=True
        )

        input_data = '\n'.join([json.dumps(r) for r in requests]) + '\n'
        stdout, stderr = proc.communicate(input_data, timeout=120)
        
        if stderr:
            print(f"Stderr: {stderr}", file=sys.stderr)
        
        # Parse the last line (tool call response)
        lines = [l.strip() for l in stdout.strip().split('\n') if l.strip()]
        if lines:
            last_response = lines[-1]
            try:
                response = json.loads(last_response)
                if 'result' in response:
                    result = response['result']
                    if isinstance(result, dict) and 'data' in result:
                        print(json.dumps(result['data'], indent=2, ensure_ascii=False))
                    else:
                        print(json.dumps(result, indent=2, ensure_ascii=False))
                elif 'error' in response:
                    print(f"Error: {response['error']}", file=sys.stderr)
            except json.JSONDecodeError:
                print(last_response)
        
        return proc.returncode

    except subprocess.TimeoutExpired:
        proc.kill()
        print("Error: Request timed out", file=sys.stderr)
        sys.exit(1)
    except FileNotFoundError:
        print("Error: uvx not found. Please install it first: curl -LsSf https://astral.sh/uv/install.sh | sh", file=sys.stderr)
        sys.exit(1)
    except Exception as e:
        print(f"Error: {e}", file=sys.stderr)
        sys.exit(1)

if __name__ == '__main__':
    if len(sys.argv) < 3:
        print("Usage: python3 understand_image.py <image_path_or_url> <prompt>", file=sys.stderr)
        print("Example: python3 understand_image.py /path/to/image.jpg '描述这张图片'", file=sys.stderr)
        sys.exit(1)
    
    image = sys.argv[1]
    prompt = sys.argv[2]
    
    sys.exit(call_mcp(image, prompt))


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: suspicious | SkillSpector: suspicious (HIGH)