{"version":"2026-10-26.2","id":"package","task":"check one package version for known vulnerabilities and repository health before installing it","input":{"ecosystem":"npm","name":"lodash","version":"4.17.15"},"measured_at":"2026-10-28T19:13:00.200662+00:00","figures":{"requests":"3 requests","diy_size":"44.4 KB","diy_time":"2.1 s","diy_tokens":"about 16,000 tokens","ours_size":"7.6 KB","ours_time":"1.4 s","ours_tokens":"about 2,600 tokens","date":"2026-10-28","gain":"For an agent that is about 5.8× less data, 1.5× faster and about 6.1× fewer tokens per check than doing it by hand."},"diy":{"requests":3,"failed":0,"bytes":44378,"wire_bytes":44378,"wall_s":2.1,"tokens":15923,"sources":[{"name":"registry.npmjs.org","host":"registry.npmjs.org","path":"/lodash/4.17.15","status":200,"bytes":2466,"wire_bytes":2466,"ms":742,"tokens_per_byte":0.4984,"sample_bytes":2466,"tokens":1229},{"name":"api.osv.dev","host":"api.osv.dev","path":"/v1/query","status":200,"bytes":23687,"wire_bytes":23687,"ms":775,"tokens_per_byte":0.3609,"sample_bytes":12000,"tokens":8549},{"name":"api.scorecard.dev","host":"api.scorecard.dev","path":"/projects/github.com/lodash/lodash","status":200,"bytes":18225,"wire_bytes":18225,"ms":587,"tokens_per_byte":0.3372,"sample_bytes":12000,"tokens":6145}]},"ours":{"calls":1,"bytes":7644,"ms":1410,"tokens":2609,"price_usd":0.005},"usd":{"diy_input":"$0.032","call":"$0.005","answer":"$0.0052","ours_total":"$0.01","diy_input_usd":0.031846,"call_usd":0.005,"answer_usd":0.0052179999999999995,"ours_total_usd":0.010218,"saves_money":true},"token_price":{"provider":"OpenAI","model":"gpt-4.1","input_usd_per_mtok":2,"url":"https://developers.openai.com/api/docs/pricing","read_at":"2026-10-28T19:13:00.200662+00:00","scope":"standard tier, text input tokens","price_text":"$2.00 per 1 million input tokens"},"method":{"diy":"Requests an agent must make itself to get the same answer: for sanctions the five official list files fetched one after another with a plain GET without compression (the EU server drops TLS when gzip is requested); for the other tasks the outgoing data requests of our own worker for that call (payment-side requests excluded), run in a sandbox copy of the worker with the payment stubbed and the live network.","ours":"One call to the route with the input shown; size is the response body in bytes, time is the sandbox wall clock.","bytes":"Decoded response bytes; 1 MB = 1,000,000 bytes and 1 KB = 1,000 bytes. Wire bytes (compressed) are listed per source.","time":"Wall clock of this machine; requests one after another; a different machine or network gives different seconds.","tokens":"Tokens of the raw content if it is read into a model: Ollama qwen3.5:9b (prompt_eval_count of the loaded chat model). Three chunks of 4000 bytes per file (start, middle, end) give tokens per byte, applied to the full size of that file; our response is counted whole.","not_shown":"A local parser reads files without spending tokens but needs code and upkeep; a cached copy avoids the download but goes stale; accuracy, completeness and price of any answer are separate questions.","repeat":"Re-measured weekly by agents/savings_facts.py; the harness is ops/savings_measure.mjs."},"tokenizer":{"name":"Ollama qwen3.5:9b (prompt_eval_count of the loaded chat model)","real":true,"sample_bytes":4000}}