ব্লগে ফিরে যান

API ও SDKগাইড

একটি API (Python) দিয়ে একটি প্রম্পট থেকে HTML টুল তৈরি করুন

একটি Python স্ক্রিপ্ট যা একটি প্রম্পটকে কার্যকরী tool.html-এ পরিণত করে, finish_reason দিয়ে কাটা উত্তর ধরে এবং টোকেন ও খরচ প্রিন্ট করে।

CheapTokens Team দ্বারাপ্রকাশিত হয়েছে 11 মিনিট পড়ার সময়

একটি কোড স্নিপেট যা finish_reason যাচাই করে এবং 'One prompt, one HTML tool' শিরোনামের পাশে tool.html সংরক্ষণ করে
এই পৃষ্ঠায়
  1. একটি "আমাকে একটি টুল বানিয়ে দাও" প্রম্পটের যা প্রয়োজন
  2. স্ক্রিপ্ট: অনুরোধ, যাচাই, সংরক্ষণ
  3. কেন max_tokens পৃষ্ঠাটি কাজ করবে কিনা তা নির্ধারণ করে
  4. এটি খুলুন এবং পৃষ্ঠাটি দেখুন
  5. একটি জেনারেশনের খরচ কত
  6. যদি এটি কাজ না করে

একটি API কল থেকেই আপনি একটি কার্যকরী একক-ফাইল টুল পেতে পারেন: একটি সুগঠিত প্রম্পট পাঠান, নিশ্চিত করুন যে max_tokens পুরো একটি পৃষ্ঠার জন্য যথেষ্ট বড়, যাচাই করুন যে finish_reason হলো stop, এবং উত্তরটি tool.html হিসেবে সংরক্ষণ করুন। নিচে ঠিক সেই কাজটি করা স্ক্রিপ্ট এবং একটি প্রম্পট টেমপ্লেট দেওয়া হলো যা আপনি নিজের টুলের জন্য পুনর্গঠন করতে পারেন।

ধারণাটি সহজ, এবং DeepSeek সম্প্রতি এটি দেখিয়েছে। এটি DeepSeek Harness-এ Creator Mode-এর জন্য সাতটি ডেমো প্রম্পটের একটি সংগ্রহ প্রকাশ করেছে (পৃষ্ঠাটি, ৩ নভেম্বর ২০২৬-এ যাচাই করা): একটি 3D ল্যান্ডমার্ক গ্যালারি, একটি পোস্টার ওয়ার্কবেঞ্চ, একটি ভিডিও এডিটিং ওয়ার্কবেঞ্চ, একটি পেপার রিডার, একটি কথোপকথন পরিসংখ্যান বোর্ড এবং আরও কয়েকটি। Creator Mode Harness অ্যাপের ভিতরে থাকে। আপনি যদি নিজের স্ক্রিপ্টে এবং নিজের কী দিয়ে একই "প্রম্পট ইন, টুল আউট" প্রবাহ চান, তবে একক-ফাইল ক্ষেত্রে একটি সাধারণ চ্যাট কমপ্লিশনই যথেষ্ট। আপনি যদি Harness নিজেই ব্যবহার করেন, তবে এটিকে CheapTokens-এর সাথে সংযুক্ত করা একটি পৃথক সংক্ষিপ্ত গাইড।

একটি "আমাকে একটি টুল বানিয়ে দাও" প্রম্পটের যা প্রয়োজন#

সেই ডেমো প্রম্পটগুলোর কয়েকটি পড়ুন এবং একটি প্যাটার্ন দেখা যাবে। প্রতিটি বলে টুলটি কী, স্ক্রিনে কী আছে, কন্ট্রোলগুলো কী করে, প্রাথমিক অবস্থা কী, এবং এটি কী করা যাবে না। এর মধ্যে একটি বাদ দিলে মডেলটি নিজের অনুমান দিয়ে শূন্যস্থান পূরণ করে, যা সাধারণত আপনার অনুমান নয়।

এখানে টেমপ্লেটটি, পাঁচটি অংশে:

text
What it is: <one sentence: the tool and who uses it>
Layout: <what is on the screen, top to bottom>
Controls: <every input and button, and what each one does>
Defaults: <what the page shows before the user touches anything>
Constraints: <single HTML file, no external requests, no libraries, size of the page>

এবং একটি পূরণ করা সংস্করণ। ধরুন আপনি রান্নার পরিমাপ রূপান্তর করেন এবং একটি কনভার্টার খোঁজা করে ক্লান্ত:

