Get Started#

This guide provides the demo setup steps for the OpenClaw service, EC-RAG service, Router service, Compressor service, and the UI service.

Prerequisites#

Before you begin, ensure the following:

  • System Requirements: Verify that your system meets the minimum requirements.

  • GPU Driver Installed: This guide assumes that the target machine already has the Intel GPU driver. Otherwise, follow the official Installing Packages from the Intel PPA guide.

  • Docker Installed: Install Docker by following Get Docker.

  • Core command-line tools: All services — including the MCP server — run as containers, so the host only needs git to clone the repo and curl / jq for the setup script and health checks:

    sudo apt-get update
    sudo apt-get install -y git curl jq
    

Table of Contents#

1. Set Up Router and Compressor Services#

The Router and Compressor services are set up separately. See the Inference Router microservice for the full instructions on generating the configuration and starting both services.

2. Set Up EC-RAG#

To install and launch EC-RAG, set up the EC-RAG pipeline, and build the knowledge base, follow the instructions in OPEA EC-RAG Setup Guide. (Please use vLLM backend refer to ‘vLLM Setup’)

a. Prepare embedding/reranker/LLM models#

python3 -m venv model_download_venv
source model_download_venv/bin/activate
# Download BAAI/bge-m3 和 BAAI/bge-reranker-large
pip install --upgrade --upgrade-strategy eager "optimum[openvino]"
export HF_ENDPOINT=https://hf-mirror.com
export MODEL_PATH=${PWD}/workspace/models
optimum-cli export openvino -m BAAI/bge-m3 ${MODEL_PATH}/BAAI/bge-m3-int8 --weight-format int8 --task sentence-similarity
optimum-cli export openvino -m BAAI/bge-reranker-large  ${MODEL_PATH}/BAAI/bge-reranker-large-int8 --weight-format int8 --task text-classification
# Download Qwen3.5-35B-A3B
pip install modelscope
export LLM_MODEL="Qwen/Qwen3.5-35B-A3B"
modelscope download --model $LLM_MODEL --local_dir "${MODEL_PATH}/${LLM_MODEL}"
# clean venv
deactivate
rm -rf model_download_venv

b. Start Service#

# clone OPEA EC-RAG repo with pinned commit
git clone --filter=blob:none --sparse https://github.com/opea-project/GenAIExamples.git
cd GenAIExamples
git sparse-checkout set EdgeCraftRAG
git checkout f56422671c8bdf46f59dd758c8c9e38ca41d6555
cd EdgeCraftRAG

# For the latest model support, you can modify the EC-RAG vLLM backend image version and
# configuration like this:
compose=docker_compose/intel/gpu/arc/compose.yaml

grep -q 'intel/llm-scaler-vllm:0.11.1-b7' "$compose" || {
  echo "ERROR: expected image tag not found in $compose; the pinned commit changed, update this guide" >&2
  exit 1
}

sed -i \
  -e '/--disable-log-requests/d' \
  -e 's@ source /opt/intel/oneapi/setvars.sh --force &&@@' \
  -e 's@intel/llm-scaler-vllm:0.11.1-b7@intel/llm-scaler-vllm:0.21.0-b1@g' \
  -e 's@VLLM_OFFLOAD_WEIGHTS_BEFORE_QUANT=1@VLLM_OFFLOAD_WEIGHTS_BEFORE_QUANT=0@g' \
  "$compose"

grep -q 'intel/llm-scaler-vllm:0.21.0-b1' "$compose" || {
  echo "ERROR: vLLM image rewrite did not apply to $compose; aborting" >&2
  exit 1
}

Below is a reference pipeline configuration:

- `HOST_IP`: `<your_host_ip>`
- `DOC_PATH`: `${PWD}/workspace`
- `TMPFILE_PATH`: `${PWD}/workspace`
- `LLM_MODEL`: `Qwen/Qwen3.5-35B-A3B`
- `MODEL_PATH`: `<the directory you put Qwen/Qwen3.5-35B-A3B>`
- `MAX_MODEL_LEN`: `60000`
- `QUANTIZATION`: `fp8`
- `GPU_MEMORY_UTIL`: `0.65`
# If you have limited GPU resources, please try to increase GPU_MEMORY_UTIL and decrease MAX_MODEL_LEN

