یه استک کامل هوش مصنوعی، مستقیم توی مرورگر
خلاصهٔ کاملتر
پروژهی inbrowser یه استک چهار تیکهست برای اینکه بشه یه مدل زبانی رو توی یه وباپ گذاشت بدون اینکه پشتش سرور inference داشته باشی. مدل یا روی GPU خود کاربر توی همون تب مرورگر اجرا میشه، یا کارو میده به یه مدل ابری، و جریان توکنها هم جوری طراحی شده که با رفرش صفحه یا قطعی اتصال از دست نمیره.
چهار کتابخونه اینا هستن: @inbrowser/model برای اجرای مدل روی GPU کاربر یا از طریق یه ارائهدهندهی ابری (با تغییر یه خط میشه بینشون سوییچ کرد)، @inbrowser/agent که به مدل اجازه میده از ابزارها استفاده کنه و چند مرحلهای یه کار رو توی مرورگر انجام بده، @inbrowser/resumable که جوابهای طولانی رو استریم میکنه و اگه تب بسته بشه یا اتصال قطع بشه، کار از همونجایی که مونده ادامه پیدا میکنه، و @inbrowser/relay که یه سرور سبک اضافه میکنه برای وقتی میخوای کلید API رو از سمت کلاینت دور نگه داری یا یه اجرا رو بین چند دستگاه به اشتراک بذاری.
نکتهی جالب پروژه اینه که مدلهای روی دستگاه اصلاً نیازی به کلید API ندارن، ولی مدلهای ابری از الگوی BYOK استفاده میکنن؛ یعنی هر کاربر کلید خودشو میده و اون کلید روی کلاینت میمونه، نه روی یه سروری که تو اداره میکنی. برای اجرای مدل روی مرورگر هم از createEngine استفاده میشه که وزنهای مدل رو یه بار دانلود میکنه (چیزی حدود ۱۸۰ مگابایت برای کوچیکترین پرست) و بعدش کش میکنه؛ اجرا هم روی WebGPU انجام میشه و اگه GPU نبود میره سراغ WASM.
برای مدلهای ابری هم ModelClient یه قرارداد مشترکه که همهی ارائهدهندهها ازش پیروی میکنن، از جمله Gemini، OpenRouter، Anthropic Claude، سرورهای سازگار با OpenAI، Ollama، llama.cpp، و حتی Claude CLI و Claude Code Agent SDK (این دوتا فقط روی Node کار میکنن). برای OpenRouter هم یه فلوی OAuth با PKCE هست که کاربر با یه کلیک وصل میشه و کلیدش مستقیم برای خودش صادر میشه، بدون اینکه هیچ client secretای لازم باشه.
const engine = createEngine({ ...smollm2_360m });
await engine.ensureReady();
const client = createEngineModelClient(engine);برای ساخت ایجنت هم @inbrowser/agent یه حلقهی ReAct میسازه که مدل میتونه توش از ابزارهای تعریفشده استفاده کنه؛ چون این حلقه به مدلی نیاز داره که بتونه ابزار صدا بزنه، معمولاً باید از یه کلاینت ابری استفاده کرد، چون بیشتر پرستهای کوچیک روی دستگاه از پس تولکالینگ برنمیان. کوچیکترین پرستی که ادعای تولکالینگ داره qwen2_5_0_5b هست.
بخش استریم قابل ازسرگیری هم یه لاگ append-only میسازه که با seq مرتب میشه؛ وقتی کلاینت بعد از رفرش دوباره وصل میشه، فقط از آخرین seqای که دیده بود ادامه میگیره و هیچ توکنی تکراری یا گم نمیشه. این استور هم قابل تعویضه: میشه از حافظه، IndexedDB، یا حتی Firebase RTDB برای اشتراکگذاری بین چند دستگاه استفاده کرد.
نکات کلیدی:
- پروژه یه استک چهار کتابخونهای برای اجرای هوش مصنوعی توی مرورگره: model، agent، resumable، و relay
- مدلهای روی دستگاه بدون کلید API کار میکنن؛ مدلهای ابری از الگوی BYOK استفاده میکنن و کلید فقط روی کلاینت میمونه
- اجرای مدل روی مرورگر با Transformers.js و ONNX Runtime Web انجام میشه، روی WebGPU با فالبک به WASM
- ModelClient یه قرارداد مشترکه که Gemini، OpenRouter، Anthropic، Ollama، llama.cpp و چندتای دیگه رو پوشش میده
- استریم قابل ازسرگیری با یه لاگ append-only مبتنی بر seq تضمین میکنه توکنی گم یا تکراری نشه