text
What it is: a unit converter for cooking, for someone standing in a kitchen with a phone.
Layout: a title, one number field, two dropdowns (from, to), a large result line under them.
Controls: the dropdowns hold cup, tablespoon, teaspoon, ml, oz, g (flour) and g (sugar). Typing a number updates the result immediately. A swap button exchanges the two dropdowns.
Defaults: 1 cup to ml, result already shown.
Constraints: one HTML file with inline CSS and JavaScript, no external libraries, fonts or network requests, works on a narrow phone screen, dark text on a light background.

এটি স্ক্রিপ্টের পাশে prompt.txt হিসেবে সংরক্ষণ করুন। "Constraints" লাইনটি সবচেয়ে বেশি ভার বহন করে: "no external requests" ছাড়া মডেলটি একটি CDN লাইব্রেরি টেনে আনতে পছন্দ করে, এবং তারপর পৃষ্ঠাটি অফলাইনে ভেঙে যায়।

আগে এবং পরে: একটি এক-লাইন প্রম্পটের পাশে পাঁচটি অংশসহ একই প্রম্পট
একই অনুরোধ এক লাইনে এবং পাঁচটি অংশে: এটি কী, লেআউট, কন্ট্রোল, ডিফল্ট, সীমাবদ্ধতা

স্ক্রিপ্ট: অনুরোধ, যাচাই, সংরক্ষণ#

CheapTokens API https://api.cheaptokens.dev/v1-এ OpenAI Chat Completions-এর সাথে সামঞ্জস্যপূর্ণ, তাই openai প্যাকেজটি দুটি পরিবর্তনে কাজ করে: বেস URL এবং কী। একটি সম্পূর্ণ পৃষ্ঠার জন্য আমরা deepseek-ai/DeepSeek-V4-Flash-0731 ব্যবহার করি: এটি প্রতি উত্তরে 32,768 আউটপুট টোকেন পর্যন্ত অনুমোদন করে এবং এর 380K কনটেক্সট উইন্ডো রয়েছে। সম্পূর্ণ API বিবরণ CheapTokens ডকুমেন্টেশনে রয়েছে।

প্যাকেজটি ইনস্টল করুন, আপনার কী একটি এনভায়রনমেন্ট ভেরিয়েবলে রাখুন, এবং প্রাইসিং টেবিল থেকে দুটি মূল্য সেট করুন (স্ক্রিপ্টটি খরচ প্রিন্ট করতে এগুলো ব্যবহার করে):

bash
pip install openai
export CHEAPTOKENS_API_KEY="your-key"
export PRICE_IN_PER_M="<input price per 1M from the table>"
export PRICE_OUT_PER_M="<output price per 1M from the table>"

তারপর make_tool.py:

python
import os
import re
import sys

from openai import OpenAI

MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'
PRICE_IN = float(os.environ['PRICE_IN_PER_M'])    # USD per 1M input tokens (from the table)
PRICE_OUT = float(os.environ['PRICE_OUT_PER_M'])  # USD per 1M output tokens (from the table)
FENCE = '`' * 3

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)

prompt = open('prompt.txt', encoding='utf-8').read()

resp = client.chat.completions.create(
    model=MODEL,
    max_tokens=16000,
    messages=[
        {'role': 'system', 'content': 'You write one self-contained HTML file. Reply with the file only, no commentary.'},
        {'role': 'user', 'content': prompt},
    ],
)

choice = resp.choices[0]
if choice.finish_reason == 'length':
    sys.exit('Cut off at max_tokens: the page is unfinished. Raise max_tokens or shrink the request.')

text = choice.message.content or ''
m = re.search(FENCE + r'(?:html)?\s*(.*?)' + FENCE, text, re.DOTALL)
html = (m.group(1) if m else text).strip()
if '</html>' not in html.lower():
    sys.exit('The reply has no closing </html>; not saving it.')

with open('tool.html', 'w', encoding='utf-8') as f:
    f.write(html)

u = resp.usage
cost = (u.prompt_tokens * PRICE_IN + u.completion_tokens * PRICE_OUT) / 1_000_000
print(f'saved tool.html, {u.prompt_tokens} in / {u.completion_tokens} out, about ${cost:.6f}')

ধাপগুলোর ক্রম গুরুত্বপূর্ণ, এবং এটি ভুল করা সহজ:

ক্রমে সাজান

