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

খরচ অপ্টিমাইজেশনগাইড

একটি LLM API দিয়ে প্রাকৃতিক ভাষা থেকে শেল কমান্ড: JSON এবং খরচ

একটি পাইথন স্ক্রিপ্ট যা একটি সস্তা মডেলকে একটি শেল কমান্ড JSON হিসাবে চায়, প্রত্যাখ্যান করে বা অনিশ্চিত অনুরোধগুলি চিহ্নিত করে, কখনও কিছু চালায় না, এবং 1,000 অনুরোধের মূল্য নির্ধারণ করে।

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

সাধারণ ইংরেজিতে একটি অনুরোধ একটি JSON অবজেক্টে একটি শেল কমান্ডে পরিণত হয়েছে যার ধরন command, refuse এবং unsure
এই পৃষ্ঠায়
  1. একটি সংকীর্ণ কাজ: উত্তরটি সংক্ষিপ্ত কেন
  2. উত্তর ফরম্যাট: কমান্ড, প্রত্যাখ্যান বা অনিশ্চিত
  3. স্ক্রিপ্ট
  4. 1,000 অনুরোধের খরচ
  5. আপনার নিজের অনুরোধে এটি যাচাই করুন

মডেলটিকে তিনটি ফিল্ড (type, command, explanation) সহ একটি JSON অবজেক্ট দিতে বলুন, উত্তরটি কয়েকশ টোকেনে সীমাবদ্ধ করুন, এবং কমান্ডটি চালানোর পরিবর্তে প্রিন্ট করুন। টোকেনের হিসাবে, এই ধরনের অনুরোধ মূলত প্রম্পট এবং একটি সংক্ষিপ্ত, পূর্বানুমেয় উত্তর: নিচের অনুমানগুলির অধীনে, 1,000 টোকেনের খরচ DeepSeek-V4-Flash-এ $0.012।

ধরুন আপনি একটি অভ্যন্তরীণ CLI-তে একটি "আপনি যা চান বর্ণনা করুন" বক্স যোগ করছেন। কেউ টাইপ করে আমার হোম ফোল্ডারে 100 MB-এর চেয়ে বড় ফাইল খুঁজুন, এবং আপনি ফেরত চান একটি লাইন যা তারা পড়তে, যাচাই করতে এবং পেস্ট করতে পারে। এরপর দুটি প্রশ্ন আসে: কীভাবে মডেলকে অনুমান করতে বা বিপজ্জনক কিছু করতে বাধা দেবেন, এবং একশো জন সারাদিন এটি ব্যবহার করলে এর খরচ কত?

একটি সংকীর্ণ কাজ: উত্তরটি সংক্ষিপ্ত কেন#

2026 সালের 9 নভেম্বর একটি টেলিগ্রাম চ্যানেল dale-0.8b-এর মডেল কার্ড পুনরায় প্রকাশ করে, একটি ওপেন মডেল যা ঠিক এই একটি কাজ করে। Hugging Face-এ মডেল কার্ড অনুসারে (10 নভেম্বর 2026-এ যাচাই করা), dale-0.8b হলো Qwen3.5-0.8B-এর একটি সম্পূর্ণ ফাইন-টিউন যা Apache-2.0 লাইসেন্সের অধীনে এবং একটি স্প্যানিশ বা ইংরেজি অনুরোধকে একটি লিনাক্স ব্যাশ কমান্ডে রূপান্তর করে। লেখক, ম্যানুয়েল গার্সিয়া, তার নিজস্ব টেস্ট সেটে 79.4% (471টি ক্ষেত্রে 374টি) রিপোর্ট করেছেন, যা Qwen3.5-9B বেস এবং ফাইন-টিউনিং ছাড়া Gemma 4 E4B-it-এর 62.8%-এর বিপরীতে। এগুলি এক ব্যক্তির টেস্ট সেটে স্ব-রিপোর্ট করা সংখ্যা, তাই এগুলিকে একটি ডেটা পয়েন্ট হিসাবে বিবেচনা করুন, র‍্যাঙ্কিং হিসাবে নয়।

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

