Antonius Felix
AI WorkflowHarvey

Harvey: AI Sales Agent Open Source dan Cara Memakainya

Oct 16, 2026/12 min read/Harvey, AI Agent, Sales, Open Source, Email
Harvey sebagai asisten riset dan draf penjualan dengan keputusan kirim tetap diperiksa manusia
Visual orisinal, bukan tangkapan layar aplikasi.

Harvey adalah asisten AI untuk pekerjaan penjualan. Tujuannya membantu Anda mencari calon pelanggan, memahami bisnis mereka, lalu menyiapkan pesan penawaran yang sesuai. Misalnya, Anda punya produk yang bagus, tetapi masih menghabiskan banyak waktu mencari bisnis yang mungkin membutuhkannya.

Harvey membantu mengerjakan bagian awal itu. Ia juga bisa membantu mengelola tindak lanjut melalui layanan email yang sudah Anda hubungkan. Anda tetap memeriksa pesan dan memutuskan apakah pesan layak dikirim. Harvey bukan jaminan mendapat pelanggan atau rapat baru.

Yang dibahas di sini adalah proyek kode terbuka milik ethanplusai, bukan Harvey AI untuk pekerjaan hukum. Programnya berjalan di komputer sendiri, tetapi tetap memakai layanan model AI dan integrasi lain. Mulailah sebagai asisten riset dan penyusun draf, bukan mesin pengirim otomatis.

Harvey bisa membantu apa saja?

  • Mencari calon pelanggan. Harvey mencari bisnis dari sumber yang tersedia. Di panduan ini, calon pelanggan juga disebut prospek.
  • Membaca informasi produk dan bisnis. Informasi produk Anda menjadi bahan penawaran. Situs calon pelanggan memberi konteks, tetapi hasil bacaan tetap perlu diperiksa.
  • Menyusun pesan penawaran. Harvey membuat draf berdasarkan informasi tadi. Nama, harga, dan klaim manfaat bisa salah; jangan langsung mengirim hasilnya.
  • Membantu tindak lanjut. Setelah layanan email dihubungkan dan diatur, Harvey dapat membantu mengirim serta menangani balasan. Pengiriman bukan otomatis aman hanya karena integrasinya tersedia.

Pada jalur email bawaan atau native, pesan dapat masuk ke Outbox, yaitu kotak antrean pesan, untuk diperiksa sebelum dikirim. Pertahankan pengaturan persetujuan manusia. Integrasi lama (legacy) Instantly memakai jalur terpisah; jangan menganggap persetujuan Outbox melindungi kampanye di sana juga.

Harvey belum bisa memilih waktu kosong dan memesan rapat secara otomatis pada kode yang diperiksa. Ia bisa mencantumkan tautan booking, tetapi mengirim tautan bukan berarti rapat sudah terjadwal.

Contoh fiktif: produk booking untuk studio yoga

Misalkan Anda menjual JadwalRapi, produk fiktif untuk membantu studio yoga mengelola reservasi. Anda ingin menawarkan produk kepada pemilik studio di satu kota. Itulah ICP (ideal customer profile), atau profil pelanggan ideal: batas siapa yang ingin Anda bantu, bukan semua bisnis.

Harvey dapat membantu menyiapkan daftar bisnis yang mungkin cocok, catatan dari situsnya, dan draf pesan. Contoh draf: “Di halaman jadwal yang saya baca, reservasi masih diarahkan ke pesan manual. Apakah saat ini memang begitu?”

Hasil yang Anda periksa adalah daftar calon pelanggan, catatan riset, dan draf penawaran, bukan janji penjualan. Tidak menemukan tombol booking belum membuktikan studio tidak punya sistem reservasi. Jangan mengarang manfaat seperti peningkatan omzet tanpa bukti.

Contoh ini hanya skenario belajar, bukan hasil penjualan penulis. Sebelum menghubungi orang sungguhan, periksa relevansi, izin yang diperlukan, dan daftar kontak yang meminta tidak dihubungi lagi. Uji kirim harus ke inbox sendiri dalam lingkungan terisolasi. Jika penerima berminat, manusia dapat melanjutkan percakapan atau memberi tautan booking.

