본문 바로가기
개발/바이브 코딩

Openclaw + Ollama 사용기 - 2

by Lajancia 2026. 4. 5.
728x90
반응형

시작 전...

Ollama + Openclaw일 때는 문제가 없었는데, Ollama를 Litellm 으로 연결할 경우 응답이 중간에 유실되는 일이 자주 발생했다. 아직까지 원인을 파악하지 못했는데, 커뮤니티를 확인해보니 무언가 Openclaw -> Litellm -> Ollama로 통신하는 과정에서 로컬 Ollama가 이 텍스트를 제대로 처리하지 못하고 끊기는 것에 있는 듯 하다. OpenRouter에서 연결한 모델들은 모두 문제가 없는데 유독 Ollama에서만 끊김 현상이 있으니, Ollama와 Litellm 연결 관련의 이슈로 추정중이다.

Openclaw 설치에 대하여

화려한 인스타와 유튜브의 Openclaw 사용기를 보다가 진짜 랍스타 생태계로 뛰어들면, 생각보다 설치부터 쉽지 않다는 사실을 금방 깨달을 수 있다. 놀랍게도 Openclaw는 정말 다양한 이유로 동작하지 않는다. 같은 명령어를 여러번 반복하다 보면 어쩌다가 한 번 동작할 때가 있고, 그렇지 않을 수도 있으며, 잘 돌다가 안될 때가 있고, 안되다가 될 때가 있다. 마찬가지로 이유는 알 수 없으며 그저 Docter에게 고쳐달라고 하면 모든 것이 마법처럼 괜찮아질 것이라는 말만 반복할 뿐이다. 한 80%의 확률로 맞는 말이다. 나머지 20%에 걸리지 않는다면...

 

우선 필자의 경우에는 공식 홈페이지의 repository를 통해 pnpm으로 실행했다. 

https://docs.openclaw.ai/install#from-source

 

물론 바로 되지는 않았다. 특히 기분탓인지 모르곘지만 초반에 skill이나 LLM 설정을 누락하면 갑자기 튕기는 듯한 버그를 몇 번 걸렸기 때문에 일단은 아무 키나 넣고 openai 세팅을 해두는 것이 좋은 것 같다.

 

채팅 앱

입력창은 Discord를 선택했다.

https://contents.premium.naver.com/codetree/funcoding/contents/260208003733025lb

 

오픈 클로(OpenClaw) 설치 및 Discode 연결 후기 MacBook + Docker + Claude API

지난주 OpenClaw 관련 글을 작성했었는데요. 이번에는 실제로 제 맥북에 오픈 클로(OpenClaw) 설치와 디스코드 앱을 연동해 보려고 합니다. 목차 MacBook에 Docker로 OpenClaw 설치 안티 그래비티로 오류 해

contents.premium.naver.com

위의 블로그를 주로 참고했는데, @로 직접 이름을 참조해야만 응답하는 것이 마음에 들지 않아 참조가 없어도 바로 대답하도록 커스텀 했다. 나중에 추가로 설명을 할 예정이지만, 간단하게 openclaw.json에 아래와 같이 설정하면 된다.

 

"channels":{
	"discord":{
    ... 기존 설정
        "guilds":{
			"CHANNAL_ID":{
            ...기존 설정
            "requireMention":false #이 부분 추가
            
            }
        }
    }
}

 

LLM 구성

여러 모델을 사용한 결과 현재 정착한 모델은, Stepfun 3.5 flash free와 qwen2-vl-7b-instruct 모델이다. 가장 성능이 좋고 빠른 Stepfun이 대부분의 텍스트와 코딩을 처리하지만 이미지 분석 기능이 없기 떄문에 이 부분은 맥미니에서 로컬로 돌아가는 qwen2-vl-7b-instruct가 담당하기로 했다.

 

openclaw는 기본적으로 Agent - Subagent 협력이 가능하다. skill과 툴을 등록해두면 Agent가 필요할 때 Subagent에게 명령을 내려 작업을 수행하도록 하는 것이다.

 

