مقایسه ابزارهای ردیابی هزینه Claude Code
ابزارهای ردیابی هزینه Claude Code شامل تحلیلگر لاگ، داشبورد Anthropic و OpenTelemetry را مقایسه کنید. بفهمید چرا این سه ابزار دادههای متفاوتی را نمایش میدهند.
ردیابهای هزینه Claude Code دقیقاً چه چیزی را میخوانند
هر ردیاب هزینه Claude Code یکی از سه منبع داده را میخواند و همین منبع تعیین میکند که ردیاب به چه پرسشی میتواند پاسخ دهد. یک تحلیلگر لاگ (log parser)، فایلهای رونوشت نشست (session transcript) را روی دیسک خودتان میخواند. یک داشبورد، سوابق مصرفی را میخواند که Anthropic برای حساب کاربری یا سازمان شما نگهداری میکند. یک بکاند متریک، جریان OpenTelemetry (OTel) را میخواند که Claude Code هنگام فعالسازی منتشر میکند. هر سه منبع میتوانند همزمان درست باشند و در عین حال با هم اختلاف داشته باشند، زیرا هر کدام چیزهای متفاوتی را شمارش میکنند.
این راهنما دوباره توکنها را توضیح نمیدهد. نحوه شمارش مصرف توکن توسط Claude Code ورودی، خروجی، نوشتن در حافظه پنهان (cache) و خواندن از آن را پوشش میدهد و تا زمانی که آن بخش شفاف نباشد، هیچ داشبوردی معنای چندانی نخواهد داشت. پرسش در اینجا محدودتر است: برای هر نوع ابزار، چه چیزی قابل مشاهده است و چه چیزی هرگز قابل مشاهده نخواهد بود.
چرا سه ابزار ردیابی هزینه Claude Code در یک روز منتشر شدند
سه ابزار ردیابی هزینه مجزا برای Claude Code در یک روز منتشر شدند. اینها سه نسخه از یک ابزار واحد نبودند و همین نکته، بخش مفید ماجراست. یکی از آنها فایلهای نشست محلی را تحلیل میکرد. دیگری صفحات مربوط به میزان مصرف حساب کاربری را بستهبندی (wrap) میکرد. سومی یک backend ردیابی میزبانیشده بود که خودتان آن را اجرا میکنید.
دلیل همزمانی انتشار آنها این است که هزینه نشستهای عامل (agent session) دیگر شفاف نیست. هزینه یک چت تقریباً همان چیزی است که روی صفحه میبینید. اما یک عامل، بیست فایل را میخواند، مجموعه تستها را اجرا میکند و در هر مرحله، کل مکالمه را دوباره ارسال میکند؛ بنابراین صورتحساب توسط متنی که شما هرگز تایپ نکردهاید، افزایش مییابد. در حالت اشتراکی، هیچ مبلغ دلاری مشخصی وجود ندارد و تنها یک نوار میزان مصرف دیده میشود که در برخی روزها سریعتر از روزهای دیگر خالی میشود. هر یک از این سه ابزار، بخش متفاوتی از این خلأ اطلاعاتی را پر میکنند.
شکل 1: یک تحلیلگر لاگ محلی هزینه امروز را به شما میگوید
Claude Code هر گفتگو را به صورت JSON Lines در مسیر ~/.claude/projects/<project>/<session-id>.jsonl ذخیره میکند، که در آن <project> مسیر دایرکتوری کاری شماست که کاراکترهای غیرالفبایی آن با - جایگزین شدهاند. هر نوبت پاسخ دستیار در آن فایل، شامل تعداد توکنهای درخواست مربوطه است. یک تحلیلگر لاگ این مقادیر را جمع زده و قیمتگذاری میکند.
ccusage گزینهای است که اکثر کاربران از آن استفاده میکنند. این ابزار نیازی به نصب ندارد:
npx ccusage@latest daily
npx ccusage@latest daily --breakdown
npx ccusage@latest blocks
npx ccusage@latest session --jsondaily مجموع هزینهها را بر اساس تاریخ ارائه میدهد. --breakdown هر ردیف را بر اساس مدل تفکیک میکند؛ این همان روشی است که متوجه میشوید یک بعدازظهر کار با Opus، بخش عمده هزینه هفته را تشکیل داده است. blocks دادهها را بر اساس بازه پنجساعتهای که اشتراک در آن ریست میشود، گروهبندی میکند. session مجموع هزینهها را به تفکیک هر گفتگو نمایش میدهد و --instances دادهها را بر اساس پروژه گروهبندی میکند تا بتوانید ببینید کدام مخزن (repository) پرهزینه است. برای محدود کردن بازه زمانی از --since و --until استفاده کنید و برای فرمت تاریخ مورد انتظار نسخه خود، npx ccusage@latest daily --help را اجرا کنید. تا اوت 2026، این ابزار سایر CLIهای عامل (agent) از جمله Codex و OpenCode را نیز میخواند که اگر قصد مقایسه آنها را دارید، اهمیت دارد.
قیمتگذاری از یک جدول قیمت مدلها استخراج میشود و این ابزار سه حالت هزینه دارد. --mode auto از مقدار costUSD که Claude Code هنگام وجود در فایل نوشته است استفاده میکند و در صورت عدم وجود، محاسبات را بر اساس تعداد توکنها انجام میدهد. --mode calculate همیشه محاسبات را بر اساس توکنها انجام داده و هرگونه هزینه ثبتشده را نادیده میگیرد. --mode display فقط هزینههای ثبتشده را نشان میدهد و برای ردیفهایی که هزینهای ندارند، $0.00 چاپ میکند. اگر مجموع هزینهها اشتباه به نظر میرسد، همان گزارش را یک بار با calculate و بار دیگر با display اجرا کنید. شکاف بزرگ بین این دو به این معنی است که اکثر ورودیها فاقد هزینه ثبتشده هستند، بنابراین هر چیزی که میخوانید یک تخمین است.
همین دادهها میتوانند به پرامپت شما تزریق شوند. ccusage statusline یک خط فشرده برای نوار وضعیت Claude Code چاپ میکند که مانند هر دستور خط وضعیت دیگری به ~/.claude/settings.json متصل میشود. برای مشاهده بلوک تنظیمات و فیلدهایی که دریافت میکند، به ساخت یک خط وضعیت برای Claude Code مراجعه کنید.
آنچه یک تحلیلگر لاگ نمیتواند ببیند، هر اتفاقی است که روی این دستگاه رخ نداده باشد. لپتاپ دوم، یک نشست در claude.ai، یا کار همتیمی: این رونوشتها روی همان دیسکها باقی میمانند. دادههای قدیمی نیز در دسترس نیستند، زیرا رونوشتها بهطور پیشفرض پس از 30 روز تحت تنظیمات cleanupPeriodDays پاکسازی میشوند، بنابراین دادههای فصل گذشته از بین رفتهاند مگر اینکه آنها را آرشیو کرده باشید.
یک ریسک دیگر نیز وجود دارد که ساختاری است. مستندات Anthropic بیان میکند که فرمت ورودی، داخلیِ Claude Code است و بین نسخهها تغییر میکند، بنابراین اسکریپتهایی که مستقیماً این فایلها را تحلیل میکنند ممکن است با هر نسخه جدید از کار بیفتند. این موضوع برای تمام ابزارهای این چنینی صدق میکند. به همین دلیل است که یک دستور یکخطی jq که بهصورت دستی روی فایلهای JSONL نوشته شده، ایده بدتری نسبت به آنچه به نظر میرسد است: تحلیلگرهای نگهداریشده، تغییرات فرمت را برای شما دنبال میکنند، اما دستور یکخطی شما در روزی که یک فیلد تغییر نام یابد، با اطمینان یک عدد اشتباه گزارش خواهد کرد.
در نهایت، عدد دلاری در یک اشتراک نیاز به یک تذکر دارد. شما در طرحهای Pro یا Max به ازای هر توکن صورتحساب دریافت نمیکنید، بنابراین این عدد نشاندهنده هزینهای است که توکنهای شما با نرخهای لیست API میداشتند. این عدد میزان سنگینی استفاده شما را اندازهگیری میکند و صورتحساب واقعی شما نیست. اگر سوال اصلی این است که در کدام طرح عضو باشید، آن مقایسه خود یک تمرین جداگانه است: به مقایسه صورتحساب API با اشتراک Claude مراجعه کنید.
شکل 2: صفحات استفاده داخلی به شما میگویند کدام مدل بودجه را مصرف کرده است
Claude Code گزارشدهی داخلی خود را دارد و اکثر افراد هرگز آن را باز نمیکنند. دستور /usage را در یک نشست اجرا کنید. بلوک Session در بالا، توکنها را بر اساس مدل و مبلغ دلاری برای نشست فعلی نشان میدهد که بهصورت محلی از تعداد توکنها با نرخهای استاندارد لیست محاسبه شده است. این رقم شامل تخفیف یا قیمتهای تبلیغاتی نیست، بنابراین ممکن است با صورتحساب شما متفاوت باشد. مجموعها زمانی که /clear یک گفتگوی جدید را شروع میکند، بازنشانی میشوند.
در طرحهای Pro، Max، Team یا Enterprise، همان صفحه نشان میدهد که چه مقدار از سقف طرح خود را استفاده کردهاید و استفادههای اخیر را به مهارتها، زیر-عاملها (subagents)، پلاگینها و سرورهای MCP مجزا به عنوان درصدی از کل نسبت میدهد. این صفحه رفتارهایی را که 10% یا بیشتر از استفادههای اخیر را تشکیل میدهند، مانند context طولانی یا cache miss، علامتگذاری میکند. برای جابجایی بین 24 ساعت گذشته و 7 روز گذشته، d یا w را فشار دهید. این ارقام تقریبی هستند و از تاریخچه نشست محلی روی این دستگاه محاسبه میشوند، بنابراین دستگاه دوم شمارش نمیشود. وقتی آن نوار خالی است (نه فقط کم)، صفحه به شما میگوید که پنجره بسته شده است اما نمیگوید چگونه به کار ادامه دهید، و اقدامات لازم پس از رسیدن به سقف مجاز یک تصمیم جداگانه در مورد مدل، context و طرح است.
برای بیش از یک توسعهدهنده، اعداد به حساب کاربری منتقل میشوند. یک سازمان API به صفحه استفاده در Console دسترسی دارد، یک داشبورد Claude Code با میزان هزینه و خطوط پذیرفتهشده به ازای هر عضو، و یک API تحلیل Claude Code که همان معیارهای روزانه به ازای هر کاربر را با یک کلید مدیریتی برمیگرداند. طرحهای Teams و Enterprise یک گزارش هزینه در کنسول مدیریت با قابلیت خروجی CSV دریافت میکنند که روزانه بهروزرسانی میشود و Enterprise یک API تحلیل نیز اضافه میکند. اینکه کدامیک از اینها را میبینید به نحوه ورود هر توسعهدهنده بستگی دارد، بنابراین یک سازمان ترکیبی باید دو گزارش را بخواند و آنها را بهصورت دستی جمع بزند.
برای برآورد بودجه، رقم منتشرشده در مستندات هزینه Anthropic تا اوت 2026، میانگینی نزدیک به 13 دلار به ازای هر توسعهدهنده در هر روز فعال و 150 تا 250 دلار به ازای هر توسعهدهنده در ماه است، که 90% کاربران زیر 30 دلار در هر روز فعال هزینه دارند. این را به عنوان یک معیار منتشرشده از استقرارهای سازمانی در نظر بگیرید، نه به عنوان پیشبینی برای تیم خودتان. یک گروه آزمایشی اجرا کنید و قبل از تعمیم دادن، اندازهگیری کنید.
آنچه داشبوردها نمیتوانند ببینند، هر چیزی پایینتر از سطح روز و شخص است. آنها به شما میگویند که Opus بیشترین سهم را در سهشنبه داشته است. آنها به شما نمیگویند کدام prompt، کدام مخزن (repository) یا کدام job در CI باعث آن شده است. آنها همچنین دارای تأخیر هستند، زیرا گزارشهای سازمان روزانه بهروز میشوند، بنابراین آنها ابزاری برای بررسی هستند نه راهی برای متوقف کردن یک عامل (agent) خارج از کنترل در همین بعدازظهر. متوقف کردن عامل خارج از کنترل نیاز به محدودیت دارد، نه گزارش، که موضوع محدود نگه داشتن هزینههای عامل روی یک VPS است.
شکل 3: پشته OpenTelemetry اختصاصی شما نشان میدهد کدام پرامپت دچار افت عملکرد شده است
ابزار Claude Code به محض تنظیم یک متغیر محیطی، متریکها و رویدادهای OpenTelemetry را منتشر میکند. این تنها گزینهای است که دادههای مربوط به توکن و هزینه را به ازای هر کاربر، بهصورت بلادرنگ به سیستمی که تحت کنترل خودتان است، ارسال میکند. این متریکها شامل claude_code.cost.usage به دلار آمریکا، claude_code.token.usage به تعداد توکن، claude_code.session.count و claude_code.active_time.total هستند.
متریک توکن به دلیل ویژگیهای (attributes) همراهش، بسیار حائز اهمیت است. هر نقطه داده شامل type است که میتواند input، output، cacheRead یا cacheCreation باشد؛ بهعلاوه model و query_source که شامل main، subagent یا auxiliary است. این دادهها همچنین شامل agent.name، skill.name، mcp_server.name و mcp_tool.name هستند. این اطلاعات برای پاسخ به پرسشهایی که هیچ داشبوردی قادر به پاسخگویی به آنها نیست، کافی است: چه بخشی از هزینه مربوط به subagentها است و نه نوبتهای کاری خودتان، آیا یک سرور MCP باعث دو برابر شدن توکنهای ورودی شده است، یا اینکه آیا پس از ویرایش فایل CLAUDE.md، نرخ خواندن از حافظه کش (cache) کاهش یافته است. رفتار حافظه کش معمولاً همان جایی است که موارد غیرمنتظره پنهان شدهاند و زمانی که استفاده از prompt caching مقرونبهصرفه است توضیح میدهد که باید به دنبال چه چیزی باشید.
یک اصلاح لازم است، زیرا این موضوع در تمامی بحثها مطرح میشود. Langfuse یک backend مناسب برای ردیابی (tracing) به صورت self-hosted است و اجرای آن روی یک VPS در میزبانی شخصی Langfuse برای ردیابی عاملها توضیح داده شده است. نقطه پایانی OTLP در Langfuse فقط traceها را میپذیرد. ابزار Claude Code متریکها و رویدادهای لاگ را صادر میکند، نه spanها را؛ بنابراین هدایت OTEL_EXPORTER_OTLP_ENDPOINT به سمت Langfuse باعث میشود پروژه خالی بماند و هیچ خطای قابلفهمی نیز دریافت نکنید. Langfuse ابزار مناسبی برای عاملهایی است که خودتان با استفاده از API میسازید، جایی که کد شما هر span را به همراه پرامپت، مدل و هزینه آن ایجاد میکند. برای CLI ابزار Claude Code، یک ذخیرهساز متریک (metrics store) گزینه مناسب است.
راهاندازی ردیابی هزینههای Claude Code روی VPS شخصی
دو سرویس برای این کار کافی است: یک collector برای دریافت معیارها (metrics) و Prometheus برای ذخیرهسازی آنها. هر دو را از دسترس اینترنت عمومی خارج کنید، زیرا پورت OTLP باز، دادههای ارسالی از سوی هر کسی که آن را پیدا کند را میپذیرد. فایل /opt/ccmetrics/compose.yaml را بنویسید:
services:
collector:
image: otel/opentelemetry-collector-contrib:latest
command: ["--config=/etc/otel/config.yaml"]
volumes:
- ./collector.yaml:/etc/otel/config.yaml:ro
ports:
- "10.8.0.1:4318:4318"
restart: unless-stopped
prometheus:
image: prom/prometheus:latest
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- prom-data:/prometheus
ports:
- "127.0.0.1:9090:9090"
restart: unless-stopped
volumes:
prom-data:10.8.0.1 آدرس سرور در داخل تونل WireGuard است، بنابراین collector فقط از ماشینهای شما در دسترس است و از هیچ جای دیگری قابل دسترسی نیست. آدرس قبل از پورت در اینجا نقش حیاتی دارد، زیرا پورتهای منتشرشده Docker توسط ufw فیلتر نمیشوند: به چرا پورتهای منتشرشده Docker از ufw عبور میکنند مراجعه کنید. راهاندازی خودِ تونل در یک VPN WireGuard روی VPS شخصی توضیح داده شده است.
/opt/ccmetrics/collector.yaml:
receivers:
otlp:
protocols:
http:
endpoint: 0.0.0.0:4318
processors:
batch:
exporters:
prometheus:
endpoint: 0.0.0.0:8889
service:
pipelines:
metrics:
receivers: [otlp]
processors: [batch]
exporters: [prometheus]/opt/ccmetrics/prometheus.yml. پورت 8889 هرگز روی میزبان (host) منتشر نمیشود، زیرا Prometheus از طریق شبکه Compose و با استفاده از نام سرویس به collector دسترسی پیدا میکند:
global:
scrape_interval: 30s
scrape_configs:
- job_name: claude-code
static_configs:
- targets: ["collector:8889"]cd /opt/ccmetrics
docker compose up -d
docker compose logs collectorلاگ collector باید با Everything is ready. Begin running and processing data. پایان یابد. لاگی که به دلیل خطای پیکربندی متوقف میشود به این معنی است که فایل YAML تجزیه (parse) نشده است و container در یک حلقه، مدام restart میشود.
اکنون Claude Code را به آن متصل کنید. روی هر ماشینی که Claude Code را اجرا میکند، این مورد را به ~/.claude/settings.json اضافه کنید:
{
"env": {
"CLAUDE_CODE_ENABLE_TELEMETRY": "1",
"OTEL_METRICS_EXPORTER": "otlp",
"OTEL_LOGS_EXPORTER": "none",
"OTEL_EXPORTER_OTLP_PROTOCOL": "http/protobuf",
"OTEL_EXPORTER_OTLP_ENDPOINT": "http://10.8.0.1:4318",
"OTEL_METRIC_EXPORT_INTERVAL": "10000"
}
}یک نشست (session) را شروع کنید، یک prompt بفرستید، به اندازه بازه زمانی export (در اینجا 10 ثانیه، بهطور پیشفرض 60 ثانیه) صبر کنید، سپس از Prometheus بپرسید چه چیزی دریافت کرده است:
curl -s http://localhost:9090/api/v1/label/__name__/values | grep -o 'claude_code[a-z_]*'شما باید چندین نام که با claude_code_ شروع میشوند را دریافت کنید. exporter نقاط را به زیرخط (underscore) تبدیل کرده و واحد را به انتهای آن اضافه میکند، بنابراین رشتههای دقیق به نسخه collector شما بستگی دارند. نتیجه خالی به این معنی است که هیچ دادهای نرسیده است. بررسی کنید که پروتکل و پورت با هم مطابقت داشته باشند، زیرا http/protobuf از پورت 4318 و grpc از پورت 4317 استفاده میکند و عدم تطابق آنها باعث شکست بیسروصدا میشود. دستور claude --debug را اجرا کنید تا لاگ دیباگ، خطاهای export مربوط به OTel را گزارش کند.
برای یک ماشین و بدون سرور، از تمام مراحل بالا صرفنظر کنید. مقدار OTEL_METRICS_EXPORTER=prometheus را تنظیم کنید تا Claude Code یک scrape endpoint را در http://localhost:9464/metrics در دسترس قرار دهد. وقتی prometheus تنها exporter لیستشده باشد، Claude Code واحدهای USD، tokens و s را از نام معیارها حذف میکند تا scrape با فرمت متنی استاندارد Prometheus سازگار بماند.
یک تصمیم حریم خصوصی در این مدل وجود دارد. بهطور پیشفرض فقط شمارندهها از ماشین خارج میشوند و هیچ متن prompt یا خروجی ابزاری ارسال نمیشود. OTEL_LOG_USER_PROMPTS=1 و OTEL_LOG_TOOL_CONTENT=1 این وضعیت را تغییر میدهند و در آن صورت، جعبه معیارهای شما حاوی کد منبع و هر چیز دیگری که در context بوده است، خواهد بود. این گزینهها را آگاهانه فعال کنید و ابتدا دور نگه داشتن اسرار از context عامل را مطالعه کنید.
ردیابی هزینهها برای اجراهای اسکریپتی و CI
اجراهای غیرتعاملی (Non-interactive) همان مواردی هستند که کاربران را غافلگیر میکنند، زیرا کسی صفحه نمایش را مشاهده نمیکند. claude -p با استفاده از --output-format json، هزینه آن اجرا را در payload نتیجه گزارش میدهد:
claude -p "summarise the failing tests" --output-format json | jq '.total_cost_usd'این payload شامل total_cost_usd به همراه تفکیک هزینه به ازای هر مدل است، بنابراین یک job در CI میتواند بدون نیاز به داشبورد، هزینه مصرفی خود را ثبت کند. مقدار را به یک فایل اضافه کنید (Append) یا آن را به عنوان یک متریک به collector ذکر شده در بالا ارسال نمایید. این ارزانترین روش کاربردی برای ردیابی هزینهها است و تنها هزینه آن، یک فراخوانی jq در هر اجرا میباشد.
حالتهای شکست و آنچه مشاهده خواهید کرد
گزارش خالی است. npx ccusage@latest daily چاپ نشدن هیچ سطری به این معنی است که ابزار در مسیری که Claude Code مینویسد، جستجو نمیکند. CLAUDE_CONFIG_DIR آن مکان را تغییر میدهد و باید به parser اطلاع داده شود. اگر سطرها وجود دارند اما از حدود یک ماه پیش متوقف شدهاند، این رفتار cleanupPeriodDays مطابق طراحی است: رونوشتها بهصورت پیشفرض پس از 30 روز حذف میشوند.
دو دستگاه مجموعهای متفاوتی را گزارش میکنند. این مورد انتظار است و باگ محسوب نمیشود. هم /usage و هم هر parser لاگ دیگری، فقط تاریخچهٔ نشستهای محلی را میخوانند؛ بنابراین استفاده از دستگاه دیگر یا از طریق claude.ai در هر دو غایب است.
مجموع محلی با صورتحساب مطابقت ندارد. ارقام محلی بر اساس تعداد توکنها با نرخهای استاندارد لیست محاسبه میشوند. این ارقام از قیمتهای تبلیغاتی یا تخفیفهای قراردادی بیاطلاع هستند و در اشتراک، توکنهای شما اصلاً بهصورت جداگانه صورتحساب نمیشوند. صفحهٔ استفاده در Console مرجع اصلی برای صورتحساب API است.
هزینه با وجود انجام کار مشابه افزایش یافته است. پیش از هر چیز، ستونهای کش را بررسی کنید. یک نشست طولانی، کل تاریخچهٔ خود را در هر نوبت دوباره ارسال میکند؛ این کار در زمانی که کش گرم است با نرخ کش و پس از سرد شدن آن با نرخ کامل ورودی محاسبه میشود، بنابراین یک وقفهٔ طولانی باعث پردازش مجدد کل گفتگو میگردد. این موضوع بهصورت یک عدد ورودی بزرگ در کنار یک عدد خروجی کوچک نمایش داده میشود و قیمتگذاری توکن ورودی در برابر خروجی توضیح میدهد که چرا این دو بهطور مستقل تغییر میکنند.
یک روز با subagentها غیرممکن به نظر میرسد. هر subagent پنجرهٔ context خاص خود را اجرا میکند، بنابراین میزان استفاده از توکن با تعداد اجراها و مدت زمان هر کدام مقیاس میشود. فقط دادههای OTel آنها را از طریق ویژگی query_source در claude_code.token.usage تفکیک میکند. یک parser لاگ، مجموع را به شما نشان میدهد و شما را در حدس زدن باقی میگذارد.
FAQ
آیا ccusage هزینهای که در طرح Max برای آن صورتحساب دریافت میکنم را نشان میدهد؟
خیر. در مدل اشتراکی، هزینه بر اساس تعداد توکن محاسبه نمیشود؛ بنابراین یک تحلیلگر لاگ، توکنهای شما را با نرخهای استاندارد API قیمتگذاری میکند تا نشان دهد همان کار از طریق API چقدر هزینه داشته است. این ابزار یک معیار نسبی مناسب برای سنجش میزان فعالیت در یک روز است و برای مقایسه پروژهها یا مدلها با یکدیگر کاربرد دارد. برای اطلاع از مبلغ بدهی، صفحه Console usage صورتحسابهای API و صفحه plan billing صورتحساب اشتراک را نمایش میدهد.
فایلهای نشست که این ابزارها میخوانند، در کجا توسط Claude Code ذخیره میشوند؟
در ~/.claude/projects/<project>/<session-id>.jsonl، که در آن <project> مسیر دایرکتوری کاری است و کاراکترهای غیرالفبایی-عددی با - جایگزین شدهاند. هر خط یک شیء JSON برای یک پیام، استفاده از ابزار یا ورودی متادیتا است. CLAUDE_CONFIG_DIR کل دایرکتوری را جابهجا میکند و cleanupPeriodDays در settings.json، نگهداری 30 روزه را کنترل میکند. Anthropic فرمت ورودی را داخلی دانسته و اعلام کرده است که ممکن است بین نسخهها تغییر کند؛ بنابراین به جای نوشتن اسکریپت شخصی، آن را با ابزاری که پشتیبانی میشود تحلیل کنید.
آیا میتوانم تلهمتری Claude Code را به Langfuse ارسال کنم؟
بهطور مستقیم خیر. اندپوینت OTLP در Langfuse تریسها (traces) را میپذیرد، اما Claude Code به جای اسپنها (spans)، متریکها و رویدادهای لاگ را صادر میکند؛ بنابراین دادهها جایی برای ثبت ندارند. متریکهای Claude Code را به یک OpenTelemetry collector ارسال کرده و در Prometheus ذخیره کنید. از Langfuse برای ایجنتهایی استفاده کنید که خودتان بر پایه API میسازید؛ جایی که کد شما اسپنهایی تولید میکند که شامل پرامپت، مدل و هزینه هستند.
چرا اعداد محلی من با صفحه Console usage مطابقت ندارند؟
زیرا محاسبات آنها متفاوت است. /usage و تحلیلگرهای لاگ، تعداد توکنها را از فایلهای نشست روی دستگاهی که با آن کار میکنید جمع میزنند و سپس با نرخهای استاندارد لیست قیمتگذاری میکنند. Console گزارش میدهد که سازمان شما در مجموع، روی تمام دستگاهها و تمام کلیدها، پس از اعمال هرگونه تخفیف، چه مبلغی پرداخت کرده است. عدم تطابق امری عادی است. اختلاف بسیار زیاد معمولاً به این معناست که دستگاه دوم، یک CI runner یا یکی دیگر از اعضای تیم در حال استفاده از همان حساب برای صورتحساب است.
چگونه هزینه اجرای یک claude -p را در CI ردیابی کنم؟
آن را با --output-format json اجرا کنید و total_cost_usd را از نتیجه بخوانید؛ برای مثال با استفاده از claude -p "..." --output-format json | jq '.total_cost_usd'. همان پیلود شامل تفکیک هزینه به تفکیک مدل و شناسه نشست (session ID) است. آن مقدار را برای هر جاب ثبت کنید تا بدون نیاز به ایجنت، داشبورد یا سرویس اضافی، هزینههای هر پایپلاین را در اختیار داشته باشید.