環境變量
Agent 如何使用密鑰,以及添加新變量的約定
本頁介紹 minara-agent-v2 加載環境變量的約定,以及引入新變量所需的步驟。每個變量的詳細參考(包括默認值、格式、使用方文件,以及未設置時的影響),請參閱
參考 → 環境變量。
標準模板位於項目根目錄的 .env.example。請保持該文件與兩個頁面同步。
MINARA_ 前綴專用於 Minara 平臺專屬變量
(MINARA_API_KEY、MINARA_BASE_URL、MINARA_SKIP_FUND_CONFIRM、
MINARA_DATA_DIR、MINARA_OPENAI_BASE_URL、
MINARA_OPENAI_CHAT_PATH)。Agent 循環基礎設施變量(網關、日誌、
模型、場景、記憶配置)不使用該前綴。
用戶可見開關寫入 Settings(settings.json#preferences)。密鑰寫入
credentials.json(設定 → API Keys / 訊息)。呼叫端讀 prefs.get /
secrets.* / infra.get。Env 是啟動時的維運層,以及覆蓋鏈上的文件化回退。
TL;DR 約定
任何需要 API 密鑰、secret、token 或可覆蓋 URL 的新技能或工具,必須:
-
寫入正確的存儲,再透過 façade 讀取。 密鑰走 API-key / messaging 登錄表和
secrets.dataSource/secrets.messaging。用戶開關走 preferences schema 和prefs.get。維運基礎設施(GATEWAY_PORT、MINARA_DATA_DIR)走config/infra/schema.ts和infra.get。嚴禁硬編碼密鑰;嚴禁通過 CLI 參數傳入並回顯。 -
在同一次提交中,將有詳細說明的條目追加到
apps/agent/src/config/env-docs/,再生成.env.example。 條目須說明:控制的內容、消費它的技能/工具、運營商何時需設置、未設置時的默認行為,以及可接受的值格式。僅有一行存根(# FOO_KEY=)的條目會被拒絕。 -
對於領域技能(
apps/agent/src/skills/builtin/*.ts或apps/agent/src/skills/external/<id>/),在requires_env中聲明該變量,以便 SkillRegistry 在憑據缺失時完全隱藏該技能:export const myNewSkill: DomainSkill = { id: "research.my_provider", // ... requires_env: ["MY_PROVIDER_API_KEY"], }; -
對於工具(
apps/agent/src/tools/*.ts),當密鑰缺失時,工廠函數應返回空的ToolEntry[]。工具註冊表會靜默排除未註冊的名稱,因此下游技能中的tool_names引用會優雅降級:export function createMyProviderTools(): ToolEntry[] { const apiKey = secrets.dataSource("MY_PROVIDER_API_KEY"); if (!apiKey) return []; // ... } -
嚴禁提交真實密鑰。
.env已加入 .gitignore;.env.example是已提交的模板,值留空。
.env 加載方式
加載由 apps/agent/src/config/load-env.ts 處理。這是一個副作用模塊,調用 Node 22 內置的 process.loadEnvFile(".env")。它作為每個入口的第一行被導入:
apps/agent/src/gateway/cli.ts:REPL 模式apps/agent/src/gateway/server.ts:HTTP 模式
ESM 求值順序保證加載器在任何在導入時讀取 process.env.<NAME> 的下游模塊之前運行。
優先級:已由 shell / CI / systemd 導出的變量優先於 .env 中的值。加載器不會覆蓋已有的 key。這與 Node 的默認行為一致,也是最安全的規則(不會意外遮蔽 CI 注入的密鑰)。
無 dotenv 依賴。 僅依賴 process.loadEnvFile,自 Node 22.5 起穩定可用。.env 文件缺失時靜默跳過,不報錯。
變量清單
每個變量的詳細文檔(默認值、格式、使用方文件、未設置時的影響),請參閱 參考 → 環境變量。下表為快速參考摘要。
LLM 提供商
至少需要一個可解析的提供商(直接設置,或通過 minara auth login 保存的 OAuth 配置),否則 Agent 拒絕啟動。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
ANTHROPIC_API_KEY | 無 | sk-ant-... | 主要 Claude 憑證。未設置時依次回退到已存儲的 OAuth、再到 OpenRouter。 |
OPENROUTER_API_KEY | 無 | sk-or-... | 備用多模型路由器。僅在 Anthropic 路徑均失敗時嘗試。 |
OPENAI_API_KEY | 無 | sk-... | 圖像生成、KB embedding、TTS 以及(可選)LLM。僅設置此變量不會自動選 OpenAI 作為 LLM::需運行 minara auth login openai --api-key $OPENAI_API_KEY 才啟用 LLM 路徑;圖像、音頻、KB 工具仍會直接使用此變量。 |
OPENAI_BASE_URL | https://api.openai.com/v1 | URL | OpenAI API 基礎 URL 的可選覆蓋::用於 Azure 兼容網關或企業代理。 |
OPENAI_ORG_ID | 無 | org-... | 計費路由的可選 OpenAI-Organization 頭。 |
XAI_API_KEY | 無 | 不透明字符串 | 原生 xAI(Grok)LLM provider 密鑰::通過 xai-api-key provider 直接調用 api.x.ai/v1。在 auto-select 中優先級最低;不會取代既有 Anthropic/OpenRouter 配置。 |
XAI_BASE_URL | https://api.x.ai/v1 | URL | xAI API 基礎 URL 的可選覆蓋。 |
MINARA_XAI_OAUTH_CLIENT_ID | xAI Grok-CLI 公共 id | UUID | 覆蓋發送到 auth.x.ai 的 OAuth public client_id。默認複用 Hermes Agent 公開共享的 id(RFC 8252 §8.4 允許);xAI 可能隨時撤銷。 |
擴展思考(Extended Thinking)
Claude 3.7+ / Sonnet 4.x / Opus 4.x / Haiku 4.5+ 支持 thinking API 參數。模型按 query 自行決定花多少 budget 去推理:簡單查詢花約 0 thinking tokens,複雜綜合可能用滿預算。其他 provider(OpenAI o1/o3)的 reasoning 是自動的,對於它們參數被接受但不生效。
web-ui 複用現有的 ReasoningBlock(默認摺疊,帶流式預覽)渲染 trace,覆蓋普通 chat 與機構模式的 persona card 兩個面。對於不支持原生擴展思考的模型,輸入框工具欄會展示一個手動 Thinking 開關,開啟後會在用戶消息前面追加一句 "think step by step" 的指令。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
THINKING_ENABLED | true | true | false | 主開關。設為 false 後所有 agent 表面都不開啟 thinking(非原生模型的手動開關仍然顯示,但 prefix 也不會生效)。 |
THINKING_BUDGET_TOKENS | 4000 | 正整數 | 單次 LLM turn 的 thinking token 上限。Anthropic 只對模型實際用掉的 tokens 計費。 |
INSTITUTION_THINKING_BUDGET_TOKENS | 同 THINKING_BUDGET_TOKENS | 正整數 | 僅作用於機構模式角色調用的覆蓋值。便於在不抬高全局默認的情況下給多 Agent 流水線更多推理空間。 |
DEEP_RESEARCH_THINKING_BUDGET_TOKENS | 同 THINKING_BUDGET_TOKENS | 正整數 | 同上模式,作用於 deep-research 綜合階段。 |
web_search / web_extract 後端
web_search 與 web_extract 共用一個後端。模型不能選擇 provider。按可用性取第一個:Tavily → Firecrawl → Exa(本地 EXA_API_KEY 或已登錄的平台 exaPassthrough)。沒有鏈式回落,沒有 DuckDuckGo / Google / Brave / Anthropic 原生路徑,也沒有 HTML 抓取提取。空結果和 HTTP 錯誤留在當前後端。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
TAVILY_API_KEY | 無 | Tavily API key | 最高優先級。失敗不會回落到 Firecrawl 或 Exa。註冊地址 https://tavily.com。 |
FIRECRAWL_API_KEY | 無 | Firecrawl API key | Tavily 不可用時的搜索 + 乾淨 markdown 抽取。免費額度 500 credits/月。註冊地址 https://www.firecrawl.dev/app/api-keys。 |
EXA_API_KEY | 無 | Exa API key | Tavily 與 Firecrawl 都不可用時使用。有本地 key 時直接調用;未設置時,已登錄會話仍走平台透傳。註冊地址 https://dashboard.exa.ai/api-keys。 |
Minara 核心
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
MINARA_API_KEY | 無 | 不透明字符串 | Minara REST 憑證。未設置時回退到已保存的 OAuth 配置(Web UI 登錄)。 |
MINARA_BASE_URL | https://api.minara.ai | 絕對 URL | 後端 API 源。只在指向 staging 環境或本地 mock 時覆寫。 |
MINARA_FRONTEND_BASE_URL | https://minara.ai | 絕對 URL | Web 前端源。終端超鏈接和深度研究報告中的 token:// / address:// 深度鏈接會指向此地址。指向 staging 前端或本地 Next.js dev server 時覆寫。 |
AGENT_MODEL | claude-sonnet-4-6 | 模型 id | 主 Agent 循環模型,也可通過 /model 設置。 |
MINARA_DATA_DIR | ~/.minara | 絕對路徑 | SQLite、沙盒、認證及日誌的根目錄。 |
MINARA_TERMINAL_CWD | — | 絕對路徑 | 覆蓋 agent 的工作目錄(文件讀寫及 shell 命令的 cwd)。解析順序:會話級覆蓋 → 此變量 → process.cwd()。適用於啟動目錄與工作目錄不同的 gateway/cron 常駐進程;本地 CLI 通常不設,回退到 shell cwd。路徑不存在時忽略並繼續回退。 |
FILES_URL_BASE | /v1/files | URL 或路徑 | 公開文件鏈接前綴(反向代理後面)。 |
OFFLINE_MODE | 關 | 1/true/yes/on | 對沙盒工具強制禁用出站 HTTP。 |
LOG_LEVEL | info | debug|info|warn|error | 日誌閾值。debug 安全但日誌量約為原來的 4 倍。 |
HTTP 網關
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
GATEWAY_HOST | 127.0.0.1 | IP / 主機名 | 綁定接口。迴環地址 = 僅本地;非迴環需要身份驗證(守衛在交互模式下拒絕啟動,或在 Docker/CI 模式下自動生成 token)。 |
GATEWAY_PORT | 8080 | 整數 | 網關綁定的 TCP 端口。 |
GATEWAY_AUTH_TOKEN | 無 | 不透明字符串 | 每個 /v1/... 路由的 Bearer token。在迴環地址上未設置時認證禁用;在非迴環綁定上未設置時,token 將被自動生成或啟動被拒絕。 |
MINARA_ALLOW_INSECURE_BIND | 無 | 1/true/yes/on | 繞過安全綁定守衛:在非迴環地址上以未認證方式提供服務。僅適用於受信任的防火牆主機。 |
WEB_UI_DIST_DIR | 無 | 絕對路徑 | 同源在 / 提供的 web-ui dist/ 構建產物(桌面端 / 單端口)。未設置時不提供靜態 UI(僅 API)。 |
WEBHOOK_PORT | 無 | 整數 | 可選的專用入站 webhook 端口。 |
安全與涉及資金的操作
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
DISABLE_STRICT_PLAYBOOK | 未設置(嚴格模式開啟) | 1/true 表示禁用 | 將 buildPlaybookBlock 回退到舊版軟建議 header。默認行為渲染命令式"本輪次權威規範"清單語氣。 |
DISABLE_METHODOLOGY_INJECTION | 未設置(注入開啟) | 1/true 表示禁用 | 關閉全部三條按需方法論路徑(場景佔位符、工具輸出 <methodology_reminder>、methodology_lookup 工具)的緊急停止開關。默認行為在畢業等級(Wilson ≥ 0.55)查詢存儲。 |
DISABLE_METHODOLOGY_INSTANCE_DISPATCH | 未設置(調度開啟) | 1/true 表示禁用 | BO 調優方法論實例覆蓋的緊急停止開關。默認行為在有實例時將實例閾值合併到模板默認值;禁用時僅使用模板解析。 |
DISABLE_KNOWLEDGE_BUDGET | 未設置(預算開啟) | 1/true 表示禁用 | 知識預算協商器的緊急停止開關。默認:將場景 playbook + 記憶上下文 + 角色提示詞的合併 token 數截斷至 KNOWLEDGE_BUDGET_TOKENS。禁用時輸出完整長度。 |
ROLE_MEMORY_MODE | shadow | off / shadow / active | 啟動時固定的 Role Memory 模式。off 保留已有數據供審計,但不新建、不評價、不召回、不注入;shadow 只為已匹配且已執行的人工交易生成和評價案例,不注入提示詞;active 還會把已復盤案例注入匹配的分析角色及機構 Trader / PM 提示詞。自動或來源不明的 perps 始終排除,執行工具也不會收到案例文本。非法值會警告並回退 shadow;修改後需重啟。 |
DISABLE_PARALLEL_TOOL_CALLS | 未設置(並行開啟) | 1/true 表示禁用 | Agent 循環中每輪並行工具調度的緊急停止開關。默認:不在 META_UNSAFE 黑名單(activate_skills)中的 READ_ONLY 等級工具通過 Promise.all 併發執行;CONFIRM_ONCE 及以上等級的工具(涉及資金 / 寫入 / 提現)始終串行。禁用時每次工具調用像舊版 for-await 循環一樣逐一執行。兩種模式下 tool_result 消息順序均保持一致。 |
CHAT_INTENT_GATING_ENABLED | 未設置(關閉) | 1/true 表示啟用 | 意圖門控的個性化注入。開啟時:緩存前綴保留始終注入的個性化核心(交易摘要、核心的知識 / 風險標籤、最近記憶、自定義提示、生效中的偏好),由一次性分類器只把其餘需要的行為標籤維度追加到易變塊,因此不會擾動緩存。關閉時:每輪把完整的個性化塊注入緩存前綴(舊版行為)。開啟時每輪多一次簡短的分類器調用。 |
POSITION_MEMORY_ENABLED | 未設置(關閉) | 1/true 表示啟用 | 持倉 / 會話感知的記憶注入。開啟時:涉及某個資產的輪次(消息裡出現代幣符號,或該資產屬於用戶近期現貨主力交易標的)會把最多 5 條與其相關的已存記憶注入易變塊。建議類問題帶入歷史觀點與交易筆記;基本面類問題帶入用戶的分析偏好與參考習慣。全程確定性且本地執行(關鍵詞意圖路由加 SQLite 查詢,不新增 LLM 調用);交易信號讀取由交易摘要重建刷新的預構建現貨主力標的產物。也可在運行時通過 personalization.positionMemory 偏好修改。 |
SHADOW_MODE | sampled | off|sampled|on | A/B 觀測記錄器。在分類器 / 記憶快照 / 角色提示詞決策點將(當前、提議)變體對寫入 shadow_runs SQLite 表。 |
SHADOW_SAMPLE_RATE | 0.1 | [0, 1] | SHADOW_MODE=sampled 時的採樣概率。 |
SHADOW_RETENTION_DAYS | 30 | 正整數 | shadow_runs 行的保留天數。啟動時執行一次性清理。 |
MEMORY_SNAPSHOT_PREF_LIMIT | 50 | 非負整數 | 會話記憶快照中 preference 類別行的配額。 |
MEMORY_SNAPSHOT_STRAT_LIMIT | 30 | 非負整數 | strategy 類別行的配額。 |
MEMORY_SNAPSHOT_TRADE_LIMIT | 50 | 非負整數 | trade_note 類別行的配額。 |
MEMORY_SNAPSHOT_OBS_LIMIT | 30 | 非負整數 | observation 行的基礎配額。pref / strategy / trade 桶中未用完的槽位會溢出到此桶。 |
MEMORY_REFRESH_WRITES | 3 | 非負整數 | 觸發軟快照刷新的"自上次重建以來寫入次數"閾值。 |
MEMORY_REFRESH_TURNS | 10 | 非負整數 | 觸發軟快照刷新的"自上次重建以來輪次數"閾值。兩個閾值須同時滿足(AND)才觸發會話中重建。設為 0 可完全禁用刷新(快照在會話內凍結)。 |
MEMORY_WRITE_MAX_LEN | 2000 | 正整數(200–8000) | agent 通過 memory_write 保存記憶(observation / preference / trade_note / strategy)時保留的最大字符數。超長內容在寫入前被截斷,避免單條過大記憶撐爆提示詞或搜索索引。也可在運行時通過 memory.writeMaxLen 偏好項調整。更嚴格的個性化事實路徑有自己更短的限制,不受影響。 |
KNOWLEDGE_BUDGET_TOKENS | 15000 | 非負整數 | 場景 playbook + 記憶上下文 + 角色提示詞合併 token 數上限。超出時按優先級從低到高截斷(角色 → 記憶 → 場景)。0 禁用上限。設置 DISABLE_KNOWLEDGE_BUDGET=1 可完全繞過截斷。 |
KNOWLEDGE_SOURCE_TAGS | false | true|false | 在每個動態知識塊前加 HTML 註釋來源標籤。僅供人工 / 日誌審計使用。 |
PREFERENCE_LEARNING | 0 | 0/1 | M2 偏好演化流程的主開關(定期 LLM 提議器 + 聊天內畢業卡)。為 0 時,M1 PreferenceStore 及 REPL/CLI/REST 手動管理仍可用;提議器不觸發,也不注入畢業卡。 |
PREFERENCE_PROPOSER_INTERVAL | 30 | 正整數 | 連續兩次提議器觸發之間的輪次數。fire-and-forget 異步方式運行,提議器在用戶可見響應發送之後運行,因此這是攤銷成本,不影響用戶延遲。 |
PREFERENCE_WEEKLY_QUOTA | 3 | 正整數 | 任意滾動 7 天窗口內允許的最大畢業次數。達到上限後提議器跳過本週期。手動 /preferences approve 可繞過該配額。與 AutoClaw 的"每週 1-3 次深度演化"原則一致。 |
PREFERENCE_DEDUP_THRESHOLD | 0.85 | [0, 1] | TF-IDF 餘弦相似度分數閾值;超過該值時候選被視為與現有活躍偏好(狀態 ∈ active/proposed/deprecated)重複,並在持久化前丟棄。 |
PREFERENCE_PROPOSER_BATCH_SIZE | 200 | 正整數 | 單次提議器 LLM 調用中拉取的最近候選最大數量。 |
PREFERENCE_MIN_CLUSTER_SIZE | 3 | 正整數(≥ 2) | 提議器 LLM 報告單個聚類所需的最少支持候選消息數,低於此數量的提議不會持久化。下限為 3,防止單例進入隊列。 |
PREFERENCE_ASK_COOLDOWN_HOURS | 24 | 正整數 | 對同一偏好連續發起畢業詢問的最小間隔小時數。用戶選擇"稍後"或無回覆後,該行保持 proposed 狀態,但在窗口結束前從詢問隊列中隱藏。 |
PREFERENCE_ASK_MIN_GAP_TURNS | 5 | 正整數 | 同一 REPL 會話內對不同偏好連續發起畢業詢問之間的最小輪次數。防止卡片連續彈出。 |
PREFERENCE_SKIP_IN_CHAT_ASK | 0 | 0/1 | 完全禁用聊天內畢業卡。提議器仍會運行並寫入提議;運營商通過 /preferences pending + approve(REPL/CLI/REST)審核。 |
PREFERENCE_HARD_AUTO_ACTIVATE | 1 | 0/1 | M3。開啟時,用戶消息命中強信號關鍵詞(never、绝不、kill switch 等)會自動激活 hard_constraint,無需彈卡。用戶在 24 小時內可通過 /preferences undo <id> 撤銷。 |
PREFERENCE_STYLE_AUTO_ACTIVATE | 1 | 0/1 | M3。對同一 dedup_key 觀察 N 次後靜默自動激活 personal_style 偏好。卡片保留給影響更大的偏好。 |
PREFERENCE_STYLE_MIN_OBSERVATIONS | 2 | 正整數 | M3。樣式自動激活前需要的相同陳述觀察次數。值越高,用戶自我矛盾的機會越多。 |
PREFERENCE_HARD_UNDO_WINDOW_HOURS | 24 | 正整數 | M3。強信號自動激活後用戶仍可執行 /preferences undo <id> 的時間窗口。超出此窗口的行須使用 /preferences deprecate。 |
MINARA_SKIP_FUND_CONFIRM | 關 | 1/true/yes/on | 繞過所有涉及資金工具的確認門控。僅限非交互式場景。 |
DISABLE_SCRIPT_RISK_GATE | 關 | 1/true/yes/on | ⚠ 用於關閉在 execute_code / terminal / write_file / patch 之前運行的靜態分析腳本風險門控。未設置時,RED 命中(大面積 rm *、刪除工作區外路徑、IMDS / SSRF、容器逃逸、憑據 / 錢包 store 讀取、間接混淆 + sink)直接拒絕;YELLOW 命中(資金類 CLI shell-out、鏈上危險方法、env 投毒、指定路徑 rm、風險包安裝)通過 AskUserQuestion 二次確認。設為 truthy 會同時跳過 RED 和 YELLOW,僅在事故響應或完全離線 CI 中使用。日常工作流豁免請使用工作流定義中的 script_risk_policy 字段(body_sha256 + 類別),不要設此全局 env。審計落庫時 script_risk_decisions.bypassed_by="env_global"。 |
MINARA_TOOL_RESULT_RETAIN_HOURS | 24 | [1, 720] 範圍內的整數 | 持久化在 <dataDir>/sandbox/files/.tool-results/ 下的超大工具結果的存活小時數,超時後由週期性清理刪除。合規 / 季度審查窗口可設為 168(7 天);臨時 CI 運行可設為 1。格式錯誤或超範圍的值回退到 24 小時並寫入 warn 日誌。 |
混合記憶檢索
當 EMBEDDING_PROVIDER=disabled(默認)時,混合搜索代碼路徑不活躍:所有記憶行的 embedding_state 保持 'pending',embedding 列為 NULL;searchMemoriesHybrid 直接回退到現有的 FTS5 BM25 路徑,結果字節完全一致。運營商僅在需要跨詞彙召回提升時啟用(例如中文查詢 山寨币最近怎么样 檢索英文 altcoin drawdown 知識)。寫入路徑保持同步,embedding 在行提交後通過 queueMicrotask 異步進行,不影響用戶側延遲。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
EMBEDDING_PROVIDER | disabled | disabled|openai|voyage | 選擇 embedder。disabled 時工廠返回 null,混合路徑不活躍。其他值需要 EMBEDDING_API_KEY。 |
EMBEDDING_API_KEY | 無 | 不透明字符串 | Bearer token。OpenAI:sk-...;Voyage:pa-...。非 disabled 提供商未設置時,工廠仍返回 null 並記錄 warn。 |
EMBEDDING_MODEL | 提供商原生(text-embedding-3-small / voyage-3) | 模型 id | 模型標識符。僅在確認維度與 EMBEDDING_DIM 匹配後才覆蓋。 |
EMBEDDING_DIM | 1536 | 正整數 | 向量維度。用於啟動時聲明 vec0 虛擬表。模型不匹配時行狀態為 embedding_state='failed'。在已有數據庫上變更需手動刪除並重建 vec0 表。 |
EMBEDDING_BASE_URL | 提供商原生 | 以 /embeddings 結尾的 URL | 可選覆蓋,用於自託管網關或代理。 |
SQLITE_VEC_EXTENSION_PATH | 捆綁的 sqlite-vec npm 二進制 | 絕對文件系統路徑 | sqlite-vec 可加載擴展的顯式路徑。僅在自行管理二進制文件時設置(自定義構建、系統路徑、剝離 node_modules 的 Docker 層)。加載失敗為非致命錯誤,混合路徑靜默降級到 BM25。 |
當提供商已啟用但發生瞬時 API 失敗時,行的狀態為 embedding_state='failed'。minara doctor 命令(E1 階段)暴露每種狀態的計數,便於運營商發現堆積;minara doctor --fix --apply(E2 階段)通過 MemoryStore.backfillEmbeddings() 補填。failed 和 pending 均可補填,同一行可能循環,直到成功 embedding 後狀態變為 embedded。短於 10 個字符的行,或觸發方法論注入掃描器的行,狀態為 skipped,永遠不會 embed。
回測反饋循環(Sprint 6:在線結果填充器)
週期性任務,用於閉合符合條件執行的學習循環。它計算確定性的交易後市場結果("+5.20% in 24h"),持久化結果,再運行可選的推理評價。統一 Trading Memory 的來源規則會先執行:自動或來源未知的 perps 不會進入人工評價鏈路。
不會重新執行歷史決策。 僅評價 trade_executions 中已有的 pending 行。開啟後,gateway 啟動時會先立即處理逾期任務,再進入固定間隔。默認暗部署(BACKTEST_ENABLED=false)。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
BACKTEST_ENABLED | false | true|false | 主開關。false 時運行器和調度器均不註冊(零運行時開銷)。true 時調度器每 BACKTEST_CRON_HOURS 小時觸發一次。 |
BACKTEST_DRY_RUN | false | true|false | 試運行:計算結果,輸出到 shadow_runs(facet='backtest_outcome'),但跳過 updateTradeOutcome 和 recordUsage。適用於第一週上線協議。 |
BACKTEST_MIN_TRADE_AGE_MS | 86400000(24 小時) | 正整數(毫秒) | 交易進入評估資格前的最小存活時間。傳入 ReviewEngine.minTradeAgeForEvalMs。 |
BACKTEST_OUTCOME_HORIZON_HOURS | 24 | 正整數(小時) | 在 created_at 後多少小時採樣結果價格。渲染在結果字符串中,讓評估器看到窗口長度。 |
BACKTEST_BATCH_LIMIT | 20 | 正整數 | 每次觸發拉取的最大待處理行數。傳入 ReviewEngine.maxEvalsPerBatch。 |
BACKTEST_CRON_HOURS | 24 | 正數 | 調度器間隔。使用 setInterval().unref()。小於 1 分鐘的值會被向上截斷。 |
BACKTEST_PRICE_PROVIDER | auto | auto|hyperliquid|yahoo | 強制使用單一歷史價格數據源。auto 路由:加密貨幣走 Hyperliquid,再 Yahoo -USD;股票/未知走 Yahoo;穩定幣為 1.0。 |
BACKTEST_MAX_COST_USD_PER_RUN | 2.00 | 非負浮點數 | 單次運行費用上限。運行器在運行前後快照 BudgetTracker.getDailySpend("learning");超出時以 status=stopped_budget 停止。0 表示禁用。與 BudgetTracker 的日 / 月上限疊加計算。 |
LEARNING_RECORD_USAGE | false | true|false | 歸因驗證通過後,開啟實時推理質量與方法論反饋。已歸因交易通過 methodology_observations 和 promoted benchmark run 更新;runner 不再批量增加舊 Wilson 計數。建議在 shadow 行乾淨後最後開啟。 |
上線協議(plan dapper-coalescing-shell §Sprint 6):
- 設置
BACKTEST_ENABLED=true和BACKTEST_DRY_RUN=true,運行一個 cron 週期。檢查shadow_runs WHERE facet='backtest_outcome',確認結果字符串符合±N.NN% in Xh格式,跳過原因合理。 - 將
BACKTEST_DRY_RUN翻轉為false。Runner 開始向trade_executions寫入確定性 outcome 和終態;evaluation run 與 observation 保持追加寫入。 - 只有歸因乾淨後才開啟
LEARNING_RECORD_USAGE=true。按 profile version 監控evaluation_runs、methodology_observations和methodology_metric_stats;只有 promoted primary run 影響新統計。
個性化重建(M3.2 事件驅動閾值)
Minara 通過 PersonalizationRebuilder 從每次對話中學習交易偏好。M3.2 之前,重建器每 10 分鐘在冷卻後運行一次。M3.2 將其改為事件驅動加閾值門控:數據寫入(交易、記憶、聊天輪次)觸發事件喚醒重建器;每次重建須通過兩個獨立門控,即最少新輸入數量和自上次重建以來的最小經過時間。兩個門控須同時滿足,缺一不觸發。
60 分鐘安全網調度器仍然存在,用於覆蓋丟失的事件(如寫入與其訂閱者之間進程重啟),但在安靜的系統上產生零 LLM 調用和零 info 日誌。
交易摘要閾值
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
FIN_PROFILE_TRADING_SUMMARY_MIN_NEW_TRADES | 3 | 正整數 | 自上次重建以來的最少新交易數,滿足後門控 2 才允許交易摘要重建。 |
FIN_PROFILE_TRADING_SUMMARY_MIN_INTERVAL_MIN | 30 | 正整數,分鐘 | 自上次重建以來的最小經過時間。 |
FIN_PROFILE_TRADING_SUMMARY_MAX_TRADES | 100 | 正整數 | 冷啟動 / 強制重新生成時傳入 LLM 的交易數上限。 |
FIN_PROFILE_TRADING_SUMMARY_INCREMENTAL_MAX_TRADES | 50 | 正整數 | 將已有摘要增量合併時傳入 LLM 的新交易數上限。 |
如果交易頻率導致摘要頻繁更新,可提高閾值;如需在回測或新手引導期間儘快收斂,可降低閾值。
記憶提取閾值
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
FIN_PROFILE_MEMORIES_MIN_NEW_TURNS | 5 | 正整數 | 自上次提取以來需記錄的最少新聊天輪次數,滿足後 rebuildMemories 才運行。 |
FIN_PROFILE_MEMORIES_MIN_INTERVAL_MIN | 10 | 正整數,分鐘 | 自上次記憶提取以來的最小經過時間。 |
MEMORY_CONSOLIDATION_ENABLED | 未設置(默認開) | 0/false/no/off 關閉 | 為聊天抽取的事實做矛盾消解。默認開啟:每次重建多一次後臺 LLM 調用,判定每條事實是重複、細化還是取代已有事實;被取代的事實軟刪除(可恢復),每次決策都記錄到 memory_consolidation_events 審計表;也用於仲裁 agent 記錄事實的近重複。設為 0 可回退到僅追加(ADD)。 |
MEMORY_CONSOLIDATION_GUIDANCE | 空 | 自由文本,最多 500 字符 | 可選的非權威傾向,用於指導消解如何合併或淘汰事實(例如“以我最新的說法為準”)。它絕不覆蓋硬性安全規則:用戶設置的硬約束只有在更新的明確用戶陳述下才會被丟棄,用戶陳述的事實始終優先於 assistant 推斷的事實。消解關閉時無效。 |
rebuildMemories 掃描游標 last_indexed_chat_id 之後寫入的 chat_turns 行並提取離散事實。默認使用僅 ADD 提示詞(無 UPDATE/DELETE),矛盾內容與先前事實並列 ADD,在檢索時解決。當 MEMORY_CONSOLIDATION_ENABLED 開啟時,後續的消解過程改為對每條事實判定 ADD / UPDATE / SUPERSEDE,在寫入時整理過時與矛盾的行(見 Minara Memory)。每條提取的事實以行的形式寫入共享 memories 表,包含 fact_type、attributed_to、entities_json 和 linked_memory_ids 元數據。
共享配置項
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
FIN_PROFILE_EVENT_DEBOUNCE_SEC | 30 | 正整數,秒 | scheduleCheck(dim) 的防抖窗口。將快速連續的寫入合併為一次門控檢查後的重建。 |
CHAT_TURN_RECORDING | 1(開啟) | 0/false/no/off 表示禁用 | 將每輪的 (user_message, final_response, tool_calls) 持久化到 chat_turns。rebuildMemories 的輸入來源,禁用後無數據可提取。 |
運營提示: 在全新部署時,將 FIN_PROFILE_TRADING_SUMMARY_MIN_NEW_TRADES 設為 1,將 FIN_PROFILE_MEMORIES_MIN_NEW_TURNS 設為 2,使重建器在第一天快速預熱。配置文件穩定後恢復默認值。
Agent 外歷史鏡像
個性化重建器現在消費三個數據源:本地 trade_history(agent 會話內)、perps_fills(Minara /v1/perp-wallets/fills 跨子錢包鏡像)、external_spot_activities(Minara /v1/tx/cross-chain/activities)。以下配置項控制 MinaraHistorySync 的同步策略以及 LLM 重建讀取的數據量。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
FIN_PROFILE_HISTORY_SYNC_WINDOW_DAYS | 90 | 正整數,天 | 滾動同步窗口。超過此窗口的記錄永遠不會被拉取。 |
FIN_PROFILE_HISTORY_SYNC_MIN_INTERVAL_MIN | 5 | 正整數,分鐘 | 連續同步觸發之間的節流下限。窗口內的多次 scheduleSync() 調用會合併為一次。 |
FIN_PROFILE_HISTORY_SYNC_TIMEOUT_SEC | 8 | 正整數,秒 | 每次 syncAll() 的硬超時。通過 AbortController 取消進行中的 HTTP 請求。 |
FIN_PROFILE_HISTORY_SYNC_PAGE_HINT | 500 | 正整數,行 | perps fills 端點的"頁面可能滿"啟發式判據。當 getPerpSubAccountFills 返回 ≥ 此值時,同步器會前移 startTime 再次請求。 |
FIN_PROFILE_HISTORY_SYNC_OVERLAP_SEC | 60 | 正整數,秒 | 在可能被截斷的頁面前移 startTime 時的重疊時間。fill_uid 去重讓重疊變得無害。 |
FIN_PROFILE_HISTORY_SYNC_MAX_ROUNDS_PER_SUB | 10 | 正整數 | 每個子錢包截斷滾動循環的硬上限。 |
FIN_PROFILE_HISTORY_SYNC_MAX_FAILURES | 5 | 正整數 | 單個 (source, sub_account_id) 的連續失敗閾值。達到/超過後,正常調度中跳過該鍵。 |
FIN_PROFILE_HISTORY_SYNC_FAILURE_COOLDOWN_MIN | 30 | 正整數,分鐘 | 達到 MAX_FAILURES 後,下次探測嘗試受此冷卻控制。探測成功重置計數器;失敗累加。防止永久凍結。 |
FIN_PROFILE_HISTORY_SYNC_SPOT_MAX_PAGES | 20 | 正整數 | spot 分頁循環的硬上限。 |
FIN_PROFILE_HISTORY_SYNC_SPOT_PAGE_SIZE | 100 | 正整數 | spot 分頁批次大小,作為 limit 轉發給 Minara。 |
FIN_PROFILE_TRADING_SUMMARY_PERPS_RECENT_FILLS | 30 | 正整數 | LLM 重建讀取的最新 perps fills 數量。聚合數據始終全量發送。 |
FIN_PROFILE_TRADING_SUMMARY_SPOT_RECENT_ACTIVITIES | 20 | 正整數 | 同上,針對 spot。 |
FIN_PROFILE_TRADING_SUMMARY_AGGREGATE_WINDOW_DAYS | 90 | 正整數,天 | 餵給 LLM 的 per-symbol / per-pair 聚合窗口。 |
FIN_PROFILE_MEMORY_SOFT_DELETE_RETENTION_DAYS | 30 | 正整數,天 | 軟刪除記憶的可恢復保留期。超過後,30 分鐘清理 cron 物理刪除。 |
同步觸發模型。 三條路徑觸發 MinaraHistorySync.scheduleSync():(1) 任何 trade:recorded 事件(agent 剛執行了一筆交易,用戶很可能也在 web/mobile 端做了操作),(2) PersonalizationRefreshTask 的每小時安全網 tick(兜底丟失的事件),(3) 顯式的 /refresh-personalization --force / POST /v1/profile/refresh 路徑。5 分鐘節流保證每個窗口內 API 不會被打超過一次。
水位粒度。 minara_history_sync_state 以 (source, sub_account_id) 為主鍵。單個子錢包的瞬時故障既不會汙染其同伴的水位,也不會影響全局 spot 游標。
Hyperliquid 永續合約
MINARA_HL_DEX_DISCOVERY 控制在構建永續合約快照和同步交易歷史時,Minara 發現 Hyperliquid 命名永續 DEX 的範圍。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
MINARA_HL_DEX_DISCOVERY | 關 | 1/true/yes/on 表示啟用 | 將永續合約快照與歷史同步接入 Hyperliquid perpDexs 實時發現。默認行為僅查詢當前用戶群持有倉位的兩個 dex("" 默認 + "xyz" 股票/大宗商品),將每次掃描扇出控制在 4 訂閱 × 2 dex × 2 調用 = 16 次 HL 請求,符合 HL 單 IP 速率限制。啟用後,快照還會調用 perpDexs(緩存 10 分鐘),並向 HL 當前暴露的所有命名 dex(xyz、flx、vntl、hyna、km、abcd、cash、para,約 9 個)扇出。對於典型的 4 訂閱用戶,每次掃描會推至約 72 次請求,可靠地觸發公共 /info 端點的 429 限制。僅在確實持有默認對以外的 dex 倉位時設置。 |
Strategy Studio(測試版)
一個運營商配置項控制 strategy-rl 基準測試運行器使用的離線策略代碼生成子 Agent。它有合理默認值,不設置也可正常使用。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
MINARA_SS_CODEGEN_MAX_ITER | 3 | 正整數,截斷至 [1, 10] | 每次基準測試運行中離線代碼生成子 Agent"生成代碼 → 臨時回測 → 精煉"循環的步數預算。子 Agent 運行到該步數;模型在此預算內自行決定何時回測、何時停止。返回時,成功狀態根據最終回測重新計算(status COMPLETED 且非零交易且回撤 < 0.95)。使用快速/廉價 llmClient(如 Haiku)且希望更好收斂的運營商可提高此值;使用慢速/昂貴模型時可降低(1-2)。由 runStrategyCodeSubagent 在 apps/agent/src/core/strategy-code-subagent.ts 中消費。 |
Harness RL
| 環境變量 | 默認值 | 可接受值 | 用途 |
|---|---|---|---|
MINARA_SKILL_ROUTER_RL_ENABLED | 未設置(關閉) | 1 / true / yes / on | 啟用僅供運營人員使用的 Skill Router Harness RL 試點:版本化排序策略、可替換 benchmark Case、有界候選探索、顯式晉升與回滾,以及使用已晉升策略對每輪 Skill 目錄排序。未設置時不會創建 skill_router_* 表,目錄保持原有 priority 順序。該功能不會修改 Skill 文本、工具權限層級、安全閘門或模型權重。 |
機構模式(多 Agent 投研團隊模擬)
minara_institution_analyze 工具召集 6 階段流水線(4 名分析師並行 → 多空研究辯論 → 研究主管(RM)→ 交易員 → 三方風控辯論 → 投資組合經理(PM))用於高風險單資產分析。以 TradingAgents 為原型;輪次數默認值與該項目的 default_config.py 完全一致,超時和 token 上限則遵循 Minara 的 deep-research 及 Agent 循環約定。
以下所有變量均為 Agent 循環基礎設施,按項目約定無 MINARA_ 前綴。全部不設置時採用 TA 錨定的默認值。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
INSTITUTION_MAX_DEBATE_ROUNDS | 1 | 整數,截斷至 [1, 5] | 第 2 階段多空交替輪次數。1 輪 = 2 次發言(一次多方 + 一次空方)。與 TradingAgents 的 max_debate_rounds: 1 一致。需要額外對抗性審查時可調至 2;常規分析保持 1。由 runInstitution 在 apps/agent/src/tools/institution/orchestrator.ts 中消費。 |
INSTITUTION_MAX_RISK_ROUNDS | 1 | 整數,截斷至 [1, 5] | 第 5 階段激進 → 保守 → 中性輪轉輪次數。1 輪 = 3 次發言。與 TradingAgents 的 max_risk_discuss_rounds: 1 一致。 |
INSTITUTION_WALL_CLOCK_TIMEOUT_MS | 1200000 | 整數毫秒,截斷至 [60000, 1800000] | 單次 minara_institution_analyze 調用的硬性掛鐘時間上限。超出時,編排器短路並返回已完成的階段結果加 meta.truncated: true。單次 LLM 調用的超時由 INSTITUTION_PER_CALL_TIMEOUT_MS 控制,且不超過此掛鐘時間。單次調用上限從 60 秒提高到 300 秒後同步上調;如需恢復舊的快速失敗行為,可將兩個配置項一起調回。 |
INSTITUTION_PER_CALL_TIMEOUT_MS | 300000 | 整數毫秒,截斷至 [5000, INSTITUTION_WALL_CLOCK_TIMEOUT_MS] | 流水線中每次子 Agent 調用(分析師、辯論參與者、管理層、結構化重試)的單次 LLM 調用超時。分析師需要調度 2-3 個數據工具並在單次子 Agent 循環中寫出結構化 AnalystReport,通常超過 60 秒上限;舊的 wallClock / 10 推導方式會在寫入中途中止。使用快速模型時可降低(如 60000)以快速失敗;使用慢速深度模型時可提高(如 600000),同時相應調高掛鐘上限。 |
INSTITUTION_MAX_OUTPUT_TOKENS_PER_TURN | 4096 | 整數,截斷至 [1024, 16384] | 流水線中每次 LLM 調用的 max_tokens 上限(分析師、辯論參與者、管理層、結構化重試)。這是費用上限,不影響行為。與 Agent 循環的默認 max_tokens 一致。投資組合經理(PM)持續截斷 executive_summary 時可提高。 |
單模型策略。 流水線中每個角色(分析師、辯論參與者、研究主管(RM)、交易員、風險人物、投資組合經理(PM)、配置 Agent/Allocator)均運行在運營商選定的 Agent 模型上,與 Agent 其餘部分使用相同的提供商和模型。不支持按角色覆蓋。如需在更強的模型上運行綜合分析,可為整個會話切換 Agent 默認模型。
成本說明: 單次機構運行約 25 次 LLM 調用 × 4K 輸出 token,合計約 10⁵ 輸出 token。以默認設置在 Sonnet 級模型上約需 $1-3。向終端用戶暴露該工具時,請在顯著位置註明此成本。
硬編碼常量(v1 中不可通過環境變量調整):
- 第 1 階段分析師併發數 = 4(分析師數量;通過
Promise.all並行,無信號量庫)。 - 子 Agent 內層循環輪次上限 = 5 輪。與 Minara 的
strategy-code-subagent規範一致;分析師通常只需 1-3 次工具調用即可生成報告。 - 單次 LLM 調用超時 =
wallClock / 10,下限 5 秒。 - 輸出語言 = 繼承自現有的用戶消息語言檢測(與
deep-research使用相同的模式);內部辯論輪次始終使用英語,僅最終報告本地化。
如實際運營需要調整硬編碼常量,請在後續 PR 中將其提升為環境變量。
自學習與 Phase B 反思(v2 PR 1 / PR 2)
v2 自學習軌道將每次機構運行持久化到三張 SQLite 表(institution_runs、institution_role_outputs、institution_reflections),針對仍持有的倉位運行多窗口 Phase B 反思階梯(1d/7d/30d/90d/180d/365d),並在每次新機構調用前對陳舊的歷史運行寫入"懶加載"反思(Phase 0 回顧刷新)。以下所有變量均為 Agent 循環基礎設施,按項目約定無 MINARA_ 前綴。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
INSTITUTION_LEARNING_ENABLED | on | on | off | v2 持久化主開關。為 off 時,捕獲鉤子為空操作,institution_* 表保持空。生產環境保持開啟;持久化的行為後續 Phase B 反思和方法論畢業提供輸入。由 captureInstitutionRun 在 apps/agent/src/learning/institution/capture-hook.ts 中消費。 |
INSTITUTION_RETROSPECT_ENABLED | on | on | off | Phase 0 懶加載刷新主開關。開啟時,每次新機構調用會遍歷同一(ticker, asset_class)的近期運行,並對最新反思已陳舊的運行寫入 lazy_refresh 反思。標準每日 cron 不受影響,繼續運行。 |
INSTITUTION_RETROSPECT_LIMIT | 10 | 整數,截斷至 [1, 50] | Phase 0 歷史深度。每個(ticker, asset_class)最多查詢的歷史運行數。多標的頻繁用戶可降低(3-5)以限制單次調用延遲;反思上下文比新鮮度更有價值時可提高(20+)。 |
INSTITUTION_RETROSPECT_TIMEOUT_MS | 120000 | 正整數毫秒 | Phase 0 掛鐘時間上限。有效超時為 min(此变量, INSTITUTION_WALL_CLOCK_TIMEOUT_MS / 2),下限 5 秒,保證當第 1 階段開始時,編排器(第 1-6 階段)仍有至少 50% 的聲明掛鐘預算。 |
INSTITUTION_LAZY_REFRESH_STALE_HOURS | 24 | 整數,截斷至 [1, 168] | 歷史運行的最新反思被視為陳舊(可懶加載刷新)的小時數閾值,以 evaluated_at 為準。 |
INSTITUTION_LAZY_REFRESH_DEDUPE_HOURS | 6 | 整數,截斷至 [1, 48] | 同一運行連續兩次 lazy_refresh 寫入之間的最小小時數。防止 10 分鐘內多次調用 /institution BTC 產生冗餘反思。 |
INSTITUTION_AUTO_STALE_DAYS | 90 | 整數,截斷至 [30, 365] | open 狀態的運行在未最終確認的情況下超過此天數後,自動晉升為 auto_stale。auto_stale 運行繼續接收 Phase B 反思,但在 PM 的 past_context 注入中權重降低。 |
INSTITUTION_BENCHMARK_CRYPTO | BTC | 代碼 | 加密資產類別的 alpha 基準。Phase B 反思計算 alpha = raw_return - benchmark_return。設為已配置價格源能解析的標的。 |
INSTITUTION_BENCHMARK_STOCK | SPY | 代碼 | 股票/指數的 alpha 基準。 |
INSTITUTION_BENCHMARK_FOREX | DXY | 代碼 | 外匯對的 alpha 基準。大宗商品、穩定幣和未知類別無基準,alpha 記錄為 null。 |
分析師恢復與規範資產預解析
每個 Phase-1 分析師 slot 先在自由的 tool 調用循環裡跑,然後跑一輪固定格式的綜合 turn,要求模型用 HEADLINE / KEY FINDINGS / CONFIDENCE 的結構化散文格式總結觀察。編排器在服務端直接把散文解析為 AnalystReport:不再有強制提交的 toolChoice 階段,也沒有重試 harness。當散文為空或解析失敗時,編排器回落到 buildSubagentSummaryReport,它在兩種分支下都能產出可用報告(tool 有成功結果時引用 tool 數據;全部失敗時回到該分析師角色的默認推理)。下游階段始終收到可用的總結;舊的 data_gap 標誌已經退役,也沒有可調的重試預算,契約是"始終產出可用結果",沒有預算需要調。
在 Phase 1 派發之前,若 ticker 為 unknown,會觸發服務端的規範身份預解析:並行查詢 CoinGecko / CMC / DexScreener,將每個 provider 的結果歸一化為 chain+contract(或 chain+native)身份,持久化在帶過期時間的 SQLite 緩存中。
| 變量 | 默認值 | 類型 | 描述 |
|---|---|---|---|
INSTITUTION_FORCE_RESOLVER_PREFLIGHT | false | true | false | 對所有 ticker 都跑規範預解析,而不只是 classifyAsset === "unknown" 的情況。便於 ops 驗證;少量延遲開銷(緩存命中約 50ms,未命中約 200-500ms)。 |
CANONICAL_ASSET_CACHE_TTL_RESOLVED_DAYS | 30 | 正整數天數 | outcome: "resolved"(單一規範 chain+contract 或 native+chain)的 TTL。 |
CANONICAL_ASSET_CACHE_TTL_MULTI_DAYS | 14 | 正整數天數 | outcome: "multi"(多鏈部署,如 USDC 在 20 條鏈上)的 TTL。比 resolved 短,因為用戶消歧可能會固定到具體某條鏈。 |
CANONICAL_ASSET_CACHE_TTL_AMBIGUOUS_DAYS | 7 | 正整數天數 | outcome: "ambiguous"(多個 provider 給出不一致結果)的 TTL。短一些,等數據收斂後重新解析。 |
CANONICAL_ASSET_CACHE_TTL_NONE_DAYS | 1 | 正整數天數 | outcome: "none" 的 TTL。非常短,因為 provider 每日更新數據,應儘快再次嘗試而不是緩存空結果。 |
CANONICAL_ASSET_CACHE_TTL_USER_DAYS | 365 | 正整數天數 | 用戶提供條目(通過 minara assets pin 或 banner CTA 的操作員覆寫)的 TTL。Pin 條目優先於 provider 解析。 |
CANONICAL_ASSET_CACHE_FALLBACK_TO_EXPIRED | true | true | false | 實時聚合失敗(所有 provider 宕機或限流)時,返回帶 from_expired_fallback: true 標記的過期緩存條目,而不是直接報告 outcome: "none"。 |
方向感知評分。 Phase B 記錄的 raw_return 對做空倉位取反,對持平決策歸零(在下跌標的上盈利的做空記錄正收益,而非負收益)。做多或未指定方向的倉位直接透傳。詳見 reflect.ts applyDirection()。
可重試的數據中斷。 標準窗口評估在價格獲取失敗時寫入 data_unavailable 佔位符;下次 cron 執行時,一旦價格恢復,該佔位符會被 UPSERT 為 ok。nextDueStandardWindow 按 status='ok' 過濾,確保窗口在成功前持續重新評估。
離線學習配置調優(Phase B 門控)
apps/agent/src/learning/methodology-store.ts 中的 LEARNING_CONFIG 超參數目前為手動調整。未來的貝葉斯優化工具將針對 Sprint 6 積累的 P&L 歸因數據對其進行調優;代碼位於 apps/agent/src/learning/replay/ 和 tools/tuning/(構建完成後)。
該工具僅離線運行,通過 CLI / Python 子進程執行,從不作為請求路徑的一部分。在數據積累達到準備門控(≥100 條已評估交易,≥20 條唯一方法論命中,見 minara learning stats)之前,整個路徑保持禁用。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
LEARNING_TUNING_ENABLED | false | true|false | 調優工具的主門控。除非此值為 true,否則 minara learning replay 短路返回 { skipped: "tuning_disabled" }。minara learning stats 忽略此門控(純只讀 SQL)。在生產環境中保持 false,直到人工運營商明確開啟調優會話。 |
完整路線圖及目標函數設計見 apps/agent/docs-src/bo-learning-config-tuning.md。
方法論自優化循環(第 1-7 階段)
輪次結束鉤子運行獨立的 Haiku 級摘要器,從建議類輪次提取 {asset, decision, confidence, quoted_price},並持久化到 decision_history。默認為異步模式;對用戶可見延遲無影響。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
DECISION_CAPTURE_ENABLED | false | true|false | 主開關。false 時鉤子立即返回,跳過預過濾和 LLM 調用。 |
DECISION_SUMMARIZER_MODEL | claude-haiku-4-5-20251001 | 模型 id | 用於提取決策 JSON 的模型。覆蓋率 < 70% 時切換為 Sonnet。 |
DECISION_SUMMARIZER_TIMEOUT_MS | 15000 | 正整數 | 單次調用超時(毫秒)。超時會丟棄該行並記錄警告;不重試。 |
DECISION_CAPTURE_SYNC_MODE | false | true|false | 在摘要器返回前等待。僅用於確定性測試 : 會增加輪次延遲。 |
DECISION_CAPTURE_HEURISTIC_ENABLED | true | true|false | 二級:捕獲響應包含 BUY/SELL 關鍵詞 + 資產代碼的輪次,就算未激活建議場景。 |
DECISION_CAPTURE_UNIVERSAL_SCAN | false | true|false | 三級:對每個輪次調用摘要器。僅供診斷使用 : 摘要器成本約增加 4 倍。 |
階段 2 : 多週期回測 + 幻覺檢查
定時任務填充 decision_outcomes 表,記錄 1 天、3 天、1 周、1 月的收益。填充前,系統對比 agent_quoted_price 與歷史實際價格;偏差超過 HALLUCINATION_MAX_PRICE_DELTA_PCT 時,該決策被標記並排除在下游學習外。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
DECISION_BACKTEST_ENABLED | false | true|false | 主開關。關閉時定時任務不啟動,無 cron 計時器。 |
DECISION_BACKTEST_DRY_RUN | false | true|false | 計算結果但寫入 shadow_runs(facet='decision_outcome') 而非 decision_outcomes/decision_history。第 1 周灰度發佈。 |
DECISION_BACKTEST_HORIZONS | 1d,3d,1w,1m | CSV | 週期列表。每個週期對應一行決策。最長週期決定待處理決策何時可參與計算。 |
DECISION_BACKTEST_CRON_HOURS | 24 | 正整數 | 定時任務調用間隔(小時)。 |
DECISION_BACKTEST_MAX_AGE_DAYS | 60 | 正整數 | 超過此天數的待處理決策被跳過(積壓防控)。 |
HALLUCINATION_MAX_PRICE_DELTA_PCT | 0.05 | 十進制 | |reported − real| / real 閾值;超過此值決策被標記為幻覺。 |
第 3 階段 : 獎勵
獎勵函數將 4 個時間跨度的收益向量聚合為單個標量,用於評估每項決策。BUY 獎勵上升行情,SELL 獎勵下降行情,HOLD 獎勵中性走勢(|收益| ≤ 閾值)。
| 變量 | 默認值 | 格式 | 作用 |
|---|---|---|---|
DECISION_HORIZON_WEIGHTS_JSON | {"1d":0.15,"3d":0.25,"1w":0.35,"1m":0.25} | JSON 對象 | 加權平均中各時間跨度的權重。缺失的標籤權重為 0。 |
DECISION_HOLD_NEUTRALITY_THRESHOLD | 0.02 | 小數 | |收益| 低於此值時計為 HOLD 獲勝。超過此值時,HOLD 獲得負獎勵(機會成本)。 |
第 4 階段 / 7 : 方法論實例分發
每個(模板、資產類別)的閾值覆蓋。第 4 階段提供腳手架;第 7 階段將提示詞構建器切換為優先使用實例覆蓋。off 保持第 4 階段前的行為完全不變。
實例分發默認啟用:提示詞構建器在可用時將 BO 調優的實例覆蓋合併到模板默認值。通過 DISABLE_METHODOLOGY_INSTANCE_DISPATCH=1 緊急停止開關恢復僅模板解析(見上文 agent-loop 部分的說明)。
第6階段 :: BO 調優週期
Python 工具集(位於 tools/tuning/)按符合條件的 bucket 運行 bayesian-optimization;
由 TS 週期編排器驅動,該編排器評估 6 個資格門限 + 資產類別配置。
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
METHODOLOGY_INSTANCE_TUNING_ENABLED | false | true|false | BO 週期總開關。 |
METHODOLOGY_TUNING_CRON_DAYS | 7 | 正整數 | 週期調用間隔(天數)。 |
METHODOLOGY_TUNING_MAX_BUCKETS_PER_CYCLE | 10 | 正整數 | 每個週期處理的 Top-N bucket(按 tunability_score 排序)。 |
METHODOLOGY_TUNING_PROFILES_PATH | $MINARA_DATA_DIR/methodology-tuning-profiles.json | 文件路徑 | 資產類別配置的 JSON 覆蓋。按類別淺合併;null 排除。 |
METHODOLOGY_TUNING_MIN_DECISIONS_GLOBAL | — | 正整數 | 應用於每個配置 min_decisions 的緊急下限(取最大值)。 |
METHODOLOGY_TUNING_MIN_IMPROVEMENT_REL | 0.05 | 十進制數 | BO 後檢查 #1 :: 測試集均值獎勵必須超過基準值的百分比。 |
METHODOLOGY_TUNING_MAX_SENSITIVITY_DROP_10PCT | 0.5 | 十進制數 (0, 1] | BO 後檢查 #2 :: 若 ±10% 鄰域得分下降超過此值,拒絕接受。 |
METHODOLOGY_TUNING_PARAM_BOUND_REL | 0.5 | 十進制數 | BO pbounds 半寬度,為模板默認值的分數。 |
METHODOLOGY_TUNING_MIN_CAPTURE_CONFIDENCE | 0.3 | 十進制數 [0, 1] | BO 回放僅考慮 capture_confidence ≥ 此值的決策。 |
推出順序:
DECISION_CAPTURE_ENABLED=true:: 開始錄製建議輪次。- 等待約 30 天收集數據。
DECISION_BACKTEST_ENABLED=true+DECISION_BACKTEST_DRY_RUN=true:: 影子模式運行 1 周。DECISION_BACKTEST_DRY_RUN=false:: 實時回測寫入。- 檢查
minara learning stats報告READY_FOR_BO=true。 METHODOLOGY_INSTANCE_TUNING_ENABLED=true:: 激活 BO 週期。- Instance dispatch 默認啟用;保持
DISABLE_METHODOLOGY_INSTANCE_DISPATCH未設置。
內置工具
每一行都是可選的。缺少變量會靜默禁用相應功能。
| 變量 | 效果 |
|---|---|
TAVILY_API_KEY | 默認的 web_search / web_extract 後端。 |
FIRECRAWL_API_KEY | Tavily 不可用時啟用 web_search 和 web_extract。 |
EXA_API_KEY | Tavily 與 Firecrawl 都不可用時啟用 web_search 和 web_extract(本地 key 或登錄後的平台透傳)。 |
FAL_KEY | 啟用 Fal.ai 圖像 / 視頻模型。 |
MESSAGING_DEFAULT_PROVIDER | send_message 省略 provider 時使用的提供商 id(如 telegram、slack)。可選 : 未設置時採用首個已配置提供商。 |
MESSAGING_MAX_ATTACHMENT_BYTES | send_message({attachments}) 調用中單個附件的大小限制。默認:52 428 800(50 MB)。提供商 API 獨立強制執行自身限制。 |
TELEGRAM_BOT_TOKEN | Telegram 出站消息。與 TELEGRAM_CHAT_ID 配對。支持流式編輯。 |
TELEGRAM_CHAT_ID | Telegram 數字聊天 id。 |
TELEGRAM_RICH_TEXT | 將 Telegram 回覆渲染為富文本(HTML,失敗時回退 MarkdownV2,再回退純文本)。默認開啟;設為 false 則發送純文本。 |
SLACK_WEBHOOK_URL | Slack 傳入 Webhook URL。最簡單的 Slack 路徑;無流式傳輸。 |
SLACK_BOT_TOKEN | Slack bot token(xoxb-...)。通過 chat.update 啟用流式編輯。與 SLACK_CHANNEL_ID 配對。 |
SLACK_CHANNEL_ID | 默認 Slack 頻道 id(如 C0123ABC)。與 SLACK_BOT_TOKEN 一起使用時必需。 |
SLACK_APP_TOKEN | 啟用 Socket Mode 入站的應用級令牌(xapp-…)。Agent 主動向 Slack 建立 WebSocket 並接收 Events API 消息,無需公網 Request URL。與 SLACK_BOT_TOKEN 配對。 |
DISCORD_BOT_TOKEN | Discord bot token。通過 PATCH /channels/{}/messages/{} 進行流式編輯。與 DISCORD_CHANNEL_ID 配對。 |
DISCORD_CHANNEL_ID | 數字 Discord 頻道 id。 |
HASS_URL | Home Assistant 基礎 URL(如 https://hass.local:8123)。 |
HASS_TOKEN | Home Assistant 長期訪問令牌。 |
HASS_NOTIFY_SERVICE | HA 通知服務 id(如 mobile_app_you,可帶或不帶 notify. 前綴)。一次性,無流式傳輸。 |
SMTP_HOST | 出站 SMTP 主機(如 smtp.gmail.com)。email 提供商必需。 |
SMTP_PORT | SMTP 端口(587 STARTTLS,465 SSL)。 |
SMTP_USER | SMTP 身份驗證用戶名(對於無身份驗證的中繼可選)。 |
SMTP_PASSWORD | SMTP 身份驗證密碼 / 應用密碼(已脫敏)。 |
EMAIL_FROM | 出站郵件中使用的"From"地址。 |
EMAIL_TO | send_message 省略 channel 時的默認收件人。 |
GOOGLE_OAUTH_CLIENT_ID | 一鍵"Email (Gmail)"連接器(email-gmail 提供商)的 Google OAuth 客戶端 ID。也可在 設置 → 消息 中填寫。 |
GOOGLE_OAUTH_CLIENT_SECRET | Gmail 連接器的 Google OAuth 客戶端密鑰(脫敏顯示)。 |
GMAIL_REFRESH_TOKEN | 由"連接 Gmail"流程寫入。通過 Gmail API 發信所用的長期令牌(僅 gmail.send 權限,從不讀取郵件)。 |
GMAIL_SENDER_EMAIL | 由"連接 Gmail"流程寫入。發信所用的已授權郵箱地址。 |
GMAIL_TO | email-gmail 提供商的可選收件人。留空則推送到已連接的收件箱本身。 |
WHATSAPP_ACCESS_TOKEN | Meta Cloud API Bearer 令牌。啟用 whatsapp 提供商。 |
WHATSAPP_PHONE_NUMBER_ID | Meta 開發者應用中的數字電話號碼 id。 |
WHATSAPP_RECIPIENT | 默認 E.164 收件人(+12025551234)。 |
SIGNAL_CLI_NUMBER | 你的註冊 Signal 發件人號碼(E.164 格式)。需要 PATH 中有 signal-cli。 |
SIGNAL_RECIPIENT | 默認 E.164 收件人。 |
SIGNAL_CLI_BINARY | 覆蓋 signal-cli 二進制文件路徑。默認:PATH 查找 signal-cli。 |
TELEGRAM_WEBHOOK_SECRET | Telegram 傳入 webhook 的共享密鑰。未設置時 /webhooks/telegram 返回 404。 |
SLACK_SIGNING_SECRET | Slack 應用簽名密鑰,用於傳入 webhook HMAC 驗證。未設置時 /webhooks/slack 返回 404。 |
DISCORD_APPLICATION_PUBLIC_KEY | Discord Ed25519 應用公鑰(十六進制)。未設置時 /webhooks/discord 返回 404。 |
WHATSAPP_APP_SECRET | Meta 應用密鑰,用於 WhatsApp Cloud API 入站 HMAC-SHA256 驗證(X-Hub-Signature-256 頭)。未設置時 POST /webhooks/whatsapp 返回 404。 |
WHATSAPP_VERIFY_TOKEN | WhatsApp Cloud API 的 hub.verify_token,用於一次性 GET 握手時回顯。未設置時 GET /webhooks/whatsapp 返回 404。 |
MESSAGING_INBOUND_TRANSCRIBE | 在傳入語音附件上啟用語音轉錄(通過 OpenAI Whisper)。需要 OPENAI_API_KEY。 |
MESSAGING_VOICE_REPLY | 收到語音消息時,除流式文字回覆外再附帶一條語音回覆。需要語音服務(ELEVENLABS_API_KEY 或 OPENAI_API_KEY)。 |
ELEVENLABS_API_KEY | ElevenLabs 密鑰。設置後語音合成與聽寫優先走 ElevenLabs(延遲更低),OpenAI 作為回退。 |
VOICE_TTS_PROVIDER | 指定語音合成服務商:auto(默認)/ elevenlabs / openai。 |
VOICE_TTS_VOICE | 朗讀回覆使用的音色 id(主服務商原生 id)。留空用服務商默認。 |
VOICE_TTS_MODEL | TTS 模型。ElevenLabs:eleven_v3(默認,最像真人)、eleven_multilingual_v2、eleven_turbo_v2_5、eleven_flash_v2_5;OpenAI 默認 gpt-4o-mini-tts。 |
VOICE_TTS_STABILITY / VOICE_TTS_SIMILARITY_BOOST / VOICE_TTS_STYLE / VOICE_TTS_SPEAKER_BOOST / VOICE_TTS_SPEED | ElevenLabs 朗讀默認參數(0-1,speed 為 0.7-1.2,speaker boost 為 1/0)。設置頁 → Voice models 的滑塊會按用戶覆蓋。 |
VOICE_TTS_FAST_FIRST | 1(默認)/ 0。每條回覆的第一句話用最快的模型朗讀,開口更快;後續句子保持所選模型。 |
VOICE_STT_PROVIDER | 指定語音聽寫服務商:auto(默認)/ elevenlabs / openai。 |
VOICE_STT_MODEL | 主服務商的 STT 模型覆蓋。留空為 scribe_v1 / gpt-4o-mini-transcribe。 |
VOICE_FFMPEG_PATH | 可選的 ffmpeg 路徑,用於語音轉碼(企業微信/公眾號的 AMR 入站語音;企業微信的 AMR 語音回覆)。默認查 PATH;沒有 ffmpeg 時相關平臺優雅降級。 |
TWITTERAPI_API_KEY | 第三方 Twitter 抓取工具。啟用 research.social.twitter。 |
X_API_BEARER_TOKEN | 官方 X API v2。啟用 x.api 技能。 |
GLASSNODE_API_KEY | Glassnode 鏈上指標。啟用 research.onchain.glassnode。 |
QDRANT_URL | 向量知識庫端點。同時啟用 research.knowledge_base skill 和機構模式的 kb_search 工具(後者還需要配置 EMBEDDING_PROVIDER)。設置後,news / fundamentals / sentiment 分析師會在調用 web_search 之前先查詢 Qdrant,給綜合階段提供明顯更乾淨的輸入。 |
QDRANT_API_KEY | 可選 Qdrant Cloud 身份驗證。設置後會作為 api-key 請求頭隨每次 Qdrant 請求發送。 |
KB_EMBEDDING_PROVIDER | kb_search 專屬的 embedder 覆蓋。僅當填充 Qdrant 的 embedder 與 EMBEDDING_PROVIDER 不一致時設置(典型場景:v1 Qdrant 用 OpenAI text-embedding-3-small 填充,但當前部署用 voyage-3 做 memory)。未設置時 kb_search 複用全局 EMBEDDING_*。維度不匹配時 Qdrant 會返回 400,kb_search 在錯誤信息中會直接提示設置該覆蓋。 |
KB_EMBEDDING_API_KEY | KB_EMBEDDING_PROVIDER 的認證。未設置時回退到 EMBEDDING_API_KEY。 |
KB_EMBEDDING_MODEL | KB_EMBEDDING_PROVIDER 的模型 id,需與填充 Qdrant 時所用模型一致。 |
KB_EMBEDDING_DIM | 向量維度。常見模型 id 會自動推斷;自定義模型時顯式設置。 |
E2B_API_KEY | 啟用 workspace.e2b 雲沙盒。 |
消息平臺(擴展集)
在原有七個平臺(telegram、discord、slack、email、whatsapp、signal、home_assistant)之上新增 11 個 IM 與消費社交平臺。每個平臺有自己的 env 變量塊;任何一項為空都會靜默禁用該 provider 的出入站(路由 404,gateway 從運行時映射中剔除)。
詳細配置步驟、入站 webhook URL、簽名算法見 消息通道 各平臺子頁。連線憑據最快的路徑是 minara auth messaging add(交互式 picker,列出 18 個平臺及其當前已配置 / 未配置狀態)。
Lark / Feishu
| 變量 | 效果 |
|---|---|
LARK_APP_ID | Lark 應用 id,cli_xxxxxxxxxxxxxxxx。出站必需。 |
LARK_APP_SECRET | Lark 應用密鑰。用於換取 tenant access token(2 小時緩存)。 |
LARK_DEFAULT_CHAT_ID | 默認 oc_xxxxxxxxxxxxxxxx 群聊 id,用於出站發送。 |
LARK_VERIFICATION_TOKEN | 入站 webhook 驗證 token。入站必需。 |
LARK_ENCRYPT_KEY | 入站加密密鑰(可選)。設置後,入站 POST 體以 {encrypt: ...} 形式到達,使用 AES-256-CBC 解密;密鑰 = SHA256(encrypt_key),IV = 該密鑰前 16 字節。 |
LARK_DOMAIN | open.feishu.cn(中國大陸,默認)或 open.larksuite.com(國際版)。 |
WeCom(企業微信)
| 變量 | 效果 |
|---|---|
WECOM_CORP_ID | "我的企業" 頁面的 corp id。 |
WECOM_AGENT_ID | 應用 agent id(數字)。 |
WECOM_SECRET | 應用密鑰。換取 access_token(2 小時緩存)。 |
WECOM_DEFAULT_TOUSER | 默認接收人,豎線分隔的 user id 或 @all。 |
WECOM_CALLBACK_TOKEN | 回調 token。用 [token, ts, nonce, encrypt] 做 SHA1 排序簽名。 |
WECOM_CALLBACK_AES_KEY | 43 字符 EncodingAESKey,用於入站 AES-256-CBC 解密。 |
DingTalk(釘釘)
| 變量 | 效果 |
|---|---|
DINGTALK_WEBHOOK_URL | 自建群機器人 webhook URL(https://oapi.dingtalk.com/robot/send?access_token=...)。 |
DINGTALK_WEBHOOK_SECRET | 機器人簽名密鑰(SECxxxx)。出站用 timestamp\nsecret 做 HMAC-SHA256 簽名;同一算法驗證入站 outgoing-webhook 簽名。 |
DINGTALK_STREAM_APP_KEY | Stream Mode 應用 key(AppKey / ClientID)。啟用客戶端外連的 Stream Mode 入站 daemon,通過網關 WebSocket 接收機器人消息,無需公網回調 URL。與 DINGTALK_STREAM_APP_SECRET 配對。 |
DINGTALK_STREAM_APP_SECRET | Stream Mode 應用密鑰(AppSecret / ClientSecret)。與 DINGTALK_STREAM_APP_KEY 一起使用時必需。 |
WeChat OA(公眾號)
| 變量 | 效果 |
|---|---|
WECHAT_OA_APP_ID | 公眾號 AppID,wxxxxxxxxxxxxxxxxx。 |
WECHAT_OA_APP_SECRET | 公眾號 AppSecret。換取 access_token(2 小時緩存)。 |
WECHAT_OA_TOKEN | 服務器配置 Token。入站 SHA1 簽名(GET 握手 3-元組,POST 4-元組)。 |
WECHAT_OA_AES_KEY | 43 字符 EncodingAESKey,用於入站 AES-256-CBC 解密。 |
WECHAT_OA_DEFAULT_OPENID | 默認 openid 收件人。客服消息必須在 48 小時交互窗口內。 |
QQ Bot
| 變量 | 效果 |
|---|---|
QQ_BOT_APP_ID | Bot AppID(數字)。 |
QQ_BOT_APP_SECRET | Bot Secret。同時作為入站 Ed25519 簽名驗證的 seed 來源(重複填充至 32 字節後派生密鑰對)。 |
QQ_BOT_TOKEN | Bot token(遺留字段,保留兼容性)。 |
QQ_BOT_DEFAULT_CHANNEL_ID | 默認目標,<kind>:<id> 其中 kind ∈ channel / group / c2c / dm。純 id 默認為 channel:。主動消息上限 4 條 / 月。 |
LINE
| 變量 | 效果 |
|---|---|
LINE_CHANNEL_ACCESS_TOKEN | 長期 bearer,用於 push API。 |
LINE_CHANNEL_SECRET | 頻道密鑰。驗證 X-Line-Signature HMAC-SHA256(base64)over 原始 body。僅出站場景可留空。 |
LINE_DEFAULT_USER_ID | 默認 userId / groupId / roomId。 |
Mattermost
| 變量 | 效果 |
|---|---|
MATTERMOST_URL | 服務器 URL(無尾部斜槓)。 |
MATTERMOST_BOT_TOKEN | Bot 用戶個人訪問 token。 |
MATTERMOST_DEFAULT_CHANNEL_ID | 出站默認頻道 id。 |
MATTERMOST_OUTGOING_WEBHOOK_TOKEN | Outgoing-webhook token,與入站 body 中的 token 字段做常量時間比對。僅出站場景可留空。Outgoing webhook 只在公開頻道按觸發詞觸發。 |
Microsoft Teams
| 變量 | 效果 |
|---|---|
TEAMS_BOT_APP_ID | Bot 的 Microsoft App ID GUID。入站 JWT 的 audience(多租戶)或 audience + tenant GUID(單租戶)。 |
TEAMS_BOT_APP_PASSWORD | Bot 的 Microsoft App Password。換取出站 access token(1 小時緩存)。 |
TEAMS_BOT_TENANT_ID | 多租戶填 common,單租戶填 GUID。影響入站 JWT audience 校驗。 |
TEAMS_DEFAULT_CONVERSATION_ID | bootstrap fallback 的會話 id。生產代碼應從入站 activity 學到 conversation id。 |
TEAMS_DEFAULT_SERVICE_URL | bootstrap fallback 的 service URL。默認 https://smba.trafficmanager.net/teams。生產代碼從入站 activity.serviceUrl 學得。 |
Google Chat
| 變量 | 效果 |
|---|---|
GOOGLE_CHAT_SERVICE_ACCOUNT_JSON_PATH | 服務賬號 JSON 密鑰的路徑。按 CLAUDE.md §4,文件必須放在 data / sandbox 樹內。 |
GOOGLE_CHAT_DEFAULT_SPACE_ID | 默認 space 資源名,spaces/AAAA1234567。 |
GOOGLE_CHAT_AUDIENCE | 必須與 Workspace 控制台的 "Authentication Audience" 完全一致(GCP project number 字符串或 endpoint URL)。audience 錯誤會讓每次入站返回 401。 |
BlueBubbles(iMessage)
| 變量 | 效果 |
|---|---|
BLUEBUBBLES_SERVER_URL | macOS 上運行的 BlueBubbles server 公網 URL(通常是隧道)。 |
BLUEBUBBLES_PASSWORD | 共享服務器密碼。入站採用純常量時間比對,無 HMAC。 |
BLUEBUBBLES_DEFAULT_CHAT_GUID | 默認 chat GUID,如 iMessage;-;+15551234567。 |
Matrix
| 變量 | 效果 |
|---|---|
MATRIX_HOMESERVER | Homeserver URL(如 https://matrix.org)。 |
MATRIX_ACCESS_TOKEN | 長期 bearer。使用 Authorization: Bearer 頭;?access_token= query 形式已棄用。 |
MATRIX_USER_ID | Bot 用戶(如 @bot:example.org)。用於在 /sync 中過濾自循環。 |
MATRIX_DEFAULT_ROOM_ID | 默認房間 id(!abc:example.org)。入站 daemon 將 emit 限定在該房間。 |
MESSAGING_MATRIX_INBOUND | 設為 1 時,應用啟動時會拉起 /sync 長輪詢 daemon。Daemon 在首次運行時丟棄歷史事件;游標存於 <dataDir>/matrix-sync.json。不支持 E2EE。 |
客戶端外連入站 daemon
Telegram、Discord、Slack、Mattermost、QQ、DingTalk 和 Lark 都支持客戶端外連入站 daemon:Agent 主動向外建立並保持一條長連接(長輪詢或 WebSocket),而不必運行公網 webhook 服務器。這正是讓雙向對話能在沒有公網 IP、沒有隧道、沒有第三方的個人機器上工作的原因。當平臺的出站憑據已配置且未為其配置公網 webhook 時,對應 daemon 會自動啟動;下面的開關是對該自動判定的顯式三態覆蓋(留空 = 自動,1 = 強制開啟,0 = 強制關閉)。
| 變量 | 效果 |
|---|---|
MESSAGING_TELEGRAM_POLLING | Telegram getUpdates 長輪詢。啟動時調用 deleteWebhook;游標存於 <dataDir>/telegram-updates.json。webhook 信號:TELEGRAM_WEBHOOK_SECRET。 |
MESSAGING_DISCORD_GATEWAY | Discord Gateway WebSocket。還能投遞 Interactions webhook 收不到的普通頻道 / 私信消息。需要在 Discord 開發者門戶啟用特權 Message Content intent。webhook 信號:DISCORD_APPLICATION_PUBLIC_KEY。 |
MESSAGING_SLACK_SOCKET | Slack Socket Mode。需要 SLACK_APP_TOKEN。webhook 信號:SLACK_SIGNING_SECRET。 |
MESSAGING_MATTERMOST_WS | Mattermost v4 WebSocket 機器人。可觸達 outgoing-webhook 無法觸達的私信和私有頻道。webhook 信號:MATTERMOST_OUTGOING_WEBHOOK_TOKEN。 |
MESSAGING_QQ_WS | QQ v2 網關 WebSocket。無 webhook 專用密鑰(webhook 複用 QQ_BOT_APP_SECRET),故優先使用 daemon;設為 0 改用 webhook。 |
MESSAGING_DINGTALK_STREAM | DingTalk Stream Mode。需要 DINGTALK_STREAM_APP_KEY / DINGTALK_STREAM_APP_SECRET。DINGTALK_WEBHOOK_SECRET 用於出站簽名而非入站,故不抑制 daemon;設為 0 改用 webhook。 |
MESSAGING_LARK_WS | Lark / Feishu 長連接,經官方 SDK。webhook 信號:LARK_VERIFICATION_TOKEN。 |
MCP 集成
| 變量 | 格式 | 效果 |
|---|---|---|
MCP_SERVERS | JSON 數組 | 覆蓋默認 MCP 服務器列表。 |
DEFILLAMA_API_KEY | 不透明字符串 | DefiLlama Pro API 密鑰。為 typed defillama_* 工具鑑權(apps/agent/src/defillama/client.ts 在 Pro 主機呼叫時注入為 URL 路徑前綴)。用 tool_search namespace: "cap/defillama" 發現工具——無 skill 包。替代已棄用的 DEFILLAMA_MCP_TOKEN。未設置時 Pro 呼叫可走 Minara forward 或免費端點。 |
MCP_EVM_RPC_URL | URL | EVM JSON-RPC 原始子 Agent。 |
MCP_ETHERSCAN_URL | URL | Etherscan 風格的區塊瀏覽器(60+ EVM 鏈)。 |
MCP_SOLSCAN_URL | URL | Solscan Solana 區塊瀏覽器。 |
MCP_GOPLUS_URL | URL | GoPlus Web3 安全分析。 |
原生提供商密鑰(PR-A → PR-G 遷移)
提供商路由推出已下線了供應商 coinglass / coinank / query-token-audit / meme-rush / polymarket / okx-dex-token / okx-wallet-portfolio / okx-security / okx-dex-trenches SKILL.md 包。它們的功能現在存在於 apps/agent/src/tools/_shared/ 下的原生優先鏈以及 analysis.derivatives / market.flows / security.token / discovery.dex / prediction.markets 技能中。下面列出的環境變量控制原生提供商,而非舊版 SKILL.md 包。
| 變量 | 激活的原生技能 | 請求頭 / 用法 |
|---|---|---|
CMC_API_KEY | 優先鏈 cmc 提供商(minara.core.crypto_kline、get_price、get_trending 中的價格 / 熱度備用) | X-CMC_PRO_API_KEY |
CMC_PRO_API_KEY | 保留供現存的供應商 cmc-api-* SKILL.md 包使用 | X-CMC_PRO_API_KEY |
COINGECKO_API_KEY | 升級 coingecko-pro 提供商(價格 / K線 / 鏈上持有者)並解鎖現存 coingecko 外部 SKILL.md 中的專業級端點 | x-cg-pro-api-key 或 x-cg-demo-api-key |
COINGLASS_API_KEY | coinglass skill :: CoinGlass v4 REST API 的類型化透傳(約 160 個只讀端點:期貨、現貨、期權、ETF 資金流、鏈上指數、交易所餘額、清算熱力圖),按品類各一個分類工具。同時為 btc_rainbow_band 工具供數。配置本地密鑰時直連 CoinGlass;未配置時該 skill 通過 Minara 後端轉發已放行的端點子集。 | CG-API-KEY |
BINANCE_WEB3_API_KEY + BINANCE_WEB3_SECRET_KEY | 優先鏈 binance-web3-dex 提供商 :: 以太坊 / BSC / Base / Solana 上鍊上代幣數據(discovery.dex 元數據 / 持有人 / 池子)的首選,在這四條鏈上排序高於 coingecko 鏈上層級和 okx-dex;錢包聚合在查詢限定於這四條鏈(或未配置 OKX 四元組)時由它承接;同時控制 binance-web3 外部技能的啟用 | X-OC-* HMAC 對 |
OKX_API_KEY + OKX_SECRET_KEY + OKX_PASSPHRASE + OKX_PROJECT_ID | 優先鏈 okx-dex 提供商 :: discovery.dex(錢包聚合、DEX 代幣在 binance-web3-dex 之後的備用)、非幣安 Web3 鏈上的 security.token、幣安 Web3 未覆蓋的鏈上 meme.* | OKX HMAC 四元組 |
FMP_API_KEY | 通過 tool_search 在 cap/fmp 命名空間發現的 FMP 公開股票數據工具 | ?apikey= 查詢參數(由 apps/agent/src/fmp/client.ts 注入) |
原生
prediction.markets技能是只讀的(Polymarket 的公開 Gamma + CLOB 讀端點),無需任何環境變量。已下線的external-polymarketSKILL.md 使用PRIVATE_KEY/RPC_URL/POLY_BUILDER_*來進行認證訂單下單;該寫入路徑尚未遷移,這些環境變量在 Agent 中已無消費者。
保留的外部技能包
PR-G 刪除後,這些 vendor 化的技能包仍保留在原地 (它們覆蓋了原生優先鏈尚未吸收的能力):
| 包 | 用途 | 環境變量 |
|---|---|---|
external-binance | 超出公有 binance-public 提供商的現貨、槓桿、私有端點 | 公有無需;私有需賬戶密鑰 |
external-coingecko | 鏈上 GeckoTerminal OHLCV + 超出優先鏈免費層的更深 coingecko 接口 | COINGECKO_API_KEY |
external-hyperliquid | 原生 minara.perps_analytics 技能未覆蓋的用戶賬戶端點 | 每用戶簽名密鑰 |
external-cmc-api-*(4 個包) | 超出價格、熱門排行的 CoinMarketCap 端點 | CMC_PRO_API_KEY |
external-okx-defi-portfolio、external-okx-dex-market、external-okx-dex-signal、external-okx-dex-ws、external-okx-audit-log | 不在原生 okx-dex 提供商中的 OKX Web3 / DeFi 接口 | OKX 四變量 |
external-diagram-design、external-strategy-studio | 與提供商路由無關 : 保持不變 | 無 |
方法論學習閉環 : case 歸因 + synthesis(Phase 1-5)
Phase 1-5 系列引入的方法論學習閉環的調節參數(case-recorder、歸因 cron、synthesis)。全部可選 : 默認值面向生產環境調優。大多數運維方只 需關注 總開關和 synthesis 閾值。
總開關(事故響應)
| 變量 | 作用 | 何時翻 |
|---|---|---|
DISABLE_METHODOLOGY_INJECTION | 關閉讀路徑 : placeholder / fusion hint / methodology_lookup 工具。方法論停止在 prompt 和工具輸出中出現。 | LLM 被汙染的方法論語料帶偏;需要乾淨的 prompt 排查問題。 |
DISABLE_METHODOLOGY_CASE_RECORDING | 僅關閉 case 寫路徑。recordHint / finalizeTurn 成 no-op;讀路徑繼續工作。 | case 表 schema 遷移中;讀路徑仍需正常。 |
DISABLE_METHODOLOGY_MUTATIONS | 關閉所有方法論 mutation:recordUsage / recordOutcome / requantize / synthesis / case-attribution / setMethodologyQuarantine。讀路徑保留。 | Wilson 計數看起來已損壞;調查期間凍結一切。覆蓋範圍比上兩個更廣。 |
設為 1 / true / yes / on 啟用。其他值或未設保持路徑活躍。
熱讀 : 運維可不重啟 agent 翻轉。
Synthesis 調優(Phase 4 D)
| 變量 | 默認值 | 效果 |
|---|---|---|
METHODOLOGY_SYNTHESIS_FLAG_MEDIAN_BPS | 50 | 加權窗口 median ≤ -0.5%(= -50 bps)觸發 regime_shift_flagged。值越小越敏感。 |
METHODOLOGY_SYNTHESIS_FLAG_HIT_RATE | 0.45 | 加權 hit_rate 低於此值觸發 flag。值越大越敏感。 |
METHODOLOGY_SYNTHESIS_DEMOTE_MEDIAN_BPS | 200 | 自動降級要求 median ≤ -2% AND 30 天樣本 ≥ 10 AND 終身 Wilson > 0.55。 |
METHODOLOGY_SYNTHESIS_HALFLIFE_DAYS | 14 | 7/30/90/180 天窗口的新鮮度半衰期。越小越對近期數據敏感。 |
METHODOLOGY_STRESS_THRESHOLD_PCT | 25 | 黑天鵝熔斷器。當一輪 synthesis 中超過 25% 的同向方法論觸發自動降級時,抑制級聯,改施加臨時 factor=0.8。 |
價格質量(Phase 3 F4.3)
每個資產類別的日內絕對收益上限。7 天窗口按 sqrt(7) 放大。攔截單日
FX 印錯、拆股後的價格跳變、退市標的歸零等汙染 Wilson 的髒數據。
| 變量 | 默認值 | 備註 |
|---|---|---|
METHODOLOGY_PRICE_CAP_MAJOR_CRYPTO | 0.5 | 日 50% |
METHODOLOGY_PRICE_CAP_LAYER_1 | 0.5 | |
METHODOLOGY_PRICE_CAP_LAYER_2 | 0.6 | L2 波動更大 |
METHODOLOGY_PRICE_CAP_DEFI_BLUE_CHIP | 0.6 | |
METHODOLOGY_PRICE_CAP_MEME_COIN | 1.0 | meme 幣確實可能日內 100% 波動 |
METHODOLOGY_PRICE_CAP_STABLECOIN | 0.02 | 激進 : 穩定幣不應日內波動 > 2% |
METHODOLOGY_PRICE_CAP_STOCK | 0.15 | |
METHODOLOGY_PRICE_CAP_INDEX | 0.1 | |
METHODOLOGY_PRICE_CAP_COMMODITY | 0.2 | |
METHODOLOGY_PRICE_CAP_FOREX | 0.05 |
Case-recorder 維護(Phase 2)
| 變量 | 默認值 | 效果 |
|---|---|---|
METHODOLOGY_HINT_ORPHAN_MS | 1800000(30 分鐘) | pending hint 行被 orphan sweeper 標記 orphaned 前的 TTL。應大於 agent 單次合理 turn 時長。 |
Phase 5 : 跨 turn 橋接 + 調度器
| 變量 | 默認值 | 效果 |
|---|---|---|
METHODOLOGY_LEARNING_CRON_ENABLED | unset(off) | 啟用進程內調度器。設為 1 後 setInterval 自動跑 orphan sweep → 7d 標準歸因 → synthesis 全套。 |
METHODOLOGY_LEARNING_CRON_INTERVAL_MS | 21600000(6 小時) | 調度器節奏。clamp 在 [1 分钟, 7 天]。 |
IS_PRIMARY_WORKER | unset = 單進程默認 primary | 多進程 serve 模式下,僅一個 worker 應跑調度器。設為 1 表示 primary;其他 worker 設為 0。 |
運營學習 cron
agent 默認不自動調度學習 cron。運維方將下面任一 minara learning
子命令接入系統 cron / launchctl / systemd timer。推薦每日節奏:
# 每日 03:00 — sweep、归因、synthesize。幂等,错过的一次会在下一 tick 重放。
0 3 * * * /usr/local/bin/minara learning cron --json >> /var/log/minara-learning.logCLI 表面(Phase 4 E):
minara learning methodology explain <id> # 当前状态 + 审计
minara learning methodology lifecycle [--kind k] # 审计日志尾部
minara learning methodology cases [--asset c] # case 表尾部
minara learning attribute # 一次 7d 归因 pass
minara learning synthesize [--asset c] # 一次 synthesis pass
minara learning sweep-orphans # 一次 orphan sweep
minara learning cron # 上面全部方法論審計子系統(被動觀察者)
一套只讀的審計子系統疊加在學習閉環之上,產出一個複合健康分。六個維度合成複合分:synthesis 決策穩定性、畢業後短期降級率、歸因健康度、資產類覆蓋度、隔離反覆檢測、cron 健康度。子系統永不變更學習狀態,唯一寫入是每次 pass 一行到 methodology_audit_reports。端到端測試在每次審計 pass 前後哈希四張學習表,一旦未來回歸引入寫入會立即失敗。
cron 與 agent loop 合作。每次 tick 檢查共享的 BusyTracker。如果有用戶對話在跑、或 agent 空閒時間不足配置的閾值,本次 tick 被推遲。連續 N 次推遲後,飢餓守衛強制執行,避免長期忙碌的部署丟失審計覆蓋。pass 執行過程中,orchestrator 在每個 SQL 階段之間向事件循環讓步,turn 進來時立即在 busy tracker 上暫停。
默認每天跑一次。cron_health 讀取 methodology_cron_runs 心跳錶,由 src/learning/methodology-cron.ts 在每次學習 tick 末尾寫入,所以歸因通道安靜(無可歸因 case)不會被誤判為閉環已死。
| 變量 | 默認 | 作用 |
|---|---|---|
METHODOLOGY_AUDIT_CRON_ENABLED | 0 | 進程內審計調度器的開關。多 worker 部署同時遵循 IS_PRIMARY_WORKER。 |
METHODOLOGY_AUDIT_CRON_INTERVAL_MS | 86400000(24h) | tick 間隔。運行時夾緊到 [5min, 30d]。 |
METHODOLOGY_AUDIT_WINDOW_DAYS | 30 | 窗口型維度的回溯窗口。夾緊到 [1, 365]。 |
METHODOLOGY_AUDIT_RETENTION_DAYS | 90 | methodology_audit_reports 行的保留期,每個本地日最多裁剪一次。夾緊到 [7, 3650]。 |
METHODOLOGY_AUDIT_SKIP_BUSY_THRESHOLD_MS | 180000(3min) | BusyTracker 報告繁忙或 idle 窗口短於此值時跳過本次 tick。夾緊到 [0, 1h]。設為 0 關閉預檢查。 |
METHODOLOGY_AUDIT_MAX_DEFERRED_TICKS | 4 | 飢餓守衛。連續推遲達到此值後,下次 tick 無論繁忙狀態都強制執行。夾緊到 [0, 100]。 |
METHODOLOGY_AUDIT_YIELD_TIMEOUT_MS | 60000(60s) | pass 內每個讓步點等待 idle 的最長時間,超時後無論繁忙狀態都繼續。夾緊到 [0, 10min]。 |
DISABLE_METHODOLOGY_AUDIT | unset | 1/true 短路寫路徑(cron + CLI audit run)。返回 band=disabled 佔位,不持久化。讀路徑(audit show/trend/findings)仍可用。 |
CLI 接口:
minara learning audit run [--window-days N] # 内联单次 pass
minara learning audit show [--latest|--pass <id>]
minara learning audit trend [--days N] # composite 历史 + sparkline
minara learning audit findings [--severity high|medium|low]資金確認繞過(高級 : 生產警告)
MINARA_SKIP_FUND_CONFIRM 由統一確認門執行。設置後 fund-moving
調用跳過確認卡片並在首次調用即執行。case-recorder 同步
適配 : 繞過下執行的 turn 計為 fund_moving_executed 進行 Wilson 歸因。
不要在交互式或生產環境中設置。
主動式財富智能體
後臺監管循環負責運行每個已激活的委託(按市價標記持倉、止盈/止損/再平衡、記錄盈虧快照、寫入工作日誌),以及較慢的重新發現循環(尋找新機會)。這三項也可以在 設置 → 主動模式(以及主動模式模塊自身的設置頁)裡實時修改;下面的環境變量是啟動時的兜底。多 worker 部署只在 IS_PRIMARY_WORKER=1 的 worker 上運行該循環。
| 變量 | 默認值 | 作用 |
|---|---|---|
PROACTIVE_SUPERVISOR_ENABLED | 1(開) | 後臺監管器的總開關。0 會暫停每個已激活委託的自主活動;委託保持激活狀態,只是停止操作,直到你重新打開。 |
PROACTIVE_SUPERVISOR_INTERVAL_SEC | 900(15 分鐘) | 每個委託多久檢查一次持倉,單位為秒。運行時鉗制到 [10s, 1h]。 |
PROACTIVE_REDISCOVER_INTERVAL_SEC | 1800(30 分鐘) | 委託多久尋找一次新機會(付費的重新規劃步驟),單位為秒。鉗制到 [1min, 24h]。每輪實時讀取,改動無需重啟即可生效。未配置模型時優雅跳過。 |
x402 支付牆預授權(PR-X)
這些變量約束了 HTTP 402 / x402 支付牆的"一次付費後自動付費"功能。授權調用本身始終經過第 3b 條的兩步確認門控;在活躍會話範圍內匹配的後續付款跳過每次調用的用戶提示,直接通過 transfer_token 執行。每次自動扣費都會向響應寫入審計元數據(會話 ID + 剩餘預算),讓用戶可以追蹤每次扣費。
連接到:
apps/agent/src/minara/x402-preauth-store.ts: SQLite 存儲 + 上限計算apps/agent/src/minara/x402-preauth-config.ts: 環境加載器 + 上限輔助函數apps/agent/src/tools/_shared/confirm.ts:shouldAutoExecuteX402輔助函數apps/agent/src/tools/trade.ts:transfer_token優先查詢自動執行策略apps/agent/src/tools/x402-preauth.ts:x402_preauth_grant / _list / _revokeapps/agent/src/gateway/repl-commands.ts:/x402 preauthCLI 入口
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
X402_PREAUTH_DEFAULT_TTL_HOURS | 24 | 正整數(小時) | 調用 x402_preauth_grant 時未指定 ttl_hours 所應用的默認 TTL。 |
X402_PREAUTH_MAX_TTL_HOURS | 168(7 天) | 正整數(小時) | 非永久 TTL 的硬上限。請求更長期限的授權會被拒絕,錯誤字段為 field: "ttlMs"。 |
X402_PREAUTH_ALLOW_FOREVER | 1 | 1/true/yes/on 表示允許 | 為 0 時,ttl_hours: "forever" 的授權被拒絕,錯誤字段為 field: "forever"。永久預算上限仍被讀取用於文檔說明。 |
X402_PREAUTH_MAX_PER_CALL_USDC | 0.5 | 正數(USDC) | 單次自動付款的硬上限。超過此金額的單次付款會降級為常規兩步確認,就算在活躍會話內::這是限制每次調用風險範圍的安全邊界。 |
X402_PREAUTH_MAX_BUDGET_USDC | 5 | 正數(USDC) | 非永久會話的總預算上限。 |
X402_PREAUTH_MAX_FOREVER_BUDGET_USDC | 20 | 正數(USDC) | 永久會話的總預算上限。獨立設置是因為移除時間約束需要更嚴格的金額控制。 |
X402_PREAUTH_DISABLE | 0 | 1/true/yes/on 表示禁用 | 全局緊急停止開關。設置後,所有預授權代碼路徑短路,x402 付款降級為常規兩步確認流。可在事件應對或合規審計期間使用。 |
scope=any+ttl=forever是最寬鬆的授權組合。 REPL 的/x402 preauth grant處理器對該組合需要雙重顯式確認; LLM 工具x402_preauth_grant永遠不會自動提議它。
OpenClaw 工作空間集成
Agent 讀取並寫入工作空間目錄(默認 ~/.minara/workspace/,可通過 MINARA_WORKSPACE_DIR 環境變量或 --workspace 標誌覆蓋),該目錄包含按 OpenClaw 的 AGENTS.default.md 模式建模的 markdown 文件:SOUL.md(身份)、AGENTS.md(規則)、IDENTITY.md、USER.md、MEMORY.md(精選長期記憶)、HEARTBEAT.md(會話間備忘)、BOOTSTRAP.md(僅首次運行)、TOOLS.md(環境特定工具說明)和 memory/YYYY-MM-DD-*.md(日誌)。
模板位於 apps/agent/src/workspace/templates/ 下。啟動路徑在 createApp() 內自動調用 seedWorkspaceIfMissing(),使新安裝獲得完整文件集,無需操作員運行 minara setup。種子過程是冪等的 : 用戶編輯過的文件永遠不會被覆蓋。HEARTBEAT.md 有意不被種子化(Agent 在首輪結束時寫入真實的;種子化陳舊狀態會造成誤導)。
Web UI 的設置 → 工作空間面板通過網關的 /v1/workspace/files 端點編輯 ~/.minara/workspace/ 下的運行時文件,使用 sha256 樂觀併發控制。
連接到:
apps/agent/src/workspace/seed.ts:seedWorkspaceIfMissing+atomicWriteFileapps/agent/src/workspace/heartbeat-writer.ts: 每輪## State寫入器apps/agent/src/workspace/daily-log-writer.ts: 每會話日誌記錄apps/agent/src/workspace/dreaming-task.ts: 定期 MEMORY.md 合併apps/agent/src/workspace/bootstrap-handler.ts:BOOTSTRAP_DONE時歸檔apps/agent/src/workspace/soul-change-detector.ts: 披露 SOUL.md 編輯
| 變量 | 默認值 | 格式 | 效果 |
|---|---|---|---|
WORKSPACE_HEARTBEAT_ENABLED | 1(開啟) | 0/false/no/off 禁用 | 每輪 HEARTBEAT.md 狀態寫入器。開啟時,每輪後 Agent 寫入 last_seen、session_id、surface、turn_count、last_user_query,外加從回覆中提取的啟發式 open_loops。用戶編輯的 ## Schedule 部分在寫入間通過 schedule_raw 往返同步保留原樣。在只讀工作空間掛載、CI 運行或隱私敏感場景下禁用。 |
WORKSPACE_DAILY_LOG_ENABLED | 0(關閉) | 1/true/yes/on 啟用 | 每次到達寫入週期後,按 SQLite chat_turns 水位將全部未落盤 turn 寫入 <workspace>/memory/YYYY-MM-DD-<session>.md;保留真實 session、surface 和來源,不使用 correlation ID 代替 session。 |
WORKSPACE_DAILY_LOG_INTERVAL | 5 | 正整數(輪) | Journal backlog 的 flush 週期。每次都會寫完水位後的所有 turn;增大值只會延後落盤,不會抽樣丟棄中間 turn。 |
WORKSPACE_DREAM_ENABLED | 0(關閉) | 1/true/yes/on 啟用 | 定期合併 MEMORY.md。自動來源 turn 保留在日誌中供審計,但在 LLM 前移除,Autopilot、策略、workflow、cron 和來源不明的 perps 執行不會變成人工偏好或案例。 |
WORKSPACE_DREAM_INTERVAL_HOURS | 24 | 正數(小時,可小數) | 夢想運行間隔。前一次運行仍在進行時調度器跳過本次,故緩慢 LLM 調用無法堆積。WORKSPACE_DREAM_ENABLED 關閉時無效。 |
WORKSPACE_DREAM_TOTAL_INPUT_BYTES | 262144(256 KB) | 正整數(字節) | 單次 dream 餵給 LLM 的所有 daily 日誌總字節預算。日誌按"最新優先連續後綴"挑選,讓模型看到的總是一段時序連貫且包含最近活動的窗口。每個文件仍受 64 KB 上限做尾部截斷;最新一份日誌就算單獨超預算也保留。防止長窗口密集日誌爆掉模型 context。WORKSPACE_DREAM_ENABLED 為關閉時無效。 |
WORKSPACE_DREAM_LOCK_TTL_MS | 1800000(30 分鐘) | 正整數(毫秒) | <workspace>/.dreaming.lock 的 TTL。超過此值的鎖被視為陳舊,可被其它進程接管。該值反映"單次 dream 最長合理執行時長",不應等於 tick 間隔。如果 LLM 調用經常超過 30 分鐘則調高。NFS 掛載的 workspace 不被支持(底層 O_EXCL 在部分 NFS 客戶端下不保證原子),請讓 dream 跑在單一主機上。WORKSPACE_DREAM_ENABLED 為關閉時無效。 |
MINARA_WORKSPACE_DIR和--workspaceCLI 標誌覆蓋讀寫的默認~/.minara/workspace/路徑,包括自動種子和網關編輯器。在指向現有 OpenClaw 工作空間時有用(--workspace ~/.openclaw/workspace)。
深度研究報告渲染
| 變量 | 默認 | 接受值 | 用途 |
|---|---|---|---|
REPORT_BUNDLE_CHART_PNGS | 未設置(關閉) | 1 / true 啟用 | 讓深度研究 HTML / PDF 報告退回到 v7 之前的 PNG 打包方式,而不是默認的可交互 ECharts。默認(關閉): 網關傳遞 ["html", "pdf"] 給 renderDeepResearchReport,每個 chart://<id> 鏈接都會展開為 ECharts 官方文檔的標準嵌入模式(<div class="echart-host"> + 內聯 <script> 從 CDN 加載 echarts 完成渲染),用戶能直接縮放、懸浮看 tooltip、點工具欄按鈕下載 PNG。開啟: 網關傳遞 ["html", "pdf", "charts"],bundleChartPngs 通過無頭 playwright 把每張圖渲染為 <dir>/charts/<id>.png,HTML 嵌入 <img> 標籤。適用於離線分發或 echarts CDN 不可達的場景;代價是圖表變成靜態截圖,喪失交互。被 apps/agent/src/gateway/api.ts handleChatStream 的深度研究分支消費。 |
Point-in-time 財務快照
| 變量 | 默認值 | 用途 |
|---|---|---|
SEC_USER_AGENT | 未設置 | 查詢 SEC EDGAR 時必填。使用 ProductName [email protected],讓 SEC 可以識別並聯系運營方。未設置時,shadow 和 enforce 模式都會停用 PIT 快照構建。 |
PIT_FINANCIAL_SNAPSHOT_MODE | shadow | data.pitFinancialSnapshots.mode 的啟動後備值:off 保留舊 Fundamentals 流程,shadow 構建並記錄快照但繼續使用舊輸入,enforce 將 PIT 快照和 Fundamentals 分析緩存設為權威輸入。Settings 中的偏好設置優先。 |
歷史快照只接納 SEC accepted time 不晚於請求截止時間的事實。FMP 數據只有在確定性匹配 SEC filing 後才能補充事實。Yahoo 當前摘要、市值、板塊、行業、TTM 數值和 DCF 始終屬於 latest-only approximation。
行為記憶
設置 BEHAVIOR_MEMORY_ENABLED=true 後才會開始採集。分類開關彼此獨立;資產上下文、交易和對話仍需顯式開啟。系統不保存請求/聊天正文、密鑰、地址、訂單參數或單項持倉。
| 變量 | 默認值 | 用途 |
|---|---|---|
BEHAVIOR_MEMORY_ENABLED | false | 採集總開關 |
BEHAVIOR_MEMORY_CAPTURE_{ENGAGEMENT,FEATURE_USAGE,CONFIGURATION,AUTOMATION,STRATEGY} | true | 非敏感採集分類 |
BEHAVIOR_MEMORY_CAPTURE_{FINANCIAL_CONTEXT,TRANSACTION,CONVERSATION} | false | 敏感聚合分類選擇性開關 |
BEHAVIOR_REFLECTION_ENABLED / BEHAVIOR_REFLECTION_INCLUDE_IN_MEMORY | true / false | 行為反思與受限對話記憶橋接 |
BEHAVIOR_REFLECTION_CUSTOM_PROMPT | 空 | 僅用於反思的指導,最多 1,000 字符 |
BEHAVIOR_MEMORY_RAW_RETENTION_DAYS / BEHAVIOR_MEMORY_MAX_MB | 90 / 128 | 保留期與 SQLite 軟上限 |
BEHAVIOR_MEMORY_BATCH_SIZE / BEHAVIOR_MEMORY_BATCH_KB / BEHAVIOR_MEMORY_FLUSH_MS / BEHAVIOR_MEMORY_QUEUE_MAX | 256 / 256 / 500 / 10000 | 緩衝寫入限制 |
BEHAVIOR_MEMORY_PRESSURE_FREE_MB / BEHAVIOR_MEMORY_CRITICAL_FREE_MB / BEHAVIOR_MEMORY_DISK_CHECK_MS | 5120 / 1024 / 60000 | 磁盤 GC、暫停與檢查閾值 |
添加新環境變量的檢查清單
合併前請完成:
- 選定歸屬:preferences schema、API-key / messaging 登錄表,或 infra schema(不屬於 prefs/secrets 登錄表時加
exempt) - 呼叫端透過
prefs.get/secrets.*/infra.get讀取,而不是process.env.<NAME> - 在
apps/agent/src/config/env-docs/sections/對應章節添加說明塊(用途、消費者、何時設置、未設置時的默認值、值格式) - 對於域技能:設置
requires_env: ["<NAME>"],使技能在憑據缺失時自動隱藏 - 對於工具:工廠函數在變量缺失時返回
[](啟動時絕不拋錯) - 變量名遵循約定
<PROVIDER>_API_KEY/<PROVIDER>_TOKEN/<PROVIDER>_<FIELD>: 大寫下劃線命名法,提供商前綴優先 - 任何地方都未提交真實密鑰值