여러 모델을 동시에 사용할 경우, 그리고 자주 모델을 갈아끼울 경우 매번 openclaw에 모델을 교체하고 다시 업데이트를 하는 것이 매우 까다롭다. 교체 자체가 어려운 일이 아니지만, 간혹가다 gateway를 내렸다 올렸다는 것 하나만으로도 갑자기 동작이 안될 때도 있기 때문이다. 이때 litellm을 사용하면 openclaw의 config 설정은 그대로 두고 litellm쪽에서만 모델을 교체하여 안정적인 운영이 가능하다. 추가로 각 모델의 토큰 사용량과 log도 관리할 수 있다.

 

Discord로 명령 -> Openclaw -> LiteLLM -> Ollama 혹은 Openrouter

 

간단하게 위와 같은 과정으로 진행된다.

 

Ollama

Ollama 설치는 간단하다. 그저 아래 링크에서 앱을 설치하면 자동으로 로컬 호스트가 실행된다

https://ollama.com/

 

Ollama

Ollama is the easiest way to automate your work using open models, while keeping your data safe.

ollama.com

 

제대로 실행되면 http://localhost:11434/ 로 ollama 서버가 운영된다고 표기된다.

LiteLLM

최근 악성 코드 이슈가 크게 터졌던 애증의 LiteLLM이다. 현재는 패치된 버전이 나왔으니 해당 버전을 사용해야 한다. 문제가 되는 버전은 1.82.7, 1.82.8 버전이다. stable은 1.82.3으로 되었다.

 

필자는 LiteLLM은 Docker로 올렸다. 때문에 Docker도 필요하다.

https://www.docker.com/products/docker-desktop/

 

Docker Desktop: The #1 Containerization Tool for Developers | Docker

Docker Desktop is collaborative containerization software for developers. Get started and download Docker Desktop today on Mac, Windows, or Linux.

www.docker.com

 

LiteLLM 실행은 Docker Compose로 하였고, 추가로 사용하는 LLM의 사용량을 추적하기 위해 데이터베이스도 붙였다. LiteLLM에서는 따로 연결된 모델들을 테스트해볼 수 있는 대시보드도 제공한다. 다양한 플랫폼에서 LLM을 호스팅 중이라면 관리하기 간편해진다.

 

docker-compose.yaml

services:
  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      POSTGRES_DB: ${POSTGRES_DB}
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:alpine

  litellm:
    build:
      context: .
      args:
        target: runtime
    image: docker.litellm.ai/berriai/litellm:main-stable
    #########################################
    ## Uncomment these lines to start proxy with a config.yaml file ##
    volumes:
     - ./litellm-config.yaml:/app/config.yaml
     - /Users/Ghost/.openclaw/media/inbound:/app/openclaw_data
    command:
     - "--config=/app/config.yaml"
    ##############################################
    ports:
      - "1234:4000" # Map the container port to the host, change the host port if necessary
    extra_hosts: # 호스트 머신의 IP를 찾을 수 있게 추가
      - "host.docker.internal:host-gateway"
    environment:
      DATABASE_URL: ${DATABASE_URL}
      LITELLM_MASTER_KEY: ${LITELLM_MASTER_KEY}
      OPENROUTER_API_KEY: ${OPENROUTER_API_KEY}
      STORE_MODEL_IN_DB: "True" # allows adding models to proxy via UI
    env_file:
      - .env # Load local .env file
    depends_on:
      - db  # Indicates that this service depends on the 'db' service, ensuring 'db' starts first
    healthcheck:  # Defines the health check configuration for the container
      test:
        - CMD-SHELL
        - python3 -c "import urllib.request; urllib.request.urlopen('http://localhost:4000/health/liveliness')"
      interval: 30s  # Perform health check every 30 seconds
      timeout: 10s   # Health check command times out after 10 seconds
      retries: 3     # Retry up to 3 times if health check fails
      start_period: 40s  # Wait 40 seconds after container start before beginning health checks

networks:
  litellm_net:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: "1400"

 

litellm-config.yaml

model_list:
  - model_name: m4-manager
    litellm_params:
      model: openai/stepfun/step-3.5-flash:free
      api_base: https://openrouter.ai/api/v1
      api_key: "os.environ/OPENROUTER_API_KEY"
      timeout: 300     

  # 3. 비전 전용
  - model_name: m4-vision
    litellm_params:
      model: openai/qwen3-vl:4b
      api_base: http://host.docker.internal:11434/v1  # Ollama 기본 포트
      # Ollama는 로컬 실행 시 별도의 API Key가 필요 없으나, 형식상 "ollama" 입력 가능
      api_key: "os.environ/OPENROUTER_API_KEY"
      drop_params: True 
      # custom_llm_provider는 생략하거나 ollama로 명시 (model 접두어에 포함됨)
      timeout: 6000

