Get Started#

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

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.

For the latest model support, you can modify the EC-RAG vLLM backend image version and configuration like this:

# clone OPEA EC-RAG repo
git clone https://github.com/opea-project/GenAIExamples.git
cd GenAIExamples/EdgeCraftRAG

# change the vllm image version and related config:
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' \
  docker_compose/intel/gpu/arc/compose.yaml

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`

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:

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#

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!