স্ক্রিপ্টের ধাপগুলো যে ক্রমে চলে সেভাবে সাজান

  1. উদার max_tokens দিয়ে প্রম্পট পাঠান
  2. টেক্সট স্পর্শ করার আগে finish_reason যাচাই করুন
  3. কোড ফেন্স থেকে HTML বের করুন, যদি থাকে
  4. নিশ্চিত করুন যে সমাপ্তি </html> সেখানে আছে
  5. tool.html সংরক্ষণ করুন এবং ব্যবহার প্রিন্ট করুন
পাইপলাইন: প্রম্পট, API কল, finish_reason যাচাই, tool.html
স্ক্রিপ্টটি যা করে, প্রম্পট থেকে সংরক্ষিত ফাইল পর্যন্ত

কেন max_tokens পৃষ্ঠাটি কাজ করবে কিনা তা নির্ধারণ করে#

একটি সম্পূর্ণ ইন্টারঅ্যাকটিভ পৃষ্ঠা একটি দীর্ঘ উত্তর। HTML, CSS এবং JavaScript দ্রুত যোগ হয়, এবং মডেল সেগুলো সেই ক্রমেই লেখে: যদি উত্তর কাটা পড়ে, আপনি প্রথমে স্ক্রিপ্টের শেষটি হারান, যা ঠিক সেই অংশ যা বোতামগুলো কাজ করায়। ব্রাউজার হয়তো পৃষ্ঠাটি খুলবে। এটি শুধু কিছুই করবে না।

এজন্যই স্ক্রিপ্টটি টেক্সট দেখার আগে finish_reason যাচাই করে। stop মানে মডেল নিজে থেকে শেষ করেছে। length মানে এটি ফাইলের মাঝপথে max_tokens সীমায় পৌঁছেছে। এই সমস্যার সাধারণ সংস্করণ AI উত্তর কেটে গেছে? finish_reason length ঠিক করুন-এ আলোচনা করা হয়েছে; এখানে নিয়মটি সংক্ষিপ্ত: যে পৃষ্ঠার finish_reason হলো length তা কখনো সংরক্ষণ করবেন না।

আপনি যদি এটি দেখেন:

  • max_tokens বাড়ান (DeepSeek-V4-Flash প্রতি উত্তরে 32,768 পর্যন্ত অনুমোদন করে);
  • অথবা কম চান: কম কন্ট্রোল, একটি স্ক্রিন, কোনো অ্যানিমেশন নয়;
  • GLM-5.3-Flash-এ (zai-org/GLM-5.3-Flash) সীমা 8,192 আউটপুট টোকেন, তাই সেই মডেলটি ছোট টুলের জন্য উপযুক্ত, যেমন উপরের কনভার্টার।

দ্বিতীয় যাচাই, টেক্সটে </html>, সেই শান্ত ব্যর্থতা ধরে যেখানে একটি মডেল ফাইল শেষ না করেই ভদ্রভাবে উত্তর শেষ করে। max_tokens সেট করলেও মডেল বেশি লেখে না: এটি শুধু একটি সীমা, এবং আপনি প্রকৃতপক্ষে উৎপাদিত টোকেনের জন্য অর্থ দেন (আরও জানতে আউটপুট টোকেন কমান)।

দ্রুত যাচাই

স্ক্রিপ্টটি finish_reason = length প্রিন্ট করেছে। আপনি কী করবেন?

উত্তর দেখান

উত্তর: সংরক্ষণ করবেন না; max_tokens বাড়ান বা অনুরোধ ছোট করুন

length মানে উত্তরটি সীমায় কাটা পড়েছে, তাই স্ক্রিপ্টের শেষটি অনুপস্থিত। কম সীমা কাটাটি আরও আগে আসতে বাধ্য করে।

এটি খুলুন এবং পৃষ্ঠাটি দেখুন#

tool.html ডাবল-ক্লিক করে খুলুন, অথবা টার্মিনাল থেকে: macOS-এ open tool.html, Linux-এ xdg-open tool.html, Windows-এ start tool.html।

এটি এমন কোড যা একটি মডেল আপনার জন্য লিখেছে, তাই এটি বিশ্বাস করার আগে এক মিনিট ব্যয় করুন। ব্রাউজারের ডেভেলপার টুলস (F12) খুলুন, Network ট্যাব দেখুন এবং পুনরায় লোড করুন: "no external requests" সীমাবদ্ধতার সাথে এটি খালি থাকা উচিত। তারপর আপনার প্রম্পটের "Controls" অংশ থেকে প্রতিটি কন্ট্রোল একবার ক্লিক করুন।

