llm-scan 是做什麼的?
此技能會將倉庫中所有 LLM 呼叫站點和使用記錄,映射到 work/<repo>/routes.json。此操作為唯讀:絕不編輯、格式化、提交或在目標倉庫內執行任何操作。
0. 設定
- 偵測您的編碼代理工具是哪一種:Claude Code 或 Codex(或任何其他編碼代理工具)。僅讀取此技能包中相符的檔案,
delegation/claude.md或delegation/codex.md。其中會說明哪個步驟應交給便宜快速的輔助工具,哪個步驟由您自己處理。 - 將
<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 拼寫。
| 欄位 | 意義 |
|---|---|
id | file:function 或 file:Class.method |
kind | sdk、cli、http、non_llm |
provider | 如程式碼所示,否則為 null |
model | 模型字串完全按照編寫方式,或設定它的配置鍵 / 環境變數(然後也記錄 model_source)。當一個路由的模型在執行時期變化時,寫入 "varies" 並在 model_source 中指明配置或來源 |
streaming | true / false / null |
cache_markers | explicit(程式碼標記了提示快取點)、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。僅限事實;數字來自日誌 |
live | true;如果僅測試則為 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 使用記錄,或記錄的數字無法直接信任的位置。例如: