OpenClaw:基于ROS 2与Hermes的多模态智能体工作流引擎

📅 2026/7/10 7:14:34
OpenClaw:基于ROS 2与Hermes的多模态智能体工作流引擎
1. 项目概述这不是一个“安装包”而是一套面向开发者的智能体工作流启动器OpenClaw这个名字第一次在ROS社区和AI工程圈里被认真讨论是在2024年Q2。它不是传统意义的软件也不是某个大厂推出的SaaS服务而是一个以ROS 2Robot Operating System 2为底层运行时、以Hermes Agent框架为认知内核、专为多模态智能体Agent快速验证与本地化部署设计的开源工具链。标题里写的“零代码一键免费安装”——这个说法本身就很误导人。我第一次看到时也信了结果在Ubuntu 22.04上执行完curl -sSL https://get.openclaw.dev | bash终端回显“Installation completed ✅”但紧接着敲openclaw --help就报错“command not found”。折腾了三小时才搞明白所谓“一键”其实是把核心依赖ROS 2 Humble、Python 3.10、PyTorch 2.1、Hermes Core自动拉下来并编译好但真正的可执行入口openclaw命令是通过一个叫openclaw-cli的Python包提供的而这个包默认不随脚本安装必须手动pip install openclaw-cli。这根本不是“零代码”而是把“写一行pip命令”的门槛包装成了“一键”。但为什么它值得你花时间因为它的价值不在安装快而在把原本需要3天才能跑通的智能体原型流程压缩到30分钟以内。比如你要做一个能看懂车间监控视频、识别设备异常并自动生成维修工单的Agent传统做法是先搭ROS 2环境2小时再配Hermes Agent3小时然后写Skill调用摄像头节点4小时最后对接飞书/微信通知2小时……OpenClaw干的事就是把这整条链路上90%的胶水代码、配置文件、环境变量、权限设置全部预置成标准化的YAML模板和CLI命令。你只需要改3个地方摄像头设备路径、飞书Webhook地址、提示词里的故障判断逻辑。我上周帮一家做工业视觉的客户落地他们原来用FlaskOpenCV自己搭每次换产线就要重调模型输入尺寸和告警阈值换成OpenClaw后只改了一个skills/vision_anomaly.yaml里的input_resolution: [1280,720]和threshold: 0.85重启服务就上线了。这才是“秒级部署”的真实含义——不是安装快而是迭代快、切换快、交付快。它适合谁第一类是ROS工程师尤其是做移动机器人、AGV调度、巡检机器人的团队你们最头疼的从来不是算法而是怎么让大模型输出的JSON指令精准驱动底盘电机或机械臂关节——OpenClaw的ros_skill模块原生支持/cmd_vel、/joint_states等标准Topic连消息序列化都帮你封装好了。第二类是AI应用工程师特别是要快速验证大模型在垂直场景金融分析、医疗问诊、客服话术生成中是否work的人你们不用再纠结“该用LangChain还是LlamaIndex”OpenClaw内置的med_skills和finance_skills已经把数据源接入、RAG索引构建、结果结构化输出全链路打通。第三类是高校实验室和学生你们缺的不是算力而是能直接跑起来的完整案例——OpenClaw GitHub仓库里那个examples/warehouse_inspection从Gazebo仿真环境加载、到YOLOv8实时检测、再到自动生成PDF巡检报告所有代码、配置、Dockerfile全公开连README里的截图都是实机录屏不是效果图。别被标题里的“零代码”骗了它降低的是工程复杂度不是思考深度它省掉的是重复劳动不是技术判断。你依然得懂ROS的Topic通信机制得会调大模型的temperature参数得知道什么时候该用Function Calling而不是纯文本生成——但这些才是你真正该花时间的地方。2. 核心设计逻辑为什么选择ROS 2 Hermes作为底座而不是直接封装FastAPI2.1 不是“为了用ROS而用ROS”而是ROS 2解决了智能体落地中最痛的三个硬伤很多人看到OpenClaw依赖ROS 2第一反应是“我又不做机器人装ROS干啥” 这是个典型误解。ROS 2在这里根本不是用来控制机械臂的而是充当一个高可靠、低延迟、自带服务发现与生命周期管理的微服务总线。我们来拆解它解决的实际问题第一异构硬件接入的统一抽象。你在工厂里可能有海康威视的IPC摄像头、大华的NVR录像机、西门子的PLC控制器、还有树莓派采集的温湿度传感器。它们的数据协议五花八门RTSP流、ONVIF XML、Modbus TCP、MQTT JSON……如果用FastAPI你得为每个设备写一个独立的API端点还要自己处理连接保活、断线重连、数据格式转换。ROS 2的Node机制天然解决这个问题每个硬件对应一个Node比如camera_node、plc_node它们只管把原始数据发布到标准Topic如/sensor/camera/image_raw、/machine/plc/status而OpenClaw的Skill模块订阅这些Topic拿到的就是已经对齐时间戳、统一编码格式的ROS Message。我实测过同一台Jetson Orin上用ROS 2 Node接入4路1080p RTSP流CPU占用率稳定在62%而用Python多线程OpenCVcv2.VideoCapture轮询4路就飙到98%且频繁丢帧。原因很简单ROS 2的rclpy底层直接调用GStreamer pipeline做了硬件解码加速而OpenCV默认走CPU软解。第二多智能体协同的时序保障。假设你的系统里有两个Agent一个负责“识别设备状态”另一个负责“生成维修建议”。前者输出JSON{“device_id”: “MOT-001”, “status”: “overheating”}后者要基于这个结果去查知识库。如果用HTTP API串行调用网络抖动会导致第二个请求超时如果用消息队列又得自己设计死信队列和重试策略。ROS 2的rclpy.executors.MultiThreadedExecutor完美解决两个Skill作为独立Node运行通过/agent/vision/output和/agent/reasoning/input这两个Topic进行松耦合通信Executor自动管理线程池和回调队列实测端到端延迟稳定在120ms±15ms远低于HTTP平均320ms的P95延迟。更关键的是ROS 2的lifecycle机制让每个Node可以声明自己的状态unconfigured→inactive→active→finalized比如当PLC网络断开时plc_node自动切到inactive状态所有订阅它的Skill会立刻收到lifecycle_state_changed事件从而触发降级逻辑比如切换到历史数据预测模式而不是傻等超时。第三安全隔离与资源管控的物理基础。这是很多AI工程师忽略的致命点。你在本地跑一个llm-skill它调用transformers.pipeline加载7B模型内存峰值会冲到12GB同时vision-skill在跑YOLOv8GPU显存占满。如果所有Skill塞进同一个Python进程一个Skill内存泄漏整个服务就OOM崩溃。ROS 2强制要求每个Skill作为独立进程Node运行配合Linux cgroups你可以精确限制每个Node的CPU份额、内存上限、GPU显存配额。我在一台32GB内存的服务器上用ros2 launch openclaw multi_skill_launch.py启动了8个Skill含2个LLM节点通过systemd-run --scope -p MemoryMax4G -p CPUQuota50% ros2 run openclaw llm_skill动态分配资源系统负载始终平稳。而同样配置下用FastAPIUvicorn启动8个Worker不出5分钟必然因内存溢出被OOM Killer干掉。所以OpenClaw选ROS 2不是赶时髦而是用一套经过十年工业验证的分布式系统架构来兜住大模型应用落地中最不可控的硬件层风险。2.2 Hermes Agent框架为什么不用LangChain而要自己造轮子Hermes是OpenClaw的“大脑”但它和LangChain/LlamaIndex有本质区别LangChain是工具集ToolkitsHermes是运行时Runtime。你可以把LangChain理解成一堆螺丝刀、扳手、电钻而Hermes是一个已经组装好、通上电、按下开关就能运转的自动化产线。它的核心设计哲学是“Skill即服务Orchestration即配置”。举个具体例子你要实现“用户发一张电路板照片Agent识别焊点虚焊并生成维修指引”。用LangChain你得写# LangChain方式代码量大逻辑分散 from langchain.agents import initialize_agent, Tool from langchain.llms import Ollama from vision_skill import detect_soldering_defect from repair_skill import generate_repair_guide tools [ Tool(namevision, funcdetect_soldering_defect, descriptionDetect soldering defects from image), Tool(namerepair, funcgenerate_repair_guide, descriptionGenerate repair guide from defect info) ] llm Ollama(modelllama3:7b) agent initialize_agent(tools, llm, agentstructured-chat-zero-shot-react-description) result agent.run(Analyze this PCB image: /tmp/pic.jpg)这段代码的问题在于1detect_soldering_defect和generate_repair_guide必须在同一Python进程里定义无法跨机器部署2错误处理全靠try-except没有统一的重试、降级、熔断机制3输入输出格式完全由开发者约定没有Schema校验。而Hermes的方式是声明式配置# skills/pcb_inspection.yaml name: pcb_inspection description: PCB soldering defect analysis and repair guidance input_schema: type: object properties: image_path: type: string format: uri output_schema: type: object properties: defects: type: array items: type: object properties: location: {type: string} severity: {type: string, enum: [low, medium, high]} guide: {type: string} steps: - name: vision_analysis skill: vision_soldering input_map: {image: $.input.image_path} timeout: 30s - name: repair_generation skill: repair_guide input_map: {defects: $.steps.vision_analysis.output.defects} fallback: {skill: default_repair_guide} # 降级方案这个YAML文件被Hermes Runtime加载后会自动启动vision_solderingSkill可能是远程服务器上的Node也可能是本地Docker容器将image_path参数序列化为ROS Message通过/skill/vision_soldering/inputTopic发送监听/skill/vision_soldering/outputTopic获取结果如果30秒没收到响应自动触发fallback调用default_repair_guideSkill最终将repair_generation的输出按output_schema校验后返回给客户端所有这些都不用你写一行Python。Hermes Runtime内置了完整的可观测性每个Step的执行耗时、成功率、错误日志全部上报到PrometheusGrafana看板。我在客户现场部署时直接打开http://localhost:3000/d/ocl-skill-monitor就能看到过去24小时所有Skill的P95延迟热力图哪个Skill拖慢了整条流水线一眼就定位。这才是“零代码”的真实价值——把工程最佳实践变成开箱即用的配置能力。2.3 “一键安装”脚本的真相它到底干了什么又刻意隐藏了什么标题里“秒级部署”四个字是OpenClaw传播最广也最易引发误解的点。我反编译了那个著名的https://get.openclaw.dev安装脚本实际是install.sh逐行分析它的真实行为# 官方install.sh核心逻辑已脱敏 set -e # 关键遇到错误立即退出避免半残状态 # 步骤1检查系统基础环境 if ! command -v curl /dev/null; then echo curl is required but not installed. Installing... 2 apt-get update apt-get install -y curl # Ubuntu/Debian fi # 步骤2下载并校验ROS 2 Humble二进制包非源码编译 ROS2_URLhttps://github.com/ros2/ros2/releases/download/release-humble-20230510/ros2-humble-20230510-linux-focal-amd64.tar.bz2 curl -fsSL $ROS2_URL -o /tmp/ros2.tar.bz2 echo a1b2c3d4e5f6... /tmp/ros2.tar.bz2 | sha256sum -c # 校验哈希 # 步骤3解压到/opt/ros2并设置环境变量 sudo tar -xjf /tmp/ros2.tar.bz2 -C /opt/ echo source /opt/ros2/setup.bash ~/.bashrc source ~/.bashrc # 步骤4安装Python依赖注意这里只装了基础包 pip3 install --upgrade pip setuptools pip3 install pyyaml rospkg catkin_pkg # ROS Python生态基础 # 步骤5克隆OpenClaw核心仓库但不安装CLI git clone https://github.com/openclaw/core.git /opt/openclaw-core # 注意这里没有执行 pip install -e /opt/openclaw-core # 步骤6创建systemd服务模板但不启用 sudo cp /opt/openclaw-core/systemd/openclaw.service /etc/systemd/system/ # 但不会执行 systemctl daemon-reload systemctl enable openclaw看到关键点了吗这个脚本只完成了环境准备没有完成功能交付。它把ROS 2二进制包放进/opt/ros2把OpenClaw源码放进/opt/openclaw-core但真正的“可执行命令”openclaw来自另一个独立仓库openclaw-cli而这个仓库的安装被刻意剥离出去了。官方文档里轻描淡写一句“Runpip install openclaw-clito get the CLI”却没告诉你openclaw-cli依赖ros2cliROS 2命令行工具而ros2cli又依赖ament_index_python这个包在ROS 2二进制分发版里是缺失的必须手动pip install ament-index-python否则openclaw --help必报错。更隐蔽的坑在Python版本。ROS 2 Humble官方支持Python 3.10但openclaw-cli的pyproject.toml里写着requires-python 3.9,3.12。如果你的系统默认Python是3.12比如Ubuntu 24.04pip install openclaw-cli会成功但运行时import rclpy会失败因为ROS 2 Humble没编译3.12的wheel。我踩过这个坑最终解决方案是用pyenv创建一个3.10.12的虚拟环境在里面装所有东西。所以“一键安装”的真相是它用一个脚本把原本需要你手动执行的17个命令查系统、装curl、下ROS、校验、解压、设PATH、装pip、升级setuptools、装pyyaml、装rospkg、装catkin_pkg、克隆core、克隆cli、装ament、装cli、设bashrc、重载shell压缩成1个命令。但它绝不保证“装完就能用”它只保证“装完的环境是你能手动复现的最简环境”。这是工程严谨性的体现不是营销话术。3. 实操全流程从裸机到生产可用的7个关键环节3.1 环境准备为什么必须用Ubuntu 22.04而不是更新的24.04或更老的20.04OpenClaw官方文档明确推荐Ubuntu 22.04 LTSFocal Fossa这不是随意指定的。背后是三个硬性约束第一ROS 2 Humble的ABI兼容性。ROS 2 Humble的二进制包.deb或.tar.bz2是用GCC 11.2.0在Ubuntu 22.04上编译的其动态链接库如librcl.so、librclcpp.so依赖glibc 2.35。Ubuntu 24.04Noble用的是glibc 2.39虽然向后兼容但ROS 2 Humble的某些底层组件如rmw_fastrtps_cpp在glibc 2.39上会出现undefined symbol: __cxa_throw_bad_array_new_length错误这是C ABI变更导致的。我实测过在24.04上强行安装Humble二进制包ros2 node list能运行但一执行ros2 topic echo /chatter就段错误。而Ubuntu 20.04的glibc是2.31ROS 2 Humble的二进制包在20.04上根本无法加载报version GLIBC_2.34 not found。第二CUDA驱动与PyTorch的版本锁死。OpenClaw的vision_skill默认用YOLOv8依赖ultralytics库而ultralytics的最新版8.2.0要求PyTorch 2.1.0。PyTorch 2.1.0官方wheel只提供CUDA 11.8和12.1两个版本。Ubuntu 22.04的NVIDIA驱动版本525.60.13完美支持CUDA 11.8而20.04的驱动太老440.x不支持CUDA 11.8的cuBLASLt新特性24.04的驱动太新535.x与CUDA 11.8存在已知的cudaMallocAsync内存分配冲突。我对比过三台机器Ubuntu 20.04 Driver 440 CUDA 11.2 → PyTorch 2.1.0安装失败报CUDA version mismatchUbuntu 22.04 Driver 525 CUDA 11.8 →pip install torch2.1.0cu118100%成功YOLOv8推理速度23 FPSRTX 3090Ubuntu 24.04 Driver 535 CUDA 12.1 →torch2.1.0cu121能装但YOLOv8的model.predict()函数在nms步骤卡死GPU利用率0%第三systemd版本的稳定性。OpenClaw的生产部署依赖systemd管理多个Skill进程的启停和依赖关系。Ubuntu 22.04的systemd版本是249它原生支持Typenotify和NotifyAccessall这让Skill Node能通过sd_notify(READY1)精确告知systemd自己已就绪避免openclaw start命令返回后Skill其实还没监听Topic的竞态问题。Ubuntu 20.04的systemd 245缺少这个特性必须用ExecStartPost/bin/sleep 5这种粗暴延时24.04的systemd 255则引入了新的RestartSec默认值导致Skill进程意外退出后systemd会以指数退避方式重试1s, 2s, 4s...而OpenClaw的健康检查期望固定间隔如10s造成误判。所以环境准备的第一步不是下载脚本而是确认你的OS。如果你用的是WSL2必须在Windows设置里开启“适用于Linux的Windows子系统”并勾选“使用WSL2”然后在PowerShell里执行wsl --install -d Ubuntu-22.04 wsl -d Ubuntu-22.04进入Ubuntu后立刻执行sudo apt update sudo apt upgrade -y sudo apt install -y python3-pip python3-venv build-essential注意不要执行sudo apt install python3-dev因为ROS 2 Humble的二进制包已经包含了头文件额外安装会导致/usr/include/python3.10/和/opt/ros2/include/python3.10/冲突编译自定义Skill时#include Python.h会报错。这是个只有亲手编译过ROS 2 C Node的人才知道的细节。3.2 核心安装如何绕过官方脚本的“陷阱”实现真正可用的一键部署官方curl -sSL https://get.openclaw.dev | bash脚本最大的问题是它把所有东西都装到系统全局路径/opt/、~/.bashrc这在生产环境是灾难。一旦某个Skill的Python依赖和系统其他服务冲突比如你服务器上跑着Django它依赖Django 4.2而某个Skill需要Django 5.0整个系统就崩了。我的做法是用Docker Compose封装整个OpenClaw运行时把ROS 2、Hermes、Skill全部隔离在容器里。这样既能享受“一键部署”的便利又能获得生产级的隔离性和可移植性。第一步创建docker-compose.ymlversion: 3.8 services: openclaw-runtime: image: ros:humble-ros-base-focal volumes: - ./skills:/opt/openclaw-skills:ro - ./config:/opt/openclaw-config:ro - ./data:/opt/openclaw-data:rw environment: - ROS_DOMAIN_ID10 - PYTHONUNBUFFERED1 command: bash -c apt-get update apt-get install -y python3-pip \ pip3 install --upgrade pip \ pip3 install pyyaml rospkg catkin_pkg \ git clone https://github.com/openclaw/core.git /opt/openclaw-core \ pip3 install -e /opt/openclaw-core \ pip3 install openclaw-cli \ exec tail -f /dev/null networks: - openclaw-net openclaw-cli: image: python:3.10-slim depends_on: - openclaw-runtime volumes: - ./skills:/opt/openclaw-skills:ro - ./config:/opt/openclaw-config:ro - ./data:/opt/openclaw-data:rw entrypoint: [sh, -c] command: pip install openclaw-cli \ exec openclaw --config /opt/openclaw-config/config.yaml --skills /opt/openclaw-skills networks: - openclaw-net networks: openclaw-net: driver: bridge这个Compose文件的关键设计openclaw-runtime服务基于官方ros:humble-ros-base-focal镜像它已经预装了ROS 2 Humble、GCC、CMake等所有依赖避免了官方脚本里手动下载、校验、解压的繁琐步骤。apt-get install python3-pip是为了确保pip可用因为ROS镜像默认不装pip。openclaw-cli服务单独起一个轻量Python容器只装openclaw-cli通过depends_on确保它在runtime之后启动。这样CLI命令的执行环境和Skill的运行环境完全隔离互不影响。Volume挂载./skills目录放所有Skill YAML文件./config放主配置./data放运行时产生的日志和缓存。这样你修改Skill配置只需docker-compose restart openclaw-cli无需重建镜像。第二步初始化项目目录mkdir -p my-openclaw/{skills,config,data} cd my-openclaw # 下载官方示例Skill注意只下载YAML不下载Python代码 curl -sSL https://raw.githubusercontent.com/openclaw/examples/main/warehouse_inspection/skills/vision_anomaly.yaml \ -o skills/vision_anomaly.yaml # 创建最小化配置 cat config/config.yaml EOF openclaw: domain_id: 10 log_level: INFO skills: - path: /opt/openclaw-skills/vision_anomaly.yaml enabled: true EOF第三步一键启动docker-compose up -d # 等待30秒检查日志 docker-compose logs -f openclaw-cli你会看到类似输出openclaw-cli-1 | [INFO] Loading skill: vision_anomaly from /opt/openclaw-skills/vision_anomaly.yaml openclaw-cli-1 | [INFO] Skill vision_anomaly loaded successfully openclaw-cli-1 | [INFO] Starting OpenClaw runtime with 1 skill(s)... openclaw-cli-1 | [INFO] OpenClaw is ready! Listening on http://0.0.0.0:8000此时openclaw-cli容器里已经有一个正常运行的openclaw服务监听在0.0.0.0:8000。你可以用curl测试curl -X POST http://localhost:8000/v1/skills/vision_anomaly \ -H Content-Type: application/json \ -d {image_path: https://example.com/test.jpg}这个方案比官方脚本多写了20行YAML但换来的是1环境绝对纯净不污染宿主机2可随时docker-compose down彻底清理3部署到任何有Docker的机器包括NAS、群晖、树莓派都只需docker-compose up -d一条命令。这才是“秒级部署”的正确打开方式。3.3 技能Skill开发如何用3个文件让大模型调用你的Python函数OpenClaw的Skill不是黑盒而是高度可定制的模块。一个完整的Skill由三个文件构成YAML配置、Python实现、Dockerfile可选。我们以“接入飞书机器人”为例展示如何从零开始开发一个Skill。第一步YAML配置文件skills/feishu_notify.yamlname: feishu_notify description: Send notification to Feishu bot input_schema: type: object properties: message: type: string description: The message content to send webhook_url: type: string format: uri description: Feishu bot webhook URL required: [message, webhook_url] output_schema: type: object properties: success: type: boolean status_code: type: integer response: type: string steps: - name: send_to_feishu skill: python_function input_map: message: $.input.message webhook_url: $.input.webhook_url function: feishu_notify.send_message timeout: 10s这个YAML定义了Skill的契约输入必须有message和webhook_url输出必须有success等字段。function: feishu_notify.send_message指定了Python模块路径。第二步Python实现skills/feishu_notify.py# skills/feishu_notify.py import requests import json import logging from typing import Dict, Any logger logging.getLogger(__name__) def send_message(message: str, webhook_url: str) - Dict[str, Any]: Send a text message to Feishu bot. This function is called by OpenClaws python_function skill. payload { msg_type: text, content: {text: message} } try: logger.info(fSending message to Feishu: {message[:50]}...) response requests.post( webhook_url, jsonpayload, timeout8 # 必须小于YAML里的timeout: 10s ) response.raise_for_status() logger.info(fFeishu notification sent successfully. Status: {response.status_code}) return { success: True, status_code: response.status_code, response: response.text } except requests.exceptions.Timeout: logger.error(Feishu request timed out) return {success: False, status_code: 0, response: Timeout} except requests.exceptions.RequestException as e: logger.error(fFeishu request failed: {e}) return {success: False, status_code: 0, response: str(e)}关键点1函数签名必须严格匹配YAML里input_map的key2必须有timeout参数且小于YAML定义的timeout3日志用logging.getLogger(__name__)这样OpenClaw的统一日志系统能捕获。第三步注册Skillconfig/config.yamlopenclaw: domain_id: 10 skills: - path: /opt/openclaw-skills/feishu_notify.yaml enabled: true - path: /opt/openclaw-skills/vision_anomaly.yaml enabled: true然后重启服务docker-compose restart openclaw-cli现在你可以用API调用这个Skillcurl -X POST http://localhost:8000/v1/skills/feishu_notify \ -H Content-Type: application/json \ -d { message: 设备MOT-001温度超标, webhook_url: https://open.feishu.cn/open-apis/bot/v2/hook/xxx }返回{success:true,status_code:200,response:{\StatusCode\:0,\StatusMessage\:\success\}}整个过程你只写了1个YAML、1个Python文件、3行配置就完成了一个可生产使用的飞书通知Skill。没有Flask路由没有FastAPI依赖注入没有JWT鉴权——因为OpenClaw的Skill Runtime已经把这些都封装好了。你专注的只是业务逻辑本身。3.4 模型切换如何在不改代码的前提下把Llama3换成Qwen2或本地Ollama换成云端APIOpenClaw的模型抽象层Model Abstraction Layer, MAL是它最被低估的设计。它把“模型”这个概念从硬编码的Python类变成了可插拔的配置项。切换模型真的只需改一个参数。场景1从本地Ollama的Llama3切换到本地Ollama的Qwen2Ollama模型在OpenClaw里是通过model_provider配置的。默认配置config/config.yamlmodel_providers: - name: ollama type: ollama config: host: http://localhost:11434 model: llama3:7b要切换到Qwen2只需改model字段model_providers: - name: ollama type: ollama config: host: http://localhost:11434 model: qwen2:7b # 只改这一行然后拉取Qwen2ollama pull qwen2:7b重启服务即可。OpenClaw的MAL会自动检测到模型变化重新初始化OllamaClient后续所有Skill调用llm.generate()时底层用的就是Qwen2。场景2从本地Ollama切换到阿里云百炼API百炼API需要API Key和Endpoint。配置如下model_providers: - name: bailian type: http config: endpoint: https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation api_key: sk-xxxxxx # 从阿里云控制台获取 headers: Content-Type: application/json request_template: | { model: qwen-max, input: { messages: [ {% for msg in messages %} {role: {{ msg.role }}, content: {{ msg.content | tojson }}}, {% endfor %} ] }, parameters: { temperature: {{ temperature | default(0.7) }}, top_p: {{ top_p | default(0.9) }} } } response_path: $.output.text这里的关键是request_template和response_path前者是Jinja2模板定义HTTP请求体的结构后者是JSONPath指定从API响应里提取哪个字段作为模型输出。OpenClaw的MAL会自动渲染模板、发送请求、解析响应Skill代码里完全感知不到底层是Ollama还是百炼。场景3混合模型路由Hybrid Routing更高级的用法是根据Skill类型自动路由到不同模型。比如vision_anomaly技能用Qwen2擅长多模态finance_analysis用百炼有金融领域微调。配置model_providers: - name: qwen2_local type: ollama config: {host: http://localhost:11434, model: qwen2:7b} - name: bailian_finance type: http config: {endpoint: ..., api_key: ..., ...} skills: - path: /opt/openclaw-skills/vision_anomaly.yaml enabled: true