যদি কিছু ভুল থাকে, তবে স্ক্র্যাচ থেকে পুনরায় জেনারেট করবেন না। নির্দিষ্ট বিষয়টি সম্পর্কে প্রম্পটে একটি বাক্য যোগ করুন ("swap বোতামটিকে অবশ্যই দুটি মান অদলবদল করতে হবে") এবং আবার চালান। DeepSeek-এর নিজস্ব পৃষ্ঠা উল্লেখ করে যে এর কিছু ডেমো কয়েকটি কথোপকথন রাউন্ডে পরিমার্জিত হয়েছিল, তাই দ্বিতীয় পাস স্বাভাবিক।

নিজে চেষ্টা করুনচেষ্টা করুন: কনভার্টারের জন্য Network ট্যাবে আপনি কী দেখতে আশা করেন?উত্তর দেখান

কিছুই না: পৃষ্ঠাটি ইনলাইন CSS এবং JavaScript সহ একটি একক ফাইল, তাই প্রথম লোডের পরে আর কোনো অনুরোধ নেই। আপনি যদি একটি CDN-এ অনুরোধ দেখেন, তবে মডেলটি সীমাবদ্ধতা উপেক্ষা করেছে; এটি বড় হাতের অক্ষরে প্রম্পটে যোগ করুন এবং আবার চালান।

একটি জেনারেশনের খরচ কত#

ধরুন প্রম্পটটি প্রায় 600 ইনপুট টোকেন এবং সমাপ্ত পৃষ্ঠাটি প্রায় 6,000 আউটপুট টোকেন (একটি মাঝারি আকারের টুলের জন্য একটি অনুমান; আপনার নিজের usage লাইনটি প্রকৃত সংখ্যা দেখাবে)। DeepSeek-V4-Flash-এ একবার চালানো $0.00061, এবং GLM-5.3-Flash-এ $0.00025। উভয়ই বর্তমান মূল্য তালিকা থেকে লাইভ সংখ্যা, এবং মোটে, ইনপুট ও আউটপুট একসাথে গণনা করলে, উভয়ই OpenRouter-এর চেয়ে সস্তা।

মডেল খরচ OpenRouter
GLM-5.3-Flash $0.00025 $0.00052
DeepSeek-V4-Flash $0.00061 $0.00088
MiniMax-M2.7 $0.00093 $0.0112

মোট ৬০০ ইনপুট এবং ৬,০০০ আউটপুট টোকেন। প্রতি 1M টোকেনের দাম বর্তমান এবং আমাদের ট্যারিফের সাথে পরিবর্তিত হয়; OpenRouter কলামটি একই ওয়ার্কলোডের জন্য রেফারেন্স মূল্য দেখায়।

বাস্তবে আপনি প্রথম চেষ্টাতেই টুলটি সঠিকভাবে পাবেন না, তাই পুনরাবৃত্তিতে ভাবুন: প্রম্পটের দশটি টুইক সেই লাইনের দশ গুণ, যা এমন একটি টুলের জন্য এখনও একটি ছোট অঙ্ক যা আপনি অন্যথায় হাতে লিখতেন। এর প্রায় সবটাই আউটপুট দিক, পৃষ্ঠাটি নিজেই, এজন্যই অনুরোধ ছোট করা (কম কন্ট্রোল) উত্তর এবং বিল ছোট করে।

যদি এটি কাজ না করে#

আপনি যা দেখেন সম্ভাব্য কারণ কী করবেন
API থেকে 401 বা 404 ভুল কী, বেস URL বা মডেল আইডি তিনটি যাচাই করুন, দেখুন API 401 বা 404 ত্রুটি
Cut off at max_tokens পৃষ্ঠা সীমার চেয়ে দীর্ঘ max_tokens বাড়ান বা কম চান
The reply has no closing </html> মডেল আগে থামেছে বা টেক্সট যোগ করেছে আবার চালান; প্রম্পটে "end with </html>" যোগ করুন
পৃষ্ঠাটি খোলে কিন্তু বোতামগুলো কিছু করে না JavaScript ত্রুটি কনসোল (F12) খুলুন, লাল ত্রুটিটি ফলো-আপ প্রম্পটে পেস্ট করুন

আপনি যদি মডেলের উত্তর একটি পৃষ্ঠার পরিবর্তে ডেটা হিসেবে পার্স করতে চান, তবে এক্সট্রাকশন কৌশলটি একটি LLM উত্তরে json.JSONDecodeError-এর মতোই। API-তে নতুন? আপনার প্রথম API অনুরোধ দিয়ে শুরু করুন।