c. Load Pipeline#

Get the host IP and send the pipeline configuration directly to EC-RAG:

HOST_IP=$(hostname -I | awk '{print $1}')

curl -X POST "http://${HOST_IP}:16010/v1/settings/pipelines" \
  -H "Content-Type: application/json" \
  --data-binary @- <<EOF | jq '.'
{
  "name": "rag_pipeline",
  "node_parser": {
    "chunk_size": 400,
    "chunk_overlap": 48,
    "parser_type": "simple"
  },
  "indexer": {
    "indexer_type": "faiss_vector",
    "embedding_model": {
      "model_id": "BAAI/bge-m3-int8",
      "model_path": "./models/BAAI/bge-m3-int8",
      "device": "auto",
      "weight": "INT8"
    }
  },
  "retriever": {
    "retriever_type": "vectorsimilarity",
    "retrieve_topk": 30
  },
  "postprocessor": [
    {
      "processor_type": "reranker",
      "top_n": 2,
      "reranker_model": {
        "model_id": "BAAI/bge-reranker-large-int8",
        "model_path": "./models/BAAI/bge-reranker-large-int8",
        "device": "auto",
        "weight": "INT8"
      }
    }
  ],
  "generator": {
    "generator_type": "chatqna",
    "inference_type": "vllm",
    "model": {
      "model_id": "Qwen/Qwen3.5-35B-A3B",
      "model_path": "",
      "device": "",
      "weight": ""
    },
    "prompt_path": "./default_prompt.txt",
    "vllm_endpoint": "http://${HOST_IP}:8086"
  },
  "active": "True"
}
EOF

3. Set Up OpenClaw#

3.1 Install and Onboard OpenClaw#

If you do not have OpenClaw yet, install it from the official repository at openclaw/openclaw. Install openclaw@2026.5.6:

# openclaw needs Node.js >= 22.14.0
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node -e 'const [a,b]=process.versions.node.split(".").map(Number); process.exit(a>22||(a===22&&b>=14)?0:1)' \
  || { echo "ERROR: Node.js >= 22.14.0 required, found $(node -v)"; exit 1; }

npm install -g openclaw@2026.5.6

Use the following choices in the onboarding wizard. Skip all online provider/channel/skill configuration for now and configure them manually in the following sections:

openclaw onboard --install-daemon

Wizard Step

Selection

Onboarding mode

QuickStart

Model / auth provider

Skip for now

Filter models by provider

All providers

Default model

Keep current

Select channel

Skip for now

Configure skills now

No

Enable hooks

Skip for now

How do you want to hatch your bot?

Do this later

If you are using an internally packaged version or a preinstalled environment, make sure you can access the following:

  • OpenClaw executable

  • openclaw.json configuration file

  • A usable agent workspace, for example ~/.openclaw/workspace

3.2 Configure openclaw.json#

Before editing the configuration, stop the openclaw gateway service:

openclaw gateway stop

Edit ~/.openclaw/openclaw.json.

The ~/.openclaw/openclaw.json file generated by openclaw onboard already includes the basic skeleton such as gateway, tools.profile, and agents.list[main], so you do not need to replace the entire file. Merge the following sections into it:

  • models.providers: add the minimax, vllm, and proxy-101 providers

  • tools: append web search using tavily

  • agents:

    • configure subagents

    • add vllm/Qwen/Qwen3.5-35B-A3B, minimax/MiniMax-M2.7, proxy-101/auto, and proxy-101/Qwen/Qwen3.5-35B-A3B under models

    • configure model

    • configure llm

  • plugins: add the tavily configuration

  • gateway: configure controlUi

