{"id":13024,"date":"2026-09-13T18:25:00","date_gmt":"2026-09-13T16:25:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13024"},"modified":"2026-10-26T12:44:08","modified_gmt":"2026-10-26T11:44:08","slug":"tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/","title":{"rendered":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego"},"content":{"rendered":"<p>U\u017cyteczny bud\u017cet API \u0142\u0105czy trzy zapisy: rezerwacj\u0119 przed \u017c\u0105daniem, zmierzone zu\u017cycie po odpowiedzi i p\u00f3\u017aniejsze uzgodnienie z op\u0142atami dostawcy. Sama suma token\u00f3w nie wystarcza. Dostawca, model, wariant us\u0142ugi, klasa pami\u0119ci podr\u0119cznej i dodatkowe narz\u0119dzia mog\u0105 zmienia\u0107 cen\u0119.<\/p>\n<h2>1. Znaczenie schematu zu\u017cycia<\/h2>\n<p>W Anthropic Messages <code>input_tokens<\/code> oznacza wej\u015bcie nieobj\u0119te pami\u0119ci\u0105 podr\u0119czn\u0105. Utworzenie cache i odczyt cache s\u0105 osobnymi klasami wej\u015bcia; zapis mo\u017ce dodatkowo rozr\u00f3\u017cnia\u0107 czas wa\u017cno\u015bci. W OpenAI Responses <code>input_tokens<\/code> oznacza ca\u0142e wej\u015bcie, obejmuj\u0105ce odczyty cache i obs\u0142ugiwane klasy zapisu. Dodanie tych podklas do sumy policzy\u0142oby wej\u015bcie dwukrotnie. To r\u00f3\u017cne struktury rozliczeniowe, a nie tylko inne nazwy.<\/p>\n<p>Poni\u017cszy fikcyjny, ujednolicony rekord u\u017cywa czterech roz\u0142\u0105cznych klas. Stawki w USD za milion token\u00f3w s\u0142u\u017c\u0105 obliczeniu i nie s\u0105 aktualn\u0105 ofert\u0105 konkretnego modelu. Rzeczywisty adapter musi obs\u0142ugiwa\u0107 wybrany endpoint oraz wszystkie w\u0142a\u015bciwe czasy wa\u017cno\u015bci cache.<\/p>\n<pre><code>from decimal import Decimal, ROUND_CEILING\n\n# Fictional normalized classes and example USD rates per million.\ncounts = {&quot;input&quot;: 12400, &quot;write_5m&quot;: 8200, &quot;read&quot;: 96000, &quot;output&quot;: 1850}\nrates = {k: Decimal(v) for k, v in {\n    &quot;input&quot;: &quot;3.00&quot;, &quot;write_5m&quot;: &quot;3.75&quot;, &quot;read&quot;: &quot;0.30&quot;, &quot;output&quot;: &quot;15.00&quot;\n}.items()}\ncost_usd = sum(Decimal(counts[k]) * rates[k] for k in counts) \/ Decimal(1_000_000)\nactual_u = int((cost_usd * 1_000_000).to_integral_value(rounding=ROUND_CEILING))\nprint(cost_usd, actual_u)  # 0.1245, 124500\n<\/code><\/pre>\n<p>Dok\u0142adne sk\u0142adniki wynosz\u0105 0,0372, 0,03075, 0,0288 i 0,02775 USD, razem 0,1245 USD. Wcze\u015bniejsze zaokr\u0105glenie ka\u017cdej wy\u015bwietlanej cz\u0119\u015bci mo\u017ce zmieni\u0107 widoczn\u0105 sum\u0119. Arytmetyka dziesi\u0119tna zachowuje obliczenie; rejestr rezerwacji poni\u017cej u\u017cywa ca\u0142kowitych mikro-USD, czyli 1 000 000 jednostek na USD. Zaokr\u0105glenie w g\u00f3r\u0119 do tej jednostki jest lokaln\u0105 regu\u0142\u0105 bud\u017cetow\u0105, nie zasad\u0105 fakturowania dostawcy.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-13020-token-budget-20261024-pl.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Cztery etapy kontroli bud\u017cetu API\"><figcaption>Cztery etapy kontroli bud\u017cetu API<\/figcaption><\/figure>\n<h2>2. Zliczanie przed wys\u0142aniem i zapis po zako\u0144czeniu<\/h2>\n<p>Endpoint zliczania Anthropic jest bezp\u0142atny w ramach limit\u00f3w cz\u0119stotliwo\u015bci i daje oszacowanie bez logiki cache. Nie przyjmuje wszystkich wej\u015b\u0107 obs\u0142ugiwanych przez Messages: aktualna dokumentacja wyklucza wi\u0119kszo\u015b\u0107 narz\u0119dzi serwerowych, konektor MCP oraz bloki obraz\u00f3w i dokument\u00f3w ze \u017ar\u00f3d\u0142ami URL lub plikowymi. Znaczenie maj\u0105 model i pe\u0142na obs\u0142ugiwana struktura \u017c\u0105dania. Tokenizer samego tekstu nie jest uniwersalnym licznikiem narz\u0119dzi, obraz\u00f3w i oprawy komunikat\u00f3w.<\/p>\n<p>Zu\u017cycie w strumieniu nie pojawia si\u0119 zawsze dopiero w ostatnim zdarzeniu. Anthropic przekazuje pocz\u0105tkowe dane w <code>message_start<\/code> i skumulowane aktualizacje w <code>message_delta<\/code>. Dodawanie wszystkich skumulowanych warto\u015bci zawy\u017cy\u0142oby wynik. Kolejne sumy 10 i 20 oznaczaj\u0105 na przyk\u0142ad \u0142\u0105cznie 20 token\u00f3w do tej chwili, a nie 30. Obs\u0142ugiwana funkcja SDK zbieraj\u0105ca zako\u0144czon\u0105 wiadomo\u015b\u0107 upraszcza zapis. Przerwany strumie\u0144 lub b\u0142\u0105d po\u0142\u0105czenia mo\u017ce pozostawi\u0107 niepe\u0142ne dane. Brak informacji pozostaje niewiadom\u0105, a nie zerem.<\/p>\n<p>Trwa\u0142y rejestr audytowy powinien \u0142\u0105czy\u0107 operacj\u0119 logiczn\u0105, unikalne ID pr\u00f3by, dost\u0119pne identyfikatory dostawcy, czasy, funkcj\u0119, dostawc\u0119 i model, wersj\u0119 cennika, rezerwacj\u0119 i surowe zu\u017cycie. Prompty i klucze API nie s\u0105 do tego potrzebne. Ponowienie jest osobn\u0105 pr\u00f3b\u0105 z w\u0142asn\u0105 rezerwacj\u0105 mo\u017cliwych koszt\u00f3w. Timeout nie dowodzi ani naliczenia op\u0142aty, ani zatrzymania przetwarzania; nag\u0142\u00f3wki odpowiedzi mog\u0142y w og\u00f3le nie dotrze\u0107.<\/p>\n<h2>3. Atomowa rezerwacja pe\u0142nej g\u00f3rnej granicy<\/h2>\n<p>G\u00f3rna granica musi obejmowa\u0107 wej\u015bcie, maksymalne w\u0142a\u015bciwe wyj\u015bcie, mo\u017cliwe koszty zapisu cache oraz ograniczone koszty narz\u0119dzi i p\u0119tli. Sam limit wyj\u015bcia nie wystarcza. Nieznane ceny, nieograniczone p\u0119tle narz\u0119dziowe lub nieudany zapis rejestru musz\u0105 blokowa\u0107 wysy\u0142k\u0119. Obliczenie granicy nie powinno zak\u0142ada\u0107 trafienia w cache.<\/p>\n<p>Wykonywalny <code>ledger.py<\/code> pokazuje kontrol\u0119 dopuszczania \u017c\u0105da\u0144 dla jednej aplikacji, jednej waluty i miesi\u0119cy kalendarzowych UTC. Wszystkie procesy musz\u0105 korzysta\u0107 z tej samej lokalnej bazy SQLite. To nie baza dla wielu host\u00f3w ani kompletna integracja rozliczeniowa. Walidator ogranicza ka\u017cd\u0105 kwot\u0119 do miliona USD wyra\u017conych w mikrojednostkach.<\/p>\n<p>Przed pierwsz\u0105 rezerwacj\u0105 <code>initialise(database_path)<\/code> tworzy tabele. Zu\u017cycie wyj\u015bcia mo\u017ce obejmowa\u0107 niewidoczne tokeny rozumowania lub formatowania; d\u0142ugo\u015b\u0107 widocznej odpowiedzi nie jest licznikiem wyj\u015bcia.<\/p>\n<pre><code>import sqlite3\nfrom datetime import datetime, timezone\n\nclass BudgetExceeded(Exception):\n    pass\n\ndef units(value):\n    if type(value) is not int or not 0 &lt;= value &lt;= 10**12:\n        raise ValueError(&quot;Expected non-negative integer micro-USD, at most 10^12&quot;)\n    return value\n\ndef connect(path):\n    db = sqlite3.connect(path, timeout=10, isolation_level=None)\n    db.execute(&quot;PRAGMA foreign_keys=ON&quot;)\n    return db\n\ndef initialise(path):\n    db = connect(path)\n    try:\n        db.executescript(&quot;&quot;&quot;\n        CREATE TABLE IF NOT EXISTS budgets(\n          month TEXT PRIMARY KEY, limit_u INTEGER NOT NULL,\n          breached INTEGER NOT NULL DEFAULT 0);\n        CREATE TABLE IF NOT EXISTS calls(\n          attempt_id TEXT PRIMARY KEY,\n          month TEXT NOT NULL REFERENCES budgets(month),\n          reserved_u INTEGER NOT NULL, actual_u INTEGER,\n          state TEXT NOT NULL CHECK(state IN (&#x27;pending&#x27;,&#x27;settled&#x27;)));\n        &quot;&quot;&quot;)\n    finally:\n        db.close()\n\ndef reserve(path, attempt_id, upper_u, limit_u, now=None):\n    upper_u, limit_u = units(upper_u), units(limit_u)\n    if not isinstance(attempt_id, str) or not attempt_id:\n        raise ValueError(&quot;Stable, nonempty attempt ID required&quot;)\n    now = datetime.now(timezone.utc) if now is None else now\n    if now.tzinfo is None or now.utcoffset() is None:\n        raise ValueError(&quot;Timezone-aware timestamp required&quot;)\n    month = now.astimezone(timezone.utc).strftime(&quot;%Y-%m&quot;)\n    db = connect(path)\n    try:\n        db.execute(&quot;BEGIN IMMEDIATE&quot;)\n        if db.execute(&quot;SELECT 1 FROM calls WHERE attempt_id=?&quot;,\n                      (attempt_id,)).fetchone():\n            db.commit()\n            return False  # No second permission to send.\n        db.execute(&quot;INSERT OR IGNORE INTO budgets(month,limit_u) VALUES (?,?)&quot;,\n                   (month, limit_u))\n        stored_limit, breached = db.execute(\n            &quot;SELECT limit_u,breached FROM budgets WHERE month=?&quot;, (month,)\n        ).fetchone()\n        if stored_limit != limit_u:\n            raise ValueError(&quot;Conflicting limit for this month&quot;)\n        used = db.execute(\n            &quot;SELECT COALESCE(SUM(COALESCE(actual_u,reserved_u)),0) &quot;\n            &quot;FROM calls WHERE month=?&quot;, (month,)\n        ).fetchone()[0]\n        if breached or used + upper_u &gt; limit_u:\n            raise BudgetExceeded(month)\n        db.execute(&quot;INSERT INTO calls VALUES (?,?,?,?,?)&quot;,\n                   (attempt_id, month, upper_u, None, &quot;pending&quot;))\n        db.commit()\n        return True\n    except BaseException:\n        db.rollback()\n        raise\n    finally:\n        db.close()\n\ndef settle(path, attempt_id, actual_u):\n    actual_u = units(actual_u)\n    db = connect(path)\n    try:\n        db.execute(&quot;BEGIN IMMEDIATE&quot;)\n        row = db.execute(\n            &quot;SELECT month,reserved_u,actual_u,state FROM calls WHERE attempt_id=?&quot;,\n            (attempt_id,)\n        ).fetchone()\n        if row is None:\n            raise ValueError(&quot;Unknown attempt&quot;)\n        month, reserved, old_actual, state = row\n        if state == &quot;settled&quot;:\n            if old_actual != actual_u:\n                raise ValueError(&quot;Conflicting settlement&quot;)\n            db.commit()\n            return\n        db.execute(&quot;UPDATE calls SET actual_u=?,state=&#x27;settled&#x27; WHERE attempt_id=?&quot;,\n                   (actual_u, attempt_id))\n        if actual_u &gt; reserved:\n            db.execute(&quot;UPDATE budgets SET breached=1 WHERE month=?&quot;, (month,))\n        db.commit()\n    except BaseException:\n        db.rollback()\n        raise\n    finally:\n        db.close()\n<\/code><\/pre>\n<p><code>BEGIN IMMEDIATE<\/code> rozpoczyna transakcj\u0119 zapisu przed odczytem sumy. Dzi\u0119ki temu dwa r\u00f3wnoleg\u0142e wywo\u0142ania nie mog\u0105 zarezerwowa\u0107 tej samej pozosta\u0142ej cz\u0119\u015bci bud\u017cetu. Rezerwacja jest zatwierdzana przed wywo\u0142aniem sieciowym; transakcja nie pozostaje otwarta podczas oczekiwania na API. Tylko prawdziwy wynik <code>reserve()<\/code> dopuszcza wysy\u0142k\u0119. False oznacza istniej\u0105c\u0105 pr\u00f3b\u0119, a nie ponown\u0105 zgod\u0119 na wys\u0142anie. B\u0142\u0105d blokady lub bazy musi zatrzyma\u0107 wywo\u0142anie.<\/p>\n<pre><code>PSEUDOCODE\nvalidate provider, model, pricing snapshot and complete cost bound\npersist a unique attempt ID and audit context\nif reserve(database, attempt_id, upper_bound_u, monthly_limit_u) is True:\n    send exactly one provider attempt outside the database transaction\n    on complete usage:\n        persist the original usage and provider identifiers\n        calculate cost with the recorded pricing snapshot\n        settle(database, attempt_id, actual_cost_u)\n    on unknown outcome or unknown cost:\n        keep the reservation pending and investigate\n<\/code><\/pre>\n<p>Zapisany limit pozostaje sta\u0142y w danym miesi\u0105cu. P\u00f3\u017aniejsze oznaczenie przekroczenia nie anuluje ju\u017c dopuszczonych \u017c\u0105da\u0144.<\/p>\n<p>Schemat jest pseudokodem adaptera dostawcy: wymaga sprawdzonej wersji cennika i pe\u0142nej g\u00f3rnej granicy. Wykonywalny kod powy\u017cej nie wywo\u0142uje API. Rozliczenie zapisuje si\u0119 raz; identyczne ponowienie jest akceptowane, sprzeczne kwoty s\u0105 odrzucane. Gdy koszt przekracza rezerwacj\u0119, nadwy\u017cka zostaje zapisana, a dalsze dopuszczenia w tym miesi\u0105cu zablokowane. Nie cofa to ju\u017c poniesionych koszt\u00f3w.<\/p>\n<h2>4. Widoczne pr\u00f3by z nieznanym wynikiem<\/h2>\n<p>Awaria po rezerwacji, ale przed wys\u0142aniem mo\u017ce blokowa\u0107 niewykorzystany bud\u017cet. Timeout po wys\u0142aniu mo\u017ce pozostawi\u0107 nieustalony realny koszt. Automatyczne wygaszanie obu przypadk\u00f3w otworzy\u0142oby bud\u017cet bez dowodu. Odzyskanie wymaga rejestru i informacji dostawcy; tylko pr\u00f3by potwierdzone jako bezp\u0142atne powinny by\u0107 rozliczane zerem.<\/p>\n<p>Miesi\u0105c jest przypisywany przy rezerwacji wed\u0142ug UTC. P\u00f3\u017aniejsze rozliczenie pozostaje w tym miesi\u0105cu. To regu\u0142a wewn\u0119trzna, nie twierdzenie o dacie faktury. Zg\u0142oszenie, wykonanie, lokalne rozliczenie i okres dostawcy powinny pozosta\u0107 odr\u0119bne przy zadaniach asynchronicznych i granicach miesi\u0119cy.<\/p>\n<div class=\"lw-faq\">\n<h2>Pytania i odpowiedzi<\/h2>\n<h3>Czy faktura dostawcy na pewno pozostanie poni\u017cej bud\u017cetu?<\/h3>\n<p>Nie. G\u00f3rna granica, adapter cen i obj\u0119cie wszystkich p\u0142atnych operacji musz\u0105 by\u0107 poprawne. Inne klucze API, pomini\u0119te op\u0142aty narz\u0119dziowe, umowy, podatki i p\u00f3\u017aniejsze korekty mog\u0105 pozostawa\u0107 poza lokalnym rejestrem. Limity dostawcy mog\u0105 dodatkowo chroni\u0107, je\u015bli s\u0105 dost\u0119pne, lecz znaczenie ma ich udokumentowany zakres.<\/p>\n<h3>Czy uzgodnienie zawsze dopasuje pojedyncze \u017c\u0105dania?<\/h3>\n<p>Nie. API Usage i Cost Anthropic udost\u0119pniaj\u0105 zagregowane przedzia\u0142y czasu i wymiary grupowania. Nie mo\u017cna zak\u0142ada\u0107 eksportu ka\u017cdego \u017c\u0105dania osobno. Raport koszt\u00f3w r\u00f3wnie\u017c ma udokumentowane ograniczenia zakresu. Okres, waluta i zakres musz\u0105 si\u0119 zgadza\u0107 przed interpretacj\u0105 r\u00f3\u017cnicy.<\/p>\n<h3>Co wykaza\u0142y testy przyk\u0142adu?<\/h3>\n<p>Osiem r\u00f3wnoleg\u0142ych pr\u00f3b rezerwacji dopu\u015bci\u0142o dok\u0142adnie dwie kwoty po 40 przy limicie 100. Dalsze testy izolowane sprawdza\u0142y powt\u00f3rne rozliczenia, nierozstrzygni\u0119te pr\u00f3by, sprzeczne limity, b\u0142\u0119dne kwoty i granice miesi\u0119cy UTC. Nie testowano p\u0142atnych wywo\u0142a\u0144 API ani prawdziwej faktury.<\/p>\n<\/div>\n<h2>\u0179r\u00f3d\u0142a<\/h2>\n<ul>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/build-with-claude\/token-counting\">Anthropic: zliczanie token\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/build-with-claude\/prompt-caching\">Anthropic: pami\u0119\u0107 podr\u0119czna prompt\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/build-with-claude\/streaming\">Anthropic: strumieniowy odbi\u00f3r wiadomo\u015bci<\/a><\/li>\n<li><a href=\"https:\/\/platform.claude.com\/docs\/en\/api\/usage-cost-api\">Anthropic: API zu\u017cycia i koszt\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/developers.openai.com\/api\/docs\/guides\/token-counting\">OpenAI: zliczanie token\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/developers.openai.com\/api\/docs\/guides\/prompt-caching\">OpenAI: pami\u0119\u0107 podr\u0119czna prompt\u00f3w<\/a><\/li>\n<li><a href=\"https:\/\/developers.openai.com\/api\/reference\/resources\/responses\/methods\/retrieve\">OpenAI: zu\u017cycie w Responses<\/a><\/li>\n<li><a href=\"https:\/\/sqlite.org\/lang_transaction.html\">SQLite: transakcje<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Schematy zu\u017cycia API r\u00f3\u017cni\u0105 si\u0119, a przerwane \u017c\u0105dania mog\u0105 pozostawia\u0107 nieznany koszt. Poradnik \u0142\u0105czy dok\u0142adne obliczenie przyk\u0142adu z atomowymi rezerwacjami SQLite, ochron\u0105 przed podw\u00f3jnym zapisem i granicami miesi\u0119cznego bud\u017cetu aplikacji.<\/p>\n","protected":false},"author":1,"featured_media":24200,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92640],"tags":[92343,92358,92346,92238],"class_list":["post-13024","post","type-post","status-publish","format-standard","hentry","category-tutorials-pl-cloud-ai-pl","tag-artificial-intelligence-pl","tag-budgeting-pl","tag-llm-pl","tag-tutorial-pl"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-13T16:25:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:44:08+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego\",\"datePublished\":\"2026-09-13T16:25:00+00:00\",\"dateModified\":\"2026-10-26T11:44:08+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/\"},\"wordCount\":1075,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13024-token-budget-20261024-dark.png\",\"keywords\":[\"Artificial Intelligence\",\"Budgeting\",\"LLM\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/\",\"name\":\"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13024-token-budget-20261024-dark.png\",\"datePublished\":\"2026-09-13T16:25:00+00:00\",\"dateModified\":\"2026-10-26T11:44:08+00:00\",\"description\":\"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13024-token-budget-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13024-token-budget-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/pl\\\/cloud-ai-pl\\\/tutorials-pl-cloud-ai-pl\\\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik","description":"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik","og_description":"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-13T16:25:00+00:00","article_modified_time":"2026-10-26T11:44:08+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego","datePublished":"2026-09-13T16:25:00+00:00","dateModified":"2026-10-26T11:44:08+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/"},"wordCount":1075,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png","keywords":["Artificial Intelligence","Budgeting","LLM","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/","url":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/","name":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png","datePublished":"2026-09-13T16:25:00+00:00","dateModified":"2026-10-26T11:44:08+00:00","description":"Odczyt bloku usage, jeden wiersz na \u017c\u0105danie, przeliczenie token\u00f3w na pieni\u0105dze i zatrzymanie przebiegu przed przekroczeniem bud\u017cetu miesi\u0119cznego.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13024-token-budget-20261024-dark.png","width":1200,"height":630,"caption":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/pl\/cloud-ai-pl\/tutorials-pl-cloud-ai-pl\/tutorial-pomiar-zuzycia-tokenow-na-zadanie-i-egzekwowanie-budzetu-miesiecznego\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Pomiar zu\u017cycia token\u00f3w na \u017c\u0105danie i egzekwowanie bud\u017cetu miesi\u0119cznego"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13024"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13024\/revisions"}],"predecessor-version":[{"id":27010,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13024\/revisions\/27010"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/24200"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13024"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}