Cocok untuk siapa?

Cocok untuk pemilik produk atau tim kecil yang penawarannya sudah jelas dan tahu siapa calon pelanggannya. Anda juga perlu nyaman mengikuti perintah terminal dan memeriksa pengaturan, atau didampingi orang teknis.

Kurang cocok bila Anda mencari aplikasi tinggal klik, jaminan alamat email valid, jaminan masuk inbox, atau pemesanan rapat otomatis. Jangan memakainya untuk mengirim massal ke daftar yang asal-usul dan izinnya tidak jelas.

Kemampuan dan batas yang benar-benar ada

API adalah penghubung antarprogram. Sebagian layanan meminta API key, yaitu kunci akses rahasia. Istilah ini muncul pada integrasi di bawah.

Bagian Implementasi yang tersedia Batas penting
Riset bisnis Pencarian bisnis (discovery) dari OpenStreetMap dan penyedia tambahan; pembacaan situs dan pencocokan profil pelanggan Sumber tidak lengkap; petunjuk dari situs, disebut sinyal, perlu diperiksa
Penulisan Bagian program berbagi tugas riset, penulisan, pengiriman, dan penanganan balasan Hasil model dapat salah, termasuk harga, nama, dan klaim produk
Email native Gmail, Microsoft 365, SMTP/IMAP; Outbox dengan persetujuan, penjadwalan, penanganan balasan require_approval perlu dipertahankan; kredensial dan batas provider tetap berlaku
Instantly Integrasi kampanye dan balasan melalui API Jalur legacy terpisah; jangan menganggap pagar persetujuan Outbox native berlaku di sini
Kontrol Batas kirim, quiet hours, pause pengiriman native, status, dashboard, ekspor CSV Bukan pengganti pengawasan; hentikan juga kampanye eksternal bila memakai Instantly
Kalender Tautan booking dapat dicantumkan dalam penawaran CalendarClient masih placeholder; tidak mencari slot atau memesan rapat sungguhan
LinkedIn Kode otomasi browser dan kredensial tersedia Risiko pelanggaran ketentuan platform dan pembatasan akun; panduan ini menonaktifkannya

Tabel ini merangkum kode yang diperiksa, bukan jaminan semua integrasi sudah berhasil diuji. Rincian sumber dan batas pengujian ada di akhir artikel.

Riset dan draf tersedia; Outbox native perlu persetujuan; kalender otomatis belum tersedia
Peta kemampuan orisinal. Persetujuan native tidak boleh diasumsikan melindungi kampanye Instantly.

Sebelum tutorial: apa yang perlu disiapkan?

Siapkan komputer, akses terminal, Git, Python 3.11+, serta Claude Code dengan akun yang sesuai. Terminal adalah tempat mengetik perintah dalam kotak kode di bawah. Instalasi ini bukan aplikasi yang cukup dibuka lalu langsung dipakai.

Siapkan juga situs produk milik sendiri dan akun email uji, bukan inbox kerja utama. Jangan masukkan data pelanggan atau rahasia perusahaan untuk latihan. Target awal tutorial adalah memasang, memeriksa pengaturan, dan membuka dashboard lokal. Bukan langsung menjalankan pengiriman.

Langkah aplikasi di bawah ditinjau dari sumber. Instalasi, login, pembacaan situs produk, dan pengiriman tidak diuji end-to-end untuk artikel ini. Pemeriksaan halaman panduan tidak sama dengan pengujian Harvey.

1. Siapkan lingkungan dan autentikasi model

Alur terminal berikut untuk macOS/Linux dengan Bash. Windows memerlukan penyesuaian aktivasi virtual environment; jalur Codex opsional pada sumber tidak mendukung Windows. Panduan ini memilih Claude, provider bawaan Harvey.

