Community程式設計與開發github.com

lokeshrana9999/llm-scan

掃描整個倉庫,找出所有呼叫 LLM 的位置,並產生一份路線圖 (routes.json)。當使用者說「稽核我的 LLM 使用狀況」、「為什麼我的 LLM 帳單這麼高」、「讓我的 LLM 呼叫更快」、「我們在哪裡呼叫模型」、「繪製我的 LLM 呼叫地圖」,或開始任何 LLM 成本或延遲審查時使用。請先執行此技能;llm-capture 和 llm-diagnose 需要它的輸出。

llm-scan 是什麼?

這項技能會掃描指定的程式碼倉庫,找出所有呼叫大型語言模型(LLM)的位置,無論是透過 SDK、CLI 子程序、HTTP 請求,還是用於決策、路由分類或健康檢查的模型呼叫。它會建立一個 `routes.json` 檔案,詳細記錄每個呼叫站點(例如提供者、模型名稱、是否串流、重試機制、是否為決策模型等),同時標記僅用於測試或非 LLM 的呼叫(如語音轉文字)。此外,它會尋找應用程式現有的使用記錄檔(如 JSONL、CSV、SQLite 等),並記錄其欄位名稱與涵蓋的路由,同時指出使用記錄中的缺口(例如某些路由完全未記錄或記錄值不可信)。此工具唯讀且不會寫入目標倉庫,專為為後續的 `llm-capture`(用於捕獲實際使用資料)和 `llm-diagnose`(用於診斷問題)提供必要資訊而設計。

相容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/lokeshrana9999/llm-cost-skills/tree/HEAD/skills/llm-scan

Installed? Explore more 程式設計與開發 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

llm-scan 是做什麼的?

此技能會將倉庫中所有 LLM 呼叫站點和使用記錄,映射到 work/<repo>/routes.json。此操作為唯讀:絕不編輯、格式化、提交或在目標倉庫內執行任何操作。

0. 設定

  1. 偵測您的編碼代理工具是哪一種:Claude Code 或 Codex(或任何其他編碼代理工具)。僅讀取此技能包中相符的檔案,delegation/claude.md 或 delegation/codex.md。其中會說明哪個步驟應交給便宜快速的輔助工具,哪個步驟由您自己處理。
  2. 將 <pack> 設定為包含 scripts/calc.py 的資料夾(在此檔案的上兩層),並將 <repo> 設定為目標倉庫的資料夾名稱。建立 <pack>/work/<repo>/;所有輸出都放在這裡。切勿寫入目標倉庫。

1. 尋找每個呼叫站點

搜尋整個倉庫(跳過 node_modules、.venv、dist、build、.git、鎖定檔案)。計算所有以下項目:

  • SDK 呼叫:任何向模型發送提示的客戶端函式庫呼叫(聊天、訊息、完成、回應、嵌入、串流輔助程式、代理框架)。
  • CLI 子程序呼叫:從程式碼中以非互動模式執行的代理或模型 CLI(使用列印旗標,如 -p、exec、--prompt),包括長時間運行的熱工作程序和串流 JSON 管道。
  • HTTP 呼叫:直接向模型 API URL、閘道器、代理或自架端點發出的請求。
  • 決策、閘道、分類器、路由器、重新排序器和評判模型,即使很小或便宜。這些也都算是 LLM 呼叫。
  • 涉及模型的預熱、保活和健康檢查呼叫:將它們記錄為路由(它們在日誌中通常沒有使用記錄;請見 usage_gaps)。
  • 測試、腳本、筆記本和 cron 任務中的呼叫:列出它們,但如果它們從未在生產環境中執行,請標記 "live": false。
  • 非 LLM 模型呼叫(語音轉文字、文字轉語音、OCR、按分鐘或按影像計費的視覺服務):不屬於定價範圍。將它們列出,並設定 "kind": "non_llm",以便報告顯示它們已被查看但未定價。

搜尋客戶端匯入、API 主機名稱、model= / "model": 字串、max_tokens、stream、cache_control 以及模型 CLI 的子程序生成。然後打開每個匹配項,並閱讀其周圍的函式。

2. 記錄每個路由

每個呼叫站點寫入一個條目。路由 ID 為 relative/path.ext:function_name;對於方法,則為 relative/path.ext:Class.method;若為頂層,則使用 <module>。在所有地方(routes.json、行、報告)使用相同的 ID 拼寫。

欄位意義
idfile:function 或 file:Class.method
kindsdk、cli、http、non_llm
provider如程式碼所示,否則為 null
model模型字串完全按照編寫方式,或設定它的配置鍵 / 環境變數(然後也記錄 model_source)。當一個路由的模型在執行時期變化時,寫入 "varies" 並在 model_source 中指明配置或來源
streamingtrue / false / null
cache_markersexplicit(程式碼標記了提示快取點)、implicit(無標記,但穩定的前綴、熱程序或提供者預設可能快取它)、none(沒有跡象表明快取)、unknown
max_tokens數字,若未設定則為 null
retries重試次數和位置(SDK 預設、包裝器、迴圈),或 0
user_waits如果有人在等待答案(聊天、語音、即時 UI)則為 true;如果是批次、背景、cron 則為 false;如果無法判斷則為 "unknown"
decision_model對於閘道器、路由器、分類器、評判器為 true
decision_shaped如果答案是一個提供給程式碼分支的微小判斷(一個列舉、一個布林值、一個標籤、一個分數),且該路由是每個事件或每個項目執行,則為 true;如果答案是自由文字或長結構化輸出,則為 false;如果無法判斷則為 "unknown"。為每個路由記錄此項;calc 也會從日誌中偵測它(在 50 次以上呼叫中,輸出 p50 為 5 個 token 或更少)
tools建構和發送工具或函式定義的位置 (file:function,以及每次呼叫發送的數量,如果程式碼有顯示),或者如果路由未發送任何工具則為 null。僅限事實;數字來自日誌
livetrue;如果僅測試則為 false;如果無法判斷則為 "unknown"
stateless如果每次呼叫都是獨立的(一個每次事件的閘道器或分類器,不發送先前的對話輪次),則為 true;如果對話或備忘錄在多次呼叫中增長,則為 false;如果無法判斷則為 "unknown"
notes一行簡短說明,僅限您看到的事實

當您無法判斷時,使用 null(或表格允許時使用 "unknown")。切勿猜測數值。

3. 尋找使用記錄

找出應用程式已經記錄使用情況(token、成本、延遲、第一個 token 的時間、成功率)的位置。尋找日誌檔案、JSONL、CSV、SQLite 或資料庫表格、追蹤和指標呼叫,以及從回應中儲存的提供者使用欄位。對於每個記錄,記錄:

  • 路徑或表格以及格式;
  • 欄位名稱,切勿記錄數值;
  • 是否有任何欄位包含提示或回答文字(has_text_fields);
  • 它涵蓋了哪些路由 ID。

切勿開啟超出學習欄位名稱所需的前幾行日誌數值,也不要從中複製任何文字。

另外,僅按欄位名稱記錄日誌是否記錄每次呼叫的工具定義或工具使用(發送的工具數量、工具定義的 token 大小、回應中的工具呼叫次數);llm-capture 會將這些轉換為 tools_defined、tool_schema_tokens 和 tool_calls。如果日誌缺少這些,請在 usage_gaps 中說明。

也要記錄 usage_gaps:簡短的純文字註解(每行一個,僅限事實),標明發生呼叫但日誌未攜帶 token 使用記錄,或記錄的數字無法直接信任的位置。例如:

相關技能