{
  "agents": {
    "defaults": {
      "workspace": "${HOME}/.openclaw/workspace",
      "compaction": {
        "mode": "safeguard"
      },
      "subagents": {
        "maxConcurrent": 2,
        "maxSpawnDepth": 1,
        "maxChildrenPerAgent": 1,
        "model": "proxy-101/Qwen/Qwen3.5-35B-A3B",
        "runTimeoutSeconds": 1500
      },
      "models": {
        "vllm/Qwen/Qwen3.5-35B-A3B": {},
        "minimax/MiniMax-M2.7": {
          "alias": "Minimax"
        },
        "proxy-101/auto": {
          "alias": "Router"
        },
        "proxy-101/Qwen/Qwen3.5-35B-A3B": {
          "alias": "Router-Qwen3.5-35B-A3B"
        },
        "minimax/MiniMax-M2.7-highspeed": {}
      },
      "model": {
        "primary": "proxy-101/auto",
        "fallbacks": [
          "vllm/Qwen/Qwen3.5-35B-A3B",
          "minimax/MiniMax-M2.7-highspeed",
          "proxy-101/Qwen/Qwen3.5-35B-A3B",
          "minimax/MiniMax-M2.7"
        ]
      },
      "llm": {
        "idleTimeoutSeconds": 800
      }
    },
    "list": [
      {
        "id": "main"
      },
      {
        "id": "auto",
        "name": "auto",
        "subagents": {
          "model": "vllm/Qwen/Qwen3.5-35B-A3B"
        },
        "workspace": "${HOME}/.openclaw/workspace-auto",
        "agentDir": "${HOME}/.openclaw/agents/auto/agent",
        "model": {
          "primary": "proxy-101/auto"
        }
      },
      {
        "id": "intro-self",
        "name": "intro-self",
        "workspace": "/tmp/intro-self",
        "agentDir": "${HOME}/.openclaw/agents/intro-self/agent",
        "model": "proxy-101/auto"
      }
    ]
  },
  "gateway": {
    "mode": "local",
    "auth": {
      "mode": "token",
      "token": ""
    },
    "port": 18789,
    "bind": "loopback",
    "tailscale": {
      "mode": "off",
      "resetOnExit": false
    },
    "controlUi": {
      "allowedOrigins": [
        "http://localhost:18789",
        "http://127.0.0.1:18789",
        "http://localhost:7000",
        "http://127.0.0.1:7000"
      ],
      "allowInsecureAuth": true,
      "dangerouslyDisableDeviceAuth": true
    },
    "nodes": {
      "denyCommands": [
        "camera.snap",
        "camera.clip",
        "screen.record",
        "contacts.add",
        "calendar.add",
        "reminders.add",
        "sms.send",
        "sms.search"
      ]
    }
  },
  "session": {
    "dmScope": "per-channel-peer"
  },
  "tools": {
    "profile": "coding",
    "web": {
      "search": {
        "provider": "tavily",
        "enabled": true
      }
    }
  },
  "models": {
    "mode": "merge",
    "providers": {
      "proxy-101": {
        "baseUrl": "http://localhost:8000/v1",
        "apiKey": "fake",
        "api": "openai-completions",
        "models": [
          {
            "id": "Qwen/Qwen3.5-35B-A3B",
            "name": "Qwen/Qwen3.5-35B-A3B",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 128000,
            "maxTokens": 8192
          },
          {
            "id": "auto",
            "name": "auto",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 200000,
            "maxTokens": 8192
          }
        ]
      },
      "vllm": {
        "baseUrl": "http://localhost:8086/v1",
        "api": "openai-completions",
        "apiKey": "VLLM_API_KEY",
        "models": [
          {
            "id": "Qwen/Qwen3.5-35B-A3B",
            "name": "Qwen/Qwen3.5-35B-A3B",
            "reasoning": false,
            "input": [
              "text"
            ],
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "contextWindow": 90000,
            "maxTokens": 8192
          }
        ]
      },
      "minimax": {
        "baseUrl": "https://api.minimaxi.com/anthropic",
        "models": [
          {
            "id": "MiniMax-M2.7",
            "name": "MiniMax M2.7",
            "reasoning": true,
            "input": [
              "text",
              "image"
            ],
            "cost": {
              "input": 0.3,
              "output": 1.2,
              "cacheRead": 0.06,
              "cacheWrite": 0.375
            },
            "contextWindow": 204800,
            "maxTokens": 131072
          }
        ],
        "api": "anthropic-messages",
        "apiKey": "${MINIMAX_API_KEY}",
        "authHeader": true
      }
    }
  },
  "plugins": {
    "entries": {
      "tavily": {
        "enabled": true,
        "config": {
          "webSearch": {
            "apiKey": "${TAVILY_API_KEY}"
          }
        }
      },
      "vllm": {
        "enabled": true
      },
      "minimax": {
        "enabled": true
      }
    }
  },
  "skills": {
    "entries": {
      "competitive_analysis_PDF_generator": {
        "enabled": true
      }
    }
  }
}

