环境变量
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>: 大写下划线命名法,提供商前缀优先 - 任何地方都未提交真实密钥值