Przejdź do głównej zawartości

Zarządzanie tokenami w Cursorze

Zarządzanie tokenami w Cursorze polega na wycinaniu kontekstu, z którego agent nie korzysta: reguł ładowanych przy każdym żądaniu, plików dołączanych „na wszelki wypadek”, długich historii czatu i powtarzanej eksploracji. Cięcie liczy się tylko wtedy, gdy stały zestaw zadań wzorcowych nadal przechodzi testy, a zmierzone tokeny i koszt modelu na zadanie spadają.

Limit wliczony w plan twojego zespołu kończy się w trzecim tygodniu miesiąca. Nikt nie zmienił sposobu pracy, ale w repozytorium jest już kilkanaście reguł ustawionych na stałe ładowanie, AGENTS.md i stary .cursorrules, które je powtarzają, oraz czaty ciągnące się przez 40 wiadomości, aż Cursor je skompaktuje, a agent ponownie czyta pliki, które już przeczytał.

Ta strona jest dla programisty, któremu limit kończy się za wcześnie, i dla tech leada, który chce utrwalić oszczędność dla całego zespołu i udowodnić ją liczbami. Ekonomię niezależną od narzędzia opisuje strona koszt kontekstu.

  • Punkt odniesienia: tokeny i koszt modelu na zadanie, zmierzone przez @cursor/sdk zamiast szacowane.
  • Hook w .cursor/hooks.json, który loguje każdą kompakcję kontekstu, więc widzisz, które czaty się przepełniają i jak często.
  • Prompt do audytu reguł, który zamienia reguły ładowane zawsze na reguły o zakresie plików, reguły wybierane przez agenta albo skille.
  • Prompt przekazania, który zastępuje długi czat krótką notatką i nowym czatem.
  • Porównanie przed/po, które dowodzi, że oszczędność nie kosztowała jakości, oraz wskazaną osobę, która ją akceptuje.

Każde żądanie agenta wysyła do modelu więcej niż twój prompt. Kontekst wypełnia pięć rzeczy i nad większością z nich masz kontrolę.

KonsumentCo go wypełniaNa co masz wpływ
Pliki instrukcjiReguły z alwaysApply: true, główny AGENTS.md, .cursorrules oraz (przy włączonym ładowaniu konfiguracji zewnętrznej) CLAUDE.md i CLAUDE.local.mdZakres i długość reguł, zbędne pliki instrukcji
Dołączony kontekstPliki i foldery wskazane przez @, wklejone logi, obrazyIle dołączasz
Historia rozmowyKażda wcześniejsza wiadomość, wywołanie narzędzia i jego wynik w czacieKiedy zaczynasz nowy czat
Eksploracja agentaPliki, które agent czyta, i wyszukiwania, którymi szuka koduPrecyzja promptu, .cursorignore
Warstwa CursoraPrompt systemowy i definicje narzędzi, w tym narzędzi z włączonych serwerów MCPTylko to, które serwery MCP są włączone

Opis plików instrukcji na tej stronie pochodzi ze środowiska uruchomieniowego agenta dołączonego do @cursor/sdk 1.0.32 (sprawdzone 2026-09-26). IDE Cursora powinno korzystać z tej samej usługi reguł, ale nie dało się tego ponownie zweryfikować na cursor.com, bo strona była zablokowana. Środowisko obserwuje .cursor/rules/**/*.mdc, AGENTS.md, CLAUDE.md, CLAUDE.local.md i .cursorrules. Plik .cursorrules w katalogu głównym ładuje jako regułę stosowaną zawsze, więc zapomniany plik z dawnych czasów kosztuje tokeny przy każdym żądaniu. AGENTS.md traktuje jako instrukcje bezwarunkowo: plik w katalogu głównym przy każdym żądaniu, a zagnieżdżone pliki AGENTS.md w podkatalogach również. Natomiast CLAUDE.md i CLAUDE.local.md traktuje jako instrukcje tylko wtedy, gdy włączone jest ładowanie konfiguracji zewnętrznej. Jeśli twój zespół używa też Claude Code, sprawdź to ustawienie, zanim uznasz, że CLAUDE.md nic w Cursorze nie kosztuje.

O dwóch kolejnych rzeczach decyduje model: o rozmiarze okna kontekstu i o cenie tokena. Obie zależą od modelu i często się zmieniają, dlatego opisuje je hub modeli, a nie ta strona.

