DEV Community

Hendra Bangun Dwi R
Hendra Bangun Dwi R

Posted on

Panduan Lengkap: Mengakses Ollama Windows dari WSL untuk Pengembangan AI Agent Pendahuluan

Panduan Lengkap: Mengakses Ollama Windows dari WSL untuk Pengembangan AI Agent

Pendahuluan

Ollama adalah platform yang memungkinkan kita menjalankan Large Language Models (LLM) secara lokal di komputer. Bagi developer yang menggunakan Windows dengan WSL (Windows Subsystem for Linux), sering muncul pertanyaan: bagaimana cara terbaik setup Ollama agar bisa diakses dari WSL? Artikel ini akan memandu kamu step-by-step dari instalasi hingga integrasi dengan Python untuk membangun AI agent.

Mengapa Setup Ini Penting?

Setup Ollama di Windows dengan akses dari WSL memberikan beberapa keuntungan:

  • Performa optimal: Ollama native di Windows lebih cepat untuk GPU NVIDIA[11]
  • Fleksibilitas development: Bisa menggunakan tools Linux di WSL sambil memanfaatkan server Windows
  • Efisiensi resource: Satu server melayani Windows dan WSL, hemat RAM
  • Environment konsisten: Development di Linux, deployment mudah

Bagian 1: Instalasi Ollama di Windows

Langkah 1: Download dan Install Ollama

  1. Kunjungi ollama.com/download[12][13]
  2. Download OllamaSetup.exe untuk Windows
  3. Jalankan installer dengan double-click
  4. Ikuti wizard instalasi (tidak perlu hak Administrator)[13]
  5. Ollama akan otomatis berjalan di background setelah instalasi

Alternatif via Winget:

Buka PowerShell sebagai Administrator:[14]

winget install --id Ollama.Ollama
Enter fullscreen mode Exit fullscreen mode

Langkah 2: Verifikasi Instalasi

Buka PowerShell dan cek versi:

ollama -v
Enter fullscreen mode Exit fullscreen mode

Test koneksi:

curl http://localhost:11434
Enter fullscreen mode Exit fullscreen mode

Jika muncul "Ollama is running", instalasi berhasil!

Langkah 3: Download Model AI

Download beberapa model yang akan digunakan:

ollama pull llama3.2
ollama pull mistral
ollama pull gemma3:1b
Enter fullscreen mode Exit fullscreen mode

Model akan tersimpan di %USERPROFILE%\.ollama\models.


Bagian 2: Konfigurasi Ollama Windows untuk Akses dari WSL

Langkah 1: Set Environment Variable OLLAMA_HOST

Agar Ollama bisa diakses dari WSL, kita perlu mengkonfigurasi agar listen di semua network interface.[15][16]

Cara Setting via GUI:

  1. Tekan Win + R, ketik sysdm.cpl, tekan Enter
  2. Klik tab "Advanced"
  3. Klik "Environment Variables"
  4. Di bagian "User variables", klik "New"
  5. Isi form:
    • Variable name: OLLAMA_HOST
    • Variable value: 0.0.0.0:11434
  6. Klik OK pada semua dialog

Cara Setting via PowerShell (Administrator):

[System.Environment]::SetEnvironmentVariable('OLLAMA_HOST', '0.0.0.0:11434', 'User')
Enter fullscreen mode Exit fullscreen mode

Langkah 2: Restart Ollama

Setelah set environment variable, restart aplikasi Ollama:

  1. Klik kanan icon Ollama di system tray (pojok kanan bawah)
  2. Pilih "Exit" atau "Quit"
  3. Tunggu beberapa detik
  4. Buka Ollama lagi dari Start Menu

Langkah 3: Konfigurasi Windows Firewall (Jika Diperlukan)

Jika WSL masih tidak bisa connect, buka port di firewall. Buka PowerShell sebagai Administrator:[17]

New-NetFirewallRule -DisplayName "Ollama WSL Access" -Direction Inbound -LocalPort 11434 -Protocol TCP -Action Allow
Enter fullscreen mode Exit fullscreen mode

Atau untuk interface WSL spesifik:

New-NetFirewallRule -DisplayName "Ollama WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Enter fullscreen mode Exit fullscreen mode

Langkah 4: Verifikasi Ollama Listen di 0.0.0.0

Dari PowerShell, cek apakah Ollama sudah listen di semua interface:

netstat -an | findstr "11434"
Enter fullscreen mode Exit fullscreen mode

Seharusnya muncul:

TCP    0.0.0.0:11434          0.0.0.0:0              LISTENING
Enter fullscreen mode Exit fullscreen mode

Bagian 3: Setup WSL untuk Akses Ollama Windows

Langkah 1: Verifikasi WSL2 Terinstall

Buka PowerShell dan cek versi WSL:

wsl --version
wsl -l -v
Enter fullscreen mode Exit fullscreen mode

Pastikan menggunakan WSL2 (bukan WSL1). Jika belum install:[18][19]

wsl --install
Enter fullscreen mode Exit fullscreen mode

Langkah 2: Dapatkan IP Windows Host dari WSL

Buka terminal WSL (Ubuntu), lalu jalankan:[20][21]

cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
Enter fullscreen mode Exit fullscreen mode

Contoh output: 172.29.176.1

IP ini adalah gateway WSL ke Windows host. Catat IP ini karena akan digunakan untuk koneksi.

Alternatif dengan ip route:

ip route show | grep -i default | awk '{ print $3}'
Enter fullscreen mode Exit fullscreen mode

Langkah 3: Test Koneksi dari WSL ke Ollama Windows

Gunakan IP yang didapat dari langkah 2, test koneksi:

curl http://172.29.176.1:11434
Enter fullscreen mode Exit fullscreen mode

Ganti 172.29.176.1 dengan IP yang kamu dapat!

Jika berhasil, akan muncul: Ollama is running

Jika gagal (Connection refused), periksa:

  • Ollama berjalan di Windows (cek system tray)
  • OLLAMA_HOST sudah di-set ke 0.0.0.0:11434
  • Firewall tidak memblokir

Langkah 4: Set Environment Variable di WSL

Set Manual (untuk session saat ini):

export WINHOST=172.29.176.1  # ganti dengan IP kamu
export OLLAMA_HOST=http://$WINHOST:11434
Enter fullscreen mode Exit fullscreen mode

Set Permanen di .bashrc:

Edit file .bashrc:

nano ~/.bashrc
Enter fullscreen mode Exit fullscreen mode

Tambahkan di akhir file:

# Ollama Windows host configuration
export WINHOST=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
export OLLAMA_HOST=http://$WINHOST:11434
Enter fullscreen mode Exit fullscreen mode

Save dengan Ctrl+O, Enter, lalu Ctrl+X.

Reload configuration:

source ~/.bashrc
Enter fullscreen mode Exit fullscreen mode

Langkah 5: Verifikasi Environment Variable

Cek apakah variable ter-set dengan benar:

echo "Windows Host IP: $WINHOST"
echo "Ollama Host: $OLLAMA_HOST"
Enter fullscreen mode Exit fullscreen mode

Test koneksi dengan variable:

curl $OLLAMA_HOST
Enter fullscreen mode Exit fullscreen mode

Langkah 6: Install Ollama CLI di WSL (Opsional)

Jika ingin menggunakan command ollama dari WSL:[22][18]

curl -fsSL https://ollama.com/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Catatan: Ini hanya install CLI, bukan server. Server tetap di Windows.

Test Ollama CLI:

ollama list
ollama run gemma3:1b
Enter fullscreen mode Exit fullscreen mode

Bagian 4: Integrasi dengan Python untuk AI Agent

Langkah 1: Setup Project Python

Buat direktori project:

mkdir ollamaAgent
cd ollamaAgent
Enter fullscreen mode Exit fullscreen mode

Install uv (Python package manager):

curl -LsSf https://astral.sh/uv/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Langkah 2: Inisialisasi Project

uv init
uv add openai python-dotenv langfuse
Enter fullscreen mode Exit fullscreen mode

Langkah 3: Buat File .env

Buat file .env untuk konfigurasi:[23]

nano .env
Enter fullscreen mode Exit fullscreen mode

Isi dengan:

# Ollama Configuration
OLLAMA_OPENAI_BASE_URL=http://172.29.176.1:11434/v1
OLLAMA_CHAT_MODEL=gemma3:1b

# Langfuse Keys (untuk monitoring)
LANGFUSE_PUBLIC_KEY=your_public_key
LANGFUSE_SECRET_KEY=your_secret_key
Enter fullscreen mode Exit fullscreen mode

Ganti 172.29.176.1 dengan IP Windows host kamu!

Langkah 4: Buat File Python (main.py)

Buat file Python dengan kode lengkap:[24][25]

import os
import sys
from typing import List

from dotenv import load_dotenv
from langfuse.openai import OpenAI


