Artificial Intelligence
StepFun Luncurkan Step Edge: AI Lokal di Perangkat
Daftar isi
- Latar belakang: kenapa Step Edge menarik perhatian?
- Masalah yang ingin dipecahkan Step Edge
- Latensi membuat agent terasa lamban
- Data sensitif terlalu mudah keluar dari perangkat
- Biaya cloud meningkat bersama jumlah pengguna
- Agent butuh akses yang lebih dekat ke sistem
- Step Edge dibandingkan cloud AI dan model lokal biasa
- Pilih cloud jika kualitas maksimum menjadi prioritas
- Pilih lokal jika tugasnya sempit dan sensitif
- Pilih hibrida jika agent harus cepat sekaligus cerdas
- Prasyarat untuk membuat prototipe Step Edge
- Perangkat dan perangkat lunak
- Pengetahuan yang membantu
- Batasan yang harus dicatat sejak awal
- Step 1 — Buat proyek agent local-first
- Kenapa langkah ini penting?
- Kesalahan yang sering muncul
- Step 2 — Tentukan kontrak permintaan dan jawaban agent
- Kenapa allowCloud harus ada?
- Periksa tipenya
- Step 3 — Bangun adaptor model lokal
- Kenapa tidak langsung memasang model besar?
- Cara menggantinya dengan runtime Step Edge
- Step 4 — Tambahkan adaptor cloud sebagai jalur cadangan
- Kenapa base URL dan nama model tidak diisi langsung?
- Kesalahan umum pada jalur cloud
- Step 5 — Buat kebijakan perutean lokal dan cloud
- Kenapa perutean perlu aturan yang terlihat?
- Keluaran yang diharapkan
- Step 6 — Bangun daftar alat yang aman
- Kenapa alat harus memakai daftar izin?
- Step 7 — Rangkai server agent
- Kenapa validasi Zod penting?
- Step 8 — Uji perintah lokal dan panggilan alat
- Uji pemisahan rencana dan tindakan
- Step 9 — Tambahkan dukungan gambar dan audio
- Kenapa memakai jalur berkas lokal?
- Pra-pemrosesan yang layak ditambahkan
- Step 10 — Ukur latensi, keberhasilan alat, dan pemakaian cloud
- Kenapa p95 lebih berguna daripada rata-rata?
- Step 11 — Pasang pengaman privasi dan pencatatan
- Studi kasus: agent inspeksi armada di Indonesia
- Background
- Challenge atau masalah
- Approach
- Implementation
- Results yang layak dijadikan target
- Key Learnings
- Penilaian Step Edge sebagai produk
- Fitur yang paling menjanjikan
- Kelebihan
- Kekurangan dan risiko
- Siapa yang paling cocok memakai Step Edge?
- Siapa yang sebaiknya menunggu?
- Kesalahan yang sering terjadi saat membangun agent edge
- Memindahkan seluruh model ke perangkat
- Menganggap “lokal” otomatis berarti aman
- Mengukur demo, bukan alur lengkap
- Tidak menyiapkan jalur cadangan
- Menjalankan alat tanpa konfirmasi
- Panduan troubleshooting Step Edge dan agent local-first
- Model lokal gagal dimuat
- Perangkat cepat panas
- Latensi lokal lebih lambat daripada cloud
- Agent memilih alat yang salah
- Permintaan sensitif masih naik ke cloud
- Respons cloud tidak sesuai format
- Agent tidak bekerja ketika offline
- Tips optimasi untuk perangkat Android, kendaraan, dan komputer
- Android dan ponsel konsumen
- Sistem kendaraan
- Laptop dan komputer
- Pengguna dengan koneksi terbatas
- Rekomendasi berdasarkan kebutuhan
- Checklist sebelum membawa prototipe ke produksi
- Model dan performa
- Privasi dan keamanan
- Kualitas agent
- Operasi dan ROI
- Latar belakang: kenapa Step Edge menarik perhatian?
- Masalah yang ingin dipecahkan Step Edge
- Latensi membuat agent terasa lamban
- Data sensitif terlalu mudah keluar dari perangkat
- Biaya cloud meningkat bersama jumlah pengguna
- Agent butuh akses yang lebih dekat ke sistem
- Step Edge dibandingkan cloud AI dan model lokal biasa
- Pilih cloud jika kualitas maksimum menjadi prioritas
- Pilih lokal jika tugasnya sempit dan sensitif
- Pilih hibrida jika agent harus cepat sekaligus cerdas
- Prasyarat untuk membuat prototipe Step Edge
- Perangkat dan perangkat lunak
- Pengetahuan yang membantu
- Batasan yang harus dicatat sejak awal
- Step 1 — Buat proyek agent local-first
- Kenapa langkah ini penting?
- Kesalahan yang sering muncul
- Step 2 — Tentukan kontrak permintaan dan jawaban agent
- Kenapa allowCloud harus ada?
- Periksa tipenya
- Step 3 — Bangun adaptor model lokal
- Kenapa tidak langsung memasang model besar?
- Cara menggantinya dengan runtime Step Edge
- Step 4 — Tambahkan adaptor cloud sebagai jalur cadangan
- Kenapa base URL dan nama model tidak diisi langsung?
- Kesalahan umum pada jalur cloud
- Step 5 — Buat kebijakan perutean lokal dan cloud
- Kenapa perutean perlu aturan yang terlihat?
- Keluaran yang diharapkan
- Step 6 — Bangun daftar alat yang aman
- Kenapa alat harus memakai daftar izin?
- Step 7 — Rangkai server agent
- Kenapa validasi Zod penting?
- Step 8 — Uji perintah lokal dan panggilan alat
- Uji pemisahan rencana dan tindakan
- Step 9 — Tambahkan dukungan gambar dan audio
- Kenapa memakai jalur berkas lokal?
- Pra-pemrosesan yang layak ditambahkan
- Step 10 — Ukur latensi, keberhasilan alat, dan pemakaian cloud
- Kenapa p95 lebih berguna daripada rata-rata?
- Step 11 — Pasang pengaman privasi dan pencatatan
- Studi kasus: agent inspeksi armada di Indonesia
- Background
- Challenge atau masalah
- Approach
- Implementation
- Results yang layak dijadikan target
- Key Learnings
- Penilaian Step Edge sebagai produk
- Fitur yang paling menjanjikan
- Kelebihan
- Kekurangan dan risiko
- Siapa yang paling cocok memakai Step Edge?
- Siapa yang sebaiknya menunggu?
- Kesalahan yang sering terjadi saat membangun agent edge
- Memindahkan seluruh model ke perangkat
- Menganggap “lokal” otomatis berarti aman
- Mengukur demo, bukan alur lengkap
- Tidak menyiapkan jalur cadangan
- Menjalankan alat tanpa konfirmasi
- Panduan troubleshooting Step Edge dan agent local-first
- Model lokal gagal dimuat
- Perangkat cepat panas
- Latensi lokal lebih lambat daripada cloud
- Agent memilih alat yang salah
- Permintaan sensitif masih naik ke cloud
- Respons cloud tidak sesuai format
- Agent tidak bekerja ketika offline
- Tips optimasi untuk perangkat Android, kendaraan, dan komputer
- Android dan ponsel konsumen
- Sistem kendaraan
- Laptop dan komputer
- Pengguna dengan koneksi terbatas
- Rekomendasi berdasarkan kebutuhan
- Checklist sebelum membawa prototipe ke produksi
- Model dan performa
- Privasi dan keamanan
- Kualitas agent
- Operasi dan ROI
- Kesimpulan
StepFun meluncurkan Step Edge pada 12 Juli 2026 sebagai keluarga model AI yang dirancang untuk berjalan langsung di ponsel, sistem kendaraan, komputer, dan perangkat edge lainnya. Fokusnya bukan sekadar membawa chatbot ke perangkat, melainkan membangun AI agent lokal yang bisa memahami teks, gambar, dan audio, lalu menjalankan alat dengan latensi rendah melalui kolaborasi perangkat dan cloud.
Ringkasnya: Step Edge memindahkan sebagian proses AI dari pusat data ke perangkat pengguna. Pendekatan ini berpotensi memangkas waktu respons, menjaga lebih banyak data tetap lokal, mengurangi ketergantungan pada internet, dan membuka jalan bagi agent yang bisa berinteraksi langsung dengan aplikasi maupun fungsi perangkat.
Tutorial ini membahas cara menyiapkan prototipe aplikasi bergaya Step Edge dengan pola local-first. Karena paket SDK publik, nama model lokal, dan antarmuka resmi Step Edge belum dijabarkan secara lengkap dalam materi peluncuran yang tersedia, kode di bawah memakai lapisan adaptor netral. Nantinya, adaptor tersebut bisa dihubungkan ke Step Inference NPU engine atau runtime resmi tanpa perlu membongkar seluruh aplikasi.
Latar belakang: kenapa Step Edge menarik perhatian?
Sebagian besar aplikasi AI hari ini masih mengikuti pola yang sama:
-
Pengguna mengirim teks, gambar, atau audio.
-
Aplikasi mengunggah data ke server.
-
Model di cloud memproses permintaan.
-
Jawaban dikirim kembali ke perangkat.
Pola itu mudah dikembangkan dan memberi akses ke model berkapasitas besar. Sayangnya, ada beberapa biaya tersembunyi: latensi jaringan, pemakaian data, biaya API, risiko privasi, dan ketergantungan pada koneksi stabil.
Masalahnya terasa nyata dalam konteks Indonesia. Koneksi di pusat Jakarta, Bandung, atau Surabaya mungkin cukup stabil, tetapi pengalaman bisa berubah saat pengguna berada di kereta, area industri, jalan antarkota, perkebunan, atau wilayah dengan sinyal yang naik turun. Agent yang sepenuhnya bergantung pada cloud bisa mendadak kehilangan fungsi pada saat paling dibutuhkan.
Edge AI mencoba memperbaiki keadaan tersebut.
Edge AI adalah pendekatan yang menjalankan pemrosesan kecerdasan buatan sedekat mungkin dengan sumber data, misalnya langsung di ponsel, laptop, kamera, kendaraan, atau perangkat industri.
Step Edge masuk ke area ini dengan membawa model teks dan visual untuk ponsel, kendaraan, serta skenario perangkat lain. Informasi awal peluncuran juga menyebut pemrosesan lokal untuk teks, visual, dan audio, panggilan alat lokal sekitar 0,1 detik, kolaborasi cloud-perangkat, serta mesin Step Inference yang memanfaatkan NPU.
NPU atau neural processing unit adalah bagian cip yang dirancang khusus untuk beban kerja AI. Analoginya sederhana: CPU itu pekerja serba bisa, GPU jago mengerjakan banyak hitungan secara paralel, sedangkan NPU adalah spesialis yang menangani operasi model AI dengan konsumsi daya lebih efisien.
Langkah StepFun ini bukan muncul tiba-tiba. Perusahaan tersebut sebelumnya mengembangkan keluarga model multimodal Step, termasuk Step-2, Step-3, Step-Video-T2V, dan Step-Audio. Model Step-3 yang tersedia di Hugging Face, misalnya, memakai arsitektur Mixture-of-Experts dengan 321 miliar parameter total dan 38 miliar parameter aktif untuk tugas penalaran multimodal.
Kini arahnya bergeser dari “model besar di cloud” menjadi “sistem cerdas yang membagi pekerjaan antara perangkat dan cloud”.
Masalah yang ingin dipecahkan Step Edge
![]()
Latensi membuat agent terasa lamban
Chatbot masih bisa diterima jika membutuhkan satu atau dua detik untuk menjawab. Agent berbeda. Agent harus melihat keadaan layar, memilih alat, menjalankan tindakan, membaca hasilnya, lalu menentukan langkah berikutnya.
Jika setiap langkah harus bolak-balik ke cloud, penundaan kecil akan menumpuk. Sebuah alur dengan enam panggilan alat bisa terasa berat walaupun masing-masing panggilan hanya terlambat satu detik.
Panggilan alat lokal sekitar 0,1 detik, seperti yang diklaim dalam informasi awal Step Edge, menarik karena mengubah rasa interaksi. Agent tidak lagi seperti layanan jarak jauh yang sedang “berpikir”, tetapi lebih mirip bagian alami dari sistem operasi.
Data sensitif terlalu mudah keluar dari perangkat
Bayangkan agent membaca:
-
notifikasi pribadi,
-
rekaman suara,
-
isi layar perbankan,
-
dokumen pelanggan,
-
foto identitas,
-
posisi kendaraan,
-
atau percakapan internal perusahaan.
Tidak semua data itu perlu dikirim ke server. Model lokal dapat menangani klasifikasi, penyaringan, ekstraksi sederhana, atau pemilihan alat tanpa mengunggah data mentah.
Cloud masih berguna untuk penalaran berat. Bedanya, aplikasi bisa mengirim ringkasan yang sudah dibersihkan, bukan seluruh data asli.
Biaya cloud meningkat bersama jumlah pengguna
Biaya satu permintaan mungkin terlihat kecil. Pada skala ratusan ribu pengguna, biaya token, gambar, audio, dan panggilan agent bisa tumbuh cepat.
Pemrosesan lokal mengalihkan sebagian biaya komputasi ke perangkat. Ini bukan berarti gratis karena ukuran aplikasi, optimasi model, pengujian perangkat, dan pemakaian baterai tetap perlu dihitung. Meski begitu, arsitektur hibrida memberi tim lebih banyak kendali atas biaya per interaksi.
Agent butuh akses yang lebih dekat ke sistem
Model cloud dapat memberi instruksi, tetapi perangkatlah yang mempunyai akses ke kamera, mikrofon, lokasi, kalender, aplikasi, dan fungsi kendaraan. Agent yang benar-benar berguna membutuhkan jembatan aman menuju kemampuan tersebut.
Baca juga GPU Terbaik untuk AI Lokal Budget Terbatas
StepFun sebelumnya juga mengembangkan Step-GUI untuk memahami antarmuka grafis dan menjalankan tugas lintas aplikasi. Step Edge memperkuat arah strategis ini dengan membawa kemampuan agent lebih dekat ke perangkat.
Step Edge dibandingkan cloud AI dan model lokal biasa
Tidak semua beban kerja harus dipindahkan ke perangkat. Teman-Teman tetap perlu memilih arsitektur berdasarkan kualitas model, privasi, biaya, dan jenis perangkat sasaran.
Kriteria | Cloud AI | Model lokal biasa | Step Edge bergaya hibrida |
|---|---|---|---|
Lokasi inferensi | Server jarak jauh | Perangkat | Perangkat dan cloud |
Ketergantungan internet | Tinggi | Rendah | Sedang dan bisa disesuaikan |
Latensi alat lokal | Bergantung jaringan | Rendah | Ditargetkan sangat rendah |
Kapasitas penalaran | Umumnya paling besar | Dibatasi perangkat | Lokal untuk tugas cepat, cloud untuk tugas berat |
Privasi | Data keluar dari perangkat | Data tetap lokal | Data sensitif bisa diproses lokal |
Biaya per permintaan | Berulang | Cenderung rendah setelah pemasangan | Bisa dioptimalkan lewat perutean |
Integrasi perangkat | Perlu jembatan tambahan | Sangat dekat | Dirancang untuk skenario agent |
Pembaruan model | Mudah di server | Perlu distribusi ulang | Kombinasi pembaruan lokal dan cloud |
Kebutuhan perangkat keras | Ringan di sisi pengguna | RAM, penyimpanan, dan NPU penting | Menyesuaikan kemampuan perangkat |
Cocok untuk | Analisis kompleks dan generasi panjang | Fitur offline yang sempit | Agent ponsel, kendaraan, dan aplikasi multimodal |
Pilih cloud jika kualitas maksimum menjadi prioritas
Cloud masih masuk akal untuk:
-
analisis dokumen yang sangat panjang,
-
penalaran kompleks,
-
pembuatan konten panjang,
-
pencarian web mendalam,
-
dan aplikasi yang berjalan pada perangkat berspesifikasi rendah.
StepFun sendiri tetap menyediakan model dan alat melalui StepFun Open Platform. Jadi, peluncuran Step Edge lebih tepat dibaca sebagai perluasan strategi daripada penggantian cloud.
Pilih lokal jika tugasnya sempit dan sensitif
Model lokal cocok untuk:
-
mendeteksi kata pemicu,
-
mengklasifikasikan perintah,
-
membaca teks singkat dari kamera,
-
menghapus informasi pribadi,
-
memilih alat,
-
atau menjalankan perintah perangkat.
Tugas semacam ini tidak selalu membutuhkan model terbesar. Model yang lebih kecil dan cepat sering memberi hasil bisnis lebih baik karena responsnya konsisten.
Pilih hibrida jika agent harus cepat sekaligus cerdas
Pola hibrida cocok saat aplikasi perlu:
-
tetap berguna tanpa jaringan,
-
menjaga data tertentu di perangkat,
-
memakai cloud hanya untuk kasus sulit,
-
dan menjalankan tindakan lokal dengan cepat.
Inilah posisi paling masuk akal bagi Step Edge.
Prasyarat untuk membuat prototipe Step Edge
Kita akan membuat layanan agent sederhana dengan TypeScript. Layanan ini menerima permintaan, memeriksa sensitivitas data, memilih inferensi lokal atau cloud, lalu memanggil alat yang aman.
Perangkat dan perangkat lunak
Siapkan:
-
Node.js 20 atau versi yang lebih baru
-
npm 10 atau versi yang lebih baru
-
Git
-
penyunting kode
-
terminal
-
akun StepFun Open Platform jika ingin menguji jalur cloud
-
ponsel, komputer, atau papan pengembangan dengan NPU jika ingin menghubungkan runtime lokal sungguhan
Periksa versi Node.js dan npm:
node --version
npm --version
Keluaran yang diharapkan:
v20.x.x
10.x.x
Versi yang lebih lama belum tentu gagal, tetapi Node.js 20 memberi dukungan stabil untuk fetch, modul modern, dan TypeScript terbaru.
Pengetahuan yang membantu
Teman-Teman cukup memahami:
-
cara menjalankan perintah di terminal,
-
variabel dan fungsi JavaScript,
-
permintaan HTTP,
-
berkas JSON,
-
serta konsep sederhana
asyncdanawait.
Kalau istilah inferensi masih asing, artinya hanya “proses menjalankan model untuk menghasilkan prediksi atau jawaban”.
Batasan yang harus dicatat sejak awal
Informasi peluncuran Step Edge menjelaskan arah produk dan kemampuan utama, tetapi belum memberi kontrak API lokal lengkap dalam sumber yang tersedia. Karena itu:
-
nama paket runtime lokal dalam tutorial ini bersifat adaptor contoh,
-
jalur berkas model hanyalah contoh konfigurasi,
-
angka hasil studi kasus nanti adalah target pengujian, bukan hasil resmi,
-
dan format alat perlu disesuaikan saat dokumentasi SDK resmi tersedia.
Kejujuran teknis seperti ini penting. Menebak nama paket atau endpoint memang bikin tutorial terlihat lengkap, tetapi ujung-ujungnya malah membuang waktu saat kode tidak bisa dijalankan.
Step 1 — Buat proyek agent local-first
Buka terminal lalu jalankan:
mkdir step-edge-agent
cd step-edge-agent
npm init -y
npm install express dotenv zod
npm install --save-dev typescript tsx @types/node @types/express
npx tsc --init
Buat struktur proyek:
mkdir -p src/adapters src/tools src/policy src/types
touch src/index.ts
touch src/config.ts
touch src/types/agent.ts
touch src/policy/router.ts
touch src/adapters/local-model.ts
touch src/adapters/cloud-model.ts
touch src/tools/registry.ts
touch .env.example
Tambahkan skrip berikut ke package.json:
Baca juga Kimi K3 Sold Out? Ini Alasan Langganan Ditutup
{
"scripts": {
"dev": "tsx watch src/index.ts",
"start": "tsx src/index.ts",
"typecheck": "tsc --noEmit"
}
}
Sesuaikan bagian utama tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "dist"
},
"include": ["src/**/*.ts"]
}
Kenapa langkah ini penting?
Kita sengaja memisahkan adaptor model, aturan perutean, dan alat. Kalau runtime Step Edge resmi berubah, Teman-Teman cukup memperbarui local-model.ts, bukan seluruh aplikasi.
Pemisahan ini juga memudahkan pengujian. Tim bisa memakai model tiruan di laptop, model NPU di ponsel, dan API cloud di server dengan kontrak aplikasi yang sama.
Jalankan pemeriksaan awal:
npm run typecheck
Keluaran yang diharapkan:
Tidak ada keluaran dan proses selesai dengan kode 0.
Kesalahan yang sering muncul
Cannot find module
Pastikan pemasangan paket selesai:
npm install
Unknown compiler option
Perbarui TypeScript:
npm install --save-dev typescript@latest
Perintah touch tidak tersedia di Windows
Buat berkas melalui penyunting kode atau PowerShell:
New-Item src/index.ts -ItemType File
Step 2 — Tentukan kontrak permintaan dan jawaban agent
Isi src/types/agent.ts:
export type InputKind = "text" | "image" | "audio";
export type ToolName =
| "open_app"
| "create_note"
| "set_reminder"
| "vehicle_status"
| "none";
export interface AgentRequest {
sessionId: string;
inputKind: InputKind;
text?: string;
mediaPath?: string;
allowCloud: boolean;
}
export interface ToolCall {
name: ToolName;
arguments: Record<string, unknown>;
}
export interface ModelResult {
answer: string;
confidence: number;
toolCall?: ToolCall;
processingLocation: "local" | "cloud";
durationMs: number;
}
export interface ModelAdapter {
run(request: AgentRequest): Promise<ModelResult>;
}
Kontrak ini menjadi bahasa bersama bagi semua komponen. Model lokal dan cloud boleh punya format internal yang berbeda, tetapi hasil akhirnya harus konsisten.
Kenapa allowCloud harus ada?
Persetujuan cloud tidak sebaiknya disembunyikan dalam pengaturan yang membingungkan. Bila data mungkin sensitif, pengguna atau kebijakan organisasi harus bisa melarang pengiriman data keluar perangkat.
Untuk aplikasi perusahaan, pilihan ini bisa ditentukan oleh:
-
klasifikasi dokumen,
-
lokasi pengguna,
-
jenis akun,
-
kebijakan perangkat,
-
atau status jaringan.
Periksa tipenya
npm run typecheck
Keluaran yang diharapkan:
Tidak ada galat TypeScript.
Step 3 — Bangun adaptor model lokal
Isi src/adapters/local-model.ts:
import {
AgentRequest,
ModelAdapter,
ModelResult,
ToolCall
} from "../types/agent.js";
function detectTool(text: string): ToolCall | undefined {
const normalized = text.toLowerCase();
if (normalized.includes("buka kamera")) {
return {
name: "open_app",
arguments: { app: "camera" }
};
}
if (normalized.includes("buat catatan")) {
const content = text
.replace(/buat catatan/gi, "")
.trim();
return {
name: "create_note",
arguments: {
title: "Catatan dari agent",
content: content || "Catatan kosong"
}
};
}
if (normalized.includes("ingatkan")) {
return {
name: "set_reminder",
arguments: {
text,
delayMinutes: 30
}
};
}
if (
normalized.includes("status kendaraan") ||
normalized.includes("baterai mobil")
) {
return {
name: "vehicle_status",
arguments: {}
};
}
return undefined;
}
export class LocalModelAdapter implements ModelAdapter {
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
const text = request.text ?? "";
const toolCall = detectTool(text);
const answer = toolCall
? `Perintah dipahami. Alat ${toolCall.name} siap dijalankan.`
: "Permintaan diproses secara lokal, tetapi belum perlu memakai alat.";
return {
answer,
confidence: toolCall ? 0.92 : 0.68,
toolCall,
processingLocation: "local",
durationMs: Math.round(performance.now() - startedAt)
};
}
}
Kode ini belum menjalankan model saraf. Ia berfungsi sebagai simulator agar arsitektur, izin, alat, pencatatan, dan jalur cadangan bisa diuji lebih dulu.
Kenapa tidak langsung memasang model besar?
Kesalahan umum dalam proyek edge AI adalah memulai dari model, lalu baru memikirkan produk. Padahal, masalah paling sulit sering berada di luar model:
-
izin alat,
-
keamanan tindakan,
-
jalur cadangan,
-
pengalaman saat offline,
-
batas waktu,
-
penggunaan baterai,
-
dan pencatatan kegagalan.
Simulator membantu tim menemukan masalah tersebut tanpa menunggu model selesai dioptimalkan.
Baca juga Qwen Cloud: Platform AI Lengkap untuk Bisnis & Developer
Cara menggantinya dengan runtime Step Edge
Saat runtime resmi tersedia, pertahankan kelas dan metode run, lalu ganti isi fungsi dengan pemanggilan mesin inferensi lokal.
Pola konseptualnya seperti ini:
export class LocalModelAdapter {
constructor(private runtime: EdgeRuntime) {}
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
const raw = await this.runtime.generate({
text: request.text,
image: request.inputKind === "image"
? request.mediaPath
: undefined,
audio: request.inputKind === "audio"
? request.mediaPath
: undefined,
responseFormat: "tool_call_json"
});
return {
answer: raw.answer,
confidence: raw.confidence,
toolCall: raw.toolCall,
processingLocation: "local",
durationMs: Math.round(performance.now() - startedAt)
};
}
}
EdgeRuntime pada contoh tersebut sengaja tidak diimpor dari paket tertentu. Teman-Teman perlu menggantinya sesuai nama paket, metode inisialisasi, dan format keluaran pada dokumentasi Step Edge yang resmi.
Step 4 — Tambahkan adaptor cloud sebagai jalur cadangan
Buat .env.example:
PORT=3000
STEPFUN_API_KEY=
STEPFUN_API_BASE_URL=
STEPFUN_MODEL=
LOCAL_CONFIDENCE_THRESHOLD=0.75
CLOUD_TIMEOUT_MS=12000
Salin menjadi .env:
cp .env.example .env
Isi src/config.ts:
import "dotenv/config";
export const config = {
port: Number(process.env.PORT ?? 3000),
apiKey: process.env.STEPFUN_API_KEY ?? "",
apiBaseUrl: process.env.STEPFUN_API_BASE_URL ?? "",
cloudModel: process.env.STEPFUN_MODEL ?? "",
localConfidenceThreshold: Number(
process.env.LOCAL_CONFIDENCE_THRESHOLD ?? 0.75
),
cloudTimeoutMs: Number(
process.env.CLOUD_TIMEOUT_MS ?? 12000
)
};
Lalu isi src/adapters/cloud-model.ts:
import { config } from "../config.js";
import {
AgentRequest,
ModelAdapter,
ModelResult
} from "../types/agent.js";
export class CloudModelAdapter implements ModelAdapter {
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
if (
!config.apiKey ||
!config.apiBaseUrl ||
!config.cloudModel
) {
throw new Error(
"Konfigurasi cloud belum lengkap. Isi API key, base URL, dan nama model dari dokumentasi resmi."
);
}
const controller = new AbortController();
const timeout = setTimeout(
() => controller.abort(),
config.cloudTimeoutMs
);
try {
const response = await fetch(config.apiBaseUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${config.apiKey}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: config.cloudModel,
messages: [
{
role: "system",
content:
"Jawab ringkas. Jika perlu alat, kembalikan panggilan alat terstruktur."
},
{
role: "user",
content: request.text ?? ""
}
]
}),
signal: controller.signal
});
if (!response.ok) {
throw new Error(
`Cloud API gagal dengan status ${response.status}`
);
}
const data = await response.json() as {
choices?: Array<{
message?: {
content?: string;
};
}>;
};
return {
answer:
data.choices?.[0]?.message?.content ??
"Cloud tidak mengembalikan jawaban.",
confidence: 0.9,
processingLocation: "cloud",
durationMs: Math.round(performance.now() - startedAt)
};
} finally {
clearTimeout(timeout);
}
}
}
Kenapa base URL dan nama model tidak diisi langsung?
Alamat API, nama model, serta skema permintaan bisa berubah. Menyalin endpoint dari artikel pihak ketiga berisiko menghasilkan integrasi yang cepat usang.
Ambil nilai aktual dari dokumentasi dan dasbor resmi StepFun. Pendekatan ini juga mencegah kunci API masuk ke repositori.
Tambahkan .env ke .gitignore:
echo ".env" >> .gitignore
Kesalahan umum pada jalur cloud
Status 401
Kunci API salah, kedaluwarsa, atau tidak mempunyai akses ke model.
Status 404
Base URL atau nama model tidak sesuai dokumentasi terbaru.
AbortError
Permintaan melewati batas waktu. Naikkan CLOUD_TIMEOUT_MS atau pertahankan jawaban lokal.
Jawaban ada, tetapi format alat hilang
Model cloud mungkin membutuhkan definisi tools dalam skema khusus. Sesuaikan payload dengan dokumentasi API yang sedang berlaku.
Step 5 — Buat kebijakan perutean lokal dan cloud
Isi src/policy/router.ts:
import { config } from "../config.js";
import {
AgentRequest,
ModelAdapter,
ModelResult
} from "../types/agent.js";
const sensitivePatterns = [
/\b\d{16}\b/,
/\bnik\b/i,
/\bpin\b/i,
/\bpassword\b/i,
/\bkata sandi\b/i,
/\brekam medis\b/i
];
function containsSensitiveData(text: string): boolean {
return sensitivePatterns.some((pattern) =>
pattern.test(text)
);
}
function isComplexRequest(text: string): boolean {
const words = text.trim().split(/\s+/).length;
return (
words > 80 ||
/bandingkan|analisis mendalam|riset|jelaskan secara rinci/i.test(text)
);
}
export class HybridRouter {
constructor(
private local: ModelAdapter,
private cloud: ModelAdapter
) {}
async run(request: AgentRequest): Promise<ModelResult> {
const text = request.text ?? "";
const sensitive = containsSensitiveData(text);
if (sensitive || !request.allowCloud) {
return this.local.run(request);
}
const localResult = await this.local.run(request);
const shouldEscalate =
localResult.confidence <
config.localConfidenceThreshold ||
isComplexRequest(text);
if (!shouldEscalate) {
return localResult;
}
try {
return await this.cloud.run(request);
} catch (error) {
return {
...localResult,
answer:
`${localResult.answer} Cloud tidak tersedia, jadi hasil lokal dipertahankan.`
};
}
}
}
Kenapa perutean perlu aturan yang terlihat?
Teman-Teman sebaiknya tidak menyerahkan semua keputusan kepada model. Aturan eksplisit lebih mudah diaudit, terutama untuk data sensitif dan tindakan berisiko.
Baca juga Qwen 3.8 Max: AI 2,4 Triliun Parameter Alibaba
Urutan dalam kode tadi sengaja dibuat seperti ini:
-
Data sensitif tetap lokal.
-
Pengguna yang menolak cloud selalu dihormati.
-
Model lokal mendapat kesempatan pertama.
-
Cloud hanya dipanggil saat keyakinan rendah atau tugas kompleks.
-
Jika cloud gagal, aplikasi tetap memberi hasil lokal.
Pola ini menangkap manfaat utama kolaborasi cloud-perangkat tanpa membuat cloud menjadi titik kegagalan tunggal.
Keluaran yang diharapkan
Permintaan singkat:
{
"text": "Buka kamera",
"allowCloud": true
}
Seharusnya tetap diproses lokal karena keyakinannya tinggi.
Permintaan panjang:
{
"text": "Bandingkan tiga strategi pemasaran dan jelaskan secara rinci",
"allowCloud": true
}
Seharusnya diarahkan ke cloud jika konfigurasi tersedia.
Permintaan sensitif:
{
"text": "Simpan PIN saya 123456",
"allowCloud": true
}
Harus tetap berada di perangkat walaupun cloud diizinkan secara umum.
Step 6 — Bangun daftar alat yang aman
Isi src/tools/registry.ts:
import { ToolCall } from "../types/agent.js";
type ToolResult = {
ok: boolean;
message: string;
data?: Record<string, unknown>;
};
const allowedApps = new Set([
"camera",
"calendar",
"maps",
"notes"
]);
export async function executeTool(
call: ToolCall
): Promise<ToolResult> {
switch (call.name) {
case "open_app": {
const app = String(call.arguments.app ?? "");
if (!allowedApps.has(app)) {
return {
ok: false,
message: `Aplikasi ${app} tidak masuk daftar izin.`
};
}
return {
ok: true,
message: `Aplikasi ${app} dibuka.`
};
}
case "create_note": {
const title = String(
call.arguments.title ?? "Tanpa judul"
);
const content = String(
call.arguments.content ?? ""
);
return {
ok: true,
message: "Catatan berhasil dibuat.",
data: { title, content }
};
}
case "set_reminder": {
const delayMinutes = Number(
call.arguments.delayMinutes ?? 30
);
if (
!Number.isFinite(delayMinutes) ||
delayMinutes < 1 ||
delayMinutes > 10080
) {
return {
ok: false,
message: "Waktu pengingat tidak valid."
};
}
return {
ok: true,
message:
`Pengingat dijadwalkan ${delayMinutes} menit lagi.`
};
}
case "vehicle_status": {
return {
ok: true,
message: "Status kendaraan tersedia.",
data: {
batteryPercent: 78,
rangeKm: 286,
doorsLocked: true
}
};
}
default:
return {
ok: false,
message: "Alat tidak dikenal."
};
}
}
Kenapa alat harus memakai daftar izin?
Model generatif bisa salah memahami perintah. Jangan memberi agent akses bebas ke fungsi sistem hanya karena model menghasilkan JSON yang terlihat meyakinkan.
Daftar izin membatasi tindakan ke fungsi yang memang sudah ditinjau. Validasi argumen juga mencegah nilai berbahaya atau tidak masuk akal.
Untuk penggunaan produksi, tindakan berikut sebaiknya meminta konfirmasi manusia:
-
mengirim pesan,
-
melakukan pembayaran,
-
menghapus berkas,
-
membuka pintu,
-
mengubah kendali kendaraan,
-
membeli barang,
-
dan membagikan lokasi.
Aturan praktis: semakin sulit sebuah tindakan dibatalkan, semakin kuat konfirmasi yang harus diminta.
Step 7 — Rangkai server agent
Isi src/index.ts:
import express from "express";
import { z } from "zod";
import { config } from "./config.js";
import { LocalModelAdapter } from "./adapters/local-model.js";
import { CloudModelAdapter } from "./adapters/cloud-model.js";
import { HybridRouter } from "./policy/router.js";
import { executeTool } from "./tools/registry.js";
const app = express();
app.use(express.json({ limit: "2mb" }));
const requestSchema = z.object({
sessionId: z.string().min(1),
inputKind: z.enum(["text", "image", "audio"]),
text: z.string().optional(),
mediaPath: z.string().optional(),
allowCloud: z.boolean().default(false),
executeTools: z.boolean().default(false)
});
const router = new HybridRouter(
new LocalModelAdapter(),
new CloudModelAdapter()
);
app.get("/health", (_req, res) => {
res.json({
ok: true,
service: "step-edge-agent-prototype"
});
});
app.post("/agent", async (req, res) => {
const parsed = requestSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({
error: "Permintaan tidak valid.",
details: parsed.error.flatten()
});
}
try {
const modelResult = await router.run(parsed.data);
let toolResult;
if (
parsed.data.executeTools &&
modelResult.toolCall
) {
toolResult = await executeTool(
modelResult.toolCall
);
}
return res.json({
...modelResult,
toolResult
});
} catch (error) {
const message =
error instanceof Error
? error.message
: "Galat tidak dikenal.";
return res.status(500).json({ error: message });
}
});
app.listen(config.port, () => {
console.log(
`Agent berjalan di http://localhost:${config.port}`
);
});
Jalankan server:
npm run dev
Keluaran yang diharapkan:
Agent berjalan di http://localhost:3000
Uji kesehatan layanan:
curl http://localhost:3000/health
Keluaran yang diharapkan:
{
"ok": true,
"service": "step-edge-agent-prototype"
}
Kenapa validasi Zod penting?
TypeScript hanya memeriksa kode saat pengembangan. Ia tidak bisa menjamin bahwa data dari aplikasi seluler, peramban, atau perangkat kendaraan benar-benar sesuai tipe.
Zod memvalidasi data ketika permintaan masuk. Tanpa validasi runtime, nilai seperti "allowCloud": "iya" bisa menyelinap dan menghasilkan perilaku yang sulit ditebak.
Step 8 — Uji perintah lokal dan panggilan alat
Kirim perintah membuka kamera:
Baca juga Pi Agent: Framework AI Open Source dengan Transparansi
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-001",
"inputKind": "text",
"text": "Buka kamera",
"allowCloud": false,
"executeTools": true
}'
Keluaran yang diharapkan:
{
"answer": "Perintah dipahami. Alat open_app siap dijalankan.",
"confidence": 0.92,
"toolCall": {
"name": "open_app",
"arguments": {
"app": "camera"
}
},
"processingLocation": "local",
"durationMs": 1,
"toolResult": {
"ok": true,
"message": "Aplikasi camera dibuka."
}
}
Nilai durationMs akan berbeda di setiap perangkat. Simulator bisa selesai dalam satu atau dua milidetik, sedangkan model lokal sungguhan membutuhkan waktu lebih panjang.
Kirim perintah membuat catatan:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-002",
"inputKind": "text",
"text": "Buat catatan beli token listrik malam ini",
"allowCloud": false,
"executeTools": true
}'
Keluaran yang diharapkan:
{
"answer": "Perintah dipahami. Alat create_note siap dijalankan.",
"confidence": 0.92,
"toolCall": {
"name": "create_note",
"arguments": {
"title": "Catatan dari agent",
"content": "beli token listrik malam ini"
}
},
"processingLocation": "local",
"toolResult": {
"ok": true,
"message": "Catatan berhasil dibuat.",
"data": {
"title": "Catatan dari agent",
"content": "beli token listrik malam ini"
}
}
}
Uji pemisahan rencana dan tindakan
Ubah executeTools menjadi false:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-003",
"inputKind": "text",
"text": "Buka kamera",
"allowCloud": false,
"executeTools": false
}'
Agent akan menyusun panggilan alat, tetapi tidak menjalankannya. Pola ini berguna untuk layar konfirmasi:
Agent ingin membuka kamera. Izinkan?
[Batalkan] [Izinkan sekali]
Step 9 — Tambahkan dukungan gambar dan audio
Step Edge diposisikan sebagai keluarga model untuk teks dan visual, sementara informasi peluncurannya juga menyinggung pemrosesan audio lokal. Aplikasi kita sudah mempunyai inputKind, tetapi belum memvalidasi berkas media.
Tambahkan fungsi berikut ke src/index.ts sebelum rute /agent:
function validateMediaInput(input: {
inputKind: "text" | "image" | "audio";
text?: string;
mediaPath?: string;
}) {
if (input.inputKind === "text" && !input.text) {
throw new Error("Input teks membutuhkan field text.");
}
if (
input.inputKind !== "text" &&
!input.mediaPath
) {
throw new Error(
"Input gambar atau audio membutuhkan mediaPath."
);
}
if (
input.mediaPath &&
input.mediaPath.startsWith("http")
) {
throw new Error(
"Prototipe local-first hanya menerima jalur berkas lokal."
);
}
}
Panggil setelah validasi Zod:
validateMediaInput(parsed.data);
Contoh permintaan gambar:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "visual-001",
"inputKind": "image",
"text": "Baca angka meter pada gambar ini",
"mediaPath": "/data/local/meter.jpg",
"allowCloud": false,
"executeTools": false
}'
Pada simulator, jawaban belum membaca gambar. Setelah adaptor terhubung ke runtime multimodal Step Edge, mediaPath bisa diteruskan ke pemroses gambar lokal.
Kenapa memakai jalur berkas lokal?
Tujuan local-first akan berantakan jika aplikasi mengunggah gambar ke penyimpanan publik sebelum model membacanya. Jalur lokal menjaga aliran data tetap berada di perangkat.
Pada Android dan iOS, akses berkas harus mengikuti mekanisme izin sistem. Jangan mengubah jalur lokal menjadi URL publik hanya demi memudahkan pengembangan.
Pra-pemrosesan yang layak ditambahkan
Untuk gambar:
-
ubah orientasi berdasarkan metadata,
-
batasi resolusi,
-
kompres tanpa merusak teks kecil,
-
potong area yang relevan,
-
dan hapus metadata lokasi jika tidak dibutuhkan.
Untuk audio:
-
ubah ke kanal mono jika model mendukungnya,
-
samakan laju sampel,
-
potong bagian hening,
-
batasi durasi,
-
dan tampilkan indikator rekaman yang jelas.
Pra-pemrosesan mengurangi beban NPU, pemakaian memori, dan waktu inferensi.
Step 10 — Ukur latensi, keberhasilan alat, dan pemakaian cloud
Klaim performa tidak cukup diuji dengan satu demo. Agent perlu diukur pada rangkaian tugas yang mencerminkan penggunaan nyata.
Buat src/benchmark.ts:
import { LocalModelAdapter } from "./adapters/local-model.js";
const model = new LocalModelAdapter();
const prompts = [
"Buka kamera",
"Buat catatan bayar internet besok",
"Ingatkan saya untuk minum obat",
"Tampilkan status kendaraan",
"Jelaskan cuaca hari ini"
];
const durations: number[] = [];
let toolCalls = 0;
for (let index = 0; index < 20; index++) {
for (const text of prompts) {
const result = await model.run({
sessionId: `bench-${index}`,
inputKind: "text",
text,
allowCloud: false
});
durations.push(result.durationMs);
if (result.toolCall) {
toolCalls++;
}
}
}
durations.sort((a, b) => a - b);
const percentile = (p: number) => {
const position = Math.ceil(
(p / 100) * durations.length
) - 1;
return durations[
Math.max(0, Math.min(position, durations.length - 1))
];
};
console.log({
samples: durations.length,
p50Ms: percentile(50),
p95Ms: percentile(95),
toolCalls
});
Tambahkan skrip:
{
"scripts": {
"benchmark": "tsx src/benchmark.ts"
}
}
Jalankan:
Baca juga SiliconFlow: Satu API untuk 200+ Model AI Murah
npm run benchmark
Contoh keluaran simulator:
{
samples: 100,
p50Ms: 0,
p95Ms: 1,
toolCalls: 80
}
Angka simulator bukan tolok ukur Step Edge. Setelah runtime asli terpasang, ukur sekurangnya:
-
waktu muat model,
-
latensi token pertama,
-
latensi total,
-
p50, p95, dan p99,
-
keberhasilan pemilihan alat,
-
keberhasilan penyelesaian tugas,
-
konsumsi RAM,
-
suhu perangkat,
-
pemakaian baterai,
-
persentase permintaan yang naik ke cloud,
-
serta kegagalan saat jaringan terputus.
Kenapa p95 lebih berguna daripada rata-rata?
Rata-rata bisa terlihat bagus walaupun sebagian pengguna mengalami penundaan parah. p95 menunjukkan bahwa 95 persen permintaan selesai di bawah angka tersebut.
Untuk agent interaktif, ekor latensi sering lebih terasa daripada rata-rata. Satu tindakan yang mendadak memakan delapan detik bisa merusak kepercayaan pengguna.
Step 11 — Pasang pengaman privasi dan pencatatan
Jangan mencatat seluruh isi permintaan secara mentah. Log produksi sering disalin ke banyak sistem, lalu bertahan lebih lama daripada data aplikasi utama.
Buat src/safe-logger.ts:
function hashSession(sessionId: string): string {
let hash = 0;
for (const char of sessionId) {
hash = (hash * 31 + char.charCodeAt(0)) >>> 0;
}
return hash.toString(16);
}
export function logAgentRun(input: {
sessionId: string;
inputKind: string;
location: "local" | "cloud";
durationMs: number;
toolName?: string;
success: boolean;
}) {
console.log(JSON.stringify({
event: "agent_run",
session: hashSession(input.sessionId),
inputKind: input.inputKind,
location: input.location,
durationMs: input.durationMs,
toolName: input.toolName ?? null,
success: input.success,
timestamp: new Date().toISOString()
}));
}
Catatan ini menyimpan metrik operasional tanpa menyimpan isi percakapan.
Untuk lingkungan yang diatur ketat, pertimbangkan juga:
-
enkripsi model dan cache,
-
tanda tangan digital untuk pembaruan model,
-
masa simpan log,
-
penghapusan otomatis media sementara,
-
isolasi alat,
-
pembatasan jaringan,
-
dan audit tindakan agent.
Studi kasus: agent inspeksi armada di Indonesia
Background
Bayangkan sebuah perusahaan logistik yang mengoperasikan armada dari Jakarta menuju Bandung, Cirebon, Semarang, dan Surabaya. Pengemudi perlu memeriksa kondisi kendaraan, mencatat kerusakan ringan, memotret panel, dan mengirim laporan sebelum berangkat.
Sistem lama memakai formulir cloud. Saat koneksi buruk, foto gagal terunggah, formulir tersangkut, dan petugas harus mengulang pemeriksaan.
Challenge atau masalah
Tim menghadapi empat hambatan:
-
koneksi tidak selalu stabil di depo dan perjalanan,
-
foto panel kendaraan mengandung informasi operasional,
-
laporan perlu selesai dalam hitungan menit,
-
dan biaya pemrosesan gambar meningkat seiring jumlah armada.
Menghapus cloud sepenuhnya bukan pilihan ideal. Tim pusat tetap membutuhkan analisis gabungan, histori armada, dan pencarian lintas laporan.
Approach
Arsitektur bergaya Step Edge membagi pekerjaan seperti berikut:
Di perangkat:
-
membaca angka odometer,
-
mengenali lampu peringatan,
-
mengubah suara menjadi teks,
-
mengklasifikasikan tingkat risiko,
-
dan memvalidasi kelengkapan laporan.
Di cloud:
-
membandingkan histori kendaraan,
-
mencari pola kerusakan,
-
menyusun rekomendasi perawatan,
-
dan membuat laporan lintas armada.
Data mentah tetap lokal jika tidak dibutuhkan. Cloud menerima hasil terstruktur seperti kode peringatan, nilai odometer, dan tingkat keyakinan.
Implementation
Alurnya bisa berbentuk:
flowchart LR
A["Kamera dan mikrofon"] --> B["Model lokal Step Edge"]
B --> C{"Keyakinan cukup?"}
C -->|"Ya"| D["Validasi dan simpan lokal"]
C -->|"Tidak"| E{"Cloud diizinkan?"}
E -->|"Ya"| F["Model Step di cloud"]
E -->|"Tidak"| G["Minta pemeriksaan manual"]
D --> H["Sinkronisasi ringkasan"]
F --> H
G --> H
Kebijakan eskalasinya:
type InspectionDecision =
| "accept_local"
| "send_to_cloud"
| "human_review";
function decideInspection(input: {
confidence: number;
networkAvailable: boolean;
cloudAllowed: boolean;
safetyCritical: boolean;
}): InspectionDecision {
if (input.safetyCritical && input.confidence < 0.95) {
return "human_review";
}
if (input.confidence >= 0.88) {
return "accept_local";
}
if (
input.networkAvailable &&
input.cloudAllowed
) {
return "send_to_cloud";
}
return "human_review";
}
Results yang layak dijadikan target
Karena implementasi ini berupa studi kasus rancangan, metrik berikut adalah target uji coba yang masuk akal, bukan hasil resmi StepFun:
Metrik | Kondisi awal | Target uji coba |
|---|---|---|
Waktu pemeriksaan | 8 menit | 4–5 menit |
Permintaan yang perlu cloud | 100% | Di bawah 35% |
Laporan gagal saat koneksi buruk | 12% | Di bawah 2% |
Pengulangan unggah foto | 9% | Di bawah 3% |
Tugas sederhana selesai lokal | 0% | Di atas 70% |
Kasus keselamatan dengan tinjauan manusia | Tidak konsisten | 100% |
Target tersebut harus divalidasi di perangkat dan jaringan nyata. Pengujian laboratorium dengan Wi-Fi cepat tidak cukup untuk mewakili jalan tol, depo pinggiran kota, atau wilayah dengan cakupan seluler tidak merata.
Baca juga Nous Research: Revolusi AI Open-Source dan Hermes Agent
Key Learnings
Beberapa pelajaran paling penting dari rancangan ini:
-
Model lokal tidak perlu menyelesaikan semua masalah.
-
Perutean yang baik lebih bernilai daripada memaksa satu model mengerjakan semuanya.
-
Tugas keselamatan tetap membutuhkan batas keyakinan tinggi.
-
Offline bukan fitur tambahan, melainkan bagian dari desain.
-
Data mentah sebaiknya tidak naik ke cloud tanpa alasan jelas.
-
Metrik keberhasilan tugas lebih penting daripada skor tolok ukur model.
Penilaian Step Edge sebagai produk
Fitur yang paling menjanjikan
1. Pemrosesan multimodal lokal
Teks, gambar, dan audio adalah tiga masukan utama perangkat modern. Dukungan lokal memungkinkan agent memahami konteks tanpa selalu mengirim data ke server.
2. Kolaborasi cloud-perangkat
Ini lebih realistis daripada pendekatan “semua lokal”. Model perangkat menangani tugas cepat, sedangkan cloud menerima pekerjaan yang membutuhkan kapasitas lebih besar.
3. Step Inference untuk NPU
Mesin inferensi yang mengoptimalkan NPU penting karena keberhasilan edge AI tidak hanya bergantung pada kualitas model. Penjadwalan operator, kuantisasi, penggunaan memori, dan kompatibilitas cip sangat menentukan pengalaman nyata.
4. Arah menuju agent sistem
Step Edge tampaknya dirancang untuk melakukan tindakan, bukan sekadar menjawab pertanyaan. Ini selaras dengan strategi StepFun pada model GUI dan keterlibatannya dalam perangkat serta kendaraan.
5. Hubungan dengan ekosistem model Step
StepFun sudah punya model bahasa, visual, audio, dan video. Portofolio ini memberi fondasi untuk membagi kemampuan antara perangkat dan cloud.
Kelebihan
-
Potensi latensi rendah untuk tindakan lokal
-
Privasi lebih baik jika kebijakan dirancang dengan benar
-
Pengalaman masih bisa berjalan saat jaringan buruk
-
Biaya cloud berpotensi turun
-
Cocok untuk ponsel, kendaraan, komputer, dan perangkat khusus
-
Mendukung arah agent multimodal yang lebih praktis
Kekurangan dan risiko
-
Dokumentasi publik Step Edge perlu cukup rinci agar integrasi mudah direproduksi
-
Dukungan NPU bisa berbeda antarmerek dan antargenerasi cip
-
Model lokal menambah ukuran aplikasi dan kebutuhan penyimpanan
-
Inferensi terus-menerus dapat menguras baterai atau menaikkan suhu
-
Pembaruan model di jutaan perangkat lebih rumit daripada pembaruan cloud
-
Akses agent ke aplikasi dan fungsi sistem memperbesar permukaan keamanan
-
Klaim peringkat pada 29 metrik perlu dibaca bersama metodologi, perangkat uji, dan pembandingnya
Siapa yang paling cocok memakai Step Edge?
Step Edge layak dipantau oleh:
-
pembuat aplikasi ponsel dengan fitur agent,
-
produsen kendaraan dan sistem kokpit,
-
perusahaan perangkat pintar,
-
tim layanan lapangan,
-
pengembang aplikasi privasi tinggi,
-
perusahaan dengan pengguna di area jaringan tidak stabil,
-
serta tim yang ingin menekan biaya inferensi cloud.
Siapa yang sebaiknya menunggu?
Pertimbangkan menunggu dokumentasi dan dukungan perangkat yang lebih matang jika:
-
aplikasi hanya membutuhkan chatbot sederhana,
-
mayoritas pengguna memakai perangkat berspesifikasi rendah,
-
tim belum punya kemampuan menguji banyak tipe cip,
-
semua data memang sudah aman diproses di cloud,
-
atau kebutuhan utama adalah penalaran sangat kompleks dan generasi panjang.
Kesalahan yang sering terjadi saat membangun agent edge
Memindahkan seluruh model ke perangkat
Model terbesar belum tentu memberi pengalaman terbaik. Pada perangkat, ukuran model berdampak langsung pada waktu muat, RAM, suhu, dan baterai.
Mulailah dari tugas yang sempit. Ukur kualitasnya, lalu tambah kemampuan sedikit demi sedikit.
Menganggap “lokal” otomatis berarti aman
Model lokal tetap bisa membaca data yang tidak semestinya. Agent juga dapat menjalankan tindakan berbahaya jika izin terlalu luas.
Keamanan membutuhkan:
-
isolasi,
-
daftar izin,
-
validasi argumen,
-
konfirmasi pengguna,
-
dan pembatasan data.
Mengukur demo, bukan alur lengkap
Latensi model hanyalah satu bagian. Pengalaman pengguna juga dipengaruhi oleh:
-
waktu membuka kamera,
-
pra-pemrosesan,
-
waktu muat model,
-
pemanggilan alat,
-
penyimpanan,
-
dan pembaruan antarmuka.
Ukur dari saat pengguna memberi perintah sampai tugas benar-benar selesai.
Tidak menyiapkan jalur cadangan
Model lokal bisa gagal karena memori rendah, perangkat panas, format media aneh, atau runtime tidak cocok. Cloud pun bisa gagal karena jaringan atau pembatasan layanan.
Baca juga Memahami Token LLM: Cara Kerja, Biaya, dan Cara Menghitungnya
Sistem yang matang punya setidaknya tiga jalur:
-
lokal,
-
cloud,
-
tinjauan manusia atau tindakan manual.
Menjalankan alat tanpa konfirmasi
Panggilan alat 0,1 detik memang menarik, tetapi cepat tidak selalu berarti aman. Kesalahan yang cepat tetaplah kesalahan.
Bedakan tindakan berdasarkan risiko:
Tingkat risiko | Contoh | Kebijakan |
|---|---|---|
Rendah | Membuka kamera | Bisa otomatis |
Sedang | Membuat pengingat | Tampilkan notifikasi |
Tinggi | Mengirim pesan | Minta konfirmasi |
Sangat tinggi | Pembayaran atau kontrol kendaraan | Konfirmasi kuat dan aturan tambahan |
Panduan troubleshooting Step Edge dan agent local-first
Model lokal gagal dimuat
Gejala:
Out of memory
Model initialization failed
Unsupported operator
Yang perlu diperiksa:
-
kapasitas RAM yang tersedia,
-
ukuran model setelah kuantisasi,
-
kompatibilitas operator NPU,
-
ruang penyimpanan,
-
dan versi runtime.
Perbaikan:
-
gunakan varian model lebih kecil,
-
turunkan panjang konteks,
-
muat model secara malas saat dibutuhkan,
-
pindahkan operator yang tidak didukung ke CPU,
-
atau batasi jumlah sesi bersamaan.
Perangkat cepat panas
Panas biasanya muncul karena inferensi berulang, model terlalu besar, atau beban jatuh ke CPU dan GPU alih-alih NPU.
Coba:
-
beri jeda antarproses,
-
hentikan model saat aplikasi tidak aktif,
-
kurangi resolusi gambar,
-
batasi jumlah token,
-
gunakan kuantisasi,
-
dan periksa apakah akselerator benar-benar aktif.
Latensi lokal lebih lambat daripada cloud
Hal ini bisa terjadi pada perangkat lama atau model yang belum dioptimalkan.
Ukur secara terpisah:
model_load_ms
preprocess_ms
first_token_ms
generation_ms
tool_execution_ms
Jika model_load_ms dominan, pertahankan model di memori saat sesi aktif. Jika generation_ms dominan, kurangi token keluaran atau pilih model lebih kecil.
Agent memilih alat yang salah
Tambahkan:
-
deskripsi alat yang lebih spesifik,
-
contoh positif dan negatif,
-
skema argumen ketat,
-
ambang keyakinan,
-
dan layar konfirmasi.
Jangan membuat dua alat dengan deskripsi yang hampir sama. create_note dan save_document, misalnya, mudah tertukar jika batas fungsinya kabur.
Permintaan sensitif masih naik ke cloud
Penyaringan berbasis pola sederhana tidak cukup untuk produksi. Kombinasikan:
-
aturan tetap,
-
pengenal entitas lokal,
-
klasifikasi kebijakan,
-
label dari aplikasi sumber,
-
dan pilihan pengguna.
Tambahkan pengujian otomatis untuk nomor identitas, alamat, kredensial, data kesehatan, serta dokumen internal.
Respons cloud tidak sesuai format
Catat respons mentah di lingkungan pengembangan, bukan produksi. Periksa:
-
nama model,
-
versi API,
-
struktur
messages, -
definisi alat,
-
format keluaran,
-
dan batas token.
Jika provider mendukung keluaran JSON terstruktur, gunakan fitur tersebut daripada meminta model “menulis JSON” lewat teks biasa.
Agent tidak bekerja ketika offline
Pastikan tidak ada ketergantungan tersembunyi pada:
-
font dari internet,
-
berkas model jarak jauh,
-
autentikasi yang harus diperbarui,
-
penyimpanan media cloud,
-
atau pemeriksaan lisensi saat aplikasi dibuka.
Lakukan uji mode pesawat dari awal hingga akhir, bukan sekadar mematikan Wi-Fi setelah model aktif.
Tips optimasi untuk perangkat Android, kendaraan, dan komputer
Android dan ponsel konsumen
Uji setidaknya tiga kelas perangkat:
Baca juga Fine Tuning Model AI Sederhana: Panduan Dasar Praktis
-
perangkat kelas atas dengan NPU terbaru,
-
perangkat kelas menengah yang paling banyak dipakai,
-
dan perangkat lama yang masih masuk dukungan.
Jangan hanya menguji ponsel unggulan. Produk yang terasa hebat pada perangkat mahal bisa gagal menjangkau sebagian besar pasar Indonesia.
Sistem kendaraan
Utamakan keselamatan dan determinisme. Agent tidak boleh mengubah fungsi berkendara penting hanya berdasarkan keluaran model generatif.
Pisahkan:
-
agent percakapan,
-
sistem infotainment,
-
telemetri,
-
dan kendali keselamatan kendaraan.
Laptop dan komputer
Perangkat ini biasanya punya RAM lebih besar, tetapi konfigurasi cip sangat beragam. Sediakan pilihan CPU, GPU, dan NPU dengan pemeriksaan kemampuan otomatis.
Tampilkan status yang mudah dipahami:
Mode AI: Lokal
Akselerator: NPU
Memori model: 3,2 GB
Cloud cadangan: Aktif
Pengguna dengan koneksi terbatas
Sediakan:
-
unduhan model yang bisa dilanjutkan,
-
paket model melalui Wi-Fi,
-
ukuran unduhan yang terlihat jelas,
-
pilihan menghapus model,
-
dan mode hemat data.
Pembaruan model beberapa gigabita bisa menjadi beban nyata. Produk yang baik menghormati kuota dan ruang penyimpanan pengguna.
Rekomendasi berdasarkan kebutuhan
Kebutuhan | Rekomendasi |
|---|---|
Chatbot situs sederhana | Gunakan cloud terlebih dahulu |
Agent ponsel lintas aplikasi | Evaluasi Step Edge dengan izin alat ketat |
Pembacaan dokumen rahasia | Utamakan inferensi lokal |
Analisis panjang dan riset web | Gunakan cloud |
Kendaraan dengan koneksi tidak stabil | Gunakan arsitektur hibrida |
Perangkat kelas rendah | Pakai model lokal kecil dan cloud selektif |
Aplikasi suara cepat | Proses deteksi dan transkripsi ringan secara lokal |
Sistem keselamatan | Tambahkan aturan deterministik dan tinjauan manusia |
Operasi lapangan di Indonesia | Sediakan offline-first dan sinkronisasi tertunda |
Produk dengan jutaan pengguna | Hitung biaya total perangkat, cloud, pengujian, dan distribusi model |
Checklist sebelum membawa prototipe ke produksi
Model dan performa
Ukur latensi p50, p95, dan p99
Uji waktu muat model dari kondisi dingin
Ukur RAM, suhu, dan baterai
Uji perangkat kelas menengah
Uji mode pesawat
Tetapkan batas token dan waktu proses
Siapkan model cadangan yang lebih kecil
Privasi dan keamanan
Klasifikasikan data sebelum perutean
Hormati pilihan
allowCloudJangan simpan isi percakapan dalam log biasa
Terapkan daftar izin alat
Validasi setiap argumen alat
Minta konfirmasi untuk tindakan berisiko
Tanda tangani pembaruan model
Hapus media sementara secara otomatis
Kualitas agent
Ukur keberhasilan tugas, bukan hanya kualitas jawaban
Uji perintah dengan bahasa Indonesia sehari-hari
Uji variasi dialek dan pengucapan
Tambahkan jalur tinjauan manusia
Catat alasan eskalasi ke cloud
Buat kumpulan uji dari skenario nyata
Jalankan pengujian regresi setiap kali model berubah
Operasi dan ROI
Hitung persentase permintaan lokal
Hitung biaya cloud per pengguna aktif
Ukur penghematan data jaringan
Pantau tingkat kegagalan per tipe perangkat
Bandingkan biaya dukungan sebelum dan sesudah peluncuran
Tetapkan target bisnis sebelum uji coba
Mulai dari satu alur kerja bernilai tinggi, bukan semua fitur sekaligus<<>> StepFun meluncurkan Step Edge pada 12 Juli 2026 sebagai keluarga model AI yang dirancang untuk berjalan langsung di ponsel, sistem kendaraan, komputer, dan perangkat edge lainnya. Fokusnya bukan sekadar membawa chatbot ke perangkat, melainkan membangun AI agent lokal yang bisa memahami teks, gambar, dan audio, lalu menjalankan alat dengan latensi rendah melalui kolaborasi perangkat dan cloud.
Ringkasnya: Step Edge memindahkan sebagian proses AI dari pusat data ke perangkat pengguna. Pendekatan ini berpotensi memangkas waktu respons, menjaga lebih banyak data tetap lokal, mengurangi ketergantungan pada internet, dan membuka jalan bagi agent yang bisa berinteraksi langsung dengan aplikasi maupun fungsi perangkat.
Tutorial ini membahas cara menyiapkan prototipe aplikasi bergaya Step Edge dengan pola local-first. Karena paket SDK publik, nama model lokal, dan antarmuka resmi Step Edge belum dijabarkan secara lengkap dalam materi peluncuran yang tersedia, kode di bawah memakai lapisan adaptor netral. Nantinya, adaptor tersebut bisa dihubungkan ke Step Inference NPU engine atau runtime resmi tanpa perlu membongkar seluruh aplikasi.
Latar belakang: kenapa Step Edge menarik perhatian?
Sebagian besar aplikasi AI hari ini masih mengikuti pola yang sama:
-
Pengguna mengirim teks, gambar, atau audio.
-
Aplikasi mengunggah data ke server.
-
Model di cloud memproses permintaan.
-
Jawaban dikirim kembali ke perangkat.
Pola itu mudah dikembangkan dan memberi akses ke model berkapasitas besar. Sayangnya, ada beberapa biaya tersembunyi: latensi jaringan, pemakaian data, biaya API, risiko privasi, dan ketergantungan pada koneksi stabil.
Masalahnya terasa nyata dalam konteks Indonesia. Koneksi di pusat Jakarta, Bandung, atau Surabaya mungkin cukup stabil, tetapi pengalaman bisa berubah saat pengguna berada di kereta, area industri, jalan antarkota, perkebunan, atau wilayah dengan sinyal yang naik turun. Agent yang sepenuhnya bergantung pada cloud bisa mendadak kehilangan fungsi pada saat paling dibutuhkan.
Edge AI mencoba memperbaiki keadaan tersebut.
Edge AI adalah pendekatan yang menjalankan pemrosesan kecerdasan buatan sedekat mungkin dengan sumber data, misalnya langsung di ponsel, laptop, kamera, kendaraan, atau perangkat industri.
Step Edge masuk ke area ini dengan membawa model teks dan visual untuk ponsel, kendaraan, serta skenario perangkat lain. Informasi awal peluncuran juga menyebut pemrosesan lokal untuk teks, visual, dan audio, panggilan alat lokal sekitar 0,1 detik, kolaborasi cloud-perangkat, serta mesin Step Inference yang memanfaatkan NPU.
NPU atau neural processing unit adalah bagian cip yang dirancang khusus untuk beban kerja AI. Analoginya sederhana: CPU itu pekerja serba bisa, GPU jago mengerjakan banyak hitungan secara paralel, sedangkan NPU adalah spesialis yang menangani operasi model AI dengan konsumsi daya lebih efisien.
Langkah StepFun ini bukan muncul tiba-tiba. Perusahaan tersebut sebelumnya mengembangkan keluarga model multimodal Step, termasuk Step-2, Step-3, Step-Video-T2V, dan Step-Audio. Model Step-3 yang tersedia di Hugging Face, misalnya, memakai arsitektur Mixture-of-Experts dengan 321 miliar parameter total dan 38 miliar parameter aktif untuk tugas penalaran multimodal.
Kini arahnya bergeser dari “model besar di cloud” menjadi “sistem cerdas yang membagi pekerjaan antara perangkat dan cloud”.
Masalah yang ingin dipecahkan Step Edge
Latensi membuat agent terasa lamban
Chatbot masih bisa diterima jika membutuhkan satu atau dua detik untuk menjawab. Agent berbeda. Agent harus melihat keadaan layar, memilih alat, menjalankan tindakan, membaca hasilnya, lalu menentukan langkah berikutnya.
Jika setiap langkah harus bolak-balik ke cloud, penundaan kecil akan menumpuk. Sebuah alur dengan enam panggilan alat bisa terasa berat walaupun masing-masing panggilan hanya terlambat satu detik.
Panggilan alat lokal sekitar 0,1 detik, seperti yang diklaim dalam informasi awal Step Edge, menarik karena mengubah rasa interaksi. Agent tidak lagi seperti layanan jarak jauh yang sedang “berpikir”, tetapi lebih mirip bagian alami dari sistem operasi.
Data sensitif terlalu mudah keluar dari perangkat
Bayangkan agent membaca:
Baca juga Mengenal Large Language Model LLM
-
notifikasi pribadi,
-
rekaman suara,
-
isi layar perbankan,
-
dokumen pelanggan,
-
foto identitas,
-
posisi kendaraan,
-
atau percakapan internal perusahaan.
Tidak semua data itu perlu dikirim ke server. Model lokal dapat menangani klasifikasi, penyaringan, ekstraksi sederhana, atau pemilihan alat tanpa mengunggah data mentah.
Cloud masih berguna untuk penalaran berat. Bedanya, aplikasi bisa mengirim ringkasan yang sudah dibersihkan, bukan seluruh data asli.
Biaya cloud meningkat bersama jumlah pengguna
Biaya satu permintaan mungkin terlihat kecil. Pada skala ratusan ribu pengguna, biaya token, gambar, audio, dan panggilan agent bisa tumbuh cepat.
Pemrosesan lokal mengalihkan sebagian biaya komputasi ke perangkat. Ini bukan berarti gratis karena ukuran aplikasi, optimasi model, pengujian perangkat, dan pemakaian baterai tetap perlu dihitung. Meski begitu, arsitektur hibrida memberi tim lebih banyak kendali atas biaya per interaksi.
Agent butuh akses yang lebih dekat ke sistem
Model cloud dapat memberi instruksi, tetapi perangkatlah yang mempunyai akses ke kamera, mikrofon, lokasi, kalender, aplikasi, dan fungsi kendaraan. Agent yang benar-benar berguna membutuhkan jembatan aman menuju kemampuan tersebut.
StepFun sebelumnya juga mengembangkan Step-GUI untuk memahami antarmuka grafis dan menjalankan tugas lintas aplikasi. Step Edge memperkuat arah strategis ini dengan membawa kemampuan agent lebih dekat ke perangkat.
Step Edge dibandingkan cloud AI dan model lokal biasa
Tidak semua beban kerja harus dipindahkan ke perangkat. Teman-Teman tetap perlu memilih arsitektur berdasarkan kualitas model, privasi, biaya, dan jenis perangkat sasaran.
Kriteria | Cloud AI | Model lokal biasa | Step Edge bergaya hibrida |
|---|---|---|---|
Lokasi inferensi | Server jarak jauh | Perangkat | Perangkat dan cloud |
Ketergantungan internet | Tinggi | Rendah | Sedang dan bisa disesuaikan |
Latensi alat lokal | Bergantung jaringan | Rendah | Ditargetkan sangat rendah |
Kapasitas penalaran | Umumnya paling besar | Dibatasi perangkat | Lokal untuk tugas cepat, cloud untuk tugas berat |
Privasi | Data keluar dari perangkat | Data tetap lokal | Data sensitif bisa diproses lokal |
Biaya per permintaan | Berulang | Cenderung rendah setelah pemasangan | Bisa dioptimalkan lewat perutean |
Integrasi perangkat | Perlu jembatan tambahan | Sangat dekat | Dirancang untuk skenario agent |
Pembaruan model | Mudah di server | Perlu distribusi ulang | Kombinasi pembaruan lokal dan cloud |
Kebutuhan perangkat keras | Ringan di sisi pengguna | RAM, penyimpanan, dan NPU penting | Menyesuaikan kemampuan perangkat |
Cocok untuk | Analisis kompleks dan generasi panjang | Fitur offline yang sempit | Agent ponsel, kendaraan, dan aplikasi multimodal |
Pilih cloud jika kualitas maksimum menjadi prioritas
Cloud masih masuk akal untuk:
-
analisis dokumen yang sangat panjang,
-
penalaran kompleks,
-
pembuatan konten panjang,
-
pencarian web mendalam,
-
dan aplikasi yang berjalan pada perangkat berspesifikasi rendah.
StepFun sendiri tetap menyediakan model dan alat melalui StepFun Open Platform. Jadi, peluncuran Step Edge lebih tepat dibaca sebagai perluasan strategi daripada penggantian cloud.
Pilih lokal jika tugasnya sempit dan sensitif
Model lokal cocok untuk:
-
mendeteksi kata pemicu,
-
mengklasifikasikan perintah,
-
membaca teks singkat dari kamera,
-
menghapus informasi pribadi,
-
memilih alat,
-
atau menjalankan perintah perangkat.
Tugas semacam ini tidak selalu membutuhkan model terbesar. Model yang lebih kecil dan cepat sering memberi hasil bisnis lebih baik karena responsnya konsisten.
Pilih hibrida jika agent harus cepat sekaligus cerdas
Pola hibrida cocok saat aplikasi perlu:
-
tetap berguna tanpa jaringan,
-
menjaga data tertentu di perangkat,
-
memakai cloud hanya untuk kasus sulit,
-
dan menjalankan tindakan lokal dengan cepat.
Inilah posisi paling masuk akal bagi Step Edge.
Prasyarat untuk membuat prototipe Step Edge
Kita akan membuat layanan agent sederhana dengan TypeScript. Layanan ini menerima permintaan, memeriksa sensitivitas data, memilih inferensi lokal atau cloud, lalu memanggil alat yang aman.
Perangkat dan perangkat lunak
Siapkan:
-
Node.js 20 atau versi yang lebih baru
-
npm 10 atau versi yang lebih baru
-
Git
-
penyunting kode
-
terminal
-
akun StepFun Open Platform jika ingin menguji jalur cloud
-
ponsel, komputer, atau papan pengembangan dengan NPU jika ingin menghubungkan runtime lokal sungguhan
Periksa versi Node.js dan npm:
node --version
npm --version
Keluaran yang diharapkan:
v20.x.x
10.x.x
Versi yang lebih lama belum tentu gagal, tetapi Node.js 20 memberi dukungan stabil untuk fetch, modul modern, dan TypeScript terbaru.
Pengetahuan yang membantu
Teman-Teman cukup memahami:
-
cara menjalankan perintah di terminal,
-
variabel dan fungsi JavaScript,
-
permintaan HTTP,
-
berkas JSON,
-
serta konsep sederhana
asyncdanawait.
Kalau istilah inferensi masih asing, artinya hanya “proses menjalankan model untuk menghasilkan prediksi atau jawaban”.
Batasan yang harus dicatat sejak awal
Informasi peluncuran Step Edge menjelaskan arah produk dan kemampuan utama, tetapi belum memberi kontrak API lokal lengkap dalam sumber yang tersedia. Karena itu:
-
nama paket runtime lokal dalam tutorial ini bersifat adaptor contoh,
-
jalur berkas model hanyalah contoh konfigurasi,
-
angka hasil studi kasus nanti adalah target pengujian, bukan hasil resmi,
-
dan format alat perlu disesuaikan saat dokumentasi SDK resmi tersedia.
Kejujuran teknis seperti ini penting. Menebak nama paket atau endpoint memang bikin tutorial terlihat lengkap, tetapi ujung-ujungnya malah membuang waktu saat kode tidak bisa dijalankan.
Step 1 — Buat proyek agent local-first
Buka terminal lalu jalankan:
mkdir step-edge-agent
cd step-edge-agent
npm init -y
npm install express dotenv zod
npm install --save-dev typescript tsx @types/node @types/express
npx tsc --init
Buat struktur proyek:
mkdir -p src/adapters src/tools src/policy src/types
touch src/index.ts
touch src/config.ts
touch src/types/agent.ts
touch src/policy/router.ts
touch src/adapters/local-model.ts
touch src/adapters/cloud-model.ts
touch src/tools/registry.ts
touch .env.example
Tambahkan skrip berikut ke package.json:
{
"scripts": {
"dev": "tsx watch src/index.ts",
"start": "tsx src/index.ts",
"typecheck": "tsc --noEmit"
}
}
Sesuaikan bagian utama tsconfig.json:
{
"compilerOptions": {
"target": "ES2022",
"module": "NodeNext",
"moduleResolution": "NodeNext",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"outDir": "dist"
},
"include": ["src/**/*.ts"]
}
Kenapa langkah ini penting?
Kita sengaja memisahkan adaptor model, aturan perutean, dan alat. Kalau runtime Step Edge resmi berubah, Teman-Teman cukup memperbarui local-model.ts, bukan seluruh aplikasi.
Pemisahan ini juga memudahkan pengujian. Tim bisa memakai model tiruan di laptop, model NPU di ponsel, dan API cloud di server dengan kontrak aplikasi yang sama.
Jalankan pemeriksaan awal:
npm run typecheck
Keluaran yang diharapkan:
Tidak ada keluaran dan proses selesai dengan kode 0.
Kesalahan yang sering muncul
Cannot find module
Pastikan pemasangan paket selesai:
npm install
Unknown compiler option
Perbarui TypeScript:
npm install --save-dev typescript@latest
Perintah touch tidak tersedia di Windows
Buat berkas melalui penyunting kode atau PowerShell:
New-Item src/index.ts -ItemType File
Step 2 — Tentukan kontrak permintaan dan jawaban agent
Isi src/types/agent.ts:
export type InputKind = "text" | "image" | "audio";
export type ToolName =
| "open_app"
| "create_note"
| "set_reminder"
| "vehicle_status"
| "none";
export interface AgentRequest {
sessionId: string;
inputKind: InputKind;
text?: string;
mediaPath?: string;
allowCloud: boolean;
}
export interface ToolCall {
name: ToolName;
arguments: Record<string, unknown>;
}
export interface ModelResult {
answer: string;
confidence: number;
toolCall?: ToolCall;
processingLocation: "local" | "cloud";
durationMs: number;
}
export interface ModelAdapter {
run(request: AgentRequest): Promise<ModelResult>;
}
Kontrak ini menjadi bahasa bersama bagi semua komponen. Model lokal dan cloud boleh punya format internal yang berbeda, tetapi hasil akhirnya harus konsisten.
Kenapa allowCloud harus ada?
Persetujuan cloud tidak sebaiknya disembunyikan dalam pengaturan yang membingungkan. Bila data mungkin sensitif, pengguna atau kebijakan organisasi harus bisa melarang pengiriman data keluar perangkat.
Untuk aplikasi perusahaan, pilihan ini bisa ditentukan oleh:
-
klasifikasi dokumen,
-
lokasi pengguna,
-
jenis akun,
-
kebijakan perangkat,
-
atau status jaringan.
Periksa tipenya
npm run typecheck
Keluaran yang diharapkan:
Tidak ada galat TypeScript.
Step 3 — Bangun adaptor model lokal
Isi src/adapters/local-model.ts:
import {
AgentRequest,
ModelAdapter,
ModelResult,
ToolCall
} from "../types/agent.js";
function detectTool(text: string): ToolCall | undefined {
const normalized = text.toLowerCase();
if (normalized.includes("buka kamera")) {
return {
name: "open_app",
arguments: { app: "camera" }
};
}
if (normalized.includes("buat catatan")) {
const content = text
.replace(/buat catatan/gi, "")
.trim();
return {
name: "create_note",
arguments: {
title: "Catatan dari agent",
content: content || "Catatan kosong"
}
};
}
if (normalized.includes("ingatkan")) {
return {
name: "set_reminder",
arguments: {
text,
delayMinutes: 30
}
};
}
if (
normalized.includes("status kendaraan") ||
normalized.includes("baterai mobil")
) {
return {
name: "vehicle_status",
arguments: {}
};
}
return undefined;
}
export class LocalModelAdapter implements ModelAdapter {
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
const text = request.text ?? "";
const toolCall = detectTool(text);
const answer = toolCall
? `Perintah dipahami. Alat ${toolCall.name} siap dijalankan.`
: "Permintaan diproses secara lokal, tetapi belum perlu memakai alat.";
return {
answer,
confidence: toolCall ? 0.92 : 0.68,
toolCall,
processingLocation: "local",
durationMs: Math.round(performance.now() - startedAt)
};
}
}
Kode ini belum menjalankan model saraf. Ia berfungsi sebagai simulator agar arsitektur, izin, alat, pencatatan, dan jalur cadangan bisa diuji lebih dulu.
Kenapa tidak langsung memasang model besar?
Kesalahan umum dalam proyek edge AI adalah memulai dari model, lalu baru memikirkan produk. Padahal, masalah paling sulit sering berada di luar model:
-
izin alat,
-
keamanan tindakan,
-
jalur cadangan,
-
pengalaman saat offline,
-
batas waktu,
-
penggunaan baterai,
-
dan pencatatan kegagalan.
Simulator membantu tim menemukan masalah tersebut tanpa menunggu model selesai dioptimalkan.
Cara menggantinya dengan runtime Step Edge
Saat runtime resmi tersedia, pertahankan kelas dan metode run, lalu ganti isi fungsi dengan pemanggilan mesin inferensi lokal.
Pola konseptualnya seperti ini:
export class LocalModelAdapter {
constructor(private runtime: EdgeRuntime) {}
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
const raw = await this.runtime.generate({
text: request.text,
image: request.inputKind === "image"
? request.mediaPath
: undefined,
audio: request.inputKind === "audio"
? request.mediaPath
: undefined,
responseFormat: "tool_call_json"
});
return {
answer: raw.answer,
confidence: raw.confidence,
toolCall: raw.toolCall,
processingLocation: "local",
durationMs: Math.round(performance.now() - startedAt)
};
}
}
EdgeRuntime pada contoh tersebut sengaja tidak diimpor dari paket tertentu. Teman-Teman perlu menggantinya sesuai nama paket, metode inisialisasi, dan format keluaran pada dokumentasi Step Edge yang resmi.
Step 4 — Tambahkan adaptor cloud sebagai jalur cadangan
Buat .env.example:
PORT=3000
STEPFUN_API_KEY=
STEPFUN_API_BASE_URL=
STEPFUN_MODEL=
LOCAL_CONFIDENCE_THRESHOLD=0.75
CLOUD_TIMEOUT_MS=12000
Salin menjadi .env:
cp .env.example .env
Isi src/config.ts:
import "dotenv/config";
export const config = {
port: Number(process.env. PORT ?? 3000),
apiKey: process.env. STEPFUN_API_KEY ?? "",
apiBaseUrl: process.env. STEPFUN_API_BASE_URL ?? "",
cloudModel: process.env. STEPFUN_MODEL ?? "",
localConfidenceThreshold: Number(
process.env. LOCAL_CONFIDENCE_THRESHOLD ?? 0.75
),
cloudTimeoutMs: Number(
process.env. CLOUD_TIMEOUT_MS ?? 12000
)
};
Lalu isi src/adapters/cloud-model.ts:
import { config } from "../config.js";
import {
AgentRequest,
ModelAdapter,
ModelResult
} from "../types/agent.js";
export class CloudModelAdapter implements ModelAdapter {
async run(request: AgentRequest): Promise<ModelResult> {
const startedAt = performance.now();
if (
!config.apiKey ||
!config.apiBaseUrl ||
!config.cloudModel
) {
throw new Error(
"Konfigurasi cloud belum lengkap. Isi API key, base URL, dan nama model dari dokumentasi resmi."
);
}
const controller = new AbortController();
const timeout = setTimeout(
() => controller.abort(),
config.cloudTimeoutMs
);
try {
const response = await fetch(config.apiBaseUrl, {
method: "POST",
headers: {
"Authorization": `Bearer ${config.apiKey}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: config.cloudModel,
messages: [
{
role: "system",
content:
"Jawab ringkas. Jika perlu alat, kembalikan panggilan alat terstruktur."
},
{
role: "user",
content: request.text ?? ""
}
]
}),
signal: controller.signal
});
if (!response.ok) {
throw new Error(
`Cloud API gagal dengan status ${response.status}`
);
}
const data = await response.json() as {
choices?: Array<{
message?: {
content?: string;
};
}>;
};
return {
answer:
data.choices?.[0]?.message?.content ??
"Cloud tidak mengembalikan jawaban.",
confidence: 0.9,
processingLocation: "cloud",
durationMs: Math.round(performance.now() - startedAt)
};
} finally {
clearTimeout(timeout);
}
}
}
Kenapa base URL dan nama model tidak diisi langsung?
Alamat API, nama model, serta skema permintaan bisa berubah. Menyalin endpoint dari artikel pihak ketiga berisiko menghasilkan integrasi yang cepat usang.
Ambil nilai aktual dari dokumentasi dan dasbor resmi StepFun. Pendekatan ini juga mencegah kunci API masuk ke repositori.
Tambahkan .env ke .gitignore:
echo ".env" >> .gitignore
Kesalahan umum pada jalur cloud
Status 401
Kunci API salah, kedaluwarsa, atau tidak mempunyai akses ke model.
Status 404
Base URL atau nama model tidak sesuai dokumentasi terbaru.
AbortError
Permintaan melewati batas waktu. Naikkan CLOUD_TIMEOUT_MS atau pertahankan jawaban lokal.
Jawaban ada, tetapi format alat hilang
Model cloud mungkin membutuhkan definisi tools dalam skema khusus. Sesuaikan payload dengan dokumentasi API yang sedang berlaku.
Step 5 — Buat kebijakan perutean lokal dan cloud
Isi src/policy/router.ts:
import { config } from "../config.js";
import {
AgentRequest,
ModelAdapter,
ModelResult
} from "../types/agent.js";
const sensitivePatterns = [
/\b\d{16}\b/,
/\bnik\b/i,
/\bpin\b/i,
/\bpassword\b/i,
/\bkata sandi\b/i,
/\brekam medis\b/i
];
function containsSensitiveData(text: string): boolean {
return sensitivePatterns.some((pattern) =>
pattern.test(text)
);
}
function isComplexRequest(text: string): boolean {
const words = text.trim().split(/\s+/).length;
return (
words > 80 ||
/bandingkan|analisis mendalam|riset|jelaskan secara rinci/i.test(text)
);
}
export class HybridRouter {
constructor(
private local: ModelAdapter,
private cloud: ModelAdapter
) {}
async run(request: AgentRequest): Promise<ModelResult> {
const text = request.text ?? "";
const sensitive = containsSensitiveData(text);
if (sensitive || !request.allowCloud) {
return this.local.run(request);
}
const localResult = await this.local.run(request);
const shouldEscalate =
localResult.confidence <
config.localConfidenceThreshold ||
isComplexRequest(text);
if (!shouldEscalate) {
return localResult;
}
try {
return await this.cloud.run(request);
} catch (error) {
return {
...localResult,
answer:
`${localResult.answer} Cloud tidak tersedia, jadi hasil lokal dipertahankan.`
};
}
}
}
Kenapa perutean perlu aturan yang terlihat?
Teman-Teman sebaiknya tidak menyerahkan semua keputusan kepada model. Aturan eksplisit lebih mudah diaudit, terutama untuk data sensitif dan tindakan berisiko.
Urutan dalam kode tadi sengaja dibuat seperti ini:
-
Data sensitif tetap lokal.
-
Pengguna yang menolak cloud selalu dihormati.
-
Model lokal mendapat kesempatan pertama.
-
Cloud hanya dipanggil saat keyakinan rendah atau tugas kompleks.
-
Jika cloud gagal, aplikasi tetap memberi hasil lokal.
Pola ini menangkap manfaat utama kolaborasi cloud-perangkat tanpa membuat cloud menjadi titik kegagalan tunggal.
Keluaran yang diharapkan
Permintaan singkat:
{
"text": "Buka kamera",
"allowCloud": true
}
Seharusnya tetap diproses lokal karena keyakinannya tinggi.
Permintaan panjang:
{
"text": "Bandingkan tiga strategi pemasaran dan jelaskan secara rinci",
"allowCloud": true
}
Seharusnya diarahkan ke cloud jika konfigurasi tersedia.
Permintaan sensitif:
{
"text": "Simpan PIN saya 123456",
"allowCloud": true
}
Harus tetap berada di perangkat walaupun cloud diizinkan secara umum.
Step 6 — Bangun daftar alat yang aman
Isi src/tools/registry.ts:
import { ToolCall } from "../types/agent.js";
type ToolResult = {
ok: boolean;
message: string;
data?: Record<string, unknown>;
};
const allowedApps = new Set([
"camera",
"calendar",
"maps",
"notes"
]);
export async function executeTool(
call: ToolCall
): Promise<ToolResult> {
switch (call.name) {
case "open_app": {
const app = String(call.arguments.app ?? "");
if (!allowedApps.has(app)) {
return {
ok: false,
message: `Aplikasi ${app} tidak masuk daftar izin.`
};
}
return {
ok: true,
message: `Aplikasi ${app} dibuka.`
};
}
case "create_note": {
const title = String(
call.arguments.title ?? "Tanpa judul"
);
const content = String(
call.arguments.content ?? ""
);
return {
ok: true,
message: "Catatan berhasil dibuat.",
data: { title, content }
};
}
case "set_reminder": {
const delayMinutes = Number(
call.arguments.delayMinutes ?? 30
);
if (
!Number.isFinite(delayMinutes) ||
delayMinutes < 1 ||
delayMinutes > 10080
) {
return {
ok: false,
message: "Waktu pengingat tidak valid."
};
}
return {
ok: true,
message:
`Pengingat dijadwalkan ${delayMinutes} menit lagi.`
};
}
case "vehicle_status": {
return {
ok: true,
message: "Status kendaraan tersedia.",
data: {
batteryPercent: 78,
rangeKm: 286,
doorsLocked: true
}
};
}
default:
return {
ok: false,
message: "Alat tidak dikenal."
};
}
}
Kenapa alat harus memakai daftar izin?
Model generatif bisa salah memahami perintah. Jangan memberi agent akses bebas ke fungsi sistem hanya karena model menghasilkan JSON yang terlihat meyakinkan.
Daftar izin membatasi tindakan ke fungsi yang memang sudah ditinjau. Validasi argumen juga mencegah nilai berbahaya atau tidak masuk akal.
Untuk penggunaan produksi, tindakan berikut sebaiknya meminta konfirmasi manusia:
-
mengirim pesan,
-
melakukan pembayaran,
-
menghapus berkas,
-
membuka pintu,
-
mengubah kendali kendaraan,
-
membeli barang,
-
dan membagikan lokasi.
Aturan praktis: semakin sulit sebuah tindakan dibatalkan, semakin kuat konfirmasi yang harus diminta.
Step 7 — Rangkai server agent
Isi src/index.ts:
import express from "express";
import { z } from "zod";
import { config } from "./config.js";
import { LocalModelAdapter } from "./adapters/local-model.js";
import { CloudModelAdapter } from "./adapters/cloud-model.js";
import { HybridRouter } from "./policy/router.js";
import { executeTool } from "./tools/registry.js";
const app = express();
app.use(express.json({ limit: "2mb" }));
const requestSchema = z.object({
sessionId: z.string().min(1),
inputKind: z.enum(["text", "image", "audio"]),
text: z.string().optional(),
mediaPath: z.string().optional(),
allowCloud: z.boolean().default(false),
executeTools: z.boolean().default(false)
});
const router = new HybridRouter(
new LocalModelAdapter(),
new CloudModelAdapter()
);
app.get("/health", (_req, res) => {
res.json({
ok: true,
service: "step-edge-agent-prototype"
});
});
app.post("/agent", async (req, res) => {
const parsed = requestSchema.safeParse(req.body);
if (!parsed.success) {
return res.status(400).json({
error: "Permintaan tidak valid.",
details: parsed.error.flatten()
});
}
try {
const modelResult = await router.run(parsed.data);
let toolResult;
if (
parsed.data.executeTools &&
modelResult.toolCall
) {
toolResult = await executeTool(
modelResult.toolCall
);
}
return res.json({
...modelResult,
toolResult
});
} catch (error) {
const message =
error instanceof Error
? error.message
: "Galat tidak dikenal.";
return res.status(500).json({ error: message });
}
});
app.listen(config.port, () => {
console.log(
`Agent berjalan di http://localhost:${config.port}`
);
});
Jalankan server:
npm run dev
Keluaran yang diharapkan:
Agent berjalan di http://localhost:3000
Uji kesehatan layanan:
curl http://localhost:3000/health
Keluaran yang diharapkan:
{
"ok": true,
"service": "step-edge-agent-prototype"
}
Kenapa validasi Zod penting?
TypeScript hanya memeriksa kode saat pengembangan. Ia tidak bisa menjamin bahwa data dari aplikasi seluler, peramban, atau perangkat kendaraan benar-benar sesuai tipe.
Zod memvalidasi data ketika permintaan masuk. Tanpa validasi runtime, nilai seperti "allowCloud": "iya" bisa menyelinap dan menghasilkan perilaku yang sulit ditebak.
Step 8 — Uji perintah lokal dan panggilan alat
Kirim perintah membuka kamera:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-001",
"inputKind": "text",
"text": "Buka kamera",
"allowCloud": false,
"executeTools": true
}'
Keluaran yang diharapkan:
{
"answer": "Perintah dipahami. Alat open_app siap dijalankan.",
"confidence": 0.92,
"toolCall": {
"name": "open_app",
"arguments": {
"app": "camera"
}
},
"processingLocation": "local",
"durationMs": 1,
"toolResult": {
"ok": true,
"message": "Aplikasi camera dibuka."
}
}
Nilai durationMs akan berbeda di setiap perangkat. Simulator bisa selesai dalam satu atau dua milidetik, sedangkan model lokal sungguhan membutuhkan waktu lebih panjang.
Kirim perintah membuat catatan:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-002",
"inputKind": "text",
"text": "Buat catatan beli token listrik malam ini",
"allowCloud": false,
"executeTools": true
}'
Keluaran yang diharapkan:
{
"answer": "Perintah dipahami. Alat create_note siap dijalankan.",
"confidence": 0.92,
"toolCall": {
"name": "create_note",
"arguments": {
"title": "Catatan dari agent",
"content": "beli token listrik malam ini"
}
},
"processingLocation": "local",
"toolResult": {
"ok": true,
"message": "Catatan berhasil dibuat.",
"data": {
"title": "Catatan dari agent",
"content": "beli token listrik malam ini"
}
}
}
Uji pemisahan rencana dan tindakan
Ubah executeTools menjadi false:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "uji-003",
"inputKind": "text",
"text": "Buka kamera",
"allowCloud": false,
"executeTools": false
}'
Agent akan menyusun panggilan alat, tetapi tidak menjalankannya. Pola ini berguna untuk layar konfirmasi:
Agent ingin membuka kamera. Izinkan?
[Batalkan] [Izinkan sekali]
Step 9 — Tambahkan dukungan gambar dan audio
Step Edge diposisikan sebagai keluarga model untuk teks dan visual, sementara informasi peluncurannya juga menyinggung pemrosesan audio lokal. Aplikasi kita sudah mempunyai inputKind, tetapi belum memvalidasi berkas media.
Tambahkan fungsi berikut ke src/index.ts sebelum rute /agent:
function validateMediaInput(input: {
inputKind: "text" | "image" | "audio";
text?: string;
mediaPath?: string;
}) {
if (input.inputKind === "text" && !input.text) {
throw new Error("Input teks membutuhkan field text.");
}
if (
input.inputKind !== "text" &&
!input.mediaPath
) {
throw new Error(
"Input gambar atau audio membutuhkan mediaPath."
);
}
if (
input.mediaPath &&
input.mediaPath.startsWith("http")
) {
throw new Error(
"Prototipe local-first hanya menerima jalur berkas lokal."
);
}
}
Panggil setelah validasi Zod:
validateMediaInput(parsed.data);
Contoh permintaan gambar:
curl -X POST http://localhost:3000/agent \
-H "Content-Type: application/json" \
-d '{
"sessionId": "visual-001",
"inputKind": "image",
"text": "Baca angka meter pada gambar ini",
"mediaPath": "/data/local/meter.jpg",
"allowCloud": false,
"executeTools": false
}'
Pada simulator, jawaban belum membaca gambar. Setelah adaptor terhubung ke runtime multimodal Step Edge, mediaPath bisa diteruskan ke pemroses gambar lokal.
Kenapa memakai jalur berkas lokal?
Tujuan local-first akan berantakan jika aplikasi mengunggah gambar ke penyimpanan publik sebelum model membacanya. Jalur lokal menjaga aliran data tetap berada di perangkat.
Pada Android dan iOS, akses berkas harus mengikuti mekanisme izin sistem. Jangan mengubah jalur lokal menjadi URL publik hanya demi memudahkan pengembangan.
Pra-pemrosesan yang layak ditambahkan
Untuk gambar:
-
ubah orientasi berdasarkan metadata,
-
batasi resolusi,
-
kompres tanpa merusak teks kecil,
-
potong area yang relevan,
-
dan hapus metadata lokasi jika tidak dibutuhkan.
Untuk audio:
-
ubah ke kanal mono jika model mendukungnya,
-
samakan laju sampel,
-
potong bagian hening,
-
batasi durasi,
-
dan tampilkan indikator rekaman yang jelas.
Pra-pemrosesan mengurangi beban NPU, pemakaian memori, dan waktu inferensi.
Step 10 — Ukur latensi, keberhasilan alat, dan pemakaian cloud
Klaim performa tidak cukup diuji dengan satu demo. Agent perlu diukur pada rangkaian tugas yang mencerminkan penggunaan nyata.
Buat src/benchmark.ts:
import { LocalModelAdapter } from "./adapters/local-model.js";
const model = new LocalModelAdapter();
const prompts = [
"Buka kamera",
"Buat catatan bayar internet besok",
"Ingatkan saya untuk minum obat",
"Tampilkan status kendaraan",
"Jelaskan cuaca hari ini"
];
const durations: number[] = [];
let toolCalls = 0;
for (let index = 0; index < 20; index++) {
for (const text of prompts) {
const result = await model.run({
sessionId: `bench-${index}`,
inputKind: "text",
text,
allowCloud: false
});
durations.push(result.durationMs);
if (result.toolCall) {
toolCalls++;
}
}
}
durations.sort((a, b) => a - b);
const percentile = (p: number) => {
const position = Math.ceil(
(p / 100) * durations.length
) - 1;
return durations[
Math.max(0, Math.min(position, durations.length - 1))
];
};
console.log({
samples: durations.length,
p50Ms: percentile(50),
p95Ms: percentile(95),
toolCalls
});
Tambahkan skrip:
{
"scripts": {
"benchmark": "tsx src/benchmark.ts"
}
}
Jalankan:
npm run benchmark
Contoh keluaran simulator:
{
samples: 100,
p50Ms: 0,
p95Ms: 1,
toolCalls: 80
}
Angka simulator bukan tolok ukur Step Edge. Setelah runtime asli terpasang, ukur sekurangnya:
-
waktu muat model,
-
latensi token pertama,
-
latensi total,
-
p50, p95, dan p99,
-
keberhasilan pemilihan alat,
-
keberhasilan penyelesaian tugas,
-
konsumsi RAM,
-
suhu perangkat,
-
pemakaian baterai,
-
persentase permintaan yang naik ke cloud,
-
serta kegagalan saat jaringan terputus.
Kenapa p95 lebih berguna daripada rata-rata?
Rata-rata bisa terlihat bagus walaupun sebagian pengguna mengalami penundaan parah. p95 menunjukkan bahwa 95 persen permintaan selesai di bawah angka tersebut.
Untuk agent interaktif, ekor latensi sering lebih terasa daripada rata-rata. Satu tindakan yang mendadak memakan delapan detik bisa merusak kepercayaan pengguna.
Step 11 — Pasang pengaman privasi dan pencatatan
Jangan mencatat seluruh isi permintaan secara mentah. Log produksi sering disalin ke banyak sistem, lalu bertahan lebih lama daripada data aplikasi utama.
Buat src/safe-logger.ts:
function hashSession(sessionId: string): string {
let hash = 0;
for (const char of sessionId) {
hash = (hash * 31 + char.charCodeAt(0)) >>> 0;
}
return hash.toString(16);
}
export function logAgentRun(input: {
sessionId: string;
inputKind: string;
location: "local" | "cloud";
durationMs: number;
toolName?: string;
success: boolean;
}) {
console.log(JSON.stringify({
event: "agent_run",
session: hashSession(input.sessionId),
inputKind: input.inputKind,
location: input.location,
durationMs: input.durationMs,
toolName: input.toolName ?? null,
success: input.success,
timestamp: new Date().toISOString()
}));
}
Catatan ini menyimpan metrik operasional tanpa menyimpan isi percakapan.
Untuk lingkungan yang diatur ketat, pertimbangkan juga:
-
enkripsi model dan cache,
-
tanda tangan digital untuk pembaruan model,
-
masa simpan log,
-
penghapusan otomatis media sementara,
-
isolasi alat,
-
pembatasan jaringan,
-
dan audit tindakan agent.
Studi kasus: agent inspeksi armada di Indonesia
Background
Bayangkan sebuah perusahaan logistik yang mengoperasikan armada dari Jakarta menuju Bandung, Cirebon, Semarang, dan Surabaya. Pengemudi perlu memeriksa kondisi kendaraan, mencatat kerusakan ringan, memotret panel, dan mengirim laporan sebelum berangkat.
Sistem lama memakai formulir cloud. Saat koneksi buruk, foto gagal terunggah, formulir tersangkut, dan petugas harus mengulang pemeriksaan.
Challenge atau masalah
Tim menghadapi empat hambatan:
-
koneksi tidak selalu stabil di depo dan perjalanan,
-
foto panel kendaraan mengandung informasi operasional,
-
laporan perlu selesai dalam hitungan menit,
-
dan biaya pemrosesan gambar meningkat seiring jumlah armada.
Menghapus cloud sepenuhnya bukan pilihan ideal. Tim pusat tetap membutuhkan analisis gabungan, histori armada, dan pencarian lintas laporan.
Approach
Arsitektur bergaya Step Edge membagi pekerjaan seperti berikut:
Di perangkat:
-
membaca angka odometer,
-
mengenali lampu peringatan,
-
mengubah suara menjadi teks,
-
mengklasifikasikan tingkat risiko,
-
dan memvalidasi kelengkapan laporan.
Di cloud:
-
membandingkan histori kendaraan,
-
mencari pola kerusakan,
-
menyusun rekomendasi perawatan,
-
dan membuat laporan lintas armada.
Data mentah tetap lokal jika tidak dibutuhkan. Cloud menerima hasil terstruktur seperti kode peringatan, nilai odometer, dan tingkat keyakinan.
Implementation
Alurnya bisa berbentuk:
flowchart LR
A["Kamera dan mikrofon"] --> B["Model lokal Step Edge"]
B --> C{"Keyakinan cukup?"}
C -->|"Ya"| D["Validasi dan simpan lokal"]
C -->|"Tidak"| E{"Cloud diizinkan?"}
E -->|"Ya"| F["Model Step di cloud"]
E -->|"Tidak"| G["Minta pemeriksaan manual"]
D --> H["Sinkronisasi ringkasan"]
F --> H
G --> H
Kebijakan eskalasinya:
type InspectionDecision =
| "accept_local"
| "send_to_cloud"
| "human_review";
function decideInspection(input: {
confidence: number;
networkAvailable: boolean;
cloudAllowed: boolean;
safetyCritical: boolean;
}): InspectionDecision {
if (input.safetyCritical && input.confidence < 0.95) {
return "human_review";
}
if (input.confidence >= 0.88) {
return "accept_local";
}
if (
input.networkAvailable &&
input.cloudAllowed
) {
return "send_to_cloud";
}
return "human_review";
}
Results yang layak dijadikan target
Karena implementasi ini berupa studi kasus rancangan, metrik berikut adalah target uji coba yang masuk akal, bukan hasil resmi StepFun:
Metrik | Kondisi awal | Target uji coba |
|---|---|---|
Waktu pemeriksaan | 8 menit | 4–5 menit |
Permintaan yang perlu cloud | 100% | Di bawah 35% |
Laporan gagal saat koneksi buruk | 12% | Di bawah 2% |
Pengulangan unggah foto | 9% | Di bawah 3% |
Tugas sederhana selesai lokal | 0% | Di atas 70% |
Kasus keselamatan dengan tinjauan manusia | Tidak konsisten | 100% |
Target tersebut harus divalidasi di perangkat dan jaringan nyata. Pengujian laboratorium dengan Wi-Fi cepat tidak cukup untuk mewakili jalan tol, depo pinggiran kota, atau wilayah dengan cakupan seluler tidak merata.
Key Learnings
Beberapa pelajaran paling penting dari rancangan ini:
-
Model lokal tidak perlu menyelesaikan semua masalah.
-
Perutean yang baik lebih bernilai daripada memaksa satu model mengerjakan semuanya.
-
Tugas keselamatan tetap membutuhkan batas keyakinan tinggi.
-
Offline bukan fitur tambahan, melainkan bagian dari desain.
-
Data mentah sebaiknya tidak naik ke cloud tanpa alasan jelas.
-
Metrik keberhasilan tugas lebih penting daripada skor tolok ukur model.
Penilaian Step Edge sebagai produk
Fitur yang paling menjanjikan
1. Pemrosesan multimodal lokal
Teks, gambar, dan audio adalah tiga masukan utama perangkat modern. Dukungan lokal memungkinkan agent memahami konteks tanpa selalu mengirim data ke server.
2. Kolaborasi cloud-perangkat
Ini lebih realistis daripada pendekatan “semua lokal”. Model perangkat menangani tugas cepat, sedangkan cloud menerima pekerjaan yang membutuhkan kapasitas lebih besar.
3. Step Inference untuk NPU
Mesin inferensi yang mengoptimalkan NPU penting karena keberhasilan edge AI tidak hanya bergantung pada kualitas model. Penjadwalan operator, kuantisasi, penggunaan memori, dan kompatibilitas cip sangat menentukan pengalaman nyata.
4. Arah menuju agent sistem
Step Edge tampaknya dirancang untuk melakukan tindakan, bukan sekadar menjawab pertanyaan. Ini selaras dengan strategi StepFun pada model GUI dan keterlibatannya dalam perangkat serta kendaraan.
5. Hubungan dengan ekosistem model Step
StepFun sudah punya model bahasa, visual, audio, dan video. Portofolio ini memberi fondasi untuk membagi kemampuan antara perangkat dan cloud.
Kelebihan
-
Potensi latensi rendah untuk tindakan lokal
-
Privasi lebih baik jika kebijakan dirancang dengan benar
-
Pengalaman masih bisa berjalan saat jaringan buruk
-
Biaya cloud berpotensi turun
-
Cocok untuk ponsel, kendaraan, komputer, dan perangkat khusus
-
Mendukung arah agent multimodal yang lebih praktis
Kekurangan dan risiko
-
Dokumentasi publik Step Edge perlu cukup rinci agar integrasi mudah direproduksi
-
Dukungan NPU bisa berbeda antarmerek dan antargenerasi cip
-
Model lokal menambah ukuran aplikasi dan kebutuhan penyimpanan
-
Inferensi terus-menerus dapat menguras baterai atau menaikkan suhu
-
Pembaruan model di jutaan perangkat lebih rumit daripada pembaruan cloud
-
Akses agent ke aplikasi dan fungsi sistem memperbesar permukaan keamanan
-
Klaim peringkat pada 29 metrik perlu dibaca bersama metodologi, perangkat uji, dan pembandingnya
Siapa yang paling cocok memakai Step Edge?
Step Edge layak dipantau oleh:
-
pembuat aplikasi ponsel dengan fitur agent,
-
produsen kendaraan dan sistem kokpit,
-
perusahaan perangkat pintar,
-
tim layanan lapangan,
-
pengembang aplikasi privasi tinggi,
-
perusahaan dengan pengguna di area jaringan tidak stabil,
-
serta tim yang ingin menekan biaya inferensi cloud.
Siapa yang sebaiknya menunggu?
Pertimbangkan menunggu dokumentasi dan dukungan perangkat yang lebih matang jika:
-
aplikasi hanya membutuhkan chatbot sederhana,
-
mayoritas pengguna memakai perangkat berspesifikasi rendah,
-
tim belum punya kemampuan menguji banyak tipe cip,
-
semua data memang sudah aman diproses di cloud,
-
atau kebutuhan utama adalah penalaran sangat kompleks dan generasi panjang.
Kesalahan yang sering terjadi saat membangun agent edge
Memindahkan seluruh model ke perangkat
Model terbesar belum tentu memberi pengalaman terbaik. Pada perangkat, ukuran model berdampak langsung pada waktu muat, RAM, suhu, dan baterai.
Mulailah dari tugas yang sempit. Ukur kualitasnya, lalu tambah kemampuan sedikit demi sedikit.
Menganggap “lokal” otomatis berarti aman
Model lokal tetap bisa membaca data yang tidak semestinya. Agent juga dapat menjalankan tindakan berbahaya jika izin terlalu luas.
Keamanan membutuhkan:
-
isolasi,
-
daftar izin,
-
validasi argumen,
-
konfirmasi pengguna,
-
dan pembatasan data.
Mengukur demo, bukan alur lengkap
Latensi model hanyalah satu bagian. Pengalaman pengguna juga dipengaruhi oleh:
-
waktu membuka kamera,
-
pra-pemrosesan,
-
waktu muat model,
-
pemanggilan alat,
-
penyimpanan,
-
dan pembaruan antarmuka.
Ukur dari saat pengguna memberi perintah sampai tugas benar-benar selesai.
Tidak menyiapkan jalur cadangan
Model lokal bisa gagal karena memori rendah, perangkat panas, format media aneh, atau runtime tidak cocok. Cloud pun bisa gagal karena jaringan atau pembatasan layanan.
Sistem yang matang punya setidaknya tiga jalur:
-
lokal,
-
cloud,
-
tinjauan manusia atau tindakan manual.
Menjalankan alat tanpa konfirmasi
Panggilan alat 0,1 detik memang menarik, tetapi cepat tidak selalu berarti aman. Kesalahan yang cepat tetaplah kesalahan.
Bedakan tindakan berdasarkan risiko:
Tingkat risiko | Contoh | Kebijakan |
|---|---|---|
Rendah | Membuka kamera | Bisa otomatis |
Sedang | Membuat pengingat | Tampilkan notifikasi |
Tinggi | Mengirim pesan | Minta konfirmasi |
Sangat tinggi | Pembayaran atau kontrol kendaraan | Konfirmasi kuat dan aturan tambahan |
Panduan troubleshooting Step Edge dan agent local-first
Model lokal gagal dimuat
Gejala:
Out of memory
Model initialization failed
Unsupported operator
Yang perlu diperiksa:
-
kapasitas RAM yang tersedia,
-
ukuran model setelah kuantisasi,
-
kompatibilitas operator NPU,
-
ruang penyimpanan,
-
dan versi runtime.
Perbaikan:
-
gunakan varian model lebih kecil,
-
turunkan panjang konteks,
-
muat model secara malas saat dibutuhkan,
-
pindahkan operator yang tidak didukung ke CPU,
-
atau batasi jumlah sesi bersamaan.
Perangkat cepat panas
Panas biasanya muncul karena inferensi berulang, model terlalu besar, atau beban jatuh ke CPU dan GPU alih-alih NPU.
Coba:
-
beri jeda antarproses,
-
hentikan model saat aplikasi tidak aktif,
-
kurangi resolusi gambar,
-
batasi jumlah token,
-
gunakan kuantisasi,
-
dan periksa apakah akselerator benar-benar aktif.
Latensi lokal lebih lambat daripada cloud
Hal ini bisa terjadi pada perangkat lama atau model yang belum dioptimalkan.
Ukur secara terpisah:
model_load_ms
preprocess_ms
first_token_ms
generation_ms
tool_execution_ms
Jika model_load_ms dominan, pertahankan model di memori saat sesi aktif. Jika generation_ms dominan, kurangi token keluaran atau pilih model lebih kecil.
Agent memilih alat yang salah
Tambahkan:
-
deskripsi alat yang lebih spesifik,
-
contoh positif dan negatif,
-
skema argumen ketat,
-
ambang keyakinan,
-
dan layar konfirmasi.
Jangan membuat dua alat dengan deskripsi yang hampir sama. create_note dan save_document, misalnya, mudah tertukar jika batas fungsinya kabur.
Permintaan sensitif masih naik ke cloud
Penyaringan berbasis pola sederhana tidak cukup untuk produksi. Kombinasikan:
-
aturan tetap,
-
pengenal entitas lokal,
-
klasifikasi kebijakan,
-
label dari aplikasi sumber,
-
dan pilihan pengguna.
Tambahkan pengujian otomatis untuk nomor identitas, alamat, kredensial, data kesehatan, serta dokumen internal.
Respons cloud tidak sesuai format
Catat respons mentah di lingkungan pengembangan, bukan produksi. Periksa:
-
nama model,
-
versi API,
-
struktur
messages, -
definisi alat,
-
format keluaran,
-
dan batas token.
Jika provider mendukung keluaran JSON terstruktur, gunakan fitur tersebut daripada meminta model “menulis JSON” lewat teks biasa.
Agent tidak bekerja ketika offline
Pastikan tidak ada ketergantungan tersembunyi pada:
-
font dari internet,
-
berkas model jarak jauh,
-
autentikasi yang harus diperbarui,
-
penyimpanan media cloud,
-
atau pemeriksaan lisensi saat aplikasi dibuka.
Lakukan uji mode pesawat dari awal hingga akhir, bukan sekadar mematikan Wi-Fi setelah model aktif.
Tips optimasi untuk perangkat Android, kendaraan, dan komputer
Android dan ponsel konsumen
Uji setidaknya tiga kelas perangkat:
-
perangkat kelas atas dengan NPU terbaru,
-
perangkat kelas menengah yang paling banyak dipakai,
-
dan perangkat lama yang masih masuk dukungan.
Jangan hanya menguji ponsel unggulan. Produk yang terasa hebat pada perangkat mahal bisa gagal menjangkau sebagian besar pasar Indonesia.
Sistem kendaraan
Utamakan keselamatan dan determinisme. Agent tidak boleh mengubah fungsi berkendara penting hanya berdasarkan keluaran model generatif.
Pisahkan:
-
agent percakapan,
-
sistem infotainment,
-
telemetri,
-
dan kendali keselamatan kendaraan.
Laptop dan komputer
Perangkat ini biasanya punya RAM lebih besar, tetapi konfigurasi cip sangat beragam. Sediakan pilihan CPU, GPU, dan NPU dengan pemeriksaan kemampuan otomatis.
Tampilkan status yang mudah dipahami:
Mode AI: Lokal
Akselerator: NPU
Memori model: 3,2 GB
Cloud cadangan: Aktif
Pengguna dengan koneksi terbatas
Sediakan:
-
unduhan model yang bisa dilanjutkan,
-
paket model melalui Wi-Fi,
-
ukuran unduhan yang terlihat jelas,
-
pilihan menghapus model,
-
dan mode hemat data.
Pembaruan model beberapa gigabita bisa menjadi beban nyata. Produk yang baik menghormati kuota dan ruang penyimpanan pengguna.
Rekomendasi berdasarkan kebutuhan
Kebutuhan | Rekomendasi |
|---|---|
Chatbot situs sederhana | Gunakan cloud terlebih dahulu |
Agent ponsel lintas aplikasi | Evaluasi Step Edge dengan izin alat ketat |
Pembacaan dokumen rahasia | Utamakan inferensi lokal |
Analisis panjang dan riset web | Gunakan cloud |
Kendaraan dengan koneksi tidak stabil | Gunakan arsitektur hibrida |
Perangkat kelas rendah | Pakai model lokal kecil dan cloud selektif |
Aplikasi suara cepat | Proses deteksi dan transkripsi ringan secara lokal |
Sistem keselamatan | Tambahkan aturan deterministik dan tinjauan manusia |
Operasi lapangan di Indonesia | Sediakan offline-first dan sinkronisasi tertunda |
Produk dengan jutaan pengguna | Hitung biaya total perangkat, cloud, pengujian, dan distribusi model |
Checklist sebelum membawa prototipe ke produksi
Model dan performa
Ukur latensi p50, p95, dan p99
Uji waktu muat model dari kondisi dingin
Ukur RAM, suhu, dan baterai
Uji perangkat kelas menengah
Uji mode pesawat
Tetapkan batas token dan waktu proses
Siapkan model cadangan yang lebih kecil
Privasi dan keamanan
Klasifikasikan data sebelum perutean
Hormati pilihan
allowCloudJangan simpan isi percakapan dalam log biasa
Terapkan daftar izin alat
Validasi setiap argumen alat
Minta konfirmasi untuk tindakan berisiko
Tanda tangani pembaruan model
Hapus media sementara secara otomatis
Kualitas agent
Ukur keberhasilan tugas, bukan hanya kualitas jawaban
Uji perintah dengan bahasa Indonesia sehari-hari
Uji variasi dialek dan pengucapan
Tambahkan jalur tinjauan manusia
Catat alasan eskalasi ke cloud
Buat kumpulan uji dari skenario nyata
Jalankan pengujian regresi setiap kali model berubah
Operasi dan ROI
Hitung persentase permintaan lokal
Hitung biaya cloud per pengguna aktif
Ukur penghematan data jaringan
Pantau tingkat kegagalan per tipe perangkat
Bandingkan biaya dukungan sebelum dan sesudah peluncuran
Tetapkan target bisnis sebelum uji coba
Mulai dari satu alur kerja bernilai tinggi, bukan semua fitur sekaligus
Kesimpulan
Peluncuran Step Edge menunjukkan bahwa AI generatif bergerak makin dekat ke pengguna: berjalan langsung di ponsel, laptop, kendaraan, dan perangkat dengan koneksi terbatas. Nilai utamanya bukan sekadar mode lokal, melainkan kombinasi latensi rendah, privasi lebih kuat, efisiensi biaya cloud, dan kemampuan tetap berfungsi saat jaringan bermasalah.
Namun, Step Edge bukan solusi sekali pasang. Implementasi yang matang tetap membutuhkan arsitektur hibrida, pemilihan model berdasarkan kemampuan perangkat, izin alat yang ketat, serta pengujian nyata terhadap RAM, baterai, suhu, bahasa Indonesia, dan keberhasilan tugas. Tim pengembang juga perlu mengikuti praktik keamanan seperti panduan OWASP untuk aplikasi berbasis model bahasa agar agent tidak berubah menjadi pintu masuk risiko baru.
Langkah paling masuk akal adalah memulai dari satu alur kerja bernilai tinggi, mengujinya pada perangkat yang benar-benar digunakan target pasar, lalu mengukur dampaknya sebelum memperluas fitur. Jangan adopsi Step Edge hanya karena AI lokal sedang ramai—gunakan ketika teknologi ini terbukti membuat produk lebih cepat, aman, hemat, dan tetap berguna bagi pengguna Indonesia.
Referensi
ZGLG. (2026). StepFun Unveils Step Edge On-Device Model Family for Smartphones and Automotive Systems.
X. (2026). StepFun Launches Step Edge, a Text and Vision AI Model for Phones, Vehicles, and Other Edge Scenarios.
StepFun Open Platform. (2026). StepFun Open Platform.
Hugging Face. (2026). StepFun Step3.
YouTube. (2026). Step Edge 正式发布!你的手机/电脑就是 AI Agent,云边协同彻底爆发,本地运行大模型新时代来了.
StepFun. (2026). 阶跃星辰.
Wikipedia. (2026). StepFun.
BigGo Finance. (2026). AI Agent Phones Flood the Market: Huaqin Technology Manufactures StepFun’s First Model.
BitAuto. (2026). Geely and StepFun Jointly Open-Source Two Multimodal Large Models.
iGeekPhone. (2026). StepFun Reportedly Preparing Its First AI Smartphone with Native AI Agent Capabilities.
Komentar (0)
Belum ada komentar. Jadilah yang pertama berbagi pendapat!
Tinggalkan komentar