Oszczędność, której nie da się zmierzyć, to tylko opinia. Wybierz trzy zadania, które zespół robi co tydzień, zamroź je jako prompty i zmierz, ile każde kosztuje dziś.

  1. Zamroź trzy zadania wzorcowe. Zapisz każdy prompt w bench/, na przykład bench/task-01.md: „Add input validation to POST /api/orders and a test that rejects a negative quantity”. Każde zadanie potrzebuje kryterium akceptacji, które da się uruchomić, zwykle konkretnego pliku testów.

  2. Zainstaluj SDK jako zależność deweloperską. Wymaga Node.js 22.13 lub nowszego. W terminalu:

    Okno terminala
    npm install --save-dev @cursor/sdk@1.0.32 tsx
    export CURSOR_API_KEY="$(op read 'op://Dev/cursor-api-key/credential')"

    Druga linia odczytuje klucz przez CLI 1Password; użyj magazynu sekretów, który ma twój zespół. Nigdy nie wklejaj klucza do linii poleceń ani do pliku.

  3. Uruchom każde zadanie skryptem pomiarowym poniżej, na jednorazowej gałęzi lub w worktree, bo lokalny agent edytuje pliki i uruchamia polecenia. Po każdym zadaniu uruchom kryterium akceptacji i zapisz wynik: przeszło albo nie.

  4. Zapisz liczby w tabeli: zadanie, model, inputTokens, cacheReadTokens, outputTokens, rawCostCents, chargedCents, wynik akceptacji. Ta tabela to twój punkt odniesienia.

bench/measure.mts
// Run from the repository root: npx tsx bench/measure.mts MODEL_ID bench/task-01.md
import { readFileSync } from 'node:fs';
import { Agent } from '@cursor/sdk';
const [modelId, taskFile] = process.argv.slice(2);
const agent = await Agent.create({
apiKey: process.env.CURSOR_API_KEY,
model: { id: modelId },
local: { cwd: process.cwd(), settingSources: ['project'] },
});
const run = await agent.send(readFileSync(taskFile, 'utf8'));
const result = await run.wait();
const { cost } = await agent.getUsage();
console.log(JSON.stringify({
task: taskFile,
model: modelId,
status: result.status,
...result.usage,
rawCostCents: cost?.rawCostCents ?? null,
chargedCents: cost?.chargedCents ?? null,
}));
agent.close();

MODEL_ID to identyfikator modelu z Cursor.models.list(); lokalny agent go wymaga. Dzięki rozszerzeniu .mts plik jest modułem ES, a tego wymaga await na najwyższym poziomie. settingSources: ['project'] ładuje reguły projektu, więc zmiany reguł widać w liczbach.

W @cursor/sdk 1.0.32 rawCostCents to koszt tokenów modelu bez rabatów (0 przy użyciu rozliczanym za żądanie), a chargedCents to kwota faktycznie naliczona przez Cursora, z rabatami i opłatą tokenową Cursora. chargedCents wynosi 0 dla użycia wliczonego w plan, BYOK i z grantów kredytowych, a result.usage liczy tokeny w każdym przypadku. Koszt dociera z opóźnieniem, więc jeśli brakuje cost, wywołaj getUsage() ponownie później. Klucze i uruchomienia w chmurze opisuje przewodnik po Cursor SDK.

Gdy czat zapełni kontekst modelu, Cursor go kompaktuje: starsze wiadomości zostają streszczone, a szczegóły przepadają. Tuż przed tym uruchamia się hook preCompact. Hook tylko obserwuje i nie może zatrzymać kompakcji. W tym samym środowisku z SDK hook dostaje na stdin JSON z polami trigger (auto albo manual), model, context_usage_percent, context_tokens, context_window_size, message_count, messages_to_compact i is_first_compaction, a zmienna CURSOR_PROJECT_DIR wskazuje katalog projektu.

.cursor/hooks.json
{
"version": 1,
"hooks": {
"preCompact": [
{ "command": "sh \"$CURSOR_PROJECT_DIR/.cursor/hooks/log-compaction.sh\"" }
]
}
}
.cursor/hooks/log-compaction.sh
#!/bin/sh
# Append one JSON line per compaction, then let the compaction proceed. Requires jq.
jq -c '{at: (now | todate), trigger, model, context_usage_percent, context_tokens,
context_window_size, message_count, messages_to_compact, is_first_compaction}' \
>> "$CURSOR_PROJECT_DIR/.cursor/compaction-log.jsonl"
echo '{}'

Dodaj .cursor/compaction-log.jsonl do .gitignore. Po tygodniu policz linie. Wiele kompakcji auto z wysokim message_count oznacza, że zespół trzyma czaty otwarte przez kilka zadań, co naprawia opisany niżej prompt przekazania. Zdarzenia hooków i blokowanie opisuje strona automatyzacja workflow w Cursorze.

