सुविधाएँ
उपयोग सीमाएँ
यह पेज अंग्रेज़ी से मशीन द्वारा अनुवादित है। सुधार का स्वागत है। इस पेज को GitHub पर संपादित करें
ccam usage दिखाता है कि हर अकाउंट ने 5 घंटे और साप्ताहिक सीमा का कितना हिस्सा इस्तेमाल किया है, और हर विंडो के रीसेट होने तक का समय भी। कोई लंबा काम शुरू करने से पहले, या जब Claude Code बताए कि कोई सीमा पास है, तब इसे इस्तेमाल करें, ताकि पता चले कि किस अकाउंट में गुंजाइश बची है। ccam statusline, Claude Code के लिए स्टेटस लाइन कमांड है: यह Claude Code के अंदर अकाउंट का नाम और उपयोग दिखाता है और ccam usage के लिए संख्याएँ सेव करता है।
उपयोग
ccam usage # every account, once
ccam u # the same, shorter
ccam usage --watch # redraw every 60 seconds until Ctrl+C
ccam usage --watch=10 # redraw every 10 seconds
ccam usage -v # add per-model weekly limits and the data source
ccam usage --json # machine-readable, one object per account
ccam usage --source cache # saved numbers only, no network
ccam usage --refresh # also renew expired logins of accounts not running
ccam statusline install # set the status line in every account's settings.json$ ccam usage
Account 5-hour Resets Weekly Resets As of
1 personal ░░░░░░░░ 0% - ██████░░ 70% 2d 16h 9h 36m ago (cached)
2 work ██░░░░░░ 24% 2h 29m ███░░░░░ 41% 3d 11h just now (cached)
3 side login expired, run `ccam side` once to refresh
→ Most headroom: personal (open it with ccam next --auto)टर्मिनल पर table तुरंत हर पंक्ति में fetching… के साथ दिखती है, और हर पंक्ति उसके अकाउंट के जवाब देते ही फिर से बनती है। As of बताता है कि संख्याएँ कितनी पुरानी हैं; (cached) का मतलब है कि वे endpoint से नहीं, सेव की गई फ़ाइल से आई हैं। आख़िरी पंक्ति 100% से कम में सबसे कम 5 घंटे के उपयोग वाले अकाउंट का नाम बताती है, और केवल तभी दिखती है जब आपके पास एक से ज़्यादा अकाउंट हों। जिस अकाउंट में लॉगिन नहीं है, वह not logged in → ccam login <name> दिखाता है, और API key वाला अकाउंट no limits (API) दिखाता है।
ccam statusline install के बाद, Claude Code [work] · Opus · 5h 24% · 7d 41% जैसी पंक्ति दिखाता है।
विकल्प
| विकल्प | क्या करता है | डिफ़ॉल्ट |
|---|---|---|
--json |
रिपोर्ट को JSON के रूप में प्रिंट करें: name, slot, status, limits, source, at, error |
बंद |
--watch[=N] |
Ctrl+C दबाने तक हर N सेकंड में फिर से बनाएँ। अकेले --watch, या 0 या उससे कम मान का मतलब 60 है |
बंद |
-v, --verbose |
मॉडल के हिसाब से साप्ताहिक सीमाएँ और एक source: पंक्ति (live, cache या statusline) दिखाएँ |
बंद |
--no-cache |
60 सेकंड की cache अनदेखी करें और endpoint से फिर पूछें | बंद |
--source live|cache |
cache कभी endpoint से नहीं पूछता और केवल सेव की गई संख्याएँ दिखाता है; live डिफ़ॉल्ट व्यवहार है |
live |
--refresh |
एक्सपायर हुए access tokens renew करें, केवल उन अकाउंट्स के लिए जो चल नहीं रहे | बंद |
--dry-run |
स्वीकार किया जाता है: ccam usage अपनी cache के अलावा कुछ नहीं बदलता। --refresh के साथ अस्वीकार किया जाता है: --dry-run cannot be combined with --refresh, which rewrites login tokens |
बंद |
--source का कोई और मान --source must be live or cache के साथ विफल होता है। ccam usage कोई आर्ग्युमेंट नहीं लेता।
ccam statusline, standard input से Claude Code का स्टेटस लाइन JSON पढ़ता है। इसका एकमात्र विकल्प --wrap <command> है: एक मौजूदा स्टेटस लाइन कमांड, जिसके आउटपुट की पहली पंक्ति के आगे अकाउंट का नाम लगता है। ccam statusline install कोई विकल्प नहीं लेता। दोनों --dry-run को --dry-run is not supported by `ccam statusline`; nothing was changed के साथ अस्वीकार करते हैं।
यह कैसे काम करता है
संख्याएँ दो जगहों से आती हैं: Anthropic का undocumented usage endpoint, GET https://api.anthropic.com/api/oauth/usage, जिसे हर अकाउंट के अपने लॉगिन से बुलाया जाता है, और वे मान जो Claude Code अपनी स्टेटस लाइन कमांड को देता है। यह सब internal/usage में है।
cli.usageCmd,config.tomlलोड करता है और हर अकाउंट के लिए एकusage.Accountबनाता है: उसका फ़ोल्डर~/.local/share/ccam/profiles/<name>/, उसका session फ़ोल्डर (यह देखने के लिए कि वह चल रहा है या नहीं) और यह कि वह अपनी जगह पर import किया गया था या नहीं।Fetcher.FetchAllहर अकाउंट के लिए एक goroutine शुरू करता है। ये सभी एक हीhttp.Clientसाझा करते हैं, इसलिए endpoint से कनेक्शन दोबारा इस्तेमाल होते हैं। कनेक्ट होने में 2 s लग सकते हैं, और हर अकाउंट को कुल 3 s मिलते हैं। Client redirects का पालन नहीं करता, क्योंकि redirect token को कहीं और भेज देता, और जवाब का अधिकतम 1 MB पढ़ता है।- हर अकाउंट के पूरा होते ही उसकी पंक्ति फिर से बनती है। जो अकाउंट विफल होता है या समय पर जवाब नहीं देता, वह सेव की गई संख्याओं पर लौट आता है, इसलिए एक धीमा अकाउंट कभी दूसरों को नहीं रोकता।
हर अकाउंट endpoint के सामने अपने goroutine में चलता है; जिसका समय ख़त्म हो जाता है, वह इसके बजाय अपनी सेव की गई संख्याएँ दिखाता है।
personal और work समय पर जवाब देते हैं और live संख्याएँ दिखाते हैं। side को 3 s से ज़्यादा लगते हैं, इसलिए fallback() उसकी दोनों cache फ़ाइलें पढ़ता है और जो आख़िर में लिखी गई, उसे इस्तेमाल करता है। usage.Table() पंक्तियाँ बनाता है और usage.Best() आख़िरी पंक्ति में बताया जाने वाला अकाउंट चुनता है।
एक अकाउंट के लिए Fetcher.Fetch ये जाँचें इस क्रम में करता है:
--source cacheके साथ यह सीधेfallback()पर जाता है।- जब तक
--no-cacheसेट न हो,~/.local/state/ccam/usage/<name>.jsonमें 60 सेकंड (CacheTTL) से कम पुराना live नतीजा जैसा है वैसा लौटाया जाता है। लगातार दो बारccam usageचलाने पर हर अकाउंट के लिए एक ही request लगती है। readCredentials(),.credentials.json(या macOS कीचेन) को बदले बिना पढ़ता है, और केवलclaudeAiOauthkey decode होती है। Subscription लॉगिन न होने का मतलबnot logged inहै, याno limits (API)जब.claude.jsonमें API key हो।- एक्सपायर हुआ access token इस्तेमाल नहीं होता।
--refreshके बिना, अकाउंट अपनी सेव की गई संख्याएँ expired के निशान के साथ दिखाता है। - वरना ccam endpoint को बुलाता है। 401 या 403 को एक्सपायर हुआ लॉगिन माना जाता है, कोई दूसरा status या न पढ़ा जा सकने वाला body त्रुटि माना जाता है, और दोनों सेव की गई संख्याओं पर लौटते हैं।
- अच्छा जवाब मापे जाने के समय के साथ
<name>.jsonमें लिखा जाता है।
fallback(), <name>.json और <name>.statusline.json दोनों पढ़ता है और नई वाली रखता है। सेव की गई संख्याएँ दिखाने से पहले यह हर विंडो का रीसेट समय जाँचता है: जो विंडो संख्याएँ सेव होने के बाद रीसेट हो चुकी है, वह 0% दिखाती है, क्योंकि पुराना प्रतिशत अब सही नहीं है। इसीलिए ऊपर personal बिना रीसेट समय के 0% दिखाता है।
Endpoint के दो response formats हैं। नए में session (5 घंटे), weekly_all और weekly_scoped (मॉडल के हिसाब से) entries वाला limits array होता है। पुराने में five_hour, seven_day, seven_day_opus और seven_day_sonnet ऑब्जेक्ट होते हैं। ParseLive दोनों पढ़ता है: limits array को प्राथमिकता मिलती है, और पुराने ऑब्जेक्ट वह भरते हैं जो वह कवर नहीं करता। बिना किसी सीमा वाला body बदले हुए format के रूप में बताया जाता है, जिसके बारे में ccam doctor आपको बताता है।
Tokens renew करना
Refresh tokens बदलते रहते हैं: एक को renew करने पर नया refresh token मिलता है और पुराना अमान्य हो जाता है। अगर ccam उसी अकाउंट से Claude Code चलते समय लॉगिन renew करता, तो वह session साइन आउट हो जाता। इसलिए ccam usage tokens पढ़ता है और कभी नहीं लिखता, जब तक आप --refresh न दें। तब Fetcher.refresh:
ccam importसे अपनी जगह पर रजिस्टर किए गए अकाउंट अस्वीकार करता है, क्योंकि सादाclaudeccam की जानकारी के बिना वह लॉगिन इस्तेमाल कर सकता है;- macOS कीचेन में रखे लॉगिन अस्वीकार करता है;
- एक lock फ़ाइल लेता है,
$XDG_RUNTIME_DIR/ccam/profile-<name>.refresh.lock(वह variable सेट न हो तो~/.local/state/ccam/locks/के नीचे), ताकि दो ccam processes कभी एक ही token को दो बार renew न करें; - lock के तहत, अकाउंट का कोई session चल रहा हो तो मना करता है, और अगर किसी दूसरे process ने token पहले ही renew कर दिया हो तो request छोड़ देता है;
- refresh token को token endpoint पर post करता है और नए tokens को
fsutil.AtomicWriteसे वापस.credentials.jsonमें लिखता है, फ़ाइल की बाकी हर key रखते हुए।
स्टेटस लाइन collector
Claude Code स्टेटस लाइन कमांड चलाता है और उसे pipe से एक JSON document देता है। ccam उससे मॉडल का नाम और rate_limits पढ़ता है:
runStatuslineअकाउंट कोCCAM_PROFILEसे खोजता है, जिसे ccam Claude Code शुरू करते समय सेट करता है, या वरनाCLAUDE_CONFIG_DIRका अकाउंट फ़ोल्डरों से मिलान करके।ParseStatusLine,rate_limits.five_hourऔरrate_limits.seven_dayपढ़ता है। API key वाले अकाउंट्स के लिए, या session के पहले response से पहले, JSON में rate limits नहीं होतीं; तब कुछ सेव नहीं होता।SaveStatusLine,~/.local/state/ccam/usage/<name>.statusline.jsonलिखता है। जब endpoint जवाब नहीं देता, तोccam usageइसे इस्तेमाल करता है।- ccam
[name] · model · 5h N% · 7d N%प्रिंट करता है।--wrapके साथ, यह आपकी कमांड को उसी input के साथsh -cसे चलाता है और इसके बजाय[name]और उसके बाद कमांड की पहली पंक्ति प्रिंट करता है।
Wrap की गई कमांड को 2 सेकंड मिलते हैं। उसके बाद उसे बंद कर दिया जाता है और पंक्ति में केवल अकाउंट का नाम दिखता है, ताकि कोई धीमी कमांड Claude Code की स्टेटस लाइन न रोक सके।
ccam statusline install हर अकाउंट की settings.json में statusLine लिखता है। जब किसी अकाउंट के पास पहले से स्टेटस लाइन कमांड हो, तो ccam उसे --wrap '<old command>' के रूप में रखता है। ग्रुप के ज़रिए साझा की गई settings.json उसके लिंक से एक बार लिखी जाती है, इसलिए ग्रुप के हर अकाउंट को यह मिल जाता है। इसे फिर से चलाने पर, जो फ़ाइलें पहले से ccam इस्तेमाल करती हैं उनके लिए (already set) प्रिंट होता है।
सुरक्षा और विशेष स्थितियाँ
- जब तक आप
--refreshन दें,ccam usageकभी token फ़ाइल नहीं बदलता। जब कोई लॉगिन एक्सपायर हो जाए, तो अकाउंट को एक बारccam <name>से चलाएँ, Claude Code उसे renew कर देगा। --refreshकभी चल रहे अकाउंट्स, import किए गए अकाउंट्स या कीचेन लॉगिन को नहीं छूता। अस्वीकार किया गया refresh सेव की गई संख्याएँ और कारण दिखाता है।- Usage endpoint सार्वजनिक रूप से documented नहीं है और बदल सकता है। ऐसा होने पर भी आपको सेव की गई संख्याएँ दिखती हैं, और
ccam doctorformat में बदलाव बताता है। - सेव की गई संख्याएँ और जवाब दोनों न होने पर, पंक्ति
lookup failed:और कारण दिखाती है, उदाहरण के लिए--source cacheके साथno saved usage। - Cache फ़ाइलों में केवल प्रतिशत और रीसेट समय होते हैं, कभी tokens नहीं।