general_settings:
  master_key: "os.environ/LITELLM_MASTER_KEY"

 

.env

# Database Settings
POSTGRES_USER=
POSTGRES_PASSWORD=
POSTGRES_DB=
DATABASE_URL=postgresql://llmadmin:POSTGRES_PASSWORD@db:5432/litellm

# LiteLLM Settings
LITELLM_MASTER_KEY=원하는 키
OPENROUTER_API_KEY=

 

원래 Ollama provider를 지원하지만 왜인지 계속 응답이 끊겨서 그냥 openai 형식 provider로 변경해두었다. 일반 대화는 응답하지만, 여전히 이미지같은 큰 분석은 결과가 나오지 않는 이슈가 계속되었다. 때문에 우선은 OpenRouter의 free 모델 중 가장 성능 좋은 것들로 붙여두었다. 지금까지 무리 없이 무료로 사용이 가능했다. 하지만 더 빠른 응답을 위해서는 어느정도 토큰을 사야 하는 것은 어쩔 수 없다.

 

Openclaw.json

 

마지막으로 litellm에 등록한 모델을 등록해야 한다.

"models": {
    "mode": "replace",
    "providers": {
      "litellm-proxy": {
        "baseUrl": "http://127.0.0.1:1234",
        "apiKey": LITELLM_KEY,
        "api": "openai-completions",
        "models": [
          {
            "id": "m4-manager",
            "name": "Daily Gemma",
            "input": [
              "text"
            ],
            "contextWindow": 128000,
            "maxTokens": 8192,
          },
          {
            "id": "m4-vision",
            "name": "Vision Qwen",
            "input": [
              "text",
              "image"
            ],
            "contextWindow": 64000,
            "reasoning": false,
            "cost": {
              "input": 0,
              "output": 0,
              "cacheRead": 0,
              "cacheWrite": 0
            },
            "maxTokens": 8192,
            "api": "openai-completions"
          }
        ]
      }
    }
  },
  "agents": {
    "defaults": {
      "imageModel": {
        "primary": "litellm-proxy/m4-vision",
        "fallbacks": [
          "litellm-proxy/m4-vision"
        ]
      },
      "models": {
        "litellm-proxy/m4-manager": {},
        "litellm-proxy/m4-vision": {}
      },
      "compaction": {
        "mode": "default",
        "reserveTokens": 8000,
        "reserveTokensFloor": 4000
      },
      "timeoutSeconds": 300,
      "maxConcurrent": 4,
      "subagents": {
        "maxConcurrent": 8
      }
    },
    "list": [
      {
        "id": "manager",
        "name": "Project Manager",
        "workspace": "/Users/User/.openclaw/workspace",
        "model": "litellm-proxy/m4-manager",
        "subagents": {
          "allowAgents": [
            "cayde",
            "sagira",
          ]
        }
      },
      {
        "id": "cayde",
        "name": "Agent Cayde",
        "model": "litellm-proxy/m4-daily",
      }
      {
        "id": "sagira",
        "name": "Agent Sagira",
        "model": "litellm-proxy/m4-vision",
      }
    ]
  },

 

provider로 litellm-proxy를 하고 litellm에서 지정한 llm key를 등록하면 동작한다. 이제 모델이 바뀌면 간단하게 config쪽만 수정하면 openclaw는 그대로 두고 계속 사용할 수 있다. (보통 context flush가 자주 발생한다면 Context window가 작게 설정된게 문제다)

 

AI 전용 블로그

https://g3941813-svg.github.io/

 

Ghost Blog

Ghost의 블로그

g3941813-svg.github.io

 

아직 자잘한 일정 관리나 내 개인 웹사이트 운영을 맡겨보고 있는데, AI와 인간의 관계에 대한 주제에 대해 AI의 입장에서 써보는 것도 재미있을 것 같아 전용 깃허브 계정과 블로그를 개설해주었다. 생각보다 흥미로운 주제와 답변을 주다 보니, 읽어보는 재미도 있었다. 조만간 조금 더 좋은 성능을 위해 유료 토큰을 지불해볼 의향이다.

반응형