Siapkan Git, Python 3.11 atau lebih baru, serta Claude Code yang sudah terpasang dan masuk dengan langganan yang sesuai. Periksa dokumentasi resmi pemasangan Claude Code; jangan jalankan skrip pemasangan pihak ketiga tanpa membacanya. Untuk login, ikuti quickstart resmi: buka claude, lalu gunakan /login bila perlu autentikasi ulang. /login adalah perintah dalam sesi Claude Code, bukan Bash. README Harvey menulis claude login; ikuti alur autentikasi versi CLI yang Anda pasang. Pilih akun langganan, bukan Claude Console/API key, bila ingin memakai kuota langganan; autentikasi API mempunyai penagihan berbeda.

python3 --version
git --version
claude --version

Pastikan interpreter yang dipilih memang 3.11+. Bila python3 masih lebih lama, gunakan nama interpreter baru yang sudah dipasang, misalnya python3.13, untuk membuat environment. Jangan memasang paket ke Python sistem.

Harvey memakai Claude Code headless, bukan model lokal. Teks produk, halaman yang dibaca, dan balasan dapat masuk ke prompt penyedia model. Langganan tetap memiliki kuota dan ketentuan penggunaan. Sumber juga menyediakan provider Codex opsional dengan syarat kompatibilitas ketat; tidak dibahas sebagai jalur instalasi alternatif di sini.

2. Ambil kode, baca, lalu pasang dalam virtual environment

git clone https://github.com/ethanplusai/harvey.git
cd harvey
git checkout e114e95471b1bf155454fca108f0730b66a47a01

Commit dikunci agar perintah cocok dengan artikel. Sebelum memasang, baca pyproject.toml, requirements.txt, harvey/cli.py, harvey/setup.py, dan .env.example. Dependensinya mencakup HTTP, parser HTML, DNS/SMTP, SQLite, Pydantic, Playwright, FastAPI, dan Uvicorn. Backend build memakai setuptools; jangan memperlakukan clone sebagai kode tepercaya hanya karena lisensinya MIT.

python3 -m venv .venv
source .venv/bin/activate
python -m pip install -e .
harvey --help
cp .env.example .env
chmod 600 .env

Perintah instalasi ini ditinjau dari sumber, belum dieksekusi dalam pengujian artikel. Chromium tidak diperlukan untuk alur email dan HTTP di sini. Jangan menjalankan harvey install hanya demi mengikuti contoh: perintah itu juga mencoba memasang browser Playwright. Jangan masukkan kredensial LinkedIn.

harvey setup tersedia sebagai wizard, tetapi dapat menguji model, meminta rahasia, dan menulis konfigurasi. Panduan ini memilih konfigurasi manual agar perubahan terlihat. Jangan menjalankan wizard dan contoh manual sekaligus tanpa memeriksa hasilnya.

3. Training dari situs produk milik sendiri

Di Harvey, training berarti membaca informasi produk dari situs Anda, lalu menyimpannya sebagai catatan dan pengaturan. Ini bukan melatih model AI sendiri atau fine-tuning. Gunakan situs yang Anda miliki atau berwenang proses, tanpa data pelanggan atau rahasia. Ganti URL contoh dengan situs Anda sebelum menjalankan:

harvey train https://produk-anda.example 5

Domain .example sengaja hanya placeholder. Angka 5 adalah batas halaman, argumen posisi, bukan flag --max-pages. Proses ini memakai jaringan dan kuota model; belum dijalankan dalam pengujian artikel.

Hasil penting: harvey.local.yaml dan skills/product_knowledge.md; skills/competitive_intel.md dibuat bila kompetitor ditemukan. Baca ulang harga, manfaat, kompetitor, dan klaim di dalamnya. Jangan membiarkan model mengarang bukti keberhasilan. harvey.local.yaml menang atas harvey.yaml bila ada; edit file yang benar.

Peringatan konfigurasi: pada commit ini, template harvey.yaml memilih Gmail dan memiliki require_approval: true, tetapi pembuat konfigurasi di trainer.py menghasilkan provider: instantly dan LinkedIn aktif. Jadi training selesai bukan berarti aman menjalankan agent. Audit dan ubah hasil training terlebih dahulu. Kode pembuat konfigurasi.

4. Matikan kanal sebelum menyiapkan inbox uji