Remember to put MINIMAX_API_KEY into ${HOME}/.openclaw/.env. Do not use ~/ in openclaw.json, because it is not allowed.

3.3 Install Repository Skills into the OpenClaw Agent Directory#

Skill files in this repository cannot remain only in the repository. They must be copied into the workspace of the corresponding OpenClaw agent so that OpenClaw can load them.

The most common target directory is:

  • ~/.openclaw/workspace/skills/

If you only need competitive_analysis_PDF_generator, copy it as follows:

mkdir -p ~/.openclaw/workspace/skills
cp -r ./skills/competitive_analysis_PDF_generator ~/.openclaw/workspace/skills/

3.4 Enable the Skill in OpenClaw Configuration#

After copying the skill directory, you also need to enable it in openclaw.json:

{
  "skills": {
    "entries": {
      "competitive_analysis_PDF_generator": {
        "enabled": true
      }
    }
  }
}

This step tells OpenClaw:

  • This skill exists

  • The agent is allowed to load it at runtime

After copying, restart the gateway:

openclaw gateway restart

Verify whether the skill is available:

openclaw tui

# In tui:
/reset
# Then ask:
"Can you use competitive_analysis_PDF_generator?"

4. Set Up the UI#

Use Docker Compose to build and start the UI container:

cd <enterprise-data-intelligence_repo>/ui/docker

# Set the required environment variables.
# VITE_AUTH_TOKEN should match gateway.auth.token in openclaw.json.
export VITE_AUTH_TOKEN=<your-auth-token>
export SERVER_HOST=<your-server-ip>

# Build the UI image.
docker compose -f build.yaml build

# Start the UI container.
docker compose -f compose.yaml up -d

By default, the UI is available at:

http://<SERVER_HOST>:7000

5. Test the Configuration#

Install weasyprint:

sudo apt install weasyprint

After completing the setup steps above, verify the configuration as follows:

  1. Open the UI in a browser: http://<HOST_IP>:7000

  2. Enter the verification prompt:

Generate a competitive analysis report for Unitree Robotics G1 Basic and comparable products on the market.

Expected result: The UI should display a professional HTML/PDF report comparing the Unitree Robotics G1 Basic with other products, generated using the competitive_analysis_PDF_generator skill.

6. Use the Knowledgebase Skill#

First install the knowledgebase skill the same way as in Steps 3.3–3.4 — copy its directory into the workspace and register it in openclaw.json:

cp -r ./skills/knowledgebase ~/.openclaw/workspace/skills/

Add it alongside the other skill under skills.entries in openclaw.json:

{
  "skills": {
    "entries": {
      "knowledgebase": {
        "enabled": true
      }
    }
  }
}

Then restart the gateway so OpenClaw picks it up:

openclaw gateway restart

If the Large Language Model (LLM) is not strong enough to use the knowledgebase skill automatically, add the following instruction to OpenClaw’s AGENTS.md:

For any user question, query, summarization, overview, or comparison, you must use the knowledgebase skill!
Do not answer questions by searching for files!

Insert the text into the “Tools” chapter in $HOME/.openclaw/workspace/AGENTS.md, for example:

## Tools

Skills provide your tools. When you need one, check its `SKILL.md`. Keep local notes (camera names, SSH details, voice preferences) in `TOOLS.md`.

For any user question, query, summarization, overview, or comparison, you must use the knowledgebase skill!
Do not answer questions by searching for files!