# 複製本文件為 .env 並填入真實值(.env 已被 .gitignore 忽略,不會提交) # cp .env.example .env # cmd 入口會先 godotenv.Load() 載入本檔,再讀環境變數。 # (claw / claw-cli 經 cmdutil.Bootstrap 間接載入;claw-dashboard 等自行呼叫。 # godotenv 不覆蓋【已存在】的環境變數——shell 裡 export 過的值優先。) # ── LLM Provider ──────────────────────────────────────────────── # 預設 Claude。要換 OpenAI 相容端點(vLLM/Ollama/OpenRouter…)設 COGITO_PROVIDER=openai。 ANTHROPIC_API_KEY= # https://console.anthropic.com # CLAUDE_MODEL=claude-opus-4-8 # 可選,預設 claude-opus-4-8 # COGITO_PROVIDER=openai # 切到 OpenAI 相容 # OPENAI_API_KEY= # OPENAI_BASE_URL=https://api.openai.com/v1 # 或 http://localhost:8000/v1(vLLM/Ollama) # OPENAI_MODEL=gpt-4o-mini # OPENAI_MAX_CONTEXT_TOKENS=128000 # OPENAI_REASONING_EFFORT=none # 有設才送 reasoning_effort;gpt-5.6-sol 帶工具時只接受 none(非推理模型留空) # ── Slack(cmd/claw 服務端必填;走 Socket Mode,免公開 URL/ngrok)────────── # Bot Token Scopes: chat:write, app_mentions:read, im:history, files:write(`get` 檔案取回用; # 後補 scope 要 Reinstall to Workspace 才生效,重裝後 token 若變記得同步這裡) # 先在 App 後臺 Settings → Socket Mode 啟用,產生 App-Level Token(scope connections:write)。 SLACK_BOT_TOKEN= # xoxb- 開頭,App 後臺 OAuth & Permissions SLACK_APP_TOKEN= # xapp- 開頭,App 後臺 Socket Mode(App-Level Token) # ── Telegram(可選,多平台):設了就與 Slack 同進程一起跑(getUpdates 長輪詢,免公開 URL)── # 找 @BotFather /newbot 取 token。會話/工作目錄靠 platform 前綴與 Slack 天然隔離。 # TELEGRAM_BOT_TOKEN= # 123456:ABC-DEF... 開頭 # ── 鏈路追蹤 OTel(可選;設了 ENDPOINT 才上報,否則 no-op)──────── # Langfuse:ENDPOINT 用【基址】.../api/public/otel(SDK 會自己接 /v1/traces)。 # 注意 region:EU=cloud / US=us.cloud / JP=jp.cloud .langfuse.com,key 綁 region,選錯會 401。 # 認證免手編 base64:設了 LANGFUSE_PUBLIC_KEY+LANGFUSE_SECRET_KEY 就自動組 Authorization header。 # OTEL_EXPORTER_OTLP_ENDPOINT=https://jp.cloud.langfuse.com/api/public/otel # OTEL_EXPORTER_OTLP_HEADERS=Authorization=Basic <僅在想覆蓋自動派生時才手設> # OTEL_TRACES_EXPORTER=console # 改印到 stdout(不接後端也能本地看 span) # ── 授權(Slack/Telegram 服務端【務必設】;不設=fail-closed 拒絕所有入站)────────── # COGITO_ALLOWED_USERS:可驅動 agent 的使用者 id(逗號分隔)。不設時 bot 對所有人拒絕回應—— # 這是刻意的:bot 入口 + host 直跑 + 工具執行 = 未授權者可在宿主機 RCE。先設白名單再上線。 # ID 來源:Telegram=純數字 user id(私訊 bot 後看 log 的「拒絕未授權使用者 」即是你的 id); # Slack=U 開頭(如 U0123ABC)。同時跑兩平台就把兩邊 id 都放進來。 # COGITO_ALLOWED_USERS=123456789,U0123ABC # COGITO_ADMIN_USERS:可 approve/reject 高危操作者(逗號分隔)。不設=回退為 ALLOWED_USERS。 # 要真正做到「發起者≠批准者」(防自我放行),把審批權限收斂到少數管理員 id。 # COGITO_ADMIN_USERS=123456789 # COGITO_USER_LINK:DM 跨平台連續性——宣告同一人在各平台的 user id(= 連接一組、逗號分隔多組)。 # 設了之後該用戶在 Telegram/Slack 私聊共用同一份 session(歷史/工作目錄/忙碌鎖), # 回覆與審批通知送到最後說話的平台。僅 DM 生效,群組不合併。信任宣告:只由你顯式配置。 # COGITO_USER_LINK=123456789=U0123ABC # # ── 平台限定(上面三個名單都支援)─────────────────────────────────────────── # 條目可寫成 platform:id(只在該平台生效),或裸 id(任何平台皆生效,向後相容)。 # COGITO_ALLOWED_USERS=telegram:123456789,slack:U0123ABC # 為什麼建議加前綴:裸 id 在【每個】平台都生效。今天安全只因 Telegram 是純數字、Slack 以 U 開頭, # ID 空間剛好不重疊;若日後接入第三個平台(如 Discord 的 snowflake 也是純數字),一個 Discord # 使用者的 ID 只要等於你白名單裡的 Telegram ID,就會【直接獲得授權】。平台名=telegram / slack。 # 注意:USER_LINK 改用前綴會換掉 session key(canonical 從 "123" 變 "telegram:123"), # 既有的共享 session 不會自動搬過去。 # ── 沙箱(可選;不設=host 直跑。面向 bot 建議開,讓 bash 不在宿主機執行)────────── # COGITO_SANDBOX=docker # bash 丟進 per-session 容器(斷網/限資源) # COGITO_SANDBOX_IMAGE=cogito-sandbox:latest # COGITO_SANDBOX_NETWORK=none # ── 面板 claw-dashboard(可選)────────────────────────────────── # COGITO_DASH_CHAT=1 開啟面板的【寫入能力】:operator chat 會真的跑 bash/寫檔,cron 也才會觸發。 # 不設=唯讀面板(仍可看 runs/metrics,治理放行等寫入走各自的 CSRF+gate 保護)。需一併設 COGITO_SESSION_DIR。 # # ⚠️ 刻意【預設註解掉】:dashboard 會自動載入本檔,寫在這裡等於「每次啟動都預設開著寫入能力」。 # 建議改用逐次啟動的 inline 前綴,讓每一次開啟都是明確決定: # COGITO_DASH_CHAT=1 ./bin/claw-dashboard # (scripts/demo.sh serve 就是這樣做的。)真的要常駐開啟再把下一行取消註解。 # COGITO_DASH_CHAT=1 # ── 成本熔斷 fallback 估價(可選;接非 Claude 模型時建議設為實際單價)────────── # 未在 PricingModel 登記的模型(OpenAI 相容端點等)用這裡的單價估算成本,好讓 MaxCostUSD 熔斷生效。 # 不設=預設 opus 級 in $5 / out $25(偏高=寧可提早熔斷也不超支)。單位:美元/百萬 token。 # COGITO_PRICE_INPUT_USD=0.5 # COGITO_PRICE_OUTPUT_USD=1.5 # ── 像素辦公室 office(可選;unity_demo 橋)────────────────────── # 三個端點的完整契約(欄位語意/截斷長度/傳遞保證/版本規則)見 docs/office-protocol.md # COGITO_OFFICE_URL=http://localhost:8123 # 設了才把執行事件投影到辦公室看板(掉幀無害、不反壓引擎) # COGITO_OFFICE_TOKEN= # 辦公室橋的 token;不設就讀 ~/.pixel-office/token(橋第一次啟動產生),通常不用設 # # HTTP 派工入口:ADDR 與 TOKEN【兩個都設】才會開。⚠️ 這個入口能執行【任意任務】(bash/寫檔), # 對外只有一道共享 bearer token 且無 TLS,故預設【只准 loopback】——非 loopback 會拒開並提示。 # COGITO_HTTP_ADDR=127.0.0.1:8124 # COGITO_HTTP_TOKEN= # 自己產一組長亂數;空=整個入口不開 # COGITO_HTTP_USER=office-web # 派工者身分(預設 office-web),須列在 COGITO_ALLOWED_USERS # COGITO_HTTP_INSECURE=1 # 逃生門:真要綁非 loopback(自負風險)。遠端建議改走 SSH tunnel # # ⚠️ 若沒單獨設 COGITO_ADMIN_USERS,admin 會回退成 allowed 名單——此時 COGITO_HTTP_USER 也具審批權, # 等於「持 token 者可自我放行高危操作」。要保住 HITL,請明確設 COGITO_ADMIN_USERS 為【真人】id。 # ── 多租戶 / 記憶隔離(可選)───────────────────────────────────── # COGITO_MEMORY_SCOPE=channel # 長期記憶 per-conversation 隔離(技能仍共享);預設 global=跨對話共享。 # # 一個 bot 服務多個【互不信任對話】時開;一個助手服務一個團隊維持預設。 # # 見 docs/multi-tenancy.md。互不信任的租戶請用「一行程一租戶」(各自 .env)。 # ── 持久化 / 容錯 / MCP(可選)─────────────────────────────────── # COGITO_SESSION_DIR=./workspace/sessions # 設了才落地磁碟、跨重啟續傳(斷點粒度=回合) # COGITO_AUTO_RESUME=1 # 自動續跑:進程活著時暫時性中斷退避重試;進程被硬砍(OOM/kill)重啟後掃出未完成任務續跑(各上限 3 次,防迴圈)。跨重啟續跑需一併設 COGITO_SESSION_DIR # COGITO_SUMMARY=off # 關閉對話式入口的滾動摘要(預設開;bench 走預設關) # COGITO_MCP_CONFIG=./.mcp.json # 掛外部 MCP 工具(cp .mcp.json.example .mcp.json) # ── 知識圖譜 embedding 選種子(可選;不設=recall 用關鍵字選種子)────── # 設了 COGITO_EMBED_MODEL 才啟用語意選種子;端點走 OpenAI 相容 /embeddings(雲端或本地 Ollama/vLLM)。 # 之後 `go run ./cmd/ingest -embed` 建向量快取,recall 即改用 embedding 選種子。 # COGITO_EMBED_MODEL=text-embedding-3-small # COGITO_EMBED_BASE_URL=https://api.openai.com/v1 # 留空則沿用 OPENAI_BASE_URL # COGITO_EMBED_API_KEY=sk-... # 留空則沿用 OPENAI_API_KEY # ── Tier 4 自我進化(可選;產物只進暫存區、需人工 review)──────── # COGITO_REFLECT_MODEL=claude-haiku-4-5-20251001 # 背景反思(技能/記憶/KG 蒸餾)改用便宜模型。 # 任務結束後才跑、沒人在等、產物還要人工放行——沒必要燒主模型。未設=沿用主模型。 # 刻意【不】涵蓋 goal judge(那道驗收會影響任務結果,與省背景成本是兩件事)。 # COGITO_SKILL_SYNTH=1 # 成功任務 → 提案技能 .claw/skills-proposed/ # COGITO_MEMORY_SYNTH=1 # 成功→提案慣例 / 失敗→教訓 .claw/AGENTS.proposed.md # COGITO_KG_SYNTH=1 # 任務後抽 typed 關係 → 提案邊 .claw/kg/edges.proposed.jsonl(每次任務多一次 LLM 呼叫) # COGITO_MEMORY_AUTOAPPLY=1 # 反思產出的【新增】記憶不等人工 apply,就地放行成記錄。 # 破壞性提案(memory reconcile 的 update/delete)永遠不受影響,仍須 `apply memory ` 逐條審。 # 敢對新增不設閘,是因為爆炸半徑本來就小:一條一個檔、System Prompt 只放索引一行(正文要 # recall 才載入)、Prune 會把久未用的歸檔;索引那端也已把記憶降級為「背景脈絡、可能過時」。 # 代價是沒人把關品質——建議先跑一兩週看提案內容,覺得可信再開。