نخستین فراخوانی3 از 37
در درسِ «[خواندنِ پاسخ](reading-the-reply)» دیدید که هر پاسخ یک گزارشِ usage دارد: چند توکن وارد شد، چند توکن از کش خوانده یا در آن نوشته شد، و چند توکن بیرون آمد. اینجا آن را به دلار تبدیل میکنید، همانطور که mini حسابِ خرجِ خودش را نگه خواهد داشت.
تابعِ reply_cost(model, usage) را بنویسید. نامِ مدل را میگیرد و usage پاسخ را به شکلِ یک دیکشنریِ ساده، مثلِ این یکی (سلامِ درس):
``json
{"input_tokens": 12, "output_tokens": 80, "cache_read_input_tokens": 0, "cache_creation_input_tokens": 0}
`
و برای هر نوع توکن یک ردیف برمیگرداند، به ترتیبِ FIELDS: برچسب، تعدادِ توکنها، و هزینهی آنها به دلار.
- **هر نوع قیمتِ خودش را دارد**، برای هر یک میلیون توکن، در جدولِ PRICES. پس ۲٬۰۰۰ توکنِ ورودی روی claude-opus-5-5 میشود ۲٬۰۰۰ × ۴ تقسیم بر ۱٬۰۰۰٬۰۰۰، یعنی ۰٫۰۰۸ دلار.
- **بخشی که نیست، یا None است، صفر حساب میشود.** پاسخهای واقعی گاهی وقتی چیزی برای شمردن نبوده، بخشی را نمیآورند یا None میگذارند، و هارنس نباید به این خاطر از کار بیفتد.
- **برای مدلِ ناشناخته** None برگردانید. کدِ چاپ خودش این را میگوید.
ورودی در خطِ اول نامِ مدل است و در خطِ دوم مصرف، به شکلِ JSON. کدی که آن را میخواند و ردیفها را چاپ میکند از پیش نوشته شده است. برای سلامِ درس این را چاپ میکند:
`text
model: claude-opus-5-5
input: 12 tokens, 0.000048 dollars
cache read: 0 tokens, 0.000000 dollars
cache write: 0 tokens, 0.000000 dollars
output: 80 tokens, 0.001600 dollars
total: 0.001648 dollars
`
ببینید پول کجا میرود: ۸۰ توکنِ خروجی (فکر کردن و سلام) بیش از سی برابرِ ۱۲ توکنِ ورودی خرج دارند.
<details>
<summary>یک راهنمایی</summary>
usage.get(field) or 0 تعدادِ توکنها را میدهد، چه آن بخش نباشد، چه None باشد، چه عدد. بعد آن را در PRICES[model][price_key]` ضرب کنید و بر ۱٬۰۰۰٬۰۰۰ تقسیم کنید.
</details>
قیمتها گرد شدهاند و مالِ اواخرِ ۲۰۲۶ هستند. فهرستِ قیمتِ واقعی جزئیاتِ بیشتری دارد (مثلاً قیمتهای Haiku برای پرامپتهای بالای ۱۰۰٬۰۰۰ توکن بالا میرود)، که این تمرین کنار گذاشته است.
ورود برای امتحان این تمرین.