প্রকাশিত: ১৪ মে, ২০২৬
ক্রোমের প্রম্পট এপিআই (Prompt API) ব্যবহার করে, আপনি window.LanguageModel এ একটি উচ্চ-স্তরের ব্রাউজার এপিআই প্রয়োগের মাধ্যমে একটি এলএলএম (LLM)-এর সাথে ইন্টারঅ্যাক্ট করতে পারেন। তবে, এর জন্য সমর্থন এখনও সীমিত এবং এর বাস্তবায়ন একটি জটিল প্রক্রিয়া।
| ব্রাউজার | সমর্থিত অপারেটিং সিস্টেম | অসমর্থিত ওএস | অবস্থান |
|---|---|---|---|
| ক্রোম | উইন্ডোজ, ম্যাকওএস, লিনাক্স, ক্রোমওএস (ক্রোমবুক প্লাস) | অ্যান্ড্রয়েড, আইওএস | ✅ সমর্থিত |
| প্রান্ত | উইন্ডোজ, ম্যাকওএস | অ্যান্ড্রয়েড, আইওএস | ✅ সমর্থিত |
| সাফারি | — | — | 📋 অবস্থান নির্ধারিত হয়েছে |
| ফায়ারফক্স | — | — | 📋 অবস্থান নির্ধারিত হয়েছে |
একই সময়ে, আর্লি প্রিভিউ প্রোগ্রামের ডেভেলপাররা প্রম্পট এপিআই (Prompt API)-এর প্রতি তাদের উচ্ছ্বাস প্রকাশ করেছেন। এই এপিআই-এর সহজলভ্যতা অদূর ভবিষ্যতে একটি সামঞ্জস্যগত চ্যালেঞ্জ তৈরি করছে।
সমাধান
এই কারণেই আমরা একটি পরীক্ষামূলক ও স্পেক-সম্মত প্রম্পট এপিআই পলিফিল প্রকাশ করছি (এর সোর্স কোড গিটহাবে দেখুন), যা কনফিগারযোগ্য ক্লাউড ব্যাকএন্ড প্রোভাইডার এবং Transformers.js- এর মতো একটি লোকাল ব্যাকএন্ড প্রোভাইডারের উপরেও প্রম্পট এপিআই নির্ভুলভাবে প্রয়োগ করে।
পলিফিল ব্যবহার করুন
পলিফিলটি ব্যবহার করতে, নিম্নলিখিতগুলি করুন:
npm থেকে পলিফিলটি ডাউনলোড করুন:
npm install prompt-api-polyfillআপনি ক্লাউড ব্যাকএন্ড প্রোভাইডার নাকি লোকাল ব্যাকএন্ড প্রোভাইডার ব্যবহার করতে চান, তা বেছে নিন:
- ক্লাউড ব্যাকএন্ড প্রোভাইডার: ব্যবহারকারীর ডেটা দূরবর্তী প্রক্রিয়াকরণের জন্য ক্লাউডে পাঠানো হয়, কিন্তু আপনাকে স্থানীয় মডেল উপলব্ধ হওয়ার জন্য অপেক্ষা করতে হবে না। আপনার ক্লাউড প্রোভাইডারের মূল্য নির্ধারণের তথ্য অনুযায়ী উদ্ভূত যেকোনো খরচের জন্য আপনি দায়ী থাকবেন।
- স্থানীয় ব্যাকএন্ড প্রোভাইডার: ব্যবহারকারীর ডেটা ব্রাউজারেই থাকে এবং স্থানীয়ভাবে প্রসেস করা হয়, কিন্তু আপনাকে একটি মডেল ডাউনলোড করতে হবে, যা আসল প্রম্পট এপিআই-এর মতো বিভিন্ন অরিজিনের মধ্যে শেয়ার করা যায় না। স্থানীয় প্রসেসিং-এর জন্য কোনো খরচ নেই।
ক্লাউড ব্যাকএন্ড
যেকোনো ক্লাউড ব্যাকএন্ড বেছে নিন এবং আপনার ব্যাকএন্ড প্রোভাইডারের জন্য একটি এপিআই কী (এবং অন্য যেকোনো অতিরিক্ত ক্রেডেনশিয়াল) সংগ্রহ করুন।
আপনার API কী পেয়ে গেলে, আপনার কনফিগারেশন ফাইল .env.json এ বিস্তারিত তথ্যগুলো লিখুন। আপনি যদি modelName নির্দিষ্ট না করেন, তাহলে পলিফিলটি প্রতিটি ব্যাকএন্ডের ডিফল্ট মডেল ব্যবহার করবে, কিন্তু যদি তা করেন, তবে আপনি প্রতিটি ব্যাকএন্ডের সমর্থিত মডেলগুলোর মধ্যে থেকে একটি বেছে নিতে পারবেন।
{
"apiKey": "y0ur-Api-k3Y",
"modelName": "model-name"
}
স্থানীয় ব্যাকএন্ড
আপনি যদি Transformers.js-ভিত্তিক কোনো স্থানীয় ব্যাকএন্ড প্রোভাইডার ব্যবহার করার সিদ্ধান্ত নেন, তাহলে আপনার শুধু একটি ডামি এপিআই কী প্রয়োজন হবে। তবে, Transformers.js কোন ডিভাইস ব্যবহার করবে তা আপনি কনফিগার করতে পারেন। সর্বোচ্চ পারফরম্যান্সের জন্য "webgpu" এবং সর্বোচ্চ সামঞ্জস্যের জন্য "wasm" বেছে নিন। আপনি চাইলে ডিফল্ট সেটিংস পরিবর্তন করতে পারেন। Hugging Face-এর সামঞ্জস্যপূর্ণ মডেলের ক্যাটালগ থেকে অন্য একটি মডেল বেছে নিন। কিছু মডেলের জন্য, আপনি dtype প্যারামিটার ব্যবহার করে বিভিন্ন কোয়ান্টাইজেশন থেকে নির্বাচন করতে পারেন।
{
"apiKey": "dummy",
"device": "webgpu",
"dtype": "q4f16",
"modelName": "onnx-community/gemma-3-1b-it-ONNX-GQA"
};
আপনার পলিফিল কনফিগার করুন
কনফিগারেশন ফাইলটি তৈরি হয়ে গেলে, আপনি এখন আপনার অ্যাপে পলিফিলটি ব্যবহার করা শুরু করতে পারেন।
- কনফিগারেশন ফাইলটি ইম্পোর্ট করুন এবং এটিকে একটি উপযুক্ত নামের গ্লোবাল ভেরিয়েবলে অ্যাসাইন করুন, যেখানে
$BACKENDহলো আপনার নির্বাচিত ব্যাকএন্ড:window.$BACKEND_CONFIG। - ডাইনামিক ইম্পোর্ট ব্যবহার করে শুধুমাত্র তখনই পলিফিলটি লোড করুন, যখন সংশ্লিষ্ট ব্রাউজারটি এটিকে সাপোর্ট করে না।
- প্রম্পট এপিআই ফাংশনগুলো কল করুন ।
import config from './.env.json' with { type: 'json' };
// Set $BACKEND_CONFIG to select a backend
window.$BACKEND_CONFIG = config;
if (!('LanguageModel' in window)) {
await import('prompt-api-polyfill');
}
const session = await LanguageModel.create({
expectedInputs: [{type: 'text', languages: ['en']}],
expectedOutputs: [{type: 'text', languages: ['en']}],
});
await session.prompt('Tell me a joke!');
এই পলিফিলটি স্ট্রাকচার্ড আউটপুট সমর্থন করে (Transformers.js ব্যাকএন্ড ছাড়া), মাল্টিমোডাল ইনপুট সামলাতে পারে (OpenAI ব্যাকএন্ড ছাড়া, যা অডিও এবং ছবি একসাথে নয়, কেবল আলাদাভাবে সমর্থন করে), এবং LanguageModel এর জন্য সম্পূর্ণ ওয়েব প্ল্যাটফর্ম টেস্ট স্যুটের সাপেক্ষে এটি পরীক্ষিত।
আরও প্রেক্ষাপট, বিস্তারিত ব্যবহারবিধি এবং সোর্স কোডের জন্য গিটহাব রিপোজিটরিতে থাকা README ফাইলটি দেখুন।
ব্রাউজার প্রম্পট এপিআই থেকে পার্থক্য
যদি পলিফিলটি ক্লাউড মডেল দ্বারা সমর্থিত হয়, তাহলে ক্লায়েন্ট-সাইডে চালানোর কিছু সুবিধা আর প্রযোজ্য থাকে না। বিশেষত, আপনি আর সংবেদনশীল ডেটার স্থানীয় প্রক্রিয়াকরণের নিশ্চয়তা দিতে পারবেন না, যদিও আপনার ব্যাকএন্ড প্রোভাইডারের গোপনীয়তা নীতিগুলো তখনও প্রযোজ্য থাকবে। ব্যবহারকারী অফলাইনে থাকলে আপনার অ্যাপ আর এআই (AI) ব্যবহার করতে পারবে না। আপনি অনলাইন না অফলাইন, তা জানতে সংশ্লিষ্ট ইভেন্টগুলো লিসেন করতে পারেন।
window.addEventListener("offline", (e) => {
console.log("offline");
});
window.addEventListener("online", (e) => {
console.log("online");
});
যদি এআই ইনফারেন্স ক্লাউডের কোনো মডেলের উপর চলে, তাহলে ডাউনলোড করার জন্য কোনো লোকাল মডেল থাকে না। পলিফিলটি downloadprogress ইভেন্টগুলোকে নকল করে, ফলে আপনার অ্যাপের কাছে এমন মনে হবে যেন বিল্ট-ইন মডেলটি ইতিমধ্যেই ডাউনলোড হয়ে গেছে। এর মানে হলো, দুটি ইভেন্ট থাকবে—একটির loaded ভ্যালু হবে 0 এবং অন্যটির 1 , যা স্পেসিফিকেশন অনুযায়ীই প্রয়োজন।
অন-ডিভাইস ইনফারেন্সের বিপরীতে, ক্লাউড-ভিত্তিক ইনফারেন্সের ক্ষেত্রে আপনার পছন্দের ব্যাকএন্ড প্রোভাইডারের এপিআই কল করার সময় একটি সম্ভাব্য খরচ জড়িত থাকে। জেমিনি এপিআই- এর মতো মূল্য নির্ধারণের তথ্য যাচাই করুন। যদি আপনি প্রতি টোকেনের খরচ জানেন, তবে খরচ গণনা করার জন্য আপনি প্রম্পট এপিআই-এর contextUsage তথ্য ব্যবহার করতে পারেন।
const COST_PER_TOKEN = 123;
const COST_LIMIT = 456;
let costSoFar = 0;
const session = await LanguageModel.create(options);
/…/
if (costSoFar < COST_LIMIT) {
await session.prompt('Tell me a joke.');
costSoFar = session.contextUsage * COST_PER_TOKEN;
} else {
// Show premium AI plan promo.
}
যখন আপনি কোনো মোবাইল বা ওয়েব অ্যাপ থেকে সরাসরি কোনো ক্লাউড এপিআই কল করেন (উদাহরণস্বরূপ, যে এপিআইগুলো জেনারেটিভ এআই মডেলে অ্যাক্সেস দেয়), তখন অননুমোদিত ক্লায়েন্টদের দ্বারা এপিআই কী-টি অপব্যবহারের ঝুঁকিতে থাকে। এই এপিআইগুলোকে সুরক্ষিত রাখতে, আপনি যদি Firebase AI Logic Hybrid SDK ব্যবহার করেন, তবে আপনার Firebase App Check ব্যবহার করে যাচাই করা উচিত যে সমস্ত ইনকামিং এপিআই কল আপনার আসল অ্যাপ থেকেই আসছে। Google-এর মতো কিছু ক্লাউড প্রোভাইডারের ক্ষেত্রে, আপনি কঠোর অরিজিন চেকও প্রয়োগ করতে পারেন, যাতে শুধুমাত্র অনুমোদিত ওয়েবসাইটগুলোই এপিআই ব্যবহার করতে পারে।
উদাহরণস্বরূপ, সেশনের contextWindow এর ক্ষেত্রে Prompt API-এর সীমাবদ্ধতার পরিবর্তে, ব্যাকএন্ড প্রোভাইডারের সীমাবদ্ধতা প্রযোজ্য হয়। contextWindow এর জন্য এই সীমাবদ্ধতাগুলো সাধারণত ডিভাইসের চেয়ে অনেক বেশি হয়, এবং ক্লাউডে আপনি আরও বেশি পরিমাণে ডেটা প্রসেস করতে পারেন। তাই, এই পার্থক্য সম্পর্কে আপনার সচেতন থাকা উচিত হলেও, বাস্তবে সম্ভবত আপনি এ নিয়ে কোনো সমস্যায় পড়বেন না।
আপনার নিজস্ব ব্যাকএন্ড তৈরি করুন
আপনার নিজস্ব ব্যাকএন্ড প্রোভাইডার যোগ করতে, এই ধাপগুলো অনুসরণ করুন:
বেস ব্যাকএন্ড ক্লাসটি প্রসারিত করুন
backends/ ডিরেক্টরিতে একটি নতুন ফাইল তৈরি করুন, যেমন ` backends/custom-backend.js । আপনাকে PolyfillBackend ক্লাসটি এক্সটেন্ড করতে হবে এবং প্রত্যাশিত ইন্টারফেসটি পূরণ করে এমন কোর মেথডগুলো ইমপ্লিমেন্ট করতে হবে।
import PolyfillBackend from './base.js';
import { DEFAULT_MODELS } from './defaults.js';
export default class CustomBackend extends PolyfillBackend {
constructor(config) {
// config typically comes from a window global (e.g., window.CUSTOM_CONFIG)
super(config.modelName || DEFAULT_MODELS.custom.modelName);
}
// Check if the backend is configured (e.g., API key is present), if given
// combinations of modelName and options are supported, or, for local model,
// if the model is available.
static availability(options) {
return window.CUSTOM_CONFIG?.apiKey ? 'available' : 'unavailable';
}
// Initialize the underlying SDK or API client. With local models, use
// monitorTarget to report model download progress to the polyfill.
createSession(options, sessionParams, monitorTarget) {
// Return the initialized session or client instance
}
// Non-streaming prompt execution
async generateContent(contents) {
// contents: Array of { role: 'user'|'model', parts: [{ text: string }] }
// Return: { text: string, usage: number }
}
// Streaming prompt execution
async generateContentStream(contents) {
// Return: AsyncIterable yielding chunks
}
// Token counting for quota/usage tracking
async countTokens(contents) {
// Return: total token count (number)
}
}
আপনার ব্যাকএন্ড নিবন্ধন করুন
পলিফিলটি গ্লোবাল কনফিগারেশনের উপর ভিত্তি করে একটি "ফার্স্ট-ম্যাচ প্রায়োরিটি" স্ট্র্যাটেজি ব্যবহার করে। আপনাকে prompt-api-polyfill.js ফাইলে স্ট্যাটিক #backends অ্যারেতে আপনার ব্যাকএন্ডটি যোগ করে রেজিস্টার করতে হবে:
// prompt-api-polyfill.js
static #backends = [
// ... existing backends
{
config: 'CUSTOM_CONFIG', // The global object to look for on `window`
path: './backends/custom-backend.js',
},
];
একটি ডিফল্ট মডেল সেট করুন
backends/defaults.js ফাইলে ফলব্যাক মডেল আইডেন্টিটি নির্ধারণ করুন। যখন কোনো ব্যবহারকারী একটি নির্দিষ্ট modelName উল্লেখ না করে সেশন শুরু করেন, তখন এটি ব্যবহৃত হয়।
// backends/defaults.js
export const DEFAULT_MODELS = {
// ...
custom: 'custom-model-pro-v1',
};
স্থানীয় উন্নয়ন এবং পরীক্ষা সক্ষম করুন
প্রজেক্টটি টেস্ট ম্যাট্রিক্স তৈরি করার জন্য একটি ডিসকভারি স্ক্রিপ্ট ( scripts/list-backends.js ) ব্যবহার করে। টেস্ট রানারে আপনার নতুন ব্যাকএন্ড অন্তর্ভুক্ত করতে, রুট ডিরেক্টরিতে একটি .env-[name].json ফাইল (উদাহরণস্বরূপ, .env-custom.json ) তৈরি করুন:
{
"apiKey": "your-api-key-here",
"modelName": "custom-model-pro-v1"
}
ওয়েব প্ল্যাটফর্ম টেস্ট (WPT) দিয়ে যাচাই করুন
চূড়ান্ত ধাপ হলো সম্মতি নিশ্চিত করা। যেহেতু পলিফিলটি স্পেক-নির্ভর, তাই যেকোনো নতুন ব্যাকএন্ডকে অবশ্যই অফিসিয়াল (বা পরীক্ষামূলক) ওয়েব প্ল্যাটফর্ম টেস্টগুলো পাস করতে হবে:
npm run test:wpt
এই যাচাইকরণ ধাপটি নিশ্চিত করে যে আপনার ব্যাকএন্ড AbortSignal , সিস্টেম প্রম্পট এবং হিস্ট্রি ফরম্যাটিং-এর মতো বিষয়গুলো Prompt API স্পেসিফিকেশন অনুযায়ী সঠিকভাবে পরিচালনা করে।
উপসংহার
এই পলিফিলটি আপনাকে সমস্ত প্ল্যাটফর্ম এবং ডিভাইসে প্রম্পট এপিআই (Prompt API) ব্যবহার করতে সাহায্য করে। প্রম্পট এপিআই-এর সু-সংজ্ঞায়িত এপিআই (API) অনুসারে কোডিং করার মাধ্যমে, আপনি ক্লাউড প্রোভাইডারদের থেকে নিজেকে আরও স্বাধীন করে তোলেন এবং প্ল্যাটফর্মের যতটা সম্ভব কাছাকাছি থাকতে পারেন।
Prompt API সমর্থনকারী সক্ষম ডিভাইসগুলিতে পলিফিলটি লোডই হয় না, ফলে আপনার ব্যবহারকারীরা এমন কোড ডাউনলোড করা থেকে বিরত থাকেন যা তারা চালাবে না। আপনার কোনো মতামত থাকলে বা কোনো বাগ খুঁজে পেলে, GitHub-এ একটি Issue খুলুন । হ্যাপি প্রম্পটিং!