Mulai Bikin Jarvis di PC dari app.py: Kode Pertama yang Bisa Langsung Dipakai
Kalau ingin membuat AI seperti Jarvis, jangan mulai dari voice cloning, model besar, atau dashboard futuristik. Mulailah dari satu file sederhana: app.py. File ini menjadi pusat kontrol yang menerima perintah, memilih fungsi, lalu menjalankan tindakan di Windows.
Versi pertama di artikel ini sengaja dibuat tanpa API key dan tanpa library tambahan. Tujuannya sederhana: pembaca yang baru belajar Python bisa benar-benar menjalankannya hari ini, lalu mengembangkan fitur satu per satu setelah fondasinya bekerja.
Apa yang perlu disiapkan?
Gunakan Windows 10 atau Windows 11 dan install Python 3 dari situs resmi Python. Saat installer muncul, centang Add Python to PATH supaya perintah python bisa dipakai dari Command Prompt atau PowerShell.
Buat folder project
Buat folder baru, misalnya:
D:\jarvis-mini
Masuk ke folder tersebut, lalu buat file bernama:
app.py
Kalau menggunakan VS Code, pilih File → Open Folder, buka folder jarvis-mini, lalu buat file app.py dari panel Explorer.
Isi app.py dengan kode lengkap ini
from pathlib import Path
from datetime import datetime
import os
import shutil
import subprocess
import webbrowser
APP_NAME = "Jarvis Mini"
BASE_DIR = Path.home()
NOTES_FILE = BASE_DIR / "jarvis_notes.txt"
ALLOWED_FOLDERS = {
"downloads": BASE_DIR / "Downloads",
"documents": BASE_DIR / "Documents",
"desktop": BASE_DIR / "Desktop",
}
APPS = {
"notepad": ["notepad.exe"],
"calculator": ["calc.exe"],
"explorer": ["explorer.exe"],
}
WEBSITES = {
"google": "https://www.google.com",
"youtube": "https://www.youtube.com",
"gmail": "https://mail.google.com",
}
def say(message):
print(f"Jarvis: {message}")
def open_app(name):
command = APPS.get(name)
if not command:
return f"Aplikasi '{name}' belum ada di whitelist."
subprocess.Popen(command)
return f"Membuka {name}."
def open_folder(name):
path = ALLOWED_FOLDERS.get(name)
if not path:
return f"Folder '{name}' belum diizinkan."
path.mkdir(parents=True, exist_ok=True)
os.startfile(path)
return f"Membuka folder {name}."
def open_website(name):
url = WEBSITES.get(name)
if not url:
return f"Website '{name}' belum terdaftar."
webbrowser.open(url)
return f"Membuka {name}."
def storage_info():
total, used, free = shutil.disk_usage(BASE_DIR.drive + "\\")
gb = 1024 ** 3
return (
f"Drive {BASE_DIR.drive} terpakai {used/gb:.1f} GB "
f"dari {total/gb:.1f} GB. Sisa {free/gb:.1f} GB."
)
def add_note(text):
if not text.strip():
return "Isi catatan masih kosong."
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M")
with NOTES_FILE.open("a", encoding="utf-8") as file:
file.write(f"[{timestamp}] {text.strip()}\n")
return f"Catatan disimpan di {NOTES_FILE}."
def find_file(keyword):
keyword = keyword.strip().lower()
if len(keyword) < 2:
return "Masukkan minimal 2 karakter untuk pencarian."
results = []
for folder in ALLOWED_FOLDERS.values():
if not folder.exists():
continue
try:
for item in folder.rglob("*"):
if item.is_file() and keyword in item.name.lower():
results.append(item)
if len(results) == 5:
break
except (PermissionError, OSError):
pass
if len(results) == 5:
break
if not results:
return f"Tidak menemukan file dengan kata '{keyword}'."
lines = "\n".join(f"- {item}" for item in results)
return f"Ditemukan {len(results)} file:\n{lines}"
def show_help():
return """Perintah yang bisa dicoba:
- buka notepad
- buka calculator
- buka explorer
- buka downloads
- buka documents
- buka desktop
- buka google
- buka youtube
- buka gmail
- storage
- waktu
- catat beli SSD minggu depan
- cari invoice
- bantuan
- keluar"""
def handle_command(command):
text = command.strip()
lower = text.lower()
if not text:
return "Perintah kosong."
if lower in {"keluar", "exit", "quit"}:
return "__EXIT__"
if lower in {"bantuan", "help"}:
return show_help()
if lower == "waktu":
return datetime.now().strftime(
"Sekarang %H:%M, %d %B %Y."
)
if lower == "storage":
return storage_info()
if lower.startswith("catat "):
return add_note(text[6:])
if lower.startswith("cari "):
return find_file(text[5:])
if lower.startswith("buka "):
target = lower[5:].strip()
if target in APPS:
return open_app(target)
if target in ALLOWED_FOLDERS:
return open_folder(target)
if target in WEBSITES:
return open_website(target)
return f"Saya belum mengenal target '{target}'."
return "Perintah belum dikenali. Ketik 'bantuan'."
def main():
print(f"{APP_NAME} siap.")
print("Ketik 'bantuan' untuk melihat perintah.\n")
while True:
try:
command = input("Anda: ")
result = handle_command(command)
if result == "__EXIT__":
say("Sampai jumpa.")
break
say(result)
except KeyboardInterrupt:
print()
say("Program dihentikan.")
break
except Exception as error:
say(f"Terjadi error: {error}")
if __name__ == "__main__":
main()
Jalankan app.py
Buka terminal di folder jarvis-mini, lalu jalankan:
python app.py
Kalau berhasil, terminal akan menampilkan:
Jarvis Mini siap. Ketik 'bantuan' untuk melihat perintah. Anda:
Coba command berikut satu per satu:
buka notepad buka calculator buka downloads buka google storage waktu catat beli SSD minggu depan cari invoice bantuan keluar
Kenapa kodenya dibuat seperti ini?
Bagian terpenting bukan tampilannya, tetapi struktur handle_command(). Fungsi ini menjadi router: ia membaca teks dari pengguna lalu memilih fungsi yang sesuai.
Nanti ketika kita menambahkan voice input atau LLM, bagian router ini tetap bisa dipakai. Yang berubah hanya sumber inputnya: dari keyboard menjadi suara atau perintah natural language.
Bagian APPS adalah whitelist
Perhatikan bagian ini:
APPS = {
"notepad": ["notepad.exe"],
"calculator": ["calc.exe"],
"explorer": ["explorer.exe"],
}
Jarvis hanya boleh membuka aplikasi yang kita daftarkan. Cara ini lebih aman daripada membiarkan AI menjalankan command shell apa saja.
Kalau ingin menambahkan Paint, misalnya:
"paint": ["mspaint.exe"],
Lalu command-nya menjadi:
buka paint
Bagian folder juga dibatasi
Versi ini hanya mencari file di Downloads, Documents dan Desktop. Kalau ingin menambahkan folder kerja sendiri, tambahkan satu baris:
ALLOWED_FOLDERS = {
"downloads": BASE_DIR / "Downloads",
"documents": BASE_DIR / "Documents",
"desktop": BASE_DIR / "Desktop",
"project": Path(r"D:\Project"),
}
Setelah itu:
buka project cari composer
Bagaimana fungsi pencarian file bekerja?
find_file() memakai Path.rglob() untuk mencari nama file di folder yang sudah diizinkan. Agar pencarian tidak terlalu lama, hasil dibatasi maksimal lima file.
Contoh:
Anda: cari invoice Jarvis: Ditemukan 3 file: - C:\Users\Nama\Downloads\invoice-januari.pdf - C:\Users\Nama\Documents\invoice-client.xlsx - C:\Users\Nama\Desktop\invoice-final.pdf
Catatan disimpan di mana?
Command:
catat beli SSD minggu depan
akan membuat atau menambahkan isi ke file:
C:\Users\Nama\jarvis_notes.txt
Setiap catatan otomatis diberi timestamp. Jadi kita sudah punya fungsi kecil yang benar-benar berguna tanpa database.
Kenapa belum pakai AI atau voice?
Karena kalau fondasi command router belum berjalan, menambahkan speech-to-text, wake word dan LLM hanya membuat debugging lebih sulit. Versi pertama sebaiknya dibuktikan dulu dengan input keyboard.
Untuk melihat bagaimana app.py, voice, local LLM, tool automation dan NPU bisa digabung menjadi satu asisten PC, lihat cara membangun Jarvis di PC. Di halaman ini fokusnya tetap pada app.py yang menjalankan tindakan di Windows.
Setelah app.py berhasil, baru tambahkan fitur satu per satu
Urutan pengembangan yang paling mudah:
Dengan pola ini, project tidak langsung berubah menjadi satu file raksasa yang sulit dirawat.
Kalau error “python is not recognized”
Biasanya Python belum masuk PATH. Tutup terminal, buka installer Python lagi, lalu pilih opsi untuk menambahkan Python ke PATH. Setelah itu buka terminal baru dan cek:
python --version
Kalau tampil versi Python, misalnya Python 3.13.x, environment sudah siap.
Kalau Notepad atau Calculator tidak terbuka
Coba jalankan langsung dari Run Windows:
notepad.exe calc.exe
Kalau command itu gagal juga, berarti masalahnya bukan pada Python. Sesuaikan path aplikasi di dictionary APPS.
Tempat mencari variasi kode dan ide fitur
Setelah versi dasar ini bekerja, ada beberapa komunitas yang bagus untuk melihat cara orang lain menyusun assistant:
Yang perlu ditiru dari komunitas bukan seluruh project sekaligus, tetapi pola strukturnya: command router, whitelist tools, pemisahan modul, serta konfirmasi untuk perintah berisiko.
Target versi pertama sudah tercapai kalau ini bekerja
Kalau python app.py sudah bisa membuka Notepad, mencari file, mengecek storage dan membuat catatan, fondasi Jarvis pertama sudah jadi. Belum bisa bicara, belum punya LLM, dan belum punya memory canggih — tetapi ia sudah bisa melakukan pekerjaan nyata di komputer.
Langkah berikutnya yang paling masuk akal adalah mengganti input keyboard dengan suara tanpa mengubah router yang sudah ada. Dengan begitu, kita menambah satu kemampuan baru tanpa merombak fondasi.
Tidak ada komentar