এর জন্য আপনার 0.8B মডেলের প্রয়োজন নেই। একই ফরম্যাট যেকোনো API মডেলে কাজ করে, এবং এই নিবন্ধের বাকি অংশ তা-ই তৈরি করে।

একটি অনুরোধের পথ: প্রম্পট ইন, JSON আউট, একজন মানুষ সিদ্ধান্ত নেয়
স্ক্রিপ্টে অনুরোধের প্রবাহ: আপনি নিজে না করা পর্যন্ত কিছুই চালানো হয় না।

উত্তর ফরম্যাট: কমান্ড, প্রত্যাখ্যান বা অনিশ্চিত#

কৌশলটি হলো মডেলের সর্বদা "না" বলার একটি বৈধ উপায় থাকে। উত্তরটি একটি অবজেক্ট:

json
{"type": "command | refuse | unsure", "command": "...", "explanation": "..."}
  • command: একটি ব্যাশ কমান্ড, সাথে এটি কী করে তার এক বাক্যের ব্যাখ্যা।
  • refuse: অনুরোধটি ধ্বংসাত্মক বা শেলের সাথে কোনও সম্পর্ক নেই। কোনও কমান্ড নেই।
  • unsure: অনুরোধটি খুব অস্পষ্ট ("আমার ডিস্ক পরিষ্কার করুন")। ব্যাখ্যায় একটি স্পষ্টীকরণ প্রশ্ন থাকে।

unsure ছাড়া, একটি অস্পষ্ট অনুরোধ একটি অনুমানকে বাধ্য করে, এবং একটি অনুমানকৃত rm হলো যা আপনি মনে রাখবেন। কার্ডের ফরম্যাটে একই তিনটি প্রকার রয়েছে; আমরা ধারণাটি পুনরায় ব্যবহার করি, মডেলটি নয়।

জোড়া মেলান

প্রতিটি উত্তর প্রকারকে স্ক্রিপ্টের কী করা উচিত তার সাথে মেলান

  • commandকমান্ড এবং ব্যাখ্যা দেখান; ব্যক্তি নিজেই এটি কপি এবং চালান
  • refuseব্যাখ্যা প্রিন্ট করুন এবং চালানোর জন্য কিছুই দিন না
  • unsureপ্রশ্নটি প্রিন্ট করুন এবং ব্যবহারকারীকে পুনরায় বাক্য গঠন করতে দিন

স্ক্রিপ্ট#

একটি ফাইল, openai প্যাকেজ, একটি পরিবেশ পরিবর্তনশীল-এ কী। বেস URL এবং সম্পূর্ণ মডেল আইডি CheapTokens ডক্স থেকে আসে; সংক্ষিপ্ত আইডি গ্রহণ করা হয় না, তাই deepseek-ai/DeepSeek-V4-Flash-0731 ব্যবহার করুন।

python
import json
import os
import sys

from openai import OpenAI

client = OpenAI(
    base_url='https://api.cheaptokens.dev/v1',
    api_key=os.environ['CHEAPTOKENS_API_KEY'],
)
MODEL = 'deepseek-ai/DeepSeek-V4-Flash-0731'

SYSTEM = '''You turn a request into ONE Linux bash command.
Reply with a single JSON object and nothing else:
{"type": "command" | "refuse" | "unsure", "command": "<one command, or empty>", "explanation": "<one short sentence>"}
Use "refuse" when the request is destructive or not about the shell.
Use "unsure" when it is too vague, and put a clarifying question in "explanation".'''

CONTEXT = 'os: Ubuntu 24.04; package manager: apt; tools: git, curl, jq'


def parse(text):
    start = text.find('{')
    if start == -1:
        return None
    try:
        obj, _ = json.JSONDecoder().raw_decode(text[start:])
    except json.JSONDecodeError:
        return None
    if not isinstance(obj, dict) or obj.get('type') not in ('command', 'refuse', 'unsure'):
        return None
    return obj


def ask(request):
    resp = client.chat.completions.create(
        model=MODEL,
        max_tokens=200,
        temperature=0,
        messages=[
            {'role': 'system', 'content': SYSTEM},
            {'role': 'user', 'content': f'Context: {CONTEXT}\nRequest: {request}'},
        ],
    )
    return parse(resp.choices[0].message.content), resp.usage


