Community生產力與協作github.com

Caveman 倉庫設定

將倉庫透過 Caveman Cloud 閘道連接,讓每一次 LLM 請求都能被測量,且不改變任何行為。用於「設定 Caveman」或增加 LLM 花費可觀察性。

Caveman 倉庫設定 是什麼?

Caveman 是一個位元組保留的 LLM 代理伺服器,以記錄模式運作,測量應用程式傳送的內容及其成本,不改變任何其他行為。此技能會引導使用者完成最小化且經過驗證的整合,將現有倉庫連接到 Caveman Cloud 閘道,實現 LLM 花費的可觀察性。它支援多種平台和 SDK,包括 OpenAI、Anthropic、Vercel AI SDK、LangChain、LangGraph、LiteLLM 等,並提供清晰的逐步指示,從找到每個 LLM 呼叫點、選擇應用程式別名、連接每個呼叫點,到透過一個真實請求進行驗證。技能強調「不重構」的方法,確保秘密僅以環境變數形式存在,並要求最終報告中僅報告觀察到的資料。整合完成後,使用者可以透過儀表板查看花費,但不會啟用任何最佳化功能,因此驗證後的節省金額為 $0。

相容平台✓Claude Code✓Codex CLI~Cursor✓Gemini CLI
npx skills add https://github.com/JuliusBrussee/caveman/tree/main/skills/caveman-setup

Installed? Explore more 生產力與協作 skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

在你喜歡的 AI 中提問

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

說明文件

您正在將此倉庫連接至 Caveman 閘道。Caveman 是一個 位元組保留的 LLM 代理:在記錄模式下,它會測量您的應用程式傳送的內容及其成本, 除此之外不會改變任何內容。您的工作是進行最小化、經過驗證的整合, 而不是重構。

