MINARA

环境变量

Agent 如何使用密钥,以及添加新变量的约定

本页介绍 minara-agent-v2 加载环境变量的约定,以及引入新变量所需的步骤。每个变量的详细参考(包括默认值、格式、使用方文件,以及未设置时的影响),请参阅 参考 → 环境变量

标准模板位于项目根目录的 .env.example。请保持该文件与两个页面同步。

MINARA_ 前缀专用于 Minara 平台专属变量 (MINARA_API_KEYMINARA_BASE_URLMINARA_SKIP_FUND_CONFIRMMINARA_DATA_DIRMINARA_OPENAI_BASE_URLMINARA_OPENAI_CHAT_PATH)。Agent 循环基础设施变量(网关、日志、 模型、场景、记忆配置)不使用该前缀。

用户可见开关写入 Settings(settings.json#preferences)。密钥写入 credentials.json(设置 → API Keys / 消息)。调用方读 prefs.get / secrets.* / infra.get。Env 是启动时的运维层,以及覆盖链上的文档化回退。

TL;DR 约定

任何需要 API 密钥、secret、token 或可覆盖 URL 的新技能或工具,必须:

  1. 写入正确的存储,再通过 façade 读取。 密钥走 API-key / messaging 注册表和 secrets.dataSource / secrets.messaging。用户开关走 preferences schema 和 prefs.get。运维基础设施(GATEWAY_PORTMINARA_DATA_DIR)走 config/infra/schema.tsinfra.get。严禁硬编码密钥;严禁通过 CLI 参数传入并回显。

  2. 在同一次提交中,将有详细说明的条目追加到 apps/agent/src/config/env-docs/,再生成 .env.example 条目须说明:控制的内容、消费它的技能/工具、运营商何时需设置、未设置时的默认行为,以及可接受的值格式。仅有一行存根(# FOO_KEY=)的条目会被拒绝。

  3. 对于领域技能apps/agent/src/skills/builtin/*.tsapps/agent/src/skills/external/<id>/),在 requires_env 中声明该变量,以便 SkillRegistry 在凭据缺失时完全隐藏该技能:

    export const myNewSkill: DomainSkill = {
      id: "research.my_provider",
      // ...
      requires_env: ["MY_PROVIDER_API_KEY"],
    };
  4. 对于工具apps/agent/src/tools/*.ts),当密钥缺失时,工厂函数应返回空的 ToolEntry[]。工具注册表会静默排除未注册的名称,因此下游技能中的 tool_names 引用会优雅降级:

    export function createMyProviderTools(): ToolEntry[] {
      const apiKey = secrets.dataSource("MY_PROVIDER_API_KEY");
      if (!apiKey) return [];
      // ...
    }
  5. 严禁提交真实密钥。 .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_KEYsk-ant-...主要 Claude 凭证。未设置时依次回退到已存储的 OAuth、再到 OpenRouter。
OPENROUTER_API_KEYsk-or-...备用多模型路由器。仅在 Anthropic 路径均失败时尝试。
OPENAI_API_KEYsk-...图像生成、KB embedding、TTS 以及(可选)LLM。仅设置此变量不会自动选 OpenAI 作为 LLM::需运行 minara auth login openai --api-key $OPENAI_API_KEY 才启用 LLM 路径;图像、音频、KB 工具仍会直接使用此变量。
OPENAI_BASE_URLhttps://api.openai.com/v1URLOpenAI API 基础 URL 的可选覆盖::用于 Azure 兼容网关或企业代理。
OPENAI_ORG_IDorg-...计费路由的可选 OpenAI-Organization 头。
XAI_API_KEY不透明字符串原生 xAI(Grok)LLM provider 密钥::通过 xai-api-key provider 直接调用 api.x.ai/v1。在 auto-select 中优先级最低;不会取代既有 Anthropic/OpenRouter 配置。
XAI_BASE_URLhttps://api.x.ai/v1URLxAI API 基础 URL 的可选覆盖。
MINARA_XAI_OAUTH_CLIENT_IDxAI Grok-CLI 公共 idUUID覆盖发送到 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_ENABLEDtruetrue | false主开关。设为 false 后所有 agent 表面都不开启 thinking(非原生模型的手动开关仍然显示,但 prefix 也不会生效)。
THINKING_BUDGET_TOKENS4000正整数单次 LLM turn 的 thinking token 上限。Anthropic 只对模型实际用掉的 tokens 计费。
INSTITUTION_THINKING_BUDGET_TOKENSTHINKING_BUDGET_TOKENS正整数仅作用于机构模式角色调用的覆盖值。便于在不抬高全局默认的情况下给多 Agent 流水线更多推理空间。
DEEP_RESEARCH_THINKING_BUDGET_TOKENSTHINKING_BUDGET_TOKENS正整数同上模式,作用于 deep-research 综合阶段。

web_search / web_extract 后端

web_searchweb_extract 共用一个后端。模型不能选择 provider。按可用性取第一个:Tavily → Firecrawl → Exa(本地 EXA_API_KEY 或已登录的平台 exaPassthrough)。没有链式回落,没有 DuckDuckGo / Google / Brave / Anthropic 原生路径,也没有 HTML 抓取提取。空结果和 HTTP 错误留在当前后端。

变量默认值格式效果
TAVILY_API_KEYTavily API key最高优先级。失败不会回落到 Firecrawl 或 Exa。注册地址 https://tavily.com。
FIRECRAWL_API_KEYFirecrawl API keyTavily 不可用时的搜索 + 干净 markdown 抽取。免费额度 500 credits/月。注册地址 https://www.firecrawl.dev/app/api-keys。
EXA_API_KEYExa API keyTavily 与 Firecrawl 都不可用时使用。有本地 key 时直接调用;未设置时,已登录会话仍走平台透传。注册地址 https://dashboard.exa.ai/api-keys。

Minara 核心

变量默认值格式效果
MINARA_API_KEY不透明字符串Minara REST 凭证。未设置时回退到已保存的 OAuth 配置(Web UI 登录)。
MINARA_BASE_URLhttps://api.minara.ai绝对 URL后端 API 源。只在指向 staging 环境或本地 mock 时覆写。
MINARA_FRONTEND_BASE_URLhttps://minara.ai绝对 URLWeb 前端源。终端超链接和深度研究报告中的 token:// / address:// 深度链接会指向此地址。指向 staging 前端或本地 Next.js dev server 时覆写。
AGENT_MODELclaude-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/filesURL 或路径公开文件链接前缀(反向代理后面)。
OFFLINE_MODE1/true/yes/on对沙盒工具强制禁用出站 HTTP。
LOG_LEVELinfodebug|info|warn|error日志阈值。debug 安全但日志量约为原来的 4 倍。

HTTP 网关

变量默认值格式效果
GATEWAY_HOST127.0.0.1IP / 主机名绑定接口。回环地址 = 仅本地;非回环需要身份验证(守卫在交互模式下拒绝启动,或在 Docker/CI 模式下自动生成 token)。
GATEWAY_PORT8080整数网关绑定的 TCP 端口。
GATEWAY_AUTH_TOKEN不透明字符串每个 /v1/... 路由的 Bearer token。在回环地址上未设置时认证禁用;在非回环绑定上未设置时,token 将被自动生成或启动被拒绝。
MINARA_ALLOW_INSECURE_BIND1/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_MODEshadowoff / 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_MODEsampledoff|sampled|onA/B 观测记录器。在分类器 / 记忆快照 / 角色提示词决策点将(当前、提议)变体对写入 shadow_runs SQLite 表。
SHADOW_SAMPLE_RATE0.1[0, 1]SHADOW_MODE=sampled 时的采样概率。
SHADOW_RETENTION_DAYS30正整数shadow_runs 行的保留天数。启动时执行一次性清理。
MEMORY_SNAPSHOT_PREF_LIMIT50非负整数会话记忆快照中 preference 类别行的配额。
MEMORY_SNAPSHOT_STRAT_LIMIT30非负整数strategy 类别行的配额。
MEMORY_SNAPSHOT_TRADE_LIMIT50非负整数trade_note 类别行的配额。
MEMORY_SNAPSHOT_OBS_LIMIT30非负整数observation 行的基础配额。pref / strategy / trade 桶中未用完的槽位会溢出到此桶。
MEMORY_REFRESH_WRITES3非负整数触发软快照刷新的"自上次重建以来写入次数"阈值。
MEMORY_REFRESH_TURNS10非负整数触发软快照刷新的"自上次重建以来轮次数"阈值。两个阈值须同时满足(AND)才触发会话中重建。设为 0 可完全禁用刷新(快照在会话内冻结)。
MEMORY_WRITE_MAX_LEN2000正整数(200–8000)agent 通过 memory_write 保存记忆(observation / preference / trade_note / strategy)时保留的最大字符数。超长内容在写入前被截断,避免单条过大记忆撑爆提示词或搜索索引。也可在运行时通过 memory.writeMaxLen 偏好项调整。更严格的个性化事实路径有自己更短的限制,不受影响。
KNOWLEDGE_BUDGET_TOKENS15000非负整数场景 playbook + 记忆上下文 + 角色提示词合并 token 数上限。超出时按优先级从低到高截断(角色 → 记忆 → 场景)。0 禁用上限。设置 DISABLE_KNOWLEDGE_BUDGET=1 可完全绕过截断。
KNOWLEDGE_SOURCE_TAGSfalsetrue|false在每个动态知识块前加 HTML 注释来源标签。仅供人工 / 日志审计使用。
PREFERENCE_LEARNING00/1M2 偏好演化流程的主开关(定期 LLM 提议器 + 聊天内毕业卡)。为 0 时,M1 PreferenceStore 及 REPL/CLI/REST 手动管理仍可用;提议器不触发,也不注入毕业卡。
PREFERENCE_PROPOSER_INTERVAL30正整数连续两次提议器触发之间的轮次数。fire-and-forget 异步方式运行,提议器在用户可见响应发送之后运行,因此这是摊销成本,不影响用户延迟。
PREFERENCE_WEEKLY_QUOTA3正整数任意滚动 7 天窗口内允许的最大毕业次数。达到上限后提议器跳过本周期。手动 /preferences approve 可绕过该配额。与 AutoClaw 的"每周 1-3 次深度演化"原则一致。
PREFERENCE_DEDUP_THRESHOLD0.85[0, 1]TF-IDF 余弦相似度分数阈值;超过该值时候选被视为与现有活跃偏好(状态 ∈ active/proposed/deprecated)重复,并在持久化前丢弃。
PREFERENCE_PROPOSER_BATCH_SIZE200正整数单次提议器 LLM 调用中拉取的最近候选最大数量。
PREFERENCE_MIN_CLUSTER_SIZE3正整数(≥ 2)提议器 LLM 报告单个聚类所需的最少支持候选消息数,低于此数量的提议不会持久化。下限为 3,防止单例进入队列。
PREFERENCE_ASK_COOLDOWN_HOURS24正整数同一偏好连续发起毕业询问的最小间隔小时数。用户选择"稍后"或无回复后,该行保持 proposed 状态,但在窗口结束前从询问队列中隐藏。
PREFERENCE_ASK_MIN_GAP_TURNS5正整数同一 REPL 会话内对不同偏好连续发起毕业询问之间的最小轮次数。防止卡片连续弹出。
PREFERENCE_SKIP_IN_CHAT_ASK00/1完全禁用聊天内毕业卡。提议器仍会运行并写入提议;运营商通过 /preferences pending + approve(REPL/CLI/REST)审核。
PREFERENCE_HARD_AUTO_ACTIVATE10/1M3。开启时,用户消息命中强信号关键词(never绝不kill switch 等)会自动激活 hard_constraint,无需弹卡。用户在 24 小时内可通过 /preferences undo <id> 撤销。
PREFERENCE_STYLE_AUTO_ACTIVATE10/1M3。对同一 dedup_key 观察 N 次后静默自动激活 personal_style 偏好。卡片保留给影响更大的偏好。
PREFERENCE_STYLE_MIN_OBSERVATIONS2正整数M3。样式自动激活前需要的相同陈述观察次数。值越高,用户自我矛盾的机会越多。
PREFERENCE_HARD_UNDO_WINDOW_HOURS24正整数M3。强信号自动激活后用户仍可执行 /preferences undo <id> 的时间窗口。超出此窗口的行须使用 /preferences deprecate
MINARA_SKIP_FUND_CONFIRM1/true/yes/on绕过所有涉及资金工具的确认门控。仅限非交互式场景。
DISABLE_SCRIPT_RISK_GATE1/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_HOURS24[1, 720] 范围内的整数持久化在 <dataDir>/sandbox/files/.tool-results/ 下的超大工具结果的存活小时数,超时后由周期性清理删除。合规 / 季度审查窗口可设为 168(7 天);临时 CI 运行可设为 1。格式错误或超范围的值回退到 24 小时并写入 warn 日志。

混合记忆检索

EMBEDDING_PROVIDER=disabled(默认)时,混合搜索代码路径不活跃:所有记忆行的 embedding_state 保持 'pending'embedding 列为 NULLsearchMemoriesHybrid 直接回退到现有的 FTS5 BM25 路径,结果字节完全一致。运营商仅在需要跨词汇召回提升时启用(例如中文查询 山寨币最近怎么样 检索英文 altcoin drawdown 知识)。写入路径保持同步,embedding 在行提交后通过 queueMicrotask 异步进行,不影响用户侧延迟。

变量默认值格式效果
EMBEDDING_PROVIDERdisableddisabled|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_DIM1536正整数向量维度。用于启动时声明 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() 补填。failedpending 均可补填,同一行可能循环,直到成功 embedding 后状态变为 embedded。短于 10 个字符的行,或触发方法论注入扫描器的行,状态为 skipped,永远不会 embed。

回测反馈循环(Sprint 6:在线结果填充器)

周期性任务,用于闭合符合条件执行的学习循环。它计算确定性的交易后市场结果("+5.20% in 24h"),持久化结果,再运行可选的推理评价。统一 Trading Memory 的来源规则会先执行:自动或来源未知的 perps 不会进入人工评价链路。

不会重新执行历史决策。 仅评价 trade_executions 中已有的 pending 行。开启后,gateway 启动时会先立即处理逾期任务,再进入固定间隔。默认暗部署(BACKTEST_ENABLED=false)。

变量默认值格式效果
BACKTEST_ENABLEDfalsetrue|false主开关。false 时运行器和调度器均不注册(零运行时开销)。true 时调度器每 BACKTEST_CRON_HOURS 小时触发一次。
BACKTEST_DRY_RUNfalsetrue|false试运行:计算结果,输出到 shadow_runs(facet='backtest_outcome'),但跳过 updateTradeOutcomerecordUsage。适用于第一周上线协议。
BACKTEST_MIN_TRADE_AGE_MS86400000(24 小时)正整数(毫秒)交易进入评估资格前的最小存活时间。传入 ReviewEngine.minTradeAgeForEvalMs
BACKTEST_OUTCOME_HORIZON_HOURS24正整数(小时)created_at 后多少小时采样结果价格。渲染在结果字符串中,让评估器看到窗口长度。
BACKTEST_BATCH_LIMIT20正整数每次触发拉取的最大待处理行数。传入 ReviewEngine.maxEvalsPerBatch
BACKTEST_CRON_HOURS24正数调度器间隔。使用 setInterval().unref()。小于 1 分钟的值会被向上截断。
BACKTEST_PRICE_PROVIDERautoauto|hyperliquid|yahoo强制使用单一历史价格数据源。auto 路由:加密货币走 Hyperliquid,再 Yahoo -USD;股票/未知走 Yahoo;稳定币为 1.0。
BACKTEST_MAX_COST_USD_PER_RUN2.00非负浮点数单次运行费用上限。运行器在运行前后快照 BudgetTracker.getDailySpend("learning");超出时以 status=stopped_budget 停止。0 表示禁用。与 BudgetTracker 的日 / 月上限叠加计算。
LEARNING_RECORD_USAGEfalsetrue|false归因验证通过后,开启实时推理质量与方法论反馈。已归因交易通过 methodology_observations 和 promoted benchmark run 更新;runner 不再批量增加旧 Wilson 计数。建议在 shadow 行干净后最后开启。

上线协议(plan dapper-coalescing-shell §Sprint 6):

  1. 设置 BACKTEST_ENABLED=trueBACKTEST_DRY_RUN=true,运行一个 cron 周期。检查 shadow_runs WHERE facet='backtest_outcome',确认结果字符串符合 ±N.NN% in Xh 格式,跳过原因合理。
  2. BACKTEST_DRY_RUN 翻转为 false。Runner 开始向 trade_executions 写入确定性 outcome 和终态;evaluation run 与 observation 保持追加写入。
  3. 只有归因干净后才开启 LEARNING_RECORD_USAGE=true。按 profile version 监控 evaluation_runsmethodology_observationsmethodology_metric_stats;只有 promoted primary run 影响新统计。

个性化重建(M3.2 事件驱动阈值)

Minara 通过 PersonalizationRebuilder 从每次对话中学习交易偏好。M3.2 之前,重建器每 10 分钟在冷却后运行一次。M3.2 将其改为事件驱动加阈值门控:数据写入(交易、记忆、聊天轮次)触发事件唤醒重建器;每次重建须通过两个独立门控,即最少新输入数量自上次重建以来的最小经过时间。两个门控须同时满足,缺一不触发。

60 分钟安全网调度器仍然存在,用于覆盖丢失的事件(如写入与其订阅者之间进程重启),但在安静的系统上产生零 LLM 调用和零 info 日志。

交易摘要阈值

变量默认值格式效果
FIN_PROFILE_TRADING_SUMMARY_MIN_NEW_TRADES3正整数自上次重建以来的最少新交易数,满足后门控 2 才允许交易摘要重建。
FIN_PROFILE_TRADING_SUMMARY_MIN_INTERVAL_MIN30正整数,分钟自上次重建以来的最小经过时间。
FIN_PROFILE_TRADING_SUMMARY_MAX_TRADES100正整数冷启动 / 强制重新生成时传入 LLM 的交易数上限。
FIN_PROFILE_TRADING_SUMMARY_INCREMENTAL_MAX_TRADES50正整数将已有摘要增量合并时传入 LLM 的新交易数上限。

如果交易频率导致摘要频繁更新,可提高阈值;如需在回测或新手引导期间尽快收敛,可降低阈值。

记忆提取阈值

变量默认值格式效果
FIN_PROFILE_MEMORIES_MIN_NEW_TURNS5正整数自上次提取以来需记录的最少新聊天轮次数,满足后 rebuildMemories 才运行。
FIN_PROFILE_MEMORIES_MIN_INTERVAL_MIN10正整数,分钟自上次记忆提取以来的最小经过时间。
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_typeattributed_toentities_jsonlinked_memory_ids 元数据。

共享配置项

变量默认值格式效果
FIN_PROFILE_EVENT_DEBOUNCE_SEC30正整数,秒scheduleCheck(dim) 的防抖窗口。将快速连续的写入合并为一次门控检查后的重建。
CHAT_TURN_RECORDING1(开启)0/false/no/off 表示禁用将每轮的 (user_message, final_response, tool_calls) 持久化到 chat_turnsrebuildMemories 的输入来源,禁用后无数据可提取。

运营提示: 在全新部署时,将 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_DAYS90正整数,天滚动同步窗口。超过此窗口的记录永远不会被拉取。
FIN_PROFILE_HISTORY_SYNC_MIN_INTERVAL_MIN5正整数,分钟连续同步触发之间的节流下限。窗口内的多次 scheduleSync() 调用会合并为一次。
FIN_PROFILE_HISTORY_SYNC_TIMEOUT_SEC8正整数,秒每次 syncAll() 的硬超时。通过 AbortController 取消进行中的 HTTP 请求。
FIN_PROFILE_HISTORY_SYNC_PAGE_HINT500正整数,行perps fills 端点的"页面可能满"启发式判据。当 getPerpSubAccountFills 返回 ≥ 此值时,同步器会前移 startTime 再次请求。
FIN_PROFILE_HISTORY_SYNC_OVERLAP_SEC60正整数,秒在可能被截断的页面前移 startTime 时的重叠时间。fill_uid 去重让重叠变得无害。
FIN_PROFILE_HISTORY_SYNC_MAX_ROUNDS_PER_SUB10正整数每个子钱包截断滚动循环的硬上限。
FIN_PROFILE_HISTORY_SYNC_MAX_FAILURES5正整数单个 (source, sub_account_id) 的连续失败阈值。达到/超过后,正常调度中跳过该键。
FIN_PROFILE_HISTORY_SYNC_FAILURE_COOLDOWN_MIN30正整数,分钟达到 MAX_FAILURES 后,下次探测尝试受此冷却控制。探测成功重置计数器;失败累加。防止永久冻结。
FIN_PROFILE_HISTORY_SYNC_SPOT_MAX_PAGES20正整数spot 分页循环的硬上限。
FIN_PROFILE_HISTORY_SYNC_SPOT_PAGE_SIZE100正整数spot 分页批次大小,作为 limit 转发给 Minara。
FIN_PROFILE_TRADING_SUMMARY_PERPS_RECENT_FILLS30正整数LLM 重建读取的最新 perps fills 数量。聚合数据始终全量发送。
FIN_PROFILE_TRADING_SUMMARY_SPOT_RECENT_ACTIVITIES20正整数同上,针对 spot。
FIN_PROFILE_TRADING_SUMMARY_AGGREGATE_WINDOW_DAYS90正整数,天喂给 LLM 的 per-symbol / per-pair 聚合窗口。
FIN_PROFILE_MEMORY_SOFT_DELETE_RETENTION_DAYS30正整数,天软删除记忆的可恢复保留期。超过后,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_DISCOVERY1/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_ITER3正整数,截断至 [1, 10]每次基准测试运行中离线代码生成子 Agent"生成代码 → 临时回测 → 精炼"循环的步数预算。子 Agent 运行到该步数;模型在此预算内自行决定何时回测、何时停止。返回时,成功状态根据最终回测重新计算(status COMPLETED 且非零交易且回撤 < 0.95)。使用快速/廉价 llmClient(如 Haiku)且希望更好收敛的运营商可提高此值;使用慢速/昂贵模型时可降低(1-2)。由 runStrategyCodeSubagentapps/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_ROUNDS1整数,截断至 [1, 5]第 2 阶段多空交替轮次数。1 轮 = 2 次发言(一次多方 + 一次空方)。与 TradingAgents 的 max_debate_rounds: 1 一致。需要额外对抗性审查时可调至 2;常规分析保持 1。由 runInstitutionapps/agent/src/tools/institution/orchestrator.ts 中消费。
INSTITUTION_MAX_RISK_ROUNDS1整数,截断至 [1, 5]第 5 阶段激进 → 保守 → 中性轮转轮次数。1 轮 = 3 次发言。与 TradingAgents 的 max_risk_discuss_rounds: 1 一致。
INSTITUTION_WALL_CLOCK_TIMEOUT_MS1200000整数毫秒,截断至 [60000, 1800000]单次 minara_institution_analyze 调用的硬性挂钟时间上限。超出时,编排器短路并返回已完成的阶段结果加 meta.truncated: true。单次 LLM 调用的超时由 INSTITUTION_PER_CALL_TIMEOUT_MS 控制,且不超过此挂钟时间。单次调用上限从 60 秒提高到 300 秒后同步上调;如需恢复旧的快速失败行为,可将两个配置项一起调回。
INSTITUTION_PER_CALL_TIMEOUT_MS300000整数毫秒,截断至 [5000, INSTITUTION_WALL_CLOCK_TIMEOUT_MS]流水线中每次子 Agent 调用(分析师、辩论参与者、管理层、结构化重试)的单次 LLM 调用超时。分析师需要调度 2-3 个数据工具并在单次子 Agent 循环中写出结构化 AnalystReport,通常超过 60 秒上限;旧的 wallClock / 10 推导方式会在写入中途中止。使用快速模型时可降低(如 60000)以快速失败;使用慢速深度模型时可提高(如 600000),同时相应调高挂钟上限。
INSTITUTION_MAX_OUTPUT_TOKENS_PER_TURN4096整数,截断至 [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_runsinstitution_role_outputsinstitution_reflections),针对仍持有的仓位运行多窗口 Phase B 反思阶梯(1d/7d/30d/90d/180d/365d),并在每次新机构调用前对陈旧的历史运行写入"懒加载"反思(Phase 0 回顾刷新)。以下所有变量均为 Agent 循环基础设施,按项目约定无 MINARA_ 前缀。

变量默认值格式效果
INSTITUTION_LEARNING_ENABLEDonon | offv2 持久化主开关。为 off 时,捕获钩子为空操作,institution_* 表保持空。生产环境保持开启;持久化的行为后续 Phase B 反思和方法论毕业提供输入。由 captureInstitutionRunapps/agent/src/learning/institution/capture-hook.ts 中消费。
INSTITUTION_RETROSPECT_ENABLEDonon | offPhase 0 懒加载刷新主开关。开启时,每次新机构调用会遍历同一(ticker, asset_class)的近期运行,并对最新反思已陈旧的运行写入 lazy_refresh 反思。标准每日 cron 不受影响,继续运行。
INSTITUTION_RETROSPECT_LIMIT10整数,截断至 [1, 50]Phase 0 历史深度。每个(ticker, asset_class)最多查询的历史运行数。多标的频繁用户可降低(3-5)以限制单次调用延迟;反思上下文比新鲜度更有价值时可提高(20+)。
INSTITUTION_RETROSPECT_TIMEOUT_MS120000正整数毫秒Phase 0 挂钟时间上限。有效超时为 min(此变量, INSTITUTION_WALL_CLOCK_TIMEOUT_MS / 2),下限 5 秒,保证当第 1 阶段开始时,编排器(第 1-6 阶段)仍有至少 50% 的声明挂钟预算。
INSTITUTION_LAZY_REFRESH_STALE_HOURS24整数,截断至 [1, 168]历史运行的最新反思被视为陈旧(可懒加载刷新)的小时数阈值,以 evaluated_at 为准。
INSTITUTION_LAZY_REFRESH_DEDUPE_HOURS6整数,截断至 [1, 48]同一运行连续两次 lazy_refresh 写入之间的最小小时数。防止 10 分钟内多次调用 /institution BTC 产生冗余反思。
INSTITUTION_AUTO_STALE_DAYS90整数,截断至 [30, 365]open 状态的运行在未最终确认的情况下超过此天数后,自动晋升为 auto_stale。auto_stale 运行继续接收 Phase B 反思,但在 PM 的 past_context 注入中权重降低。
INSTITUTION_BENCHMARK_CRYPTOBTC代码加密资产类别的 alpha 基准。Phase B 反思计算 alpha = raw_return - benchmark_return。设为已配置价格源能解析的标的。
INSTITUTION_BENCHMARK_STOCKSPY代码股票/指数的 alpha 基准。
INSTITUTION_BENCHMARK_FOREXDXY代码外汇对的 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_PREFLIGHTfalsetrue | false对所有 ticker 都跑规范预解析,而不只是 classifyAsset === "unknown" 的情况。便于 ops 验证;少量延迟开销(缓存命中约 50ms,未命中约 200-500ms)。
CANONICAL_ASSET_CACHE_TTL_RESOLVED_DAYS30正整数天数outcome: "resolved"(单一规范 chain+contract 或 native+chain)的 TTL。
CANONICAL_ASSET_CACHE_TTL_MULTI_DAYS14正整数天数outcome: "multi"(多链部署,如 USDC 在 20 条链上)的 TTL。比 resolved 短,因为用户消歧可能会固定到具体某条链。
CANONICAL_ASSET_CACHE_TTL_AMBIGUOUS_DAYS7正整数天数outcome: "ambiguous"(多个 provider 给出不一致结果)的 TTL。短一些,等数据收敛后重新解析。
CANONICAL_ASSET_CACHE_TTL_NONE_DAYS1正整数天数outcome: "none" 的 TTL。非常短,因为 provider 每日更新数据,应尽快再次尝试而不是缓存空结果。
CANONICAL_ASSET_CACHE_TTL_USER_DAYS365正整数天数用户提供条目(通过 minara assets pin 或 banner CTA 的操作员覆写)的 TTL。Pin 条目优先于 provider 解析。
CANONICAL_ASSET_CACHE_FALLBACK_TO_EXPIREDtruetrue | false实时聚合失败(所有 provider 宕机或限流)时,返回带 from_expired_fallback: true 标记的过期缓存条目,而不是直接报告 outcome: "none"

方向感知评分。 Phase B 记录的 raw_return 对做空仓位取反,对持平决策归零(在下跌标的上盈利的做空记录正收益,而非负收益)。做多或未指定方向的仓位直接透传。详见 reflect.ts applyDirection()

可重试的数据中断。 标准窗口评估在价格获取失败时写入 data_unavailable 占位符;下次 cron 执行时,一旦价格恢复,该占位符会被 UPSERT 为 oknextDueStandardWindowstatus='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_ENABLEDfalsetrue|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_ENABLEDfalsetrue|false主开关。false 时钩子立即返回,跳过预过滤和 LLM 调用。
DECISION_SUMMARIZER_MODELclaude-haiku-4-5-20251001模型 id用于提取决策 JSON 的模型。覆盖率 < 70% 时切换为 Sonnet。
DECISION_SUMMARIZER_TIMEOUT_MS15000正整数单次调用超时(毫秒)。超时会丢弃该行并记录警告;不重试。
DECISION_CAPTURE_SYNC_MODEfalsetrue|false在摘要器返回前等待。仅用于确定性测试 : 会增加轮次延迟。
DECISION_CAPTURE_HEURISTIC_ENABLEDtruetrue|false二级:捕获响应包含 BUY/SELL 关键词 + 资产代码的轮次,就算未激活建议场景。
DECISION_CAPTURE_UNIVERSAL_SCANfalsetrue|false三级:对每个轮次调用摘要器。仅供诊断使用 : 摘要器成本约增加 4 倍。

阶段 2 : 多周期回测 + 幻觉检查

定时任务填充 decision_outcomes 表,记录 1 天、3 天、1 周、1 月的收益。填充前,系统对比 agent_quoted_price 与历史实际价格;偏差超过 HALLUCINATION_MAX_PRICE_DELTA_PCT 时,该决策被标记并排除在下游学习外。

变量默认值格式效果
DECISION_BACKTEST_ENABLEDfalsetrue|false主开关。关闭时定时任务不启动,无 cron 计时器。
DECISION_BACKTEST_DRY_RUNfalsetrue|false计算结果但写入 shadow_runs(facet='decision_outcome') 而非 decision_outcomes/decision_history。第 1 周灰度发布。
DECISION_BACKTEST_HORIZONS1d,3d,1w,1mCSV周期列表。每个周期对应一行决策。最长周期决定待处理决策何时可参与计算。
DECISION_BACKTEST_CRON_HOURS24正整数定时任务调用间隔(小时)。
DECISION_BACKTEST_MAX_AGE_DAYS60正整数超过此天数的待处理决策被跳过(积压防控)。
HALLUCINATION_MAX_PRICE_DELTA_PCT0.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_THRESHOLD0.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_ENABLEDfalsetrue|falseBO 周期总开关。
METHODOLOGY_TUNING_CRON_DAYS7正整数周期调用间隔(天数)。
METHODOLOGY_TUNING_MAX_BUCKETS_PER_CYCLE10正整数每个周期处理的 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_REL0.05十进制数BO 后检查 #1 :: 测试集均值奖励必须超过基准值的百分比。
METHODOLOGY_TUNING_MAX_SENSITIVITY_DROP_10PCT0.5十进制数 (0, 1]BO 后检查 #2 :: 若 ±10% 邻域得分下降超过此值,拒绝接受。
METHODOLOGY_TUNING_PARAM_BOUND_REL0.5十进制数BO pbounds 半宽度,为模板默认值的分数。
METHODOLOGY_TUNING_MIN_CAPTURE_CONFIDENCE0.3十进制数 [0, 1]BO 回放仅考虑 capture_confidence ≥ 此值的决策。

推出顺序:

  1. DECISION_CAPTURE_ENABLED=true :: 开始录制建议轮次。
  2. 等待约 30 天收集数据。
  3. DECISION_BACKTEST_ENABLED=true + DECISION_BACKTEST_DRY_RUN=true :: 影子模式运行 1 周。
  4. DECISION_BACKTEST_DRY_RUN=false :: 实时回测写入。
  5. 检查 minara learning stats 报告 READY_FOR_BO=true
  6. METHODOLOGY_INSTANCE_TUNING_ENABLED=true :: 激活 BO 周期。
  7. Instance dispatch 默认启用;保持 DISABLE_METHODOLOGY_INSTANCE_DISPATCH 未设置。

内置工具

每一行都是可选的。缺少变量会静默禁用相应功能。

变量效果
TAVILY_API_KEY默认的 web_search / web_extract 后端。
FIRECRAWL_API_KEYTavily 不可用时启用 web_searchweb_extract
EXA_API_KEYTavily 与 Firecrawl 都不可用时启用 web_searchweb_extract(本地 key 或登录后的平台透传)。
FAL_KEY启用 Fal.ai 图像 / 视频模型。
MESSAGING_DEFAULT_PROVIDERsend_message 省略 provider 时使用的提供商 id(如 telegramslack)。可选 : 未设置时采用首个已配置提供商。
MESSAGING_MAX_ATTACHMENT_BYTESsend_message({attachments}) 调用中单个附件的大小限制。默认:52 428 800(50 MB)。提供商 API 独立强制执行自身限制。
TELEGRAM_BOT_TOKENTelegram 出站消息。与 TELEGRAM_CHAT_ID 配对。支持流式编辑。
TELEGRAM_CHAT_IDTelegram 数字聊天 id。
TELEGRAM_RICH_TEXT将 Telegram 回复渲染为富文本(HTML,失败时回退 MarkdownV2,再回退纯文本)。默认开启;设为 false 则发送纯文本。
SLACK_WEBHOOK_URLSlack 传入 Webhook URL。最简单的 Slack 路径;无流式传输。
SLACK_BOT_TOKENSlack 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_TOKENDiscord bot token。通过 PATCH /channels/{}/messages/{} 进行流式编辑。与 DISCORD_CHANNEL_ID 配对。
DISCORD_CHANNEL_ID数字 Discord 频道 id。
HASS_URLHome Assistant 基础 URL(如 https://hass.local:8123)。
HASS_TOKENHome Assistant 长期访问令牌。
HASS_NOTIFY_SERVICEHA 通知服务 id(如 mobile_app_you,可带或不带 notify. 前缀)。一次性,无流式传输。
SMTP_HOST出站 SMTP 主机(如 smtp.gmail.com)。email 提供商必需。
SMTP_PORTSMTP 端口(587 STARTTLS,465 SSL)。
SMTP_USERSMTP 身份验证用户名(对于无身份验证的中继可选)。
SMTP_PASSWORDSMTP 身份验证密码 / 应用密码(已脱敏)。
EMAIL_FROM出站邮件中使用的"From"地址。
EMAIL_TOsend_message 省略 channel 时的默认收件人。
GOOGLE_OAUTH_CLIENT_ID一键"Email (Gmail)"连接器(email-gmail 提供商)的 Google OAuth 客户端 ID。也可在 设置 → 消息 中填写。
GOOGLE_OAUTH_CLIENT_SECRETGmail 连接器的 Google OAuth 客户端密钥(脱敏显示)。
GMAIL_REFRESH_TOKEN由"连接 Gmail"流程写入。通过 Gmail API 发信所用的长期令牌(仅 gmail.send 权限,从不读取邮件)。
GMAIL_SENDER_EMAIL由"连接 Gmail"流程写入。发信所用的已授权邮箱地址。
GMAIL_TOemail-gmail 提供商的可选收件人。留空则推送到已连接的收件箱本身。
WHATSAPP_ACCESS_TOKENMeta Cloud API Bearer 令牌。启用 whatsapp 提供商。
WHATSAPP_PHONE_NUMBER_IDMeta 开发者应用中的数字电话号码 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_SECRETTelegram 传入 webhook 的共享密钥。未设置时 /webhooks/telegram 返回 404。
SLACK_SIGNING_SECRETSlack 应用签名密钥,用于传入 webhook HMAC 验证。未设置时 /webhooks/slack 返回 404。
DISCORD_APPLICATION_PUBLIC_KEYDiscord Ed25519 应用公钥(十六进制)。未设置时 /webhooks/discord 返回 404。
WHATSAPP_APP_SECRETMeta 应用密钥,用于 WhatsApp Cloud API 入站 HMAC-SHA256 验证(X-Hub-Signature-256 头)。未设置时 POST /webhooks/whatsapp 返回 404。
WHATSAPP_VERIFY_TOKENWhatsApp Cloud API 的 hub.verify_token,用于一次性 GET 握手时回显。未设置时 GET /webhooks/whatsapp 返回 404。
MESSAGING_INBOUND_TRANSCRIBE在传入语音附件上启用语音转录(通过 OpenAI Whisper)。需要 OPENAI_API_KEY
MESSAGING_VOICE_REPLY收到语音消息时,除流式文字回复外再附带一条语音回复。需要语音服务(ELEVENLABS_API_KEYOPENAI_API_KEY)。
ELEVENLABS_API_KEYElevenLabs 密钥。设置后语音合成与听写优先走 ElevenLabs(延迟更低),OpenAI 作为回退。
VOICE_TTS_PROVIDER指定语音合成服务商:auto(默认)/ elevenlabs / openai
VOICE_TTS_VOICE朗读回复使用的音色 id(主服务商原生 id)。留空用服务商默认。
VOICE_TTS_MODELTTS 模型。ElevenLabs:eleven_v3(默认,最像真人)、eleven_multilingual_v2eleven_turbo_v2_5eleven_flash_v2_5;OpenAI 默认 gpt-4o-mini-tts
VOICE_TTS_STABILITY / VOICE_TTS_SIMILARITY_BOOST / VOICE_TTS_STYLE / VOICE_TTS_SPEAKER_BOOST / VOICE_TTS_SPEEDElevenLabs 朗读默认参数(0-1,speed 为 0.7-1.2,speaker boost 为 1/0)。设置页 → Voice models 的滑块会按用户覆盖。
VOICE_TTS_FAST_FIRST1(默认)/ 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_KEYGlassnode 链上指标。启用 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_PROVIDERkb_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_KEYKB_EMBEDDING_PROVIDER 的认证。未设置时回退到 EMBEDDING_API_KEY
KB_EMBEDDING_MODELKB_EMBEDDING_PROVIDER 的模型 id,需与填充 Qdrant 时所用模型一致。
KB_EMBEDDING_DIM向量维度。常见模型 id 会自动推断;自定义模型时显式设置。
E2B_API_KEY启用 workspace.e2b 云沙盒。

消息平台(扩展集)

在原有七个平台(telegramdiscordslackemailwhatsappsignalhome_assistant)之上新增 11 个 IM 与消费社交平台。每个平台有自己的 env 变量块;任何一项为空都会静默禁用该 provider 的出入站(路由 404,gateway 从运行时映射中剔除)。

详细配置步骤、入站 webhook URL、签名算法见 消息通道 各平台子页。连线凭据最快的路径是 minara auth messaging add(交互式 picker,列出 18 个平台及其当前已配置 / 未配置状态)。

Lark / Feishu

变量效果
LARK_APP_IDLark 应用 id,cli_xxxxxxxxxxxxxxxx。出站必需。
LARK_APP_SECRETLark 应用密钥。用于换取 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_DOMAINopen.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_KEY43 字符 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_KEYStream Mode 应用 key(AppKey / ClientID)。启用客户端外连的 Stream Mode 入站 daemon,通过网关 WebSocket 接收机器人消息,无需公网回调 URL。与 DINGTALK_STREAM_APP_SECRET 配对。
DINGTALK_STREAM_APP_SECRETStream 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_KEY43 字符 EncodingAESKey,用于入站 AES-256-CBC 解密。
WECHAT_OA_DEFAULT_OPENID默认 openid 收件人。客服消息必须在 48 小时交互窗口内。

QQ Bot

变量效果
QQ_BOT_APP_IDBot AppID(数字)。
QQ_BOT_APP_SECRETBot Secret。同时作为入站 Ed25519 签名验证的 seed 来源(重复填充至 32 字节后派生密钥对)。
QQ_BOT_TOKENBot 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_TOKENBot 用户个人访问 token。
MATTERMOST_DEFAULT_CHANNEL_ID出站默认频道 id。
MATTERMOST_OUTGOING_WEBHOOK_TOKENOutgoing-webhook token,与入站 body 中的 token 字段做常量时间比对。仅出站场景可留空。Outgoing webhook 只在公开频道按触发词触发。

Microsoft Teams

变量效果
TEAMS_BOT_APP_IDBot 的 Microsoft App ID GUID。入站 JWT 的 audience(多租户)或 audience + tenant GUID(单租户)。
TEAMS_BOT_APP_PASSWORDBot 的 Microsoft App Password。换取出站 access token(1 小时缓存)。
TEAMS_BOT_TENANT_ID多租户填 common,单租户填 GUID。影响入站 JWT audience 校验。
TEAMS_DEFAULT_CONVERSATION_IDbootstrap fallback 的会话 id。生产代码应从入站 activity 学到 conversation id。
TEAMS_DEFAULT_SERVICE_URLbootstrap 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_URLmacOS 上运行的 BlueBubbles server 公网 URL(通常是隧道)。
BLUEBUBBLES_PASSWORD共享服务器密码。入站采用纯常量时间比对,无 HMAC。
BLUEBUBBLES_DEFAULT_CHAT_GUID默认 chat GUID,如 iMessage;-;+15551234567

Matrix

变量效果
MATRIX_HOMESERVERHomeserver URL(如 https://matrix.org)。
MATRIX_ACCESS_TOKEN长期 bearer。使用 Authorization: Bearer 头;?access_token= query 形式已弃用。
MATRIX_USER_IDBot 用户(如 @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_POLLINGTelegram getUpdates 长轮询。启动时调用 deleteWebhook;游标存于 <dataDir>/telegram-updates.json。webhook 信号:TELEGRAM_WEBHOOK_SECRET
MESSAGING_DISCORD_GATEWAYDiscord Gateway WebSocket。还能投递 Interactions webhook 收不到的普通频道 / 私信消息。需要在 Discord 开发者门户启用特权 Message Content intent。webhook 信号:DISCORD_APPLICATION_PUBLIC_KEY
MESSAGING_SLACK_SOCKETSlack Socket Mode。需要 SLACK_APP_TOKEN。webhook 信号:SLACK_SIGNING_SECRET
MESSAGING_MATTERMOST_WSMattermost v4 WebSocket 机器人。可触达 outgoing-webhook 无法触达的私信和私有频道。webhook 信号:MATTERMOST_OUTGOING_WEBHOOK_TOKEN
MESSAGING_QQ_WSQQ v2 网关 WebSocket。无 webhook 专用密钥(webhook 复用 QQ_BOT_APP_SECRET),故优先使用 daemon;设为 0 改用 webhook。
MESSAGING_DINGTALK_STREAMDingTalk Stream Mode。需要 DINGTALK_STREAM_APP_KEY / DINGTALK_STREAM_APP_SECRETDINGTALK_WEBHOOK_SECRET 用于出站签名而非入站,故不抑制 daemon;设为 0 改用 webhook。
MESSAGING_LARK_WSLark / Feishu 长连接,经官方 SDK。webhook 信号:LARK_VERIFICATION_TOKEN

MCP 集成

变量格式效果
MCP_SERVERSJSON 数组覆盖默认 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_URLURLEVM JSON-RPC 原始子 Agent。
MCP_ETHERSCAN_URLURLEtherscan 风格的区块浏览器(60+ EVM 链)。
MCP_SOLSCAN_URLURLSolscan Solana 区块浏览器。
MCP_GOPLUS_URLURLGoPlus 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_klineget_priceget_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-keyx-cg-demo-api-key
COINGLASS_API_KEYcoinglass 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_searchcap/fmp 命名空间发现的 FMP 公开股票数据工具?apikey= 查询参数(由 apps/agent/src/fmp/client.ts 注入)

原生 prediction.markets 技能是只读的(Polymarket 的公开 Gamma + CLOB 读端点),无需任何环境变量。已下线的 external-polymarket SKILL.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-portfolioexternal-okx-dex-marketexternal-okx-dex-signalexternal-okx-dex-wsexternal-okx-audit-log不在原生 okx-dex 提供商中的 OKX Web3 / DeFi 接口OKX 四变量
external-diagram-designexternal-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_BPS50加权窗口 median ≤ -0.5%(= -50 bps)触发 regime_shift_flagged。值越小越敏感。
METHODOLOGY_SYNTHESIS_FLAG_HIT_RATE0.45加权 hit_rate 低于此值触发 flag。值越大越敏感。
METHODOLOGY_SYNTHESIS_DEMOTE_MEDIAN_BPS200自动降级要求 median ≤ -2% AND 30 天样本 ≥ 10 AND 终身 Wilson > 0.55。
METHODOLOGY_SYNTHESIS_HALFLIFE_DAYS147/30/90/180 天窗口的新鲜度半衰期。越小越对近期数据敏感。
METHODOLOGY_STRESS_THRESHOLD_PCT25黑天鹅熔断器。当一轮 synthesis 中超过 25% 的同向方法论触发自动降级时,抑制级联,改施加临时 factor=0.8。

价格质量(Phase 3 F4.3)

每个资产类别的日内绝对收益上限。7 天窗口按 sqrt(7) 放大。拦截单日 FX 印错、拆股后的价格跳变、退市标的归零等污染 Wilson 的脏数据。

变量默认值备注
METHODOLOGY_PRICE_CAP_MAJOR_CRYPTO0.5日 50%
METHODOLOGY_PRICE_CAP_LAYER_10.5
METHODOLOGY_PRICE_CAP_LAYER_20.6L2 波动更大
METHODOLOGY_PRICE_CAP_DEFI_BLUE_CHIP0.6
METHODOLOGY_PRICE_CAP_MEME_COIN1.0meme 币确实可能日内 100% 波动
METHODOLOGY_PRICE_CAP_STABLECOIN0.02激进 : 稳定币不应日内波动 > 2%
METHODOLOGY_PRICE_CAP_STOCK0.15
METHODOLOGY_PRICE_CAP_INDEX0.1
METHODOLOGY_PRICE_CAP_COMMODITY0.2
METHODOLOGY_PRICE_CAP_FOREX0.05

Case-recorder 维护(Phase 2)

变量默认值效果
METHODOLOGY_HINT_ORPHAN_MS1800000(30 分钟)pending hint 行被 orphan sweeper 标记 orphaned 前的 TTL。应大于 agent 单次合理 turn 时长。

Phase 5 : 跨 turn 桥接 + 调度器

变量默认值效果
METHODOLOGY_LEARNING_CRON_ENABLEDunset(off)启用进程内调度器。设为 1 后 setInterval 自动跑 orphan sweep → 7d 标准归因 → synthesis 全套。
METHODOLOGY_LEARNING_CRON_INTERVAL_MS21600000(6 小时)调度器节奏。clamp 在 [1 分钟, 7 天]
IS_PRIMARY_WORKERunset = 单进程默认 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.log

CLI 表面(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_ENABLED0进程内审计调度器的开关。多 worker 部署同时遵循 IS_PRIMARY_WORKER
METHODOLOGY_AUDIT_CRON_INTERVAL_MS86400000(24h)tick 间隔。运行时夹紧到 [5min, 30d]
METHODOLOGY_AUDIT_WINDOW_DAYS30窗口型维度的回溯窗口。夹紧到 [1, 365]
METHODOLOGY_AUDIT_RETENTION_DAYS90methodology_audit_reports 行的保留期,每个本地日最多裁剪一次。夹紧到 [7, 3650]
METHODOLOGY_AUDIT_SKIP_BUSY_THRESHOLD_MS180000(3min)BusyTracker 报告繁忙或 idle 窗口短于此值时跳过本次 tick。夹紧到 [0, 1h]。设为 0 关闭预检查。
METHODOLOGY_AUDIT_MAX_DEFERRED_TICKS4饥饿守卫。连续推迟达到此值后,下次 tick 无论繁忙状态都强制执行。夹紧到 [0, 100]
METHODOLOGY_AUDIT_YIELD_TIMEOUT_MS60000(60s)pass 内每个让步点等待 idle 的最长时间,超时后无论繁忙状态都继续。夹紧到 [0, 10min]
DISABLE_METHODOLOGY_AUDITunset1/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_ENABLED1(开)后台监管器的总开关。0 会暂停每个已激活委托的自主活动;委托保持激活状态,只是停止操作,直到你重新打开。
PROACTIVE_SUPERVISOR_INTERVAL_SEC900(15 分钟)每个委托多久检查一次持仓,单位为秒。运行时钳制到 [10s, 1h]
PROACTIVE_REDISCOVER_INTERVAL_SEC1800(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.tsshouldAutoExecuteX402 辅助函数
  • apps/agent/src/tools/trade.tstransfer_token 优先查询自动执行策略
  • apps/agent/src/tools/x402-preauth.tsx402_preauth_grant / _list / _revoke
  • apps/agent/src/gateway/repl-commands.ts/x402 preauth CLI 入口
变量默认值格式效果
X402_PREAUTH_DEFAULT_TTL_HOURS24正整数(小时)调用 x402_preauth_grant 时未指定 ttl_hours 所应用的默认 TTL。
X402_PREAUTH_MAX_TTL_HOURS168(7 天)正整数(小时)非永久 TTL 的硬上限。请求更长期限的授权会被拒绝,错误字段为 field: "ttlMs"
X402_PREAUTH_ALLOW_FOREVER11/true/yes/on 表示允许0 时,ttl_hours: "forever" 的授权被拒绝,错误字段为 field: "forever"。永久预算上限仍被读取用于文档说明。
X402_PREAUTH_MAX_PER_CALL_USDC0.5正数(USDC)单次自动付款的硬上限。超过此金额的单次付款会降级为常规两步确认,就算在活跃会话内::这是限制每次调用风险范围的安全边界。
X402_PREAUTH_MAX_BUDGET_USDC5正数(USDC)非永久会话的总预算上限。
X402_PREAUTH_MAX_FOREVER_BUDGET_USDC20正数(USDC)永久会话的总预算上限。独立设置是因为移除时间约束需要更严格的金额控制。
X402_PREAUTH_DISABLE01/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.mdUSER.mdMEMORY.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.tsseedWorkspaceIfMissing + atomicWriteFile
  • apps/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.tsBOOTSTRAP_DONE 时归档
  • apps/agent/src/workspace/soul-change-detector.ts : 披露 SOUL.md 编辑
变量默认值格式效果
WORKSPACE_HEARTBEAT_ENABLED1(开启)0/false/no/off 禁用每轮 HEARTBEAT.md 状态写入器。开启时,每轮后 Agent 写入 last_seensession_idsurfaceturn_countlast_user_query,外加从回复中提取的启发式 open_loops。用户编辑的 ## Schedule 部分在写入间通过 schedule_raw 往返同步保留原样。在只读工作空间挂载、CI 运行或隐私敏感场景下禁用。
WORKSPACE_DAILY_LOG_ENABLED0(关闭)1/true/yes/on 启用每次到达写入周期后,按 SQLite chat_turns 水位将全部未落盘 turn 写入 <workspace>/memory/YYYY-MM-DD-<session>.md;保留真实 session、surface 和来源,不使用 correlation ID 代替 session。
WORKSPACE_DAILY_LOG_INTERVAL5正整数(轮)Journal backlog 的 flush 周期。每次都会写完水位后的所有 turn;增大值只会延后落盘,不会抽样丢弃中间 turn。
WORKSPACE_DREAM_ENABLED0(关闭)1/true/yes/on 启用定期合并 MEMORY.md。自动来源 turn 保留在日志中供审计,但在 LLM 前移除,Autopilot、策略、workflow、cron 和来源不明的 perps 执行不会变成人工偏好或案例。
WORKSPACE_DREAM_INTERVAL_HOURS24正数(小时,可小数)梦想运行间隔。前一次运行仍在进行时调度器跳过本次,故缓慢 LLM 调用无法堆积。WORKSPACE_DREAM_ENABLED 关闭时无效。
WORKSPACE_DREAM_TOTAL_INPUT_BYTES262144(256 KB)正整数(字节)单次 dream 喂给 LLM 的所有 daily 日志总字节预算。日志按"最新优先连续后缀"挑选,让模型看到的总是一段时序连贯且包含最近活动的窗口。每个文件仍受 64 KB 上限做尾部截断;最新一份日志就算单独超预算也保留。防止长窗口密集日志爆掉模型 context。WORKSPACE_DREAM_ENABLED 为关闭时无效。
WORKSPACE_DREAM_LOCK_TTL_MS1800000(30 分钟)正整数(毫秒)<workspace>/.dreaming.lock 的 TTL。超过此值的锁被视为陈旧,可被其它进程接管。该值反映"单次 dream 最长合理执行时长",不应等于 tick 间隔。如果 LLM 调用经常超过 30 分钟则调高。NFS 挂载的 workspace 不被支持(底层 O_EXCL 在部分 NFS 客户端下不保证原子),请让 dream 跑在单一主机上。WORKSPACE_DREAM_ENABLED 为关闭时无效。

MINARA_WORKSPACE_DIR--workspace CLI 标志覆盖读写的默认 ~/.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 可以识别并联系运营方。未设置时,shadowenforce 模式都会停用 PIT 快照构建。
PIT_FINANCIAL_SNAPSHOT_MODEshadowdata.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_ENABLEDfalse采集总开关
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_MEMORYtrue / false行为反思与受限对话记忆桥接
BEHAVIOR_REFLECTION_CUSTOM_PROMPT仅用于反思的指导,最多 1,000 字符
BEHAVIOR_MEMORY_RAW_RETENTION_DAYS / BEHAVIOR_MEMORY_MAX_MB90 / 128保留期与 SQLite 软上限
BEHAVIOR_MEMORY_BATCH_SIZE / BEHAVIOR_MEMORY_BATCH_KB / BEHAVIOR_MEMORY_FLUSH_MS / BEHAVIOR_MEMORY_QUEUE_MAX256 / 256 / 500 / 10000缓冲写入限制
BEHAVIOR_MEMORY_PRESSURE_FREE_MB / BEHAVIOR_MEMORY_CRITICAL_FREE_MB / BEHAVIOR_MEMORY_DISK_CHECK_MS5120 / 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> : 大写下划线命名法,提供商前缀优先
  • 任何地方都未提交真实密钥值

本页目录

TL;DR 约定.env 加载方式变量清单LLM 提供商扩展思考(Extended Thinking)web_search / web_extract 后端Minara 核心HTTP 网关安全与涉及资金的操作混合记忆检索回测反馈循环(Sprint 6:在线结果填充器)个性化重建(M3.2 事件驱动阈值)交易摘要阈值记忆提取阈值共享配置项Agent 外历史镜像Hyperliquid 永续合约Strategy Studio(测试版)Harness RL机构模式(多 Agent 投研团队模拟)自学习与 Phase B 反思(v2 PR 1 / PR 2)分析师恢复与规范资产预解析离线学习配置调优(Phase B 门控)方法论自优化循环(第 1-7 阶段)阶段 2 : 多周期回测 + 幻觉检查第 3 阶段 : 奖励第 4 阶段 / 7 : 方法论实例分发第6阶段 :: BO 调优周期内置工具消息平台(扩展集)Lark / FeishuWeCom(企业微信)DingTalk(钉钉)WeChat OA(公众号)QQ BotLINEMattermostMicrosoft TeamsGoogle ChatBlueBubbles(iMessage)Matrix客户端外连入站 daemonMCP 集成原生提供商密钥(PR-A → PR-G 迁移)保留的外部技能包方法论学习闭环 : case 归因 + synthesis(Phase 1-5)总开关(事故响应)Synthesis 调优(Phase 4 D)价格质量(Phase 3 F4.3)Case-recorder 维护(Phase 2)Phase 5 : 跨 turn 桥接 + 调度器运营学习 cron方法论审计子系统(被动观察者)资金确认绕过(高级 : 生产警告)主动式财富智能体x402 支付墙预授权(PR-X)OpenClaw 工作空间集成深度研究报告渲染Point-in-time 财务快照行为记忆添加新环境变量的检查清单