if __name__ == '__main__':
    result, usage = ask(' '.join(sys.argv[1:]))
    if result is None:
        print('Could not read the reply as JSON. Try again.')
    elif result['type'] == 'command':
        print(result['explanation'])
        print('\n    ' + result['command'] + '\n')
        print('Read it, then copy it yourself. This script never runs it.')
    else:
        print(f"[{result['type']}] {result['explanation']}")
    print(f'tokens: {usage.prompt_tokens} in, {usage.completion_tokens} out')

এটি python shellhelp.py find files bigger than 100 MB in my home folder হিসাবে চালান। এখানে তিনটি পছন্দ গুরুত্বপূর্ণ:

  • কোথাও subprocess নেই। কমান্ডটি স্ক্রিনে টেক্সট। এটি চালানো আপনার সিদ্ধান্ত, এটি পড়ার পরে।
  • max_tokens=200, কার্ডের সীমার মতোই। একটি JSON অবজেক্ট সহজেই ফিট করে; একটি এলোমেলো উত্তর আপনার খরচে চলার পরিবর্তে 200 টোকেনে কাটা হয়। সীমাটি সম্পূর্ণ উত্তরে প্রযোজ্য, তাই যদি একটি মডেল তার যুক্তি লিখে, তা সীমা খেয়ে ফেলতে পারে। যদি কোনও উত্তর কখনও finish_reason সমান length দিয়ে শেষ হয়, সীমাটি একটু বাড়ান। আরও জানতে max_tokens দিয়ে আউটপুট টোকেন কমানো দেখুন।
  • ফরম্যাটটি প্রম্পটে অনুরোধ করা হয়, তারপর প্রতিরক্ষামূলকভাবে পার্স করা হয়। raw_decode একটি বিপথগামী কোড ফেন্স বা {-এর আগে একটি বাক্য এড়িয়ে যায়। আরও এগোতে চাইলে, একটি OpenAI-সামঞ্জস্যপূর্ণ API থেকে বৈধ JSON এবং একটি উত্তরে json.JSONDecodeError-এর সমাধান দেখুন।

কিছু চালানোর আগে, যাচাই করুন যে ধাপগুলির ক্রম স্পষ্ট:

ক্রমে সাজান

স্ক্রিপ্টের ধাপগুলি সঠিক ক্রমে রাখুন

  1. প্রম্পট তৈরি করুন: নির্দিষ্ট সিস্টেম টেক্সট, একটি প্রসঙ্গ লাইন, অনুরোধ
  2. একটি ছোট max_tokens দিয়ে API কল করুন
  3. JSON পার্স করুন এবং যাচাই করুন যে type তিনটির একটি
  4. কমান্ডটি দেখান এবং ব্যক্তির এটি চালানোর জন্য অপেক্ষা করুন

1,000 অনুরোধের খরচ#

স্ক্রিপ্টের শেষ লাইন usage প্রিন্ট করে। এটি আসল সংখ্যা, এবং আপনার নিজেরটি পড়া উচিত। যতক্ষণ না আপনার এটি আছে, একটি অনুমান নিয়ে কাজ করুন: প্রম্পটটি প্রায় 400 ইনপুট টোকেন (স্ক্রিপ্টে খালি প্রম্পটটি মোটামুটি গণনায় প্রায় 150 টোকেন; বাকিটি হলো তিন বা চারটি উদাহরণ অনুরোধ-এবং-উত্তর জোড়ার জন্য জায়গা যা আপনি সম্ভবত যোগ করবেন), এবং JSON উত্তরটি প্রায় 60 আউটপুট টোকেন।

1,000 অনুরোধের জন্য এটি 400 × 1,000 = 400,000 ইনপুট টোকেন এবং 60 × 1,000 = 60,000 আউটপুট টোকেন। টেবিলটি ক্যাটালগের প্রতিটি মডেলের জন্য ঠিক এটি মূল্য নির্ধারণ করে, পাশে OpenRouter কলাম সহ; পরিসংখ্যান লাইভ মূল্য থেকে আসে, তাই তারা aktuell থাকে।

মডেল প্রতি অনুরোধে ১,০০০টি অনুরোধ OpenRouter, ১,০০০টি অনুরোধ
GLM-5.3-Flash $0.00001 $0.0104 $0.0184
DeepSeek-V4-Flash $0.000012 $0.012 $0.0364
MiniMax-M2.7 $0.000029 $0.029 $0.348

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

মোট, ইনপুট এবং আউটপুট একসাথে গণনা করলে, এই ওয়ার্কলোডের জন্য DeepSeek-V4-Flash OpenRouter-এর চেয়ে সস্তা হয়। টোকেনের হিসাবে অনুরোধটি প্রায় সম্পূর্ণ ইনপুট এবং উত্তরটি সংক্ষিপ্ত, তবে উভয় দিকই বিল করা হয়, তাই প্রম্পট এবং উত্তর উভয়ই ছাঁটাই করুন। প্রতি মডেলের মূল্য মূল্য পৃষ্ঠা-এ, এবং মডেলটি নিজেই DeepSeek পৃষ্ঠা-এ বর্ণিত: 380K প্রসঙ্গ, 32,768 আউটপুট টোকেন পর্যন্ত, যেকোনো সময়ে একই মূল্য।

অনুপাতগুলি অনুভব করার একটি দ্রুত উপায়:

দ্রুত যাচাই

max_tokens=200 অনুরোধের কোন অংশ সীমাবদ্ধ করে?

উত্তর দেখান

উত্তর: উত্তরটি

max_tokens শুধুমাত্র উত্তর সীমাবদ্ধ করে; প্রম্পট যেমন আছে তেমনই বিল করা হয়, তাই এটি আলাদাভাবে ছাঁটাই করুন।

মাসে 100,000 অনুরোধ চান? 100 দিয়ে গুণ করুন: 40,000,000 ইনপুট এবং 6,000,000 আউটপুট টোকেন। সেই দুটি সংখ্যা একইভাবে ::cost-এ রাখুন এবং সারিটি পড়ুন।

আপনার নিজের অনুরোধে এটি যাচাই করুন#

কার্ডের 79.4% আপনার প্রম্পট, আপনার OS বা আপনার ব্যবহারকারীদের শব্দচয়ন সম্পর্কে কিছু বলে না। আপনি যে কমান্ডগুলি গ্রহণ করবেন সেগুলি সহ 20টি বাস্তব অনুরোধ লিখুন এবং তুলনা করুন, ঠিক যেমন একটি ছোট ইভাল সেটে একটি প্রম্পট পরীক্ষা করা-এ। কয়েকটি অন্তর্ভুক্ত করুন যা স্ক্রিপ্টের প্রত্যাখ্যান করা উচিত বা অনিশ্চিত হিসাবে চিহ্নিত করা উচিত, যেমন "সবকিছু মুছে ফেলুন" বা "আমার কম্পিউটার দ্রুত করুন"।

যখন কিছু ভুল হয়, উপসর্গটি সাধারণত সমাধানের দিকে নির্দেশ করে:

  • Could not read the reply as JSON: কাঁচা টেক্সট একবার প্রিন্ট করুন। "Sure!"-এর মতো একটি উপসর্গ পরিচালনা করা হয়; সীমা দ্বারা কাটা একটি উত্তর নয়, তাই finish_reason পরীক্ষা করুন।
  • 401 বা 404: ভুল কী, বেস URL বা মডেল আইডি। তালিকাটি API 401 বা 404: কী, বেস URL, মডেল আইডি-এ আছে।
  • ভিন্ন সিস্টেমের সাথে খাপ খায় এমন কমান্ড: প্রসঙ্গ লাইনটি কারণ। এটি সঠিক রাখুন (OS, প্যাকেজ ম্যানেজার, টুলস); এটি কয়েক ডজন টোকেন খরচ করে এবং একটি Fedora বক্সে একটি ভুল apt বাঁচায়।

একই কাজ, ভিন্ন মডেল? ডক্স থেকে GLM বা MiniMax আইডির জন্য MODEL পরিবর্তন করুন, প্রম্পট রাখুন, এবং স্ক্রিপ্ট যে টোকেন গণনা প্রিন্ট করে তা উপরের টেবিলের সাথে তুলনা করুন।