提示為您提供了四個值。請參考以下名稱:

  • GATEWAY — 閘道基本 URL(例如 https://gateway.caveman.so 或 http://127.0.0.1:8787)
  • CAVE_API_KEY — 閘道驗證密鑰(請像對待任何 API 金鑰一樣:僅使用環境變數,絕不提交,絕不完整列印)
  • PROVIDER_KEYS — stored(提供者金鑰以加密方式存在於 Caveman Cloud 中)或 byok(此應用程式在每個請求中發送自己的提供者金鑰)
  • DASHBOARD — 儀表板基本 URL(例如 https://app.caveman.so)

如果缺少任何值,請停下來並要求提供。不要猜測 URL 或產生金鑰。

規則(不可協商)

  1. 一致性的整合。 透過現有的設定和相關接縫連接每一個實際運作的 LLM 呼叫點。 觸及每個正確性所需的層。不要順帶進行重構或格式化檢查;僅在抽象層能釐清所有權或 降低生命週期成本時才新增抽象層。
  2. 機密必須放在環境變數中。 將 CAVE_API_KEY 放入倉庫已使用的環境變數檔案中 (.env, .env.local, …)。如果該檔案未被 .gitignore 忽略,將其加入 .gitignore 並說明。絕不要將金鑰寫入原始碼中。
  3. 只報告您觀察到的結果。 最終報告必須陳述來自實際驗證回應的 HTTP 狀態 和使用數據——絕不假設成功。如果驗證失敗,請改用失敗範本。
  4. 僅限記錄模式。 您正在新增測量功能。您不會啟用任何最佳化功能, 也不會聲稱任何節省——在最佳化功能被明確啟用並通過其評估關卡之前,驗證後的節省金額為 $0。
  5. 提供者金鑰不關您的事。 使用 PROVIDER_KEYS: stored 時,您永遠不會看到提供者金鑰。 使用 byok 時,應用程式現有的提供者金鑰保持在其原來的位置。

步驟 1 — 找到每個實際運作的 LLM 呼叫點

讀取依賴檔案(package.json, requirements.txt, pyproject.toml, go.mod, lockfiles)並在原始碼中搜尋 LLM 客戶端:

  • SDK 匯入:openai, @anthropic-ai/sdk, anthropic, ai + @ai-sdk/* (Vercel), langchain*, litellm, google-genai / @google/genai, crewai, pydantic_ai, openai-agents / agents
  • 對 api.openai.com, api.anthropic.com, generativelanguage.googleapis.com 的原始 HTTP 請求
  • 現有的基本 URL 環境變數:OPENAI_BASE_URL, OPENAI_API_BASE, ANTHROPIC_BASE_URL, GEMINI_BASE_URL, GOOGLE_GEMINI_BASE_URL

在進行任何修改之前,列出您找到的內容(每個呼叫點的路徑:行號)。如果您 找到沒有 LLM 呼叫點,請停下來並回報本文檔末尾的「無可連接」範本—— 不要憑空發明一個整合。

步驟 2 — 選擇應用程式別名

一個別名在閘道路徑中命名此應用程式:GATEWAY/w/<app>。根據套件/模組名稱 (例如 support-bot, acme-api)推導出來。語法: 以小寫 [a-z0-9]開頭,接著 [a-z0-9._-],最長 64 個字元。此整個應用程式的花費將 在儀表板上以該別名群組顯示。

步驟 3 — 連接每個呼叫點

模式始終相同:基本 URL → 閘道加上 /w/<app>,再加上一個驗證標頭。 閘道驗證是 x-cave-api-key: CAVE_API_KEY(在標頭不方便的地方,Authorization: Bearer CAVE_API_KEY 也行)。使用 PROVIDER_KEYS: byok 時,還要發送 x-cave-upstream-key: <應用程式已使用的提供者金鑰>。

有兩個事實讓連接變得安全(兩者都由閘道強制執行,而非空想): 閘道會從頭開始重建上游驗證標頭,因此客戶端的 Authorization/x-api-key 值永遠不會被轉發給提供者;並且使用 stored 時,上游驗證來自伺服器端的加密連線。因此,在 stored 模式下,如果 SDK 強制要求 api-key 參數,請將其設定為 Cave 金鑰—— 它用於驗證閘道,不會被進一步轉發。

確切形式(使用與每個呼叫點匹配的形式——這些是產品的 已發布配方,而非建議):

OpenAI SDK (TS) — Chat Completions 和 Responses 都透過以下方式路由:

const client = new OpenAI({
  baseURL: `${process.env.CAVE_GATEWAY_URL}/w/<app>/openai/v1`,
  apiKey: process.env.OPENAI_API_KEY,           // byok: 不變 · stored: 使用 CAVE_API_KEY
  defaultHeaders: {
    "x-cave-api-key": process.env.CAVE_API_KEY!,
    // 僅限 byok:
    "x-cave-upstream-key": process.env.OPENAI_API_KEY!,
  },
});

OpenAI SDK (Python) — 相同形式:base_url=f"{gw}/w/<app>/openai/v1", default_headers={"x-cave-api-key": ..., "x-cave-upstream-key": ...}。

Anthropic SDK (TS/Python) — SDK 會自行附加 /v1/messages。在此兩種模式下, 都需要 x-cave-api-key 標頭(此 SDK 自己的金鑰參數使用 x-api-key, 這不是閘道驗證標頭):

client = anthropic.Anthropic(
    base_url=f"{os.environ['CAVE_GATEWAY_URL']}/w/<app>",
    api_key=os.environ["ANTHROPIC_API_KEY"],      # byok: 不變 · stored: 使用 CAVE_API_KEY
    default_headers={
        "x-cave-api-key": os.environ["CAVE_API_KEY"],
        # 僅限 byok:
        "x-cave-upstream-key": os.environ["ANTHROPIC_API_KEY"],
    },
)

Vercel AI SDK — createOpenAICompatible({ baseURL: ${gw}/w//openai/v1, headers: { "x-cave-api-key": ... } });Anthropic 模型透過 createAnthropic({ baseURL: ${gw}/w//v1,headers: { ... } })。

LangChain / LangGraph — ChatOpenAI(base_url=f"{gw}/w/<app>/openai/v1", default_headers={...});ChatAnthropic(base_url=f"{gw}/w/<app>", default_headers={...})。LangGraph 會繼承您傳遞給它的任何模型。

LiteLLM — 每次呼叫 api_base=f"{gw}/w/<app>/openai/v1" + extra_headers={...},或在 LiteLLM 代理程式的 config.yaml 中進行整個部署設定。

原始 HTTP / 其他任何東西 — 交換主機,保留提供者的原生路徑: GATEWAY/w/<app>/v1/chat/completions(OpenAI 協議)或 GATEWAY/w/<app>/v1/messages(Anthropic 協議),並加上標頭。

具體來說,使用別名 support-bot 和託管閘道,OpenAI SDK 的基本 URL 為 https://gateway.caveman.so/w/support-bot/openai/v1。而在 stored 模式下,完全刪除每一行 x-cave-upstream-key——它僅供 byok 使用。

對於未列出的框架(google-genai, crewai, pydantic-ai, openai-agents), 請提取 <docs origin>/docs/integrations/ 下的對應頁面——與此技能來自相同的來源—— 並遵循其指示。

新增至倉庫的環境變數檔案(並在程式碼中引用——不要使用字面值):

CAVE_GATEWAY_URL=<GATEWAY>
CAVE_API_KEY=<CAVE_API_KEY>

步驟 4 — 使用一個真實請求進行驗證

使用者貼上設定提示就是為了授權這件事:一個小型驗證請求。現在就發送它—— 不要停下來請求許可。一個因為您猶豫而未經驗證就結束的整合,比一個小小的請求更糟糕; 自主完成驗證和報告正是此技能的重點。

透過您剛建立的連接發送一個最小請求——如果有的話,使用應用程式自己的成本最低的路徑 (如果有腳本可用),否則使用 與您剛連接的協議匹配的路徑 上的 curl, 使用應用程式自己的模型和一個小的上限(max_tokens ≤ 32):

# OpenAI 協議連接:
curl -sS "$CAVE_GATEWAY_URL/w/<app>/v1/chat/completions" \
  -H "x-cave-api-key: $CAVE_API_KEY" \
  -H "content-type: application/json" \
  -d '{"model":"<倉庫已使用的模型>","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

# Anthropic 協議連接:
curl -sS "$CAVE_GATEWAY_URL/w/<app>/v1/messages" \
  -H "x-cave-api-key: $CAVE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model":"<倉庫已使用的模型>","max_tokens":16,"messages":[{"role":"user","content":"ping"}]}'

(byok:請加上 -H "x-cave-upstream-key: $PROVIDER_KEY"。)這是一個真實的、 會產生費用的提供者請求——這就是重點:真實的流量,真實的測量。

讀取回應。成功 = HTTP 200 且帶有 usage 區塊。其他任何情況 = 下方的匹配失敗範本。

步驟 5 — 報告

以完全相同的格式結束,根據您實際執行的操作和看到的結果填寫數值:

## Caveman 已在這個倉庫中啟用

已連接:<n> 個檔案中的 <n> 個呼叫點
  - <檔案> — <一行說明變更內容>
應用程式別名:<app> — 此應用程式的花費將以此別名群組
已驗證:HTTP 200 · 模型 <model> · <輸入> 輸入 / <輸出> 輸出 tokens(一個真實請求)
模式:記錄 — 僅測量。沒有模型可見的位元組被更改,沒有啟用最佳化。
驗證後的節省金額為 $0,直到您開啟最佳化功能並且它通過其評估關卡。
這種誠實就是產品的價值所在。

查看花費:<DASHBOARD>/traces — 您的請求位於最上方一行,價格來自公開目錄。
<DASHBOARD>/getting-started 會切換為「已收到第一個請求。」

想要按工作流程(例如 support-reply vs nightly-digest)而非僅按應用程式
來劃分花費嗎?請說「發現工作流程」——我將提取 <docs origin>/docs/discover-workflows.md
並為每個呼叫點標記其所屬的工作。

失敗範本(請逐字使用,填入資料——切勿弱化)

  • 無可連接:「我在這個倉庫中沒有找到任何 LLM 呼叫點(已搜尋 SDK、 原始提供者 HTTP、基本 URL 環境變數)。如果此倉庫執行的是編碼代理 而非部署 LLM 程式碼,請改用 caveman wrap <agent>——請參閱 /getting-started。」
  • 閘道無法連線:「驗證請求無法到達 GATEWAY (<錯誤>)。連接已就位但未經驗證——在閘道可連線之前,不會測量任何東西。 請檢查 URL 和網路,然後重新執行上述的驗證 curl。」
  • 401 cave_invalid_api_key:「閘道拒絕了 CAVE_API_KEY。請在 /getting-started 產生一個新的金鑰並更新環境變數檔案;連接本身 無需更改。」
  • 404 cave_route_not_found:「閘道沒有匹配到任何路由——通常是 /w/ 別名格式錯誤(以小寫 [a-z0-9] 開頭,接著 [a-z0-9._-],最長 64 個字元) 或路徑與 SDK 的協議不匹配。請修正 URL 並重新驗證。」
  • 提供者錯誤(經由閘道的 4xx/5xx):報告狀態和主體原文; 閘道可連線且驗證已通過,但上游呼叫失敗——通常是應用程式本身的 提供者金鑰或模型名稱問題。

切勿在任何這些情況下報告成功。未經驗證的整合應報告為未經驗證。

Individual skills in this repo

This repo contains 12 individual skills — each has its own dedicated page.

JuliusBrussee/caveman-discover

Find and label every LLM workflow in the repository so Caveman Cloud groups spend by workflow instead of one bucket. Use for "discover workflows" or breaking LLM spend down by workflow.

JuliusBrussee/caveman-evidence-review

Read-only review of Caveman Cloud evidence: cost, Cave Score, workflows, traces, latency, errors, routing, savings. Use when asked what Caveman found or where LLM spend goes.

JuliusBrussee/caveman-explore

Read-only repository explorer for cold-start orientation, broad cross-file localization, or when a direct search failed. Skip it when the exact file or symbol is already named. Returns path:line citations only; its reads stay out of main context.

JuliusBrussee/caveman-learn

Act on a Caveman learn report - review the ranked token sinks, apply cost-lowering fixes with per-edit consent, and report what those fixes returned. Use when asked to lower an agent's token cost, what caveman has saved, to trim a heavy CLAUDE.md, or to offload re-pasted context into cavemem.

JuliusBrussee/caveman-manage

Inspect Caveman Cloud's experiment lifecycle and block unsafe execution. Use when asked to start, approve, cancel, promote or roll back a Caveman experiment.

JuliusBrussee/caveman-optimize

Turn a Caveman optimization observation into an operator-chosen candidate with a paired baseline evaluation. Use when asked to inspect or evaluate a Caveman optimization report. Needs explicit approval.

JuliusBrussee/investigate-first

Diagnose ambiguous failures before editing. Use for unknown causes, intermittent behavior, performance regressions, or investigations needing evidence-ranked hypotheses.

JuliusBrussee/lean-build

Build feature work with high overbuilding risk. Use for new behavior, product slices, or integrations where repository reuse, strict scope, and an explicit stop condition matter.

JuliusBrussee/migration

Implement reversible compatibility-safe transitions. Use for schema, data, API, protocol, configuration, or dependency migrations requiring rollback and preservation proof.

JuliusBrussee/safe-refactor

Restructure code while preserving behavior. Use for extraction, consolidation, ownership moves, or cleanup where verification must bracket structural edits.

JuliusBrussee/surgical-patch

Fix bugs and small behavior changes at the narrowest responsible layer. Use when regression proof, preserved surrounding behavior, and task-relevant tests matter.

JuliusBrussee/verify-and-stop

Prove existing work meets acceptance conditions without expanding scope. Use for validation-only tasks, completion checks, focused gate runs, and last-mile proof.

相關技能