CliCode With Ollama: Difference between revisions

From 흡혈양파의 인터넷工房
Jump to navigation Jump to search
docker command line: 오타 수정
잡다한 스크립트들: claude code proxy 의 동작을 테스트하기 위한 curl 스크립트 추가
Line 170: Line 170:
<pre>
<pre>
docker kill litellm ; docker start litellm ; docker stats
docker kill litellm ; docker start litellm ; docker stats
</pre>
===claude code proxy 의 동작을 테스트하기 위한 curl 스크립트===
<pre>
curl -sS http://192.168.1.239:3334/v1/messages \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer onionmixer" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 20480,
    "messages": [{"role":"user","content":"hello"}]
  }'
</pre>
</pre>



Revision as of 16:42, 20 September 2025

이 문서는 ollama / open webUI / litellm with continue cli / qwen code cli / claude code cli 를 연동해보기 위한 과정에서 얻은 tip 들을 정리한 문서입니다.

basic infomation

  • ollama/open webUI/liteLLM server IP : 192.168.1.239
  • ollama docker api port : 11434
    • model : robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
  • open webUI api port : 3000
    • model : robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
  • litellm api port : 3333
    • model : qwen3-coder


docker command line

ollama docker command line

nvidia-docker run -d -e OLLAMA_KEEP_ALIVE=24h -e OLLAMA_FLASH_ATTENTION=true -e OLLAMA_KV_CACHE_TYPE=q8_0 -e OLLAMA_SCHED_SPREAD=1 --gpus '"device=0,1"' -v ollama:/root/.ollama -p 11434:11434 --restart always --name ollama ollama/ollama:latest

open webUI docker command line

nvidia-docker run -d -p 3000:8080 --gpus=all --add-host=host.docker.internal:host-gateway -e OLLAMA_BASE_URL=http://host.docker.internal:11434 -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda

litellm docker command line

nvidia-docker run -d --gpus=all --name litellm -v $(pwd)/config.yaml:/app/config.yaml -p 3333:4000 --add-host=host.docker.internal:host-gateway --restart always ghcr.io/berriai/litellm:main-stable --config /app/config.yaml --port 4000

claude code proxy docker command line

nvidia-docker run -d --name ccproxy -e LANG=C.UTF-8 -e LC_ALL=C.UTF-8 -e PYTHONIOENCODING=UTF-8 --env-file .env -p 3334:8082 --add-host=host.docker.internal:host-gateway --restart always ghcr.io/1rgs/claude-code-proxy:main

test scripts

ollama ollama api check

curl -sS -H "Content-Type: application/json" -d '{"model":"robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL","messages":[{"role":"user","content":"hello"}]}' http://192.168.1.239:11434/api/chat
curl -sS -H "Content-Type: application/json" -d '{"model":"robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL","keep_alive":"24h","messages":[{"role":"user","content":"hello"}]}' http://192.168.1.239:11434/api/chat


ollama openai api check

curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:11434/v1/chat/completions
curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL", "keep_alive": "24h", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:11434/v1/chat/completions

open webUI openai api check

curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:3000/api/chat/completions
curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL", "keep_alive": "24h", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:3000/api/chat/completions


litellm openai api check

curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "qwen3-coder", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:3333/v1/chat/completions
curl -sS -X POST -H "Authorization: Bearer sk-5aec4d12374344f7942217efced322d9" -H "Content-Type: application/json" -d '{ "model": "qwen3-coder", "keep_alive": "24h", "messages": [{"role": "user", "content": "hello"}] }' http://192.168.1.239:3333/v1/chat/completions


CLI tool 환경변수

qwen code cli 환경변수

ollama openai api 환경변수

export OPENAI_BASE_URL="http://192.168.1.239:11434/v1"
export OPENAI_MODEL="sammcj/devstral-small-24b-2505-ud:cline-64k-q6_k_xl"  
export OPENAI_API_KEY="."

open webui openai api 환경변수