def require_env(var_name: str) -> str:
    """Validate required environment variables"""
    value = os.getenv(var_name)
    if not value:
        raise RuntimeError(f"Missing required environment variable: {var_name}")
    return value


def get_windows_host_ip() -> str:
    """
    Dapatkan IP Windows host dari /etc/resolv.conf atau ip route
    """
    # Method 1: resolv.conf
    try:
        with open('/etc/resolv.conf', 'r') as f:
            for line in f:
                if 'nameserver' in line:
                    ip = line.split()[1].strip()
                    if ip and not ip.startswith('127.'):
                        return ip
    except Exception as e:
        print(f"Warning: Could not read resolv.conf: {e}")

    # Method 2: ip route (fallback)
    try:
        import subprocess
        result = subprocess.run(
            ['ip', 'route', 'show', 'default'],
            capture_output=True,
            text=True,
            timeout=2
        )
        if result.returncode == 0:
            for word in result.stdout.split():
                if '.' in word and not word.startswith('127.'):
                    return word
    except Exception as e:
        print(f"Warning: Could not get IP from route: {e}")

    # Fallback: return localhost
    return "localhost"


def get_openai_client_for_ollama() -> OpenAI:
    """
    Configure OpenAI-compatible client untuk Ollama
    dengan auto-detection Windows host IP
    """
    base_url = os.getenv("OLLAMA_OPENAI_BASE_URL")

    if not base_url:
        windows_ip = get_windows_host_ip()
        base_url = f"http://{windows_ip}:11434/v1"

    print(f"Connecting to Ollama at: {base_url}")

    return OpenAI(
        base_url=base_url, 
        api_key=os.getenv("OPENAI_API_KEY", "ollama")
    )


def verify_ollama_connection(base_url: str) -> bool:
    """
    Verifikasi koneksi ke Ollama sebelum memulai chat
    """
    import urllib.request
    import urllib.error

    # Hapus /v1 untuk health check
    health_url = base_url.replace('/v1', '').rstrip('/')

    try:
        print(f"Verifying connection to Ollama at {health_url}...", end=" ")
        with urllib.request.urlopen(health_url, timeout=5) as response:
            if response.status == 200:
                print("✓ Connected!")
                return True
    except urllib.error.URLError as e:
        print(f"✗ Failed!")
        print(f"\nError: Cannot connect to Ollama at {health_url}")
        print(f"Details: {e}")
        print("\nPastikan:")
        print("1. Ollama berjalan di Windows (cek system tray)")
        print("2. OLLAMA_HOST di Windows sudah diset ke 0.0.0.0:11434")
        print("3. Windows Firewall tidak memblokir port 11434")
        print(f"\nTest manual dengan: curl {health_url}")
        return False
    except Exception as e:
        print(f"✗ Failed!")
        print(f"\nUnexpected error: {e}")
        return False


def chat_stream_repl(client: OpenAI, model: str, system_prompt: str) -> None:
    """
    Interactive REPL dengan streaming dan conversation memory
    """
    print(f"\nStarting streaming chat with model '{model}'.")
    print("Type 'exit', 'quit', or ':q' to quit.\n")
    print("=" * 50)

    messages = [{"role": "system", "content": system_prompt}]

    while True:
        try:
            user = input("\nYou: ").strip()
            if user.lower() in {"exit", "quit", ":q"}:
                print("Bye!")
                return
            if not user:
                continue

            messages.append({"role": "user", "content": user})

            # Stream assistant response
            print("Assistant: ", end="", flush=True)
            full_content_parts: List[str] = []

            try:
                stream = client.chat.completions.create(
                    model=model,
                    messages=messages,
                    stream=True,
                )

                for event in stream:
                    try:
                        delta = event.choices[0].delta.content or ""
                    except Exception:
                        delta = ""
                    if delta:
                        full_content_parts.append(delta)
                        sys.stdout.write(delta)
                        sys.stdout.flush()

                assistant_content = "".join(full_content_parts).strip()
                print()  # newline
                messages.append({"role": "assistant", "content": assistant_content})

            except Exception as e:
                print(f"\n\nError during chat: {e}")
                print("Pastikan Ollama masih berjalan di Windows.")
                messages.pop()  # Hapus user message terakhir

        except KeyboardInterrupt:
            print("\n\nInterrupted. Bye!")
            return
        except EOFError:
            print("\n\nEOF. Bye!")
            return