Reguły to najtańsza poprawka, bo jedna zmiana działa na każde żądanie każdej osoby. To samo środowisko klasyfikuje regułę po frontmatterze w tej kolejności:

FrontmatterKiedy reguła się ładujeDo czego jej używać
alwaysApply: truePrzy każdym żądaniuKrótki opis projektu, twarde zasady bezpieczeństwa
Ustawione globs:Gdy agent pracuje na pasujących plikachStyl języka, konwencje API dla jednego katalogu
Tylko description:Gdy agent uzna opis za istotnyPrzewodniki po funkcjach, scenariusze migracji
Żadne z powyższychTylko gdy wskażesz regułę przez @Rzadko używane checklisty

Reguła o zakresie glob dla tras API wygląda tak:

.cursor/rules/api-routes.mdc
---
description: Conventions for HTTP route handlers in src/api
globs: src/api/**/*.ts
alwaysApply: false
---
Follow the handler pattern in @src/api/users.ts: validate with zod at the top,
return typed errors from src/api/errors.ts, and never read process.env in a handler.

Reguła wskazuje plik z przykładem zamiast wklejać 200 linii kodu, więc agent czyta przykład tylko wtedy, gdy reguła się załaduje. Długa procedura niezwiązana z plikami, na przykład checklista wydania, lepiej pasuje do Agent Skill w .cursor/skills/<nazwa>/SKILL.md. W formacie Agent Skills agent widzi nazwę i opis każdego skilla, a treść czyta dopiero wtedy, gdy go używa. Projektowanie reguł szczegółowo opisuje strona reguły projektu w Cursorze.

Wprowadź zmiany na gałęzi, uruchom ponownie trzy zadania wzorcowe i zachowaj zmianę tylko wtedy, gdy każde kryterium akceptacji nadal przechodzi.

Historia rozmowy rośnie najszybciej ze wszystkich konsumentów, bo każdy wynik narzędzia zostaje w czacie. Zacznij nowy czat, gdy kończysz zadanie, przechodzisz do innej części kodu albo widzisz, że agent ponownie czyta pliki, które już otworzył. Nie czekaj na kompakcję: streszczenie, które powstaje, odzwierciedla wybór Cursora, a nie twój.

To, co ważne, przenieś notatką przekazania, nad którą masz kontrolę.

Potem otwórz nowy czat i wyślij: „Read @docs/handoff/current.md and continue with the step under Open.” Nowy czat startuje od 40 linii zamiast całej historii. Dodaj docs/handoff/ do .gitignore, chyba że zespół chce, żeby notatki trafiały do code review.

Osiem plików dołączonych „dla pewności” to opłata za osiem plików w każdej turze czatu. Daj agentowi jeden punkt wejścia i wzorzec do skopiowania, a dalej niech czyta tylko wtedy, gdy musi:

# Over-attached
Add a delete endpoint @src/routes/users.ts @src/routes/posts.ts @src/routes/comments.ts
@src/models/user.ts @src/models/post.ts @src/middleware/auth.ts @src/lib/db.ts
# Pointed
Add DELETE /api/users/:id in @src/routes/users.ts, following the existing PATCH handler
in that file. Soft-delete by setting deleted_at. Add a test next to users.test.ts that
checks a second delete returns 404.

Wskazujący prompt jest też bardziej precyzyjny, co ogranicza eksplorację: przy niejasnym prompcie agent przeszukuje repozytorium, żeby zgadnąć, o co ci chodziło. Kod generowany, snapshoty i zależności vendorowane trzymaj poza zasięgiem przez .cursorignore, który konfiguruje strona strojenie Cursora pod duże repozytoria. Wzmianki @ i inne sposoby sterowania kontekstem opisuje zarządzanie kontekstem w Cursorze.

Serwery MCP kosztują tokeny w ten sam sposób: każdy włączony serwer dokłada definicje swoich narzędzi do każdego żądania. Wyłącz serwery MCP, których zadanie nie potrzebuje (serwer projektowy usuń z .cursor/mcp.json na gałęzi benchmarku), a potem uruchom ponownie jedno zadanie wzorcowe i porównaj inputTokens z tymi serwerami i bez nich.

Wybieraj model na podstawie benchmarku, nie przyzwyczajenia

Dział zatytułowany „Wybieraj model na podstawie benchmarku, nie przyzwyczajenia”

Tańszy model, który potrzebuje trzech podejść, kosztuje więcej niż mocniejszy, który przechodzi za pierwszym razem. Zasada tej strony: zacznij od domyślnego modelu narzędzia i zmieniaj go tylko wtedy, gdy twoje własne pomiary tak wskazują. Lista modeli Cursora, ustawienia domyślne i ceny często się zmieniają i nie dało się ich ponownie zweryfikować dla tej strony, więc sprawdzaj je w selektorze modeli Cursora i w hubie modeli.