export OPENAI_BASE_URL="http://192.168.1.239:3000/api"
export OPENAI_MODEL="sammcj/devstral-small-24b-2505-ud:cline-64k-q6_k_xl"  
export OPENAI_API_KEY="sk-5aec4d12374344f7942217efced322d9"

litellm openai api 환경변수

export OPENAI_BASE_URL="http://192.168.1.239:3333/v1"
export OPENAI_MODEL="qwen3-coder"
export OPENAI_API_KEY="sk-5aec4d12374344f7942217efced322d9"


claude code cli openai api 환경변수(example)

export ANTHROPIC_BASE_URL="http://192.168.1.239:3334"
export ANTHROPIC_API_KEY="onionmixer"

잡다한 스크립트들

continue cli 의 설정파일별 실행 명령

cn --verbose --config ~/.continue/config_to_ollama.yaml
cn --verbose --config ~/.continue/config_to_ollama_openai.yaml
cn --verbose --config ~/.continue/config_to_openai.yaml
cn --verbose --config ~/.continue/config_to_litellm.yaml
cn --verbose --config ~/.continue/config_to_litellm.yaml --exclude Read --exclude Edit --exclude MultiEdit --exclude Write --exclude List --exclude Search --exclude Bash --exclude Fetch --exclude Checklist

기본적으로는 위쪽의 명령어가 맞지만, 각종 테스트를 할 때에는 아래쪽의 명령어도 사용 가능하다.

모델의 상세 정보를 JSON 으로 반환하는 명령어(ollama ollama api case)

curl http://192.168.1.239:11434/api/show -d '{"name": "robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL"}'

이 명령어를 실행하면 모델의 상세 정보가 담긴 긴 JSON이 반환됩니다. 여기서 template이나 parameters 같은 항목을 살펴보면 도구 호출과 관련된 지시어나 설정이 포함되어 있는지 확인할 수 있습니다. 예를 들어, robbiemu/qwen3-coder 모델의 시스템 프롬프트 템플릿에는 "When calling tools: - Prefer batching independent calls in one block..." 와 같은 내용이 포함되어 있어, 이 모델이 도구 사용에 최적화되었음을 알 수 있습니다.

결론적으로, 모델이 사용하는 도구 목록은 Continue CLI와 같은 클라이언트 애플리케이션에 정의된 것이며, curl로 Ollama에 직접 물어봐서 목록을 얻을 수는 없습니다.


continue cli 의 특정 버전을 사용하는 방법

npm i -g @continuedev/cli@1.4.40

사용 환경에 따라 다르지만, root 에서 continue cli 를 설치했다면, 이후에도 root 에서 진행하면 된다.


docker log 보는법

docker logs --follow --timestamps ollama
docker logs --follow --timestamps open-webui
docker logs --follow --timestamps litellm


docker 의 재시작

docker kill litellm ; docker start litellm ; docker stats


claude code proxy 의 동작을 테스트하기 위한 curl 스크립트

curl -sS http://192.168.1.239:3334/v1/messages \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer onionmixer" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 20480,
    "messages": [{"role":"user","content":"hello"}]
  }'

설정 예제들

litellm 에서 사용할 config.yaml

적어도 이렇게 세팅해야 cli 도구에서는 채팅이라도 가능. 아니면 그냥 동작 불가수준.

model_list:
  - model_name: qwen3-coder  # 사용자가 호출할 모델 이름
    litellm_params:
      model: ollama/robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL # 실제 라우팅될 모델 (ollama/모델명 형식)
      api_base: http://host.docker.internal:11434 # Ollama 컨테이너 주소
      drop_params: true
      additional_drop_params:
        - response_format       # ← format=json 매핑 차단
        - tools                 # ← 툴 신호도 원치 않으면 함께 드롭(선택)
        - tool_choice           # ← 선택

  - model_name: nomic-embed-text # 임베딩 모델 예시
    litellm_params:
      model: ollama/nomic-embed-text
      api_base: http://host.docker.internal:11434

router_settings:
  # LiteLLM이 응답에서 "ollama/" 접두사를 제거하도록 설정
  remove_model_name_prefix: true