def main() -> None:
    # Load .env file
    load_dotenv(override=False)

    # Required untuk Langfuse tracing
    require_env("LANGFUSE_PUBLIC_KEY")
    require_env("LANGFUSE_SECRET_KEY")

    # Inisialisasi client
    client = get_openai_client_for_ollama()

    # Verify connection
    base_url = client.base_url if hasattr(client, 'base_url') else None
    if base_url:
        if not verify_ollama_connection(str(base_url)):
            sys.exit(1)

    # Start interactive chat
    chat_model = os.getenv("OLLAMA_CHAT_MODEL", "gemma3:1b")
    chat_stream_repl(
        client=client,
        model=chat_model,
        system_prompt="Anda adalah asisten yang ringkas, membantu, dan sopan. Jawab dalam Bahasa Indonesia secara singkat.",
    )


if __name__ == "__main__":
    main()
Enter fullscreen mode Exit fullscreen mode

Langkah 5: Jalankan AI Agent

uv run python main.py
Enter fullscreen mode Exit fullscreen mode

Output yang diharapkan:

Connecting to Ollama at: http://172.29.176.1:11434/v1
Verifying connection to Ollama at http://172.29.176.1:11434... ✓ Connected!

Starting streaming chat with model 'gemma3:1b'.
Type 'exit', 'quit', or ':q' to quit.

==================================================

You: 
Enter fullscreen mode Exit fullscreen mode

Bagian 5: Troubleshooting

Problem 1: Connection Refused dari WSL

Gejala:

curl: (7) Failed to connect to 172.29.176.1 port 11434: Connection refused
Enter fullscreen mode Exit fullscreen mode

Solusi:

  1. Cek Ollama running di Windows:

    • Lihat icon di system tray
    • Dari PowerShell: ollama list
  2. Cek OLLAMA_HOST di Windows:

   $env:OLLAMA_HOST
Enter fullscreen mode Exit fullscreen mode

Harus return: 0.0.0.0:11434

  1. Restart Ollama Windows:

    • Exit dari system tray
    • Buka lagi dari Start Menu
  2. Test dari Windows dulu:

   curl http://localhost:11434
Enter fullscreen mode Exit fullscreen mode

Problem 2: Python Script Connect ke localhost Bukan Windows IP

Gejala:

Connecting to Ollama at: http://localhost:11434/v1
✗ Failed!
Enter fullscreen mode Exit fullscreen mode

Solusi:

  1. Cek file .env:
   cat .env | grep OLLAMA_OPENAI_BASE_URL
Enter fullscreen mode Exit fullscreen mode

Pastikan ada dan benar:

   OLLAMA_OPENAI_BASE_URL=http://172.29.176.1:11434/v1
Enter fullscreen mode Exit fullscreen mode
  1. Set manual sebelum run:
   export OLLAMA_OPENAI_BASE_URL=http://172.29.176.1:11434/v1
   uv run python main.py
Enter fullscreen mode Exit fullscreen mode
  1. Debug: print environment variable: Tambahkan di awal main():
   print(f"DEBUG - OLLAMA_OPENAI_BASE_URL: {os.getenv('OLLAMA_OPENAI_BASE_URL')}")
   print(f"DEBUG - Windows Host IP: {get_windows_host_ip()}")
Enter fullscreen mode Exit fullscreen mode

Problem 3: IP Windows Berubah Setelah Restart

Penyebab: IP WSL dinamis dan bisa berubah.[20]

Solusi: Gunakan script dinamis di .bashrc yang sudah dijelaskan di Bagian 3, Langkah 4.

Problem 4: Firewall Memblokir Koneksi

Gejala: Timeout saat curl dari WSL.

Solusi: Buka port di Windows Firewall (PowerShell Administrator):

New-NetFirewallRule -DisplayName "Ollama WSL Access" -Direction Inbound -LocalPort 11434 -Protocol TCP -Action Allow
Enter fullscreen mode Exit fullscreen mode

Atau allow semua untuk WSL interface:

New-NetFirewallRule -DisplayName "Ollama WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Enter fullscreen mode Exit fullscreen mode

Problem 5: Model Tidak Ditemukan

Gejala:

Error: model 'gemma3:1b' not found
Enter fullscreen mode Exit fullscreen mode

Solusi:

  1. Cek model available di Windows:
   ollama list
Enter fullscreen mode Exit fullscreen mode
  1. Download model jika belum ada:
   ollama pull gemma3:1b
Enter fullscreen mode Exit fullscreen mode
  1. Update .env dengan model yang ada:
   OLLAMA_CHAT_MODEL=llama3.2