Aby porównać dwa modele, uruchom te same trzy zadania wzorcowe z każdym MODEL_ID i porównaj koszt surowy na zaliczone zadanie, a nie cenę tokena. Model, który nie przejdzie kryterium akceptacji, dostaje za to zadanie zero, niezależnie od tego, jak był tani. Kryteria decyzji opisuje strona wybór modelu w Cursorze.

Cloud Agents działają w izolowanych maszynach wirtualnych z pełnym środowiskiem deweloperskim, więc niejasne zadanie płaci za eksplorację na maszynie, której nie obserwujesz. Najpierw zaplanuj lokalnie w Plan Mode, który tworzy plan implementacji przed napisaniem kodu. Potem przekaż Cloud Agentowi plan i jedno kryterium akceptacji na krok. Dla agentów w chmurze getUsage() zwraca w runs rozbicie na uruchomienia, więc tokeny i koszt każdego z nich trafiają do tej samej tabeli odniesienia. Szczegóły: Cloud Agents i Automations.

Jak udowodnić, że oszczędność tokenów nie obniżyła jakości?

Dział zatytułowany „Jak udowodnić, że oszczędność tokenów nie obniżyła jakości?”

Mniej tokenów to zysk tylko wtedy, gdy praca nadal przechodzi. Zmianę reguł, nawyków lub modelu akceptuj tylko z takimi dowodami:

DowódSkąd pochodziWarunek zaliczenia
Kryteria akceptacji trzech zadań wzorcowychTwoje testy, uruchomione po każdym zadaniuWszystkie przechodzą, jak wcześniej
Tokeny na zadanieresult.usage z bench/measure.mtsMniej niż w punkcie odniesienia
Koszt surowy na zaliczone zadaniegetUsage().cost.rawCostCentsMniej niż w punkcie odniesienia
Kompakcje na tydzień.cursor/compaction-log.jsonlMniej kompakcji auto
Wycofane lub przerabiane zmiany agentaHistoria pull requestów z dwóch tygodniBez wzrostu

Tech lead zatwierdza zmiany wspólnych reguł i domyślnych modeli zespołu oraz commituje tabelę benchmarku razem ze zmianą reguł, żeby następna osoba mogła ją powtórzyć. Każdy programista odpowiada za własne nawyki w czatach i czyta własny log kompakcji. Liczby dla całego zespołu i łączenie kosztu z pull requestami opisuje strona obserwowalność agentów.

ProblemJak z niego wyjść
Jakość wyników spada po zmianie regułAgent stracił potrzebny kontekst. Przejrzyj diff zmiany reguł, przywróć jedną regułę powiązaną z nieudanym zadaniem i powtórz benchmark.
Reguła o zakresie glob nigdy się nie ładujeGlob nie pasuje do plików, które agent edytuje. Sprawdź wzorzec przez git ls-files 'src/api/**/*.ts' i popraw go.
Agent ignoruje regułę wybieraną na podstawie opisudescription nie mówi, kiedy reguła ma zastosowanie. Przepisz go jako wyzwalacz: „Use when adding or changing a database migration”.
Tokeny nie spadają mimo odchudzenia .cursor/rules/.cursorrules albo AGENTS.md w katalogu głównym nadal ładuje się przy każdym żądaniu. Uruchom ponownie prompt audytu i scal lub usuń zbędny plik.
Nowy czat powtarza stare błędyW notatce przekazania zabrakło decyzji. Dopisz decyzję z uzasadnieniem w sekcji Decisions i zacznij od nowa.
chargedCents stoi na 0Użycie jest wliczone w plan, idzie przez BYOK albo z grantu kredytowego. Porównuj rawCostCents i tokeny.
rawCostCents wynosi 0Model jest rozliczany za żądanie, więc nie ma kosztu tokenów do pokazania. Porównuj inputTokens i outputTokens.
W wyniku brakuje costDane rozliczeniowe przychodzą z opóźnieniem. Wywołaj getUsage() ponownie po kilku minutach.
Log kompakcji pozostaje pustyBrakuje jq albo ścieżka hooka jest błędna. Uruchom skrypt ręcznie: echo '{}' | CURSOR_PROJECT_DIR=$PWD sh .cursor/hooks/log-compaction.sh.
Tańszy model przechodzi benchmark, ale zawodzi w realnej pracyTrzy zadania były za łatwe. Dodaj do bench/ najtrudniejsze zadanie z ostatniego sprintu i porównaj ponownie.