Di harvey.local.yaml, ganti blok channels dan usage dengan contoh berikut. Jangan menimpa bagian persona, product, icp, atau brain hasil training. Jangan membuat dua kunci channels dalam YAML yang sama.

channels:
  email:
    enabled: false
    provider: gmail
    require_approval: true
    max_daily_sends: 1
    send_to_risky: false
    max_bounce_rate: 0.05
  linkedin:
    enabled: false
    max_daily_connections: 0
    max_daily_messages: 0
usage:
  max_daily_claude_percent: 20
  heartbeat_interval_minutes: 15
  quiet_hours:
    start: "18:00"
    end: "09:00"
    timezone: "Asia/Jakarta"

Ini pagar awal, bukan dry-run. Jangan jalankan harvey run pada tahap ini. Batas satu email dan 20 persen adalah pilihan konservatif untuk contoh, bukan rekomendasi throughput atau jaminan kuota. Persentase membandingkan jendela pemakaian provider bila terbaca; bila tidak, kode beralih ke hitungan panggilan internal. Bukan meter tagihan atau jatah harian resmi.

Gmail memakai OAuth, yaitu pemberian izin melalui akun Google, bukan dengan membagikan kata sandi email.

Untuk jalur Gmail, gunakan akun uji khusus. Ikuti petunjuk .env.example: buat proyek Google Cloud, aktifkan Gmail API, siapkan OAuth client bertipe Desktop app dan layar persetujuan/test user sesuai akun, lalu isi GMAIL_CLIENT_ID dan GMAIL_CLIENT_SECRET di .env. Login berikut hanya dilakukan oleh pemilik akun setelah izin OAuth dibaca:

harvey gmail auth
harvey gmail test

Jangan menyambungkan inbox kerja utama untuk eksperimen. Untuk SMTP atau Microsoft 365, baca integrasi terkait sebelum mengganti provider. Instantly memerlukan akun dan INSTANTLY_API_KEY; konfigurasi tersebut bukan otomatis bebas biaya dan bukan jalur yang dipakai contoh ini.

5. Riset, dashboard, dan uji terkendali

harvey status
harvey signals
harvey dashboard --host 127.0.0.1 --port 5555

Dashboard tetap berjalan di terminal itu; buka http://127.0.0.1:5555 pada komputer yang sama. Perintah lain dijalankan dari terminal kedua, di folder Harvey, setelah mengaktifkan .venv. status dapat membuat database lokal; bukan bukti login atau model sehat.

Sinyal adalah kriteria teramati seperti situs tanpa booking online atau teknologi yang dipakai. Konfirmasi hanya yang relevan. Untuk eksplorasi semua sinyal tanpa biaya provider menurut katalog sumber, tersedia:

harvey signals --confirm free
harvey discover --estimate

free tidak berarti tanpa jaringan, kuota, atau aturan sumber. --estimate menaksir discovery, bukan seluruh biaya operasional. Setelah sumber dan izin diperiksa, harvey discover benar-benar mencari bisnis; jangan menjalankannya sekadar untuk menguji instalasi. Discovery bukan syarat untuk uji kirim ke inbox sendiri.

Batas aman tahap awal berhenti di dashboard, bukan menjalankan otomasi. harvey run dapat memulai pencarian prospek saat pipeline, yaitu daftar dan tahapan calon pelanggan, kekurangan kontak. Database kosong, satu kontak uji, email nonaktif, atau harvey sending pause tidak menghentikan riset tersebut. Tidak ditemukan mode simulasi (dry-run) atau pembatas penerima khusus inbox uji pada CLI yang diperiksa. Jangan menganggap menambahkan inbox sendiri membuat proses terisolasi.

Untuk uji end-to-end, pengelola teknis perlu menyiapkan lingkungan terpisah yang benar-benar membatasi jaringan, sumber prospek, dan penerima ke fixture/inbox milik sendiri. Jangan melemahkan gate alamat agar tes lolos. Bila isolasi itu belum tersedia, cukup tinjau konfigurasi dan draf yang ada; jangan aktifkan loop. Persetujuan manusia tetap wajib sebelum setiap kiriman nyata.