Enter fullscreen mode Exit fullscreen mode

Problem 6: Environment Variable Tidak Ter-load

Gejala: Variable kosong meskipun sudah di-set di .bashrc.

Solusi:

  1. Reload .bashrc:
   source ~/.bashrc
Enter fullscreen mode Exit fullscreen mode
  1. Cek apakah ter-set:
   echo $OLLAMA_HOST
   echo $WINHOST
Enter fullscreen mode Exit fullscreen mode
  1. Jika masih kosong, cek syntax di .bashrc:
   cat ~/.bashrc | tail -5
Enter fullscreen mode Exit fullscreen mode

Bagian 6: Best Practices dan Tips

Performa

  1. Gunakan model kecil untuk development (gemma3:1b, phi3) untuk response cepat
  2. Model besar untuk production (llama3.2:8b, mistral:7b) untuk kualitas lebih baik[11]
  3. Monitor GPU usage di Windows Task Manager untuk optimasi

Development Workflow

  1. VS Code dengan Remote-WSL untuk coding di WSL
  2. Jupyter Notebook di WSL untuk prototyping AI agent
  3. Git repository di WSL untuk version control
  4. Docker di WSL untuk containerization (jika diperlukan)

Resource Management

  1. Tutup model yang tidak digunakan untuk free memory:
   ollama stop model_name
Enter fullscreen mode Exit fullscreen mode
  1. Set context window di API call untuk kontrol memory:
   stream = client.chat.completions.create(
       model=model,
       messages=messages,
       stream=True,
       options={"num_ctx": 2048}  # sesuaikan dengan kebutuhan
   )
Enter fullscreen mode Exit fullscreen mode

Keamanan

  1. Jangan expose Ollama ke internet - binding 0.0.0.0 hanya untuk WSL local network
  2. Gunakan .env file dan tambahkan ke .gitignore untuk API keys
  3. Validasi input dari user sebelum kirim ke LLM

Monitoring dan Logging

  1. Gunakan Langfuse untuk monitoring LLM calls (sudah terintegrasi di code)
  2. Log errors ke file untuk debugging:
   import logging
   logging.basicConfig(filename='ollama_agent.log', level=logging.ERROR)
Enter fullscreen mode Exit fullscreen mode
  1. Monitor latency untuk optimize response time

Kesimpulan

Setup Ollama di Windows dengan akses dari WSL memberikan fleksibilitas maksimal untuk development AI agent. Dengan mengikuti panduan ini, kamu bisa:

  • ✅ Menjalankan Ollama dengan performa optimal di Windows
  • ✅ Mengakses dari WSL untuk development dengan tools Linux
  • ✅ Integrasi dengan Python menggunakan OpenAI-compatible API
  • ✅ Build AI agent dengan streaming response dan conversation memory
  • ✅ Troubleshoot masalah koneksi dengan systematic approach

Kunci sukses setup ini adalah:

  1. OLLAMA_HOST di Windows harus di-set ke 0.0.0.0:11434
  2. OLLAMA_OPENAI_BASE_URL di WSL harus point ke IP Windows yang benar
  3. Firewall tidak boleh memblokir port 11434
  4. Environment variables harus ter-load dengan benar

Dengan setup ini, kamu siap mengembangkan AI agent yang powerful menggunakan local LLM tanpa depend pada cloud services. Selamat coding!


Referensi Cepat

Windows - Set OLLAMA_HOST:

[System.Environment]::SetEnvironmentVariable('OLLAMA_HOST', '0.0.0.0:11434', 'User')
Enter fullscreen mode Exit fullscreen mode

WSL - Get Windows IP:

cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
Enter fullscreen mode Exit fullscreen mode

WSL - Set di .bashrc:

export WINHOST=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
export OLLAMA_HOST=http://$WINHOST:11434
Enter fullscreen mode Exit fullscreen mode

Python - OpenAI Client:

client = OpenAI(
    base_url='http://172.29.176.1:11434/v1',
    api_key='ollama'
)
Enter fullscreen mode Exit fullscreen mode

Test Koneksi:

curl http://172.29.176.1:11434  # ganti dengan IP kamu
Enter fullscreen mode Exit fullscreen mode

Firewall Rule:

New-NetFirewallRule -DisplayName "Ollama WSL Access" -Direction Inbound -LocalPort 11434 -Protocol TCP -Action Allow
Enter fullscreen mode Exit fullscreen mode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

Top comments (0)