개요
OpenClaw Project (구 ClawdBot, MoltBot) 구축 과정과 성공, 실패 사례를 공유한다.
OpenClaw 개발 목적은 AI 모델에 연결하여 개인 정보나 파일, 이메일에 접근하여 도구(tool)와 기술(skill)을 사용하여 더욱 개인에 맞춘 서비스를 적극적으로 이용할 수 있다.
Chat 기반 서비스와 차이점
ChatGPT(OpenAI) 혹은 Gemini(Google) 같은 chat 기반 서비스와 가장 큰 차이점은 도구와 기술, 그리고 Cron Job 사용을 통해 적극적으로 명령을 내리거나 반응을 한다는 것이다. (Claude 지원은 있었다고 알고 있다) Chat 기반 서비스가 사용자 요청이 필요한 것에 비교하자면 훨씬 적극적인 대응이 가능하다. Cron 기능을 사용해서 주기적으로 작업을 자동으로 반복시키거나 특정 Webhook Event 수신 시 명령을 수행할 수 있다. Notion 혹은 Google Workspace 접근 또한 가능하며, 권한만 주어진다면 컴퓨터 상에서 파일을 읽고 쓰거나 옮기거나 실행하거나 삭제하는 것도 가능하다.
Skills and Tools
SKILL.md
도구를 어떻게 사용하는지 인공지능에게 설명하는 문서이다.
clawhub 접속을 통해 다양한 도구들을 살펴보고, 명령어를 사용하여 도구를 어떻게 사용하는지 인공지능에게 설명하는 문서(SKILL.md)를 쉽게 설치할 수 있다.
설치 방법은 다음과 같다. :
npx clawhub install [SKILL NAME]
경로는 ~/.openclaw/workspace/skills 아래 skill 이름으로 저장한다.
skills 항목에서 built-in 제공이라고 하는 skill 목록이 있는데, 이는 openclaw 자체에 내장되어있다.
System Prompts
Openclaw 역할과 규칙들을 정의해놓은 문서들이다.
.openclaw/workspace 경로에는 아래와 같은 파일들이 있다. :
- SOUL.md : 존재 이유, 역할 등을 정의한 문서
- AGENT.md : agent 작업 시 주의하거나 고려해야할 사항 및 지침
- TOOLS.md : 도구의 정의와 사용 방법, 지침을 적은 문서.
- MEMORY.md : 기억해야할 항목 혹은 지침. 새로운 session 시작 시 이 파일을 읽고 반영하며 시작한다.
- ...
구축
환경
Windows/WSL2
Nvidia RTX 3090
OpenClaw 설치
아래 명령어를 실행하여 설정을 초기화한다
openclaw onboard
tool 선택은 나중에 clawhub 통해서 설치하는게 훨씬 낫다.
model 설정 시 local 혹은 openAI compatiable 선택지가 지원이 되지 않는 것 같다. 일단 아무 모델이나 우선 선택한다.
이후 openclaw gateway start 명령어를 입력하여 실행한다
Ollama
vLLM 혹은 Ollama 등 다양한 serve 도구가 있지만, Ollama 중심으로 설명하겠다.
우선 ollama 다운로드 페이지에 접속하여 내려받는다.
ollama pull [model 이름]:[tag] 명령어로 마음에 드는 model 아무거나 내려받는다.
참고:
VRAM 규모에 따라서 실행할 수 있는 model parameter 규모가 다르겠지만, 나같은 경우에는 qwen3.5:35b 모델을 이용 중이다. 다만 이 모델의 경우에는 2026년 2월 25일 기준으로 0.17.1-rc2 버전을 내려받아야 사용할 수 있다. MoE 구조이기 때문인데, 현재 정식 relese 중인 0.17.0 버전에서는 이 구조를 지원하지 않는다. 또한 Model 사용 시 think, tool 지원 여부를 확인해야한다. model 이름 밑에 think 혹은 tool tag 확인 후 선택한다.
모두 완료했으면 ollama list 명령어로 실제로 인식 가능한지 확인한다. 이후 ollama serve 명령어로 api 제공을 시작한다.
.openclaw/openclaw.json 파일 수정
내가 구성한 openclaw.json 내용을 참고해서 수정해준다.
참고 : 기본적으로 openAI/text-small-embed 모델을 찾는데, 이를 대체할 embed model 설치를 해야한다. 나는 ollama pull mxbai-embed-large 명령어로 내려 받아서 설정했다.
primary, fallback, models, agent.default.model 부분을 주의 깊게 봐야한다. ollama가 실행 중인 baseUrl 주소를 입력해야한다.
실행환경은 node에 elevated full, sandbox off로 설정했다. (실제 시스템 그대로 사용하도록 설정되어있으니 주의)
{
"meta": {
"lastTouchedVersion": "2026.2.23",
"lastTouchedAt": "2026-02-24T12:05:30.213Z"
},
"env": {
"shellEnv": {
"enabled": true
}
},
"wizard": {
"lastRunAt": "2026-01-31T19:55:45.012Z",
"lastRunVersion": "2026.1.29",
"lastRunCommand": "configure",
"lastRunMode": "local"
},
"models": {
"providers": {
"google": {
"baseUrl": "http://10.0.0.2:11434/v1",
"apiKey": "ollama-local",
"auth": "api-key",
"api": "openai-completions",
"models": [
{
"id": "llama3.3:70b-instruct-q5_k_m",
"name": "llama3.3:70b-instruct-q5_k_m",
"reasoning": false,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 320000,
"maxTokens": 1280000
},
{
"id": "qwen3.5:35b",
"name": "qwen3.5:35b",
"reasoning": true,
"input": [
"text", "image"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 32768,
"maxTokens": 1280000
},
{
"id": "qwen3:14b",
"name": "qwen3:14b",
"reasoning": true,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 320000,
"maxTokens": 1280000
}
]
},
"openai": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "ollama-local",
"auth": "api-key",
"api": "openai-completions",
"models": [
{
"id": "q:lt",
"name": "q:lt",
"reasoning": true,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 8192
},
{
"id": "mistral-small3.2-m",
"name": "mistral-small3.2-m",
"reasoning": true,
"input": [
"text"
],
"cost": {
"input": 0,
"output": 0,
"cacheRead": 0,
"cacheWrite": 0
},
"contextWindow": 131072,
"maxTokens": 8192
}
]
}
}
},
"nodeHost": {
"browserProxy": {
"enabled": true
}
},
"agents": {
"defaults": {
"model": {
"primary": "google/qwen3.5:35b",
"fallbacks": ["openai/q:lt"]
},
"models": {},
"workspace": "/home/XXX/.openclaw/workspace",
"repoRoot": "모든 대화는 자연스러운 한국어로 진행하며, 전문 용어도 한국어 맥락에 맞게 설명해줘.",
"memorySearch": {
"provider": "openai",
"remote": {
"baseUrl": "http://127.0.0.1:11434/v1",
"apiKey": "ollama"
},
"model": "mxbai-embed-large:latest"
},
"compaction": {
"mode": "default",
"memoryFlush": {
"enabled": false,
"prompt": "",
"systemPrompt": ""
}
},
"thinkingDefault": "off",
"verboseDefault": "full",
"elevatedDefault": "full",
"blockStreamingBreak": "text_end",
"blockStreamingChunk": {
"breakPreference": "sentence"
},
"humanDelay": {
"mode": "off"
},
"typingMode": "instant",
"heartbeat": {
"prompt": ""
},
"maxConcurrent": 4,
"subagents": {
"maxConcurrent": 8
}
},
"list": [
{
"id": "main",
"tools": {
"elevated": {
"enabled": true
},
"exec": {
"node": "28455xxxxxxxxxxx................xxxxxxxxxxf73ecadaf870af8"
}
}
}
]
},
"tools": {
"web": {
"search": {
"enabled": true,
"apiKey": "BSATxxxxxx.......xxxxxx"
},
"fetch": {
"enabled": true
}
},
"elevated": {
"enabled": true,
"allowFrom": {
"telegram": [
"*"
],
"openai": [
"*"
]
}
},
"exec": {
"host": "node",
"security": "full",
"ask": "off",
"node": "f65250d2df00...................7668a009b94",
"notifyOnExit": false,
"applyPatch": {
"enabled": true
}
}
},
"messages": {
"ackReactionScope": "group-mentions"
},
"commands": {
"native": true,
"nativeSkills": true,
"text": true,
"bash": true,
"config": true,
"debug": true,
"restart": true,
"useAccessGroups": true,
"ownerDisplay": "raw"
},
"session": {
"typingMode": "thinking"
},
"cron": {
"enabled": true
},
"hooks": {
"gmail": {
"thinking": "off"
}
},
"web": {
"enabled": true
},
"channels": {
"telegram": {
"enabled": true,
"dmPolicy": "pairing",
"botToken": "849xxxxxxx:AAE.......................YX8",
"groupPolicy": "allowlist",
"streaming": "partial"
}
},
"gateway": {
"port": 18789,
"mode": "local",
"bind": "loopback",
"auth": {
"mode": "token",
"token": "a5ce46b......................94ce1d539"
},
"tailscale": {
"mode": "off",
"resetOnExit": false
},
"nodes": {
"browser": {
"mode": "auto"
}
}
},
"skills": {
"load": {
"watch": true
},
"install": {
"preferBrew": true,
"nodeManager": "npm"
},
"entries": {
"sherpa-onnx-tts": {
"enabled": false
},
"gog": {
"enabled": true
},
"notion": {
"apiKey": "ntn_xxxxxxxx........xxxxxxxx"
}
}
},
"plugins": {
"entries": {
"telegram": {
"enabled": true
}
}
}
}
node 연결을 위해서 openclaw node run 명령어를 입력해준다
openclaw node run --host 127.0.0.1 --port 18789 --display-name "Build Node"
telegram 연동
@botfather (사칭 계정 주의) 계정을 검색하여 bot id 및 token 정보를 받는다.
이후 @userinfo 계정을 검색하여 chat id 정보를 받을 수 있다.
이후 위에서 생성한 bot 계정에서 대화를 시작하고 /start 명령어를 입력하여 시작한다.
8자리 코드를 주는데, 이 코드를 openclaw pairing approve telegram <8자리 CODE> 명령어를 사용해서 연결해주면 완료 된다.
Model 사용 후기 (추가 예정)
LLAMA 3.3 8B
QWEN-2.5 32B
QWEN-3-next
DeepSeek-R2 distill
QWEN3.5:35b
'AI' 카테고리의 다른 글
| 이미지 기반 도마뱀 가격 제안 학습 (1) | 2026.04.22 |
|---|---|
| Cursor 17개월 사용기 (0) | 2026.02.26 |
| Dify 구축해서 AI Chat Bot 노코드 개발하기 (0) | 2026.02.26 |
| [Stable Diffusion] 피사체 활용 T-shirts Logo 및 Mock-up 개발 후기 (0) | 2025.11.22 |