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
- Kunjungi ollama.com/download[12][13]
- Download
OllamaSetup.exeuntuk Windows - Jalankan installer dengan double-click
- Ikuti wizard instalasi (tidak perlu hak Administrator)[13]
- Ollama akan otomatis berjalan di background setelah instalasi
Alternatif via Winget:
Buka PowerShell sebagai Administrator:[14]
winget install --id Ollama.Ollama
Langkah 2: Verifikasi Instalasi
Buka PowerShell dan cek versi:
ollama -v
Test koneksi:
curl http://localhost:11434
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
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:
- Tekan
Win + R, ketiksysdm.cpl, tekan Enter - Klik tab "Advanced"
- Klik "Environment Variables"
- Di bagian "User variables", klik "New"
- Isi form:
- Variable name:
OLLAMA_HOST - Variable value:
0.0.0.0:11434
- Variable name:
- Klik OK pada semua dialog
Cara Setting via PowerShell (Administrator):
[System.Environment]::SetEnvironmentVariable('OLLAMA_HOST', '0.0.0.0:11434', 'User')
Langkah 2: Restart Ollama
Setelah set environment variable, restart aplikasi Ollama:
- Klik kanan icon Ollama di system tray (pojok kanan bawah)
- Pilih "Exit" atau "Quit"
- Tunggu beberapa detik
- 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
Atau untuk interface WSL spesifik:
New-NetFirewallRule -DisplayName "Ollama WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Langkah 4: Verifikasi Ollama Listen di 0.0.0.0
Dari PowerShell, cek apakah Ollama sudah listen di semua interface:
netstat -an | findstr "11434"
Seharusnya muncul:
TCP 0.0.0.0:11434 0.0.0.0:0 LISTENING
Bagian 3: Setup WSL untuk Akses Ollama Windows
Langkah 1: Verifikasi WSL2 Terinstall
Buka PowerShell dan cek versi WSL:
wsl --version
wsl -l -v
Pastikan menggunakan WSL2 (bukan WSL1). Jika belum install:[18][19]
wsl --install
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 }'
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}'
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
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_HOSTsudah di-set ke0.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
Set Permanen di .bashrc:
Edit file .bashrc:
nano ~/.bashrc
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
Save dengan Ctrl+O, Enter, lalu Ctrl+X.
Reload configuration:
source ~/.bashrc
Langkah 5: Verifikasi Environment Variable
Cek apakah variable ter-set dengan benar:
echo "Windows Host IP: $WINHOST"
echo "Ollama Host: $OLLAMA_HOST"
Test koneksi dengan variable:
curl $OLLAMA_HOST
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
Catatan: Ini hanya install CLI, bukan server. Server tetap di Windows.
Test Ollama CLI:
ollama list
ollama run gemma3:1b
Bagian 4: Integrasi dengan Python untuk AI Agent
Langkah 1: Setup Project Python
Buat direktori project:
mkdir ollamaAgent
cd ollamaAgent
Install uv (Python package manager):
curl -LsSf https://astral.sh/uv/install.sh | sh
Langkah 2: Inisialisasi Project
uv init
uv add openai python-dotenv langfuse
Langkah 3: Buat File .env
Buat file .env untuk konfigurasi:[23]
nano .env
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
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()
Langkah 5: Jalankan AI Agent
uv run python main.py
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:
Bagian 5: Troubleshooting
Problem 1: Connection Refused dari WSL
Gejala:
curl: (7) Failed to connect to 172.29.176.1 port 11434: Connection refused
Solusi:
-
Cek Ollama running di Windows:
- Lihat icon di system tray
- Dari PowerShell:
ollama list
Cek OLLAMA_HOST di Windows:
$env:OLLAMA_HOST
Harus return: 0.0.0.0:11434
-
Restart Ollama Windows:
- Exit dari system tray
- Buka lagi dari Start Menu
Test dari Windows dulu:
curl http://localhost:11434
Problem 2: Python Script Connect ke localhost Bukan Windows IP
Gejala:
Connecting to Ollama at: http://localhost:11434/v1
✗ Failed!
Solusi:
- Cek file .env:
cat .env | grep OLLAMA_OPENAI_BASE_URL
Pastikan ada dan benar:
OLLAMA_OPENAI_BASE_URL=http://172.29.176.1:11434/v1
- Set manual sebelum run:
export OLLAMA_OPENAI_BASE_URL=http://172.29.176.1:11434/v1
uv run python main.py
-
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()}")
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
Atau allow semua untuk WSL interface:
New-NetFirewallRule -DisplayName "Ollama WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
Problem 5: Model Tidak Ditemukan
Gejala:
Error: model 'gemma3:1b' not found
Solusi:
- Cek model available di Windows:
ollama list
- Download model jika belum ada:
ollama pull gemma3:1b
- Update .env dengan model yang ada:
OLLAMA_CHAT_MODEL=llama3.2
Problem 6: Environment Variable Tidak Ter-load
Gejala: Variable kosong meskipun sudah di-set di .bashrc.
Solusi:
- Reload .bashrc:
source ~/.bashrc
- Cek apakah ter-set:
echo $OLLAMA_HOST
echo $WINHOST
- Jika masih kosong, cek syntax di .bashrc:
cat ~/.bashrc | tail -5
Bagian 6: Best Practices dan Tips
Performa
- Gunakan model kecil untuk development (gemma3:1b, phi3) untuk response cepat
- Model besar untuk production (llama3.2:8b, mistral:7b) untuk kualitas lebih baik[11]
- Monitor GPU usage di Windows Task Manager untuk optimasi
Development Workflow
- VS Code dengan Remote-WSL untuk coding di WSL
- Jupyter Notebook di WSL untuk prototyping AI agent
- Git repository di WSL untuk version control
- Docker di WSL untuk containerization (jika diperlukan)
Resource Management
- Tutup model yang tidak digunakan untuk free memory:
ollama stop model_name
- 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
)
Keamanan
-
Jangan expose Ollama ke internet - binding
0.0.0.0hanya untuk WSL local network -
Gunakan
.envfile dan tambahkan ke.gitignoreuntuk API keys - Validasi input dari user sebelum kirim ke LLM
Monitoring dan Logging
- Gunakan Langfuse untuk monitoring LLM calls (sudah terintegrasi di code)
- Log errors ke file untuk debugging:
import logging
logging.basicConfig(filename='ollama_agent.log', level=logging.ERROR)
- 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:
-
OLLAMA_HOST di Windows harus di-set ke
0.0.0.0:11434 - OLLAMA_OPENAI_BASE_URL di WSL harus point ke IP Windows yang benar
- Firewall tidak boleh memblokir port 11434
- 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')
WSL - Get Windows IP:
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'
WSL - Set di .bashrc:
export WINHOST=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
export OLLAMA_HOST=http://$WINHOST:11434
Python - OpenAI Client:
client = OpenAI(
base_url='http://172.29.176.1:11434/v1',
api_key='ollama'
)
Test Koneksi:
curl http://172.29.176.1:11434 # ganti dengan IP kamu
Firewall Rule:
New-NetFirewallRule -DisplayName "Ollama WSL Access" -Direction Inbound -LocalPort 11434 -Protocol TCP -Action Allow
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)