Perintah operasional di bawah bukan rangkaian tes aman untuk langsung disalin. run menjalankan otomasi nyata, resume membuka kembali pengiriman native yang disetujui dan sudah jatuh tempo:

Perintah Efek
harvey run Menjalankan heartbeat, termasuk riset, draf, dan kanal yang aktif
harvey outbox Menampilkan antrean untuk diperiksa
harvey sending pause Menahan pengiriman dan staging native, bukan seluruh aktivitas agent
harvey sending resume Membuka kembali alur pengiriman native
Ctrl+C pertama pada terminal loop Meminta shutdown bertahap setelah pekerjaan aktif selesai, bukan pembatalan langsung

Sebelum produksi, ubah channels.email.enabled menjadi true hanya setelah uji terisolasi berhasil, pertahankan require_approval: true, dan periksa penerima, subjek, fakta produk, opt-out, serta jadwal satu per satu. Uji pertama harus ke inbox sendiri: periksa kiriman, balas, lalu pastikan respons menunggu persetujuan lagi. Ini kriteria kelulusan, bukan hasil yang telah dibuktikan artikel ini. Pause menahan staging juga; Outbox kosong saat pause tidak membuktikan pipeline bekerja.

Penghentian darurat berbeda dari shutdown biasa. Untuk native, jalankan harvey sending pause, lalu minta shutdown pada proses loop dan pastikan proses benar-benar keluar. Ctrl+C pertama membiarkan pekerjaan aktif selesai; sinyal kedua pada implementasi ini meminta keluar segera. Jangan menganggap salah satunya bisa menarik kembali email atau permintaan API yang sudah berjalan. Jika perlu containment segera, putus akses kirim pada provider atau jaringan lingkungan tersebut dan periksa log/inbox untuk kiriman yang terlanjur diproses. Untuk Instantly, hentikan kampanye dan akses pengiriman pada platform eksternal juga; menghentikan proses lokal saja tidak membatalkan kampanye yang sudah aktif.

Jangan anggap approval mencakup semua integrasi. Kode native menaruh email dan respons pada status pending_review ketika opsi aktif. Jalur Instantly membuat/mengaktifkan kampanye dan mengirim balasan melalui API tersendiri. Untuk itu, kontrol persetujuan dan penghentian harus diaudit pada platform eksternal juga. Jangan memakai --approve-all untuk onboarding.

Lima langkah aman Harvey: pasang, training, audit, uji inbox sendiri, evaluasi sebelum prospek nyata
Alur orisinal. Tidak ada tahap otomatis yang menggantikan izin penerima atau pemeriksaan manusia.

Biaya, kuota, dan privasi

Kode Harvey berlisensi MIT. Lisensi perangkat lunak tidak mencakup hak atas data prospek, merek pihak lain, atau izin mengirim email.

Pisahkan biaya langganan model, inbox/domain, provider discovery/verifikasi, dan server opsional. Harvey memanggil Claude Code dengan autentikasi langganan; ini bukan klaim “semua tanpa API key” atau “gratis unlimited”. Gmail memakai OAuth; Instantly dan beberapa provider opsional memakai API key. Crawling Cloudflare opsional memakai kredensial sendiri; tanpa itu trainer punya fallback HTTP. Tidak perlu memasukkan token Cloudflare untuk alur dasar. Angka biaya di menu repo perlu dicek terhadap provider sebelum dibelanjakan.

Kode quota Claude membaca endpoint OAuth yang tidak didokumentasikan sebagai API publik dan dapat gagal. Bila angka quota tidak tersedia, jangan menganggap pemakaian nol. Lihat quota client dan budget gate.

Data lokal mencakup data/harvey.db, konfigurasi, .env, token OAuth, serta hasil pengetahuan produk. “Berjalan lokal” tidak berarti “data tidak keluar”: model dan API yang dipakai menerima data sesuai alurnya. Batasi data yang dikumpulkan, akses file, masa simpan, serta backup. Jangan commit atau membagikan .env, token, cookies LinkedIn, database, dan file hasil training.