litellm_settings:
  drop_params: true        # 미지원/혼선 유발 파라미터 제거
  set_verbose: true


continue(vscod) 를 위한 config.yaml

name: Local via Ollama
version: 0.0.1
schema: v1
models:
  - name: Qwen3 Coder (Remote)
    provider: openai
    model: robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
    apiBase: http://192.168.1.239:3000/api
    apiKey: sk-5aec4d12374344f7942217efced322d9
    roles:
      - chat
      - edit
      - apply
      - autocomplete


continue cli 를 위한 ollama ollama api 를 위한 config_to_ollama.yaml

name: Local via Ollama
version: 0.0.1
schema: v1
models:
  - name: Qwen3 Coder Ollama
    provider: ollama
    model: robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
    baseURL: "http://192.168.1.239:11434"
    useLegacyCompletionsEndpoint: false

tools:
  exclude:
    - Fetch
    - Search
  allow:
    - Read
    - Write
    - Edit

prompts:
  - name: default
    description: "Custom default prompt without tools-prepared info"
    prompt: |
      {{ user_content | remove_tools_prepared }}
      # (커스텀 프롬프트; 도구 준비 정보 삽입 없음)

logging.level: debug

continue cli 를 위한 ollama openai api를 위한 config_to_ollama_openai.yaml

name: Local via Ollama
version: 0.0.1
schema: v1
models:
  - name: Qwen3 Coder Ollama(openAI)
    provider: openai
    model: robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
    apiBase: "http://192.168.1.239:11434/v1"
    useLegacyCompletionsEndpoint: false

continue cli 를 위한 open webui openai api 를 위한 config_to_openai.yaml

name: Local via Ollama
version: 0.0.1
schema: v1
models:
  - name: Qwen3 Coder Open webUI
    provider: openai
    model: robbiemu/qwen3-coder:30b-a3b-i-q4_K_XL
    apiBase: "http://192.168.1.239:3000/api/"
    apiKey: sk-5aec4d12374344f7942217efced322d9
    useLegacyCompletionsEndpoint: false

tools:
  exclude:
    - Fetch
    - Search
  allow:
    - Read
    - Write
    - Edit

prompts:
  - name: default
    description: "Custom default prompt without tools-prepared info"
    prompt: |
      {{ user_content | remove_tools_prepared }}
      # (커스텀 프롬프트; 도구 준비 정보 삽입 없음)

logging.level: debug

continue cli 를 위한 litelm openai api 를 위한 config_to_litellm.yaml

name: Local via Ollama
version: 0.0.1
schema: v1
models:
  - name: Qwen3 Coder liteLLM
    provider: openai
    model: qwen3-coder
    apiBase: "http://192.168.1.239:3333/v1"
    useLegacyCompletionsEndpoint: false

tools:
  exclude:
    - Fetch
    - Search
  allow:
    - Read
    - Write
    - Edit

prompts:
  - name: default
    description: "Custom default prompt without tools-prepared info"
    prompt: |
      {{ user_content | remove_tools_prepared }}
      # (커스텀 프롬프트; 도구 준비 정보 삽입 없음)

logging.level: debug


claude code proxy 에서 사용하는 .env 파일

중요한 포인트가 있는데, 쌍따옴표 사용할 필요 없고, 빈칸도 필요없고, # 을 이용한 주석도 사용해서는 안된다.

OPENAI_API_KEY=.
OPENAI_BASE_URL=http://host.docker.internal:11434/v1
BIG_MODEL=sammcj/devstral-small-24b-2505-ud:cline-64k-q6_k_xl
SMALL_MODEL=sammcj/devstral-small-24b-2505-ud:cline-64k-q6_k_xl
ANTHROPIC_API_KEY=onionmixer
PREFERRED_PROVIDER=openai
HOST=0.0.0.0
PORT=8082
LOG_LEVEL=DEBUG
MAX_TOKENS_LIMIT=20480
REQUEST_TIMEOUT=90

참고자료