Keamanan dan izin penerima

  • Pertahankan dashboard pada 127.0.0.1. Kode menyediakan endpoint pengubahan konfigurasi dan pengendalian proses tanpa sistem login pengguna yang layak diasumsikan aman untuk internet. Jangan bind ke 0.0.0.0 atau membuka port 5555 ke publik.
  • Untuk VPS opsional, gunakan SSH tunnel menuju loopback, firewall, dan akun terbatas. VPS tidak diperlukan untuk belajar. Docker bawaan memasang CLI lewat skrip unduhan, memasang direktori autentikasi dengan akses tulis, dan otomatis menjalankan loop; bukan pilihan awal panduan ini.
  • Halaman web dan balasan email adalah input tidak tepercaya. Periksa prompt injection dan klaim yang muncul dari sumber tersebut. Jangan beri model atau dashboard kredensial produksi untuk latihan.
  • Biarkan LinkedIn mati. Implementasinya memakai login browser serta menyimpan cookies; otomatisasi dapat melanggar ketentuan LinkedIn dan membatasi akun. Batas aktivitas tidak membuatnya otomatis diizinkan.
  • Status verified, pemeriksaan MX, atau respons SMTP bukan jaminan deliverability, persetujuan, atau kepatuhan. Catch-all tetap berisiko; jangan aktifkan send_to_risky untuk mengejar volume. Implementasi email finder.
  • Periksa hukum dan ketentuan provider yang berlaku untuk pengirim/penerima dengan pihak kompeten. Siapkan opt-out yang berfungsi, catat suppression, hormati permintaan berhenti, dan pastikan kontak yang sudah menolak tidak masuk kembali lewat impor atau kampanye lain. Fitur klasifikasi balasan bukan bukti kepatuhan hukum. Artikel ini bukan nasihat hukum.

Troubleshooting

Gejala Pemeriksaan pertama
harvey: command not found Aktifkan .venv dari folder clone; pastikan python -m pip install -e . selesai
Python terlalu lama atau externally-managed-environment Gunakan interpreter 3.11+ dan virtual environment, bukan instalasi global
Konfigurasi berubah tetapi perilaku tidak berubah Periksa harvey.local.yaml; file ini mendahului template harvey.yaml
Model gagal Periksa login Claude Code, langganan, kuota, log; status saja tidak memvalidasi sesi Claude
Discovery kosong Periksa konfirmasi sinyal, geografi, cakupan provider, dan pembatasan sumber; jangan langsung meningkatkan volume
Outbox kosong saat pause Pause native juga menghentikan staging; periksa kampanye dan gate dalam database uji bersih sebelum resume
Email tidak keluar Periksa approval, pause, alamat yang ditolak gate, jadwal, batas harian, quiet hours, serta autentikasi provider
Perlu berhenti segera Pause native; hentikan akses kirim/kampanye eksternal bila perlu. Ctrl+C pertama menunggu pekerjaan aktif; kiriman in-flight mungkin tetap selesai

Sumber primer dan batas verifikasi

Panduan ini mengacu pada repositori Harvey, diperiksa 16 Oktober 2026. Metadata paket menyebut 0.3.0, sedangkan bagian akhir README masih menyebut 0.2.1. Karena itu, commit (salinan kode pada satu titik perubahan) menjadi patokan, bukan label versi.

Kode kalender mengembalikan daftar slot kosong dan False untuk booking. Pengayaan informasi orang dari registry masih tercantum sebagai rencana pengembangan, bukan fitur siap pakai. Lihat kalender, Sender, dan Handler.

Uji artikel terbatas pada parser CLI tanpa rahasia atau panggilan provider, pemeriksaan sumber, serta halaman panduan ini. Tidak ada login akun, scraping LinkedIn, kontak prospek, atau pengiriman email nyata. Semua visual merupakan ilustrasi orisinal, bukan screenshot dashboard dan bukan afiliasi resmi dengan Harvey atau penyedia model.

More Toolkits & Guides
Based in Jakarta
Digital Business research and collaboration

Let's build it as one system.