Market Sizing & Strategic Modeling(市场规模测算与战略建模)
通过 alice-market-sizing-strategic-modeling 调用万得 Alice Agent,围绕特定市场、细分赛道或产品机会,一键生成结构化市场规模模型与研究报告。
核心原则:基础设施交给脚本处理;Agent 只负责把用户的市场测算问题拼成一句自然语言 prompt 传入。默认就执行 Market Sizing & Strategic Modeling 技能,无需也不要再指定其它 Skill。 任务完成后,只将 CLI stdout 中的
agentResult.value原文原样交给用户;CLI 静默下载的附件(reportFullFile=)不要读给用户看。宿主 Agent:执行任何 shell 命令前必须先读同目录
AGENT.md(一页执行契约,与 IDE 无关,随 skill 包发布)。
技能介绍
官方技能:市场规模测算与战略建模
专业级市场规模量化分析工具。通过自上而下(TD)与自下而上(BU)双路径交叉验证,结合多情景预测与敏感性分析,输出可直接用于决策的市场规模 Excel 模型与结构化研究报告。
适用场景:
- 市场规模测算 — 量化某个行业/细分市场的当前体量与历史趋势
- 市场预测建模 — 预测未来 3-10 年的市场增长路径(CAGR、TAM/SAM/SOM)
- 战略进入评估 — 评估新市场的可寻址规模,支持投资或业务拓展决策
- 多情景分析 — 构建乐观/基准/悲观情景,量化关键假设的敏感性
- 竞争格局建模 — 分析市场细分结构、区域分布与渠道占比
- 投融资支撑材料 — 为 BP、尽调报告、战略规划提供可引用的市场数据模型
试试这样问:
- 帮我测算中国 AI 大模型应用市场的规模
- 全球新能源汽车市场未来 5 年的增长预测
- 中国私募股权市场的 TAM/SAM/SOM 是多少?
- 帮我建一个东南亚跨境电商市场的规模模型
- 医疗器械耗材市场的市场规模和增速是多少?
- 预测中国 SaaS 市场 2025-2030 年的收入规模
- 帮我做一个咖啡连锁市场的自下而上测算
- 分析宠物经济市场的细分结构和增长驱动
💡 提示:
- 必要输入:市场名称(你想测算哪个市场);地理范围(中国/全球/某区域,不填则自动推断)
- 可选输入:测算指标(收入/GMV/用户数/AUM 等)、预测年限(默认未来 5 年)、币种
- 默认同时构建自上而下与自下而上两套模型,并进行交叉验证
- 自动生成公式驱动的 Excel 模型文件,可直接下载使用
- 支持
compact(3-5 页快速决策版)或full(10-15 页完整报告版)两种报告模式,可在对话中指定 - 每个关键假设均附有数据来源、置信区间与合理性校验
输出形式
- Agent 向用户展示的内容:CLI stdout 中的
agentResult.value正文(服务端流式返回) - 自动生成的结构化内容包含:市场定义、测算方法论、关键假设、Top-down / Bottom-up 测算结果、交叉验证、情景与敏感性分析、结论与建议
- 部分场景下 CLI 会静默把完整报告附件与 Excel 模型下载到用户
Downloads/文件夹或-d指定目录(供用户本地查阅);Agent 向用户展示时只用agentResult.value,不要粘贴附件正文 - 数据受限时在对应模块明确标注
Agent 调用红线(必读)
Agent 调用本技能时,一律用下列单条命令(CLI 内部自旋直到拿到结果)。按操作系统选写法——禁止在 Windows PowerShell 里用 cd ... && node ...(&& 会 ParserError,命令根本不会执行)。
Windows PowerShell(Trae / Cursor 默认 shell,一律用方案 A):
<SKILL_DIR>= 本SKILL.md所在目录的绝对路径(例:C:\Users\<用户名>\.agents\skills)。
# ✅ 方案 A(唯一推荐):amssm.ps1 绝对路径,无需 cd,自带 UTF-8 代码页
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "<USER_QUESTION>" --no-wait
# ❌ 禁止:PowerShell 5.x 不支持 &&,整条命令解析失败
cd "<SKILL_DIR>" && node scripts/cli.mjs --prompt "..." --no-wait
# ❌ 禁止:裸 node 相对路径(易因 cwd 不对而失败;且无 UTF-8 包装)
Set-Location "<SKILL_DIR>"; node scripts/cli.mjs --prompt "..." --no-wait
macOS / Linux(bash / zsh):
cd /path/to/alice-market-sizing-strategic-modeling && node scripts/cli.mjs --prompt "<USER_QUESTION>" --no-wait
判定与红线(CLI 程序层已强制,但 Agent 仍须能识别这些信号、不被 stdout 文案误导):
| 信号 | 含义 / Agent 必须怎么做 |
|------|------------------------|
| stdout 含 ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE taskId=... promptHash=... reportFile=... reportFullFile=... | 唯一真正完成信号;必须先核对 promptHash= 与本次 --prompt 一致,再以 stdout 中的 agentResult.value 原文交付用户(stdout 被截断时读 reportFile= 兜底);若有 reportFullFile= 必须把绝对路径转告用户 |
| stdout 含 ALICE_SESSION_LOG=<path>(Windows 管道场景) | live 中文可能乱码;只读 stdout 打印的该 path(含完整 promptHash);禁止 view_folder logs/;读前核对 ALICE_SESSION_LOG_BOUNDARY promptHash= 与 PROMPT_HASH= 一致 |
| stdout 含 ALICE_POLL_HEARTBEAT status=working | 轮询中心跳 | 仍未完成;即使其它 session.log 里有 DONE 行也无效 |
| 同一 taskId 多进程同时 completed | CLI 对附件 URL 跨进程加锁 + tasks.json 去重;只下载 1 份,后续进程复用 reportFullFile=;禁止因此读 download/ 附件内容展示给用户 |
| 退出码 0 但没有 DONE 行 | 视为未完成;不要凭印象编造报告(strict 模式默认会改成 6) |
| 退出码 4 / 6 | 进程未输出 DONE(触顶 / 沙箱被杀);用相同 prompt 再发一次 --no-wait 续接,禁止连发多条、禁止 --new |
| 退出码 11(check-conflict 子命令命中冲突) | 主调用前预检发现已有同/相似 prompt 的 running 任务;必须把 stdout 列出的任务列给用户,由用户在续接 / --new / 取消 三选一。对用户说:「已经有一条相同或相似的分析正在执行中,你想怎么处理?」 |
| 退出码 12(check-conflict 命中可重放 completed) | 24h 内已有相似措辞的 completed 任务(另一 Agent 可能已跑完);必须把 REPLAY_CANDIDATE 列给用户,由用户在「查看已有结果 / 重新分析 / 取消」三选一。对用户说:「最近已经有一条相同或相似的分析结果,你想怎么处理?」禁止直接读 download/ 同名报告 |
| 退出码 77(status 误读风险) | 本地无此 prompt 记录,但存在相似 completed;禁止扫 tasks.json / download/ 猜报告,须 check-conflict 或阻塞 --no-wait 等 DONE |
| 退出码 76(主调用相似度命中) | 10min 内已有同市场相似 prompt 任务(含措辞差异);CLI 通常已自动续接/重放;若仍 exit=76 表示跨进程市场锁命中,用原 prompt --no-wait 续接,禁止换措辞 |
| 退出码 75(并发 / 额度满) | 立即停止,告知用户「当前分析任务较多,请稍等 5-15 分钟后再试」;禁止换 prompt / --new 绕过 |
| 退出码 78(环境受限,无法保存任务状态) | 当前环境无法保存任务状态(未开启完全访问权限);未向服务端发请求;告知用户「当前环境无法运行市场规模测算与战略建模,请在工具中开启完全访问权限后重试」;禁止换 prompt / --new / 反复重试 |
| stdout 含 ALICE_NO_SERVER_CALL=1 reason=replay_completed | 主调用 --no-wait 复用了本地已有的 completed 结果,未向服务端发请求;这不是新建分析——即使 check-conflict 返回 exit=0 也可能触发。必须先询问用户「该市场的规模测算已有最近的结果,你想怎么处理?」,由用户在「查看已有结果 / 重新分析 / 取消」三选一。禁止未经用户确认就直接交付旧结果或自行加 --new 重跑 |
五大红线(违反任一条都会导致重复消耗积分 / 编造结果 / 向用户交付错误数据):
- 阻塞等待 CLI 进程结束——禁止
check_command_status/Start-Sleep替代。 - 不要换 prompt 重试——
"分析X"与"分析X,关注Y"会被识别为相似任务直接 exit=76。 - 没有 DONE 行 = 未完成——不要把
STATUS=COMPLETED文案、tasks.json中 running 记录或download/目录 mtime 当成"完成"。 - 禁止手动翻目录猜报告——不要用
view_folder/view_files扫download/、results/或logs/;若 CLI 未完成,stdout 会出现ALICE_ARTIFACT_GUARD/ALICE_POLL_HEARTBEAT/ALICE_MISLEAD_RISK/ORPHAN_DOWNLOAD_CANDIDATE提示,这些只是警告,不是可交付的报告路径。 - 只交付 agentResult.value,禁止概括,禁止展示下载附件正文——将 CLI stdout 中的
agentResult.value原文交给用户;禁止自行总结、摘录、重写表格或「用自己的话」复述。若 stdout 被沙箱截断,读取 DONE 行reportFile=落盘正文(跳过 HTML 注释头)。DONE 含reportFullFile=时必须转告绝对路径;禁止读取reportFullFile=/download/附件正文向用户展示。
完整步骤、异常处理、典型现场复盘见下方 Agent 调用流程 与 常见问题。
环境要求
1. Node.js 18+
CLI 基于 Node.js(18+ 自带 fetch)。node -v 检查,未达标到 nodejs.org 下载。
2. 获取并配置 WIND_API_KEY
获取:浏览器打开 万得 Alice → 设置 → 账户,在「API Key」一栏点「生成」/「复制」(失效或泄漏点「重置」会让旧 Key 立即作废)。
写入(推荐用 CLI 子命令):
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" apikey-set <KEY>
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" apikey-get
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" apikey-clear
# macOS / Linux
node scripts/cli.mjs apikey-set <KEY> # 写入(KEY 裸值,不加引号)
node scripts/cli.mjs apikey-get # 查看是否已配置 + 脱敏末四位
node scripts/cli.mjs apikey-clear # 清除
CLI 把 Key 写到 ~/.wind-alice/config.env(Windows %USERPROFILE%\.wind-alice\config.env),dotenv 格式单行 WIND_API_KEY=...——这是唯一受支持的位置。历史无后缀的 ~/.wind-alice/config 仍可读取,apikey-set 会自动迁移。
手动写入(无 Node 运维场景):
# macOS / Linux
mkdir -p ~/.wind-alice && printf 'WIND_API_KEY=...\n' > ~/.wind-alice/config.env && chmod 600 ~/.wind-alice/config.env
# Windows PowerShell
New-Item -ItemType Directory -Force "$env:USERPROFILE\.wind-alice" | Out-Null
"WIND_API_KEY=..." | Set-Content -Encoding ascii "$env:USERPROFILE\.wind-alice\config.env"
安全:CLI 不读环境变量,也不读 skill 目录内的
config.json——避免 Key 残留在 shell 历史 / CI 日志 / 提交记录。apikey-set/apikey-getstdout 仅回显脱敏 Key;macOS/Linux 会自动把文件权限收到600。
CLI 调用说明
Windows Agent 一律用方案 A:
amssm.ps1写绝对路径,无需cd。macOS / Linux 在SKILL.md所在目录下用node scripts/cli.mjs(可用cd ... &&)。
Windows PowerShell 语法(Agent 必读)
Trae / Cursor 在 Windows 上默认使用 PowerShell 5.x,不支持 &&。Agent 只能用方案 A:
# ✅ 方案 A(唯一写法)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "帮我做一份金三江的市场规模测算与战略建模报告" --no-wait
# ❌ 禁止
cd "<SKILL_DIR>" && node scripts/cli.mjs --prompt "..."
Set-Location "<SKILL_DIR>"; node scripts/cli.mjs --prompt "..."
其他注意:
<SKILL_DIR>替换为本技能目录绝对路径;路径含空格时必须加双引号。- 禁止在命令末尾拼接
undefined等无效 token(部分 Agent 工具 bug)。 - bash 的
&&仅适用于 macOS / Linux,不要在 Windows PowerShell 里照搬。
中文乱码(Windows 必读)
根因:Node 输出 UTF-8 字节,Trae / PowerShell 5.x 管道捕获时默认按 GBK 解码 → live 输出变成 鏈繘绋嬪皢闃诲...,不是 CLI 坏了。
三层防护(由 CLI 自动提供):
-
scripts/amssm.ps1:调用前切 UTF-8 代码页(Windows Agent 优先用它代替裸node)。 -
ALICE_SESSION_LOG=:非 TTY 管道场景下,CLI 会把全部输出 tee 到~/.wind-alice/logs/<promptHash>.session.log(完整 64 位 promptHash,UTF-8 BOM)。只能读 stdout 打印的那条路径,禁止view_folder logs/扫描:# ✅ 从本次 CLI stdout 复制 ALICE_SESSION_LOG= 的完整路径 Get-Content -Path "$env:USERPROFILE\.wind-alice\logs\<promptHash>.session.log" -Encoding UTF8 -Tail 200 -Wait # ❌ 禁止:按 mtime 挑「最新」或只认 12 位前缀——不同 prompt(同公司)会落在不同文件 -
落盘
.md(results/、Downloads/、--detach日志)均带 UTF-8 BOM,Get-Content即使不写-Encoding UTF8通常也能正确显示。
禁止:因 live 乱码就改 prompt 重试、连发多条 CLI、或手工 Start-Sleep 轮询 tasks.json。
查看 --detach 日志(避免中文乱码)
~/.wind-alice/logs/<hash>.log 由 CLI 以 UTF-8 写入。PowerShell 5.x 的 Get-Content 默认按 GBK 解码,会把 UTF-8 中文显示成 鏈繘绋嬪皢闃诲... 这类乱码——不是日志坏了,是读法错了。
# ✅ 正确:显式指定 UTF-8
Get-Content -Path "$env:USERPROFILE\.wind-alice\logs\969e4c647aae.log" -Encoding UTF8 -Tail 50 -Wait
# ❌ 错误:省略 -Encoding UTF8,中文 Windows 上几乎必乱码
Get-Content -Path "...\969e4c647aae.log" -Tail 50 -Wait
自新版 CLI 起,--detach 创建的日志文件会写入 UTF-8 BOM,部分环境下即使不写 -Encoding UTF8 也能正常显示;仍建议 Agent 始终带 -Encoding UTF8。
命令行调用
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "<USER_QUESTION>" --no-wait [-d "<DIR>"] [--new]
# macOS / Linux
node scripts/cli.mjs --prompt "<USER_QUESTION>" --no-wait [-d "<DIR>"] [--new]
参数
| 参数 | 说明 |
|------|------|
| --prompt, -p | 用户提问(市场名称 + 关注角度,自然语言)。必填;CLI 自动加 使用「市场规模测算与战略建模」技能: 前缀,Agent 不要再加 |
| --no-wait | Agent 默认必带——CLI 内部自旋 tasks/get 直到终态。默认 60s 一次探针、每轮 30min、全程 60min;到轮上限 CLI 自动续轮;Agent 禁止外层 Start-Sleep 或连发多条 |
| -d, --download-dir | 报告附件落地目录;不传则用户 Downloads/ 文件夹(Windows %USERPROFILE%\Downloads)。不存在自动创建;同名冲突自动加 (1) 后缀,绝不覆盖 |
| --new | 用户明确要求并行新建时清除本地记录后新建;须先 check-conflict 询问用户 |
| --continue-session | 显式请求延续上一次多轮会话上下文(opt-in)。默认每次 CLI 调用视为全新会话,contextId 每次新生成,避免跨 Agent / 跨话题的 context 污染。宿主 Agent 判定为同一会话追问时(省略式追问 / 明确承接前文 / 代词指代等)应自动加此参数,不再要求用户显式说「接着刚才那个话题继续」。若上次调用在 30min idle window 内,CLI 会复用上次落盘的 contextId;否则退化为新会话。与 --new 正交:--new 决定是否新建 taskId、--continue-session 决定是否复用 contextId |
| --new-session | 显式强制新建会话上下文(与默认行为一致,保留兼容旧脚本)。与 --continue-session 同时给时以 --new-session 为准 |
| --session-scope <ID> | 宿主 Agent 会话隔离标识(推荐始终传入)。同一 OS 用户下 Cursor / Trae 等宿主 Agent 默认共享 ~/.wind-alice/current-session.json;不隔离会出现"A Agent 的续接读到 B Agent 的 contextId"这类跨宿主污染。传入 <ID> 后按 current-session.<ID>.json 隔离到宿主自己的文件。也可用环境变量 WIND_ALICE_SESSION_SCOPE 统一设置(命令行 --session-scope 优先)。非法字符(空格 / 冒号 / 路径分隔符 / 中文等)自动替换成 _,长度上限 64 |
| --once | 配合 --no-wait,单次探针;仅脚本调试,Agent 禁止外层循环 |
| --no-strict | 关闭 strict 模式(默认开启:未输出 DONE 行时 exit=0 改成 6);Agent 禁止传 |
| --watch-interval / --watch-timeout / --watch-absolute-max | 自旋节奏与上限调优(秒),通常默认即可 |
| --help, -h | 查看帮助 |
已废弃:
--watch/-w(--no-wait默认即内部自旋)。
调用示例
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" -p "帮我测算中国 AI 大模型应用市场的规模" --no-wait
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" -p "全球新能源汽车市场未来 5 年的增长预测,重点看 TAM/SAM" --no-wait
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" -p "预测中国 SaaS 市场 2025-2030 年的收入规模" --no-wait -d "D:\reports\market-sizing"
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" -p "重新测算中国新能源汽车市场" --no-wait --new # 仅用户说"重新跑"才加
# macOS / Linux
node scripts/cli.mjs -p "帮我测算中国 AI 大模型应用市场的规模" --no-wait
node scripts/cli.mjs -p "全球新能源汽车市场未来 5 年的增长预测" --no-wait
node scripts/cli.mjs -p "预测中国 SaaS 市场 2025-2030 年的收入规模" --no-wait -d "/reports/market-sizing"
node scripts/cli.mjs -p "重新测算中国新能源汽车市场" --no-wait --new
附件用 WIND_API_KEY 自动鉴权下载到 Downloads/ 或 -d 目录(CLI 在 DONE 行给出 reportFullFile= 路径仅供落盘核对);Agent 交付用户时只用 agentResult.value,不要展示下载附件内容。
子命令
只读 / 配置类,不消耗服务端额度:
| 子命令 | 用途 |
|--------|------|
| apikey-set <KEY> / apikey-get / apikey-clear | 写入 / 查看(脱敏)/ 清除 ~/.wind-alice/config.env 中的 API Key |
| status --prompt <Q> | 查询本地 tasks.json 中该 prompt 最近一条任务的落盘路径 |
| check-conflict --prompt <Q> | 主调用前的并发预检:检测是否有同/相似 prompt 的 running 任务。无冲突 → exit=0;命中 → exit=11,stdout 列出 EXISTING_TASK ...,Agent 必须把详情列给用户、由用户三选一(attach / --new / 取消)。详见调用流程第 5 步 |
Agent 调用流程
上方「调用红线」已给出退出码识别与禁止动作;本节是分步操作流程。唯一推荐命令永远是
--no-wait,CLI 内部自旋直到完成。
1. 识别意图
用户提问命中以下任一场景即可调用:市场规模测算 / 市场增长预测 / TAM·SAM·SOM / 自下而上测算 / 情景与敏感性分析 / 细分结构建模。
2. 构造 prompt
把市场名称(行业/赛道/产品机会)和关注维度拼成一句自然语言。不要加 使用「...」技能: 前缀,CLI 内部已自动注入。
3. 解析下载目录意图
扫描用户对话中是否说过"下载到 X / 保存到 X / 放到 X 目录"。
- 命中 → 用
-d "<DIR>"传入(多次指定取最近一次,含空格的路径必须加双引号)。 - 未命中 → 不要传该参数;CLI 落到用户
Downloads/文件夹。
4. 告知用户耗时
Alice 市场规模测算与战略建模通常 2-15 分钟。调用前必须用一句话告诉用户这个耗时,并禁止中途取消或重复发起。
推荐话术:「好的,我来帮你分析。市场规模测算与战略建模通常需要 2–15 分钟,请稍等。」
5. 冲突预检(必做,避免与另一个 Agent 撞车)
主调用前先跑一条快速预检(纯本地查询,不发请求、不消耗额度)。
对用户说:「先确认一下没有重复任务……」
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" check-conflict --prompt "<USER_QUESTION>"
# macOS / Linux
node scripts/cli.mjs check-conflict --prompt "<USER_QUESTION>"
-
退出码
0:无 running 冲突、无 24h 内可重放的 completed(含同 prompt 本地 completed),主调用--no-wait将向服务端新建分析。注意:由于check-conflict与主调用的查询时机 / 沙箱写入延迟可能存在微小差异,即使 exit=0,主调用仍可能触发 replay(ALICE_NO_SERVER_CALL=1);此时 Agent 必须按步骤 6 的 replay 处理流程询问用户,不得直接交付旧结果。 -
退出码
11:检测到已有 running 任务(ALICE_CONFLICT_CHECK kind=exact|similar),必须停下来询问用户。stdout 会逐行列出EXISTING_TASK matchKind=... taskId=... elapsed=... promptPreview=...——把这些信息原样告诉用户,让用户三选一。对用户说:「已经有一条相同或相似的分析正在执行中,你想怎么处理?」- (A) 续接已有任务(推荐,最快):用户原 prompt +
--no-wait(CLI 会自动续接 running 任务)。 - (B) 另外新建一条分析:加
--new --no-wait(须先经用户明确确认)。 - (C) 取消本次提问。
禁止 Agent 自作主张选 attach 或
--new;必须让用户裁决。 - (A) 续接已有任务(推荐,最快):用户原 prompt +
-
退出码
12:无 running 冲突,但 24h 内已有相似 completed 或同 prompt 本地 completed(kind=replay_available+REPLAY_CANDIDATE)。未经确认直接--no-wait会 重放本地结果(ALICE_NO_SERVER_CALL=1,不发请求)。必须停下来询问用户。对用户说:「最近已经有一条相同或相似的分析结果,你想怎么处理?」- (A) 查看已有结果(推荐):用 stdout 里
REPLAY_CANDIDATE的 原 promptPreview 执行--no-wait(CLI 会replay_completed)。 - (B) 重新做一次分析:当前 prompt +
--new --no-wait(必须--new)。 - (C) 取消。
禁止在 exit=12 时直接
view_files打开REPLAY_CANDIDATE_REPORT path=——该文件绑定的是旧 promptHash,不是用户本次措辞的结果。 - (A) 查看已有结果(推荐):用 stdout 里
-
退出码
2:参数错误(通常是 prompt 缺失),按命令行错误处理。
这一步是处理"用户在多个 Agent 同时问相同问题"的关键。即便 Agent 跳过预检直接跑第 6 步,主路径在相似 prompt 上仍会兜底
exit=76、相同 prompt 上会自动 attach;但只有走预检 Agent 才能在动作发生之前让用户介入。
6. 执行命令并阻塞等待
对用户说:「已提交分析,正在等待结果,请稍候……」(禁止说「CLI 自旋」「进程」「shell」等技术细节)。
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "<USER_QUESTION>" --no-wait [-d "<DIR>"]
# macOS / Linux
node scripts/cli.mjs --prompt "<USER_QUESTION>" --no-wait [-d "<DIR>"]
- 必须前台运行,阻塞等待该命令返回,读完整 stdout/stderr 与退出码。
- 禁止 fire-and-forget 写法:
Start-Process(含-NoNewWindow)、| Out-Null、nohup、后台 job 等。 - 禁止用
check_command_status/Start-Sleep/ 轮询下载目录 / 轮询tasks.json替代等待 CLI 进程结束。 - 禁止在命令末尾拼接
undefined或其它无效参数;只传 SKILL 列出的参数。 - 终端必须配置 ≥1200 秒(20min) 超时;若做不到(典型于 Trae
run_command数十秒就 kill),跳到下方第 8 步「沙箱被 kill 后的续接」即可——--no-wait模式天然为此设计。 - replay 检测:进程退出后,若 stdout 含
ALICE_NO_SERVER_CALL=1/reason=replay_completed,说明复用了本地已有结果而非新建分析——必须先询问用户(见下方「replay 重放处理」)。
7. 判定完成的唯一标准
stdout 含 ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE taskId=... promptHash=... reportFile=... reportFullFile=... 行 + 退出码 0。同时满足才算完成;promptHash= 必须与本次 --prompt 对应(CLI 启动时会打印 PROMPT_HASH= 供核对)。
以下情况一律视为未完成(即使 exit=0):
- 只有
ALICE_MARKET_SIZING_STRATEGIC_MODELING_STATUS=COMPLETED/[任务已受理]/state=submitted,没有 DONE 行; - 退出码
6(strict 兜底,进程被沙箱杀)或76(重复提交防护)。
8. 沙箱被 kill 后的续接(Trae / Codex 等受限终端)
为何像「卡住」:市场规模测算与战略建模要 2–15 分钟,而 Trae/Cursor run_command 常只有 60–120s 超时。Agent 若用 check_command_status 轮询而非阻塞等待,终端会先杀 CLI(exit 4/6),服务端任务却仍在跑——results/ 尚未生成,Agent 误判为卡住。此时对用户说:「分析仍在进行中,我继续等待……」,不要向用户提及超时、被杀等技术细节。
首选:终端超时 ≥1200s,只发一条 --no-wait 阻塞等到 DONE。
无法拉长超时时,用 --detach 再续接:
powershell ... amssm.ps1 --prompt "<USER_QUESTION>" --detach
powershell ... amssm.ps1 --prompt "<和首次完全一致的 prompt>" --no-wait
退出码 4 或 6(未见到 DONE)——任务在服务端可能仍在跑。处理方式:
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "<和首次完全一致的 prompt>" --no-wait
# macOS / Linux
node scripts/cli.mjs --prompt "<和首次完全一致的 prompt>" --no-wait
- 默认每 60s 探针一次;每轮最长 30min,CLI 自动续轮;全程最长 60min。
- 退出码
4触顶时:再发一次相同命令续接;禁止连发多条、禁止--new。 - 探针输出
state=submitted是正常排队,不要因为连续几次 submitted 就--new或换 prompt。 - 禁止
check_command_status、Test-Path results/、Get-Content扫 logs 猜进度——CLI 未输出 DONE 前这些都不能当交付依据。 replay_completed时 CLI 会把agentResult.value重新打印到 stdout;Agent 应读 stdout 原样交付,禁止view_files打开results/后自行概括。
8.5 replay 重放处理(必须,当 stdout 含 ALICE_NO_SERVER_CALL=1)
主调用 --no-wait 返回后,若 stdout 含 ALICE_NO_SERVER_CALL=1 / reason=replay_completed,说明本次未向服务端发请求,直接复用了本地已有的 completed 结果——这不是新建分析。
即使 check-conflict 返回 exit=0,主调用仍可能 replay(两个命令的查询时机 / 沙箱写入延迟可能导致差异)。Agent 必须在交付前检查是否触发了 replay。
处理流程:
- 检查 stdout 是否含
ALICE_NO_SERVER_CALL=1; - 若是:检查
agentResult.value正文中的主体名称是否与用户请求一致;- 无论是否一致,均停下来告知用户。若主体不一致,说明:「检测到本地缓存的结果,且与本次请求可能不一致(例如请求富创精密,缓存为苏美达)。」若一致,说明:「该主体的市场规模测算与战略建模已有最近的结果。」然后统一列出选项:
- (A) 查看已有结果 — 直接交付 stdout 的
agentResult.value原文(不扣费); - (B) 重新做一次分析 — 用相同 prompt 加
--new --no-wait重新执行(将消耗积分); - (C) 取消。
- (A) 查看已有结果 — 直接交付 stdout 的
- 禁止未经用户明确选择 (B) 就执行
--new --no-wait。
- 无论是否一致,均停下来告知用户。若主体不一致,说明:「检测到本地缓存的结果,且与本次请求可能不一致(例如请求富创精密,缓存为苏美达)。」若一致,说明:「该主体的市场规模测算与战略建模已有最近的结果。」然后统一列出选项:
- 若否:正常交付,按步骤 9 处理。
禁止在触发 replay 时未经用户确认就直接交付旧结果或自行加 --new 重跑。
9. 交付给用户:只要 agentResult.value(必看)
CLI 完成任务后,Agent 只向用户交付服务端 agentResult.value,不要展示下载附件。
| 来源 | 路径 / 信号 | 内容 | Agent 该怎么用 |
|------|-------------|------|----------------|
| 首选 | CLI stdout 中的 agentResult.value: 行 | 服务端流式返回的市场规模测算与战略建模正文 | 原样交给用户(去掉行首 agentResult.value: 前缀即可);CLI 已自动去掉 ### …完整报告 标题及含 /project/ 的不可点击附件行;其余正文禁止改写 |
| 兜底 | reportFile= → ~/.wind-alice/results/<taskId>.md | agentResult.value 落盘副本(沙箱 stdout 被截断时用) | DONE 后若 stdout 读不全,读此文件正文部分(跳过 <!-- ... --> 注释头)原样输出 |
| 禁止展示正文 | reportFullFile= / REPORT_FULL_FILE= → Downloads/*.md | CLI 静默下载的完整 Markdown 附件 | 必须转告绝对路径;禁止读取或粘贴附件正文 |
| ALICE_ARTIFACT_GUARD 等 | stdout 警告 | 防误读提示 | 不是可交付正文;阻塞等到 DONE |
正确流程(成功场景):
- stdout 出现
ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE且promptHash=与本次PROMPT_HASH=一致; - 从 CLI stdout 提取全部
agentResult.value:正文,原样呈现给用户(CLI 已自动去掉### …完整报告与/project/附件行);其余正文禁止改写; - 若 stdout 被沙箱截断、读不全,再读 DONE 行
reportFile=兜底文件的正文部分; - DONE 含
reportFullFile=时,必须把完整报告附件的绝对路径转告用户(照抄 DONE 行或ALICE_USER_DOWNLOAD_HINT=);禁止只说「已下载」「可本地查阅」等空话;禁止读取download/附件正文展示给用户。 - 禁止把
results/称为「完整报告」——results/只是agentResult.value摘要副本,不是服务端/project/*.md附件。
转告路径:禁止空话 vs 必须写清
| 对用户说法 | 对错 |
|-----------|------|
| 「完整报告文件已下载。」 | ❌ 未说明路径 |
| 「Alice 还生成了详细的可下载 Markdown 报告供你本地查阅。」 | ❌ 未说明路径 |
| 「报告已保存到 Downloads 目录。」 | ❌ 未给出具体文件名 |
| 「完整报告已保存到:C:\Users\...\Downloads\永辉超市市场规模测算与战略建模报告.md」 | ✅ 照抄 DONE reportFullFile= |
路径易混(必记):
| 用户可能听到的说法 | 实际路径 | 对错 |
|-------------------|----------|------|
| 「完整报告在 results/」 | ~/.wind-alice/results/<taskId>.md | ❌ 错误——这是摘要副本,不是完整附件 |
| 「完整报告在 Downloads/」 | %USERPROFILE%\Downloads\*.md 或 -d 指定目录 | ✅ 正确(以 DONE 行 reportFullFile= 为准) |
| 「完整报告已由后台落盘,位于 results/」 | 同上 | ❌ 严重误导(永辉超市现场 Agent 原话) |
典型错误(永辉超市复盘):(1) Agent 连发多条 CLI 未等到 DONE,读 results/<taskId>.md 后自行概括成表格——数字会被改错;(2) 收尾告诉用户「完整报告在 %USERPROFILE%\.wind-alice\results\」——路径说反了,完整附件实际在 %USERPROFILE%\Downloads\(DONE 行 reportFullFile=)。正确做法:阻塞等到 DONE → 输出 agentResult.value 原文 → 禁止概括 → 若附言文件路径,只引用 reportFullFile=,不把 results/ 当完整报告。
10. 任务调度 / 续接 / 强制新建
- 默认(
--no-wait):同 prompt 有 running → 自动续接;本地 completed → 重放落盘结果(replay_completed,不消耗新额度);无记录 → 新建。 - 默认(阻塞 SSE,无
--no-wait):同 prompt 有 running → 续接;本地 completed → 清除后提交新分析;无记录 → 新建。 --new:用户明确要求并行新建;须先 check-conflict 询问用户。prompt必须和首次提交时完全一致(trim + 折叠空白后哈希相同),否则可能命中退出码 76(相似 prompt 检测)。
防重复扣费:沙箱 kill 后 Agent 只应再发一条
--no-wait续接。若本地已是completed,CLI 会直接输出 DONE(重放),不会再调message/stream。连发多条时,旧版会在第二条误触发新任务——现已修复。
11. 退出码 75(并发 / 额度上限,立即停止)
stdout 含 [严重] 服务端拒绝任务 / 达到最大同步执行任务数目,或退出码 = 75 时:
- 立即停止,告知用户「当前分析任务较多,请稍等 5-15 分钟后再试」;
- 禁止换 prompt、
--new、改-d这些"绕过"动作——它们仍会占用并发槽; - 把 stdout 里
[严重]横幅的原文转述给用户。
任务幂等性与停止行为
CLI 跨进程在 ~/.wind-alice/tasks.json 按 taskId 记录任务,~/.wind-alice/results/<taskId>.md 存每条任务的 agentResult.value 落盘副本。基于 prompt 的 promptHash(trim + 折叠空白后 SHA-256)做幂等。
- 默认调度(
--no-wait):同 prompt running → 续接;completed → 重放落盘(不新建);无记录 → 新建。 - 默认调度(阻塞 SSE):同 prompt running → 续接;completed → 新建;无记录 → 新建。
--new:用户明确要求并行新建;须先 check-conflict 询问用户。- 状态同步:收到
agentResult→ completed;服务端提示 / jsonrpc 错误 / 流静默结束 → failed;Ctrl+C → 保持 running(服务端仍在跑,下次自动续接)。 - attach 失败自动回退:attach 模式下 60s 无 SSE / jsonrpc 错误 / 4xx → 自动删旧记录新建任务(单进程内最多 1 次)。
- 自动清理:running > 6h 强清;completed > 7d 清;failed > 3d 清;总条数 > 200 裁到 100。
配置位置与环境变量
| 路径 / 变量 | 内容 | 必备 |
|-------------|------|------|
| ~/.wind-alice/config.env(Win: %USERPROFILE%\.wind-alice\config.env) | dotenv:WIND_API_KEY=<KEY>,唯一受支持位置(不读环境变量、不读 skill 目录 config.json) | ✅ |
| ~/.wind-alice/tasks.json | 本地任务注册表(CLI 自动维护) | 自动 |
| ~/.wind-alice/results/<taskId>.md | 每条任务的 agentResult.value 落盘副本(stdout 截断时 Agent 可读) | 自动 |
| WIND_ALICE_API_URL(环境变量) | Alice Agent 接口地址,默认 https://alice.wind.com.cn/Weaver/ChatAgent,一般无需修改 | 否 |
兼容:历史无后缀的
~/.wind-alice/config仍可读取,apikey-set会自动迁移到config.env。
CLI 执行失败处理(核心红线)
CLI 失败时,立即停止;绝不用 WebSearch 或其它信息源拿"近似的市场规模测算与战略建模"敷衍用户。
KEY_MISSING(仅当 exit=2 且 stderr 含 JSON"code":"KEY_MISSING"时才成立):按「环境要求」检查 Key 后重试。禁止在退出码不是 2、或 stderr 没有KEY_MISSING字段时,凭"进程被杀""输出不完整""apikey-get 返回 missing"等迹象猜测 Key 缺失——这些与 Key 无关(典型反例:exit=6 是 strict 兜底,Key 配得好好的)。若需核实 Key 状态,用apikey-get并读其 JSON 的status字段:configured= 正常,missing= 确实缺失;禁止把configured读成missing或凭空下结论。- exit=75 /
[严重] 服务端拒绝任务/达到最大同步执行任务数目:临时拒绝,等 5-15 分钟后用相同 prompt 重试;禁止换 prompt /--new,把[严重]原文转述给用户。 - 服务端用户提示(体验账户 / 数据受限):原样转述,不要替换为外部信息源。
- macOS Gatekeeper / Windows SmartScreen / 企业安全软件拦截:按系统提示放行后重试。
- 网络 / 服务端 5xx:CLI 内置最多 10 次重连,耐心等。
- 仍失败:向用户展示完整错误,让用户处理;绝不回退到其它信息源伪造"看似合理"的市场规模测算与战略建模。
常见问题
Q1:提示「WIND_API_KEY 未配置」 / Key 失效怎么换?
A:从 万得 Alice → 设置 → 账户 复制(或点「重置」换新)Key,然后写入:Windows 用 powershell ... -File "<SKILL_DIR>\scripts\amssm.ps1" apikey-set <KEY>;macOS/Linux 用 node scripts/cli.mjs apikey-set <KEY>。apikey-get 验证脱敏末四位;apikey-clear 清除。CLI 不读环境变量与 skill 目录内 config.json——只读 ~/.wind-alice/config.env。
Q2:能否同时分析多个公司?报告附件在哪?怎么改下载目录?
A:(a) 可以——把多家主体写进同一个 prompt(建议 ≤ 5 家)。(b) 完整报告附件会静默落到 ~/Downloads/(Windows %USERPROFILE%\Downloads),供用户本地查阅;Agent 不要把附件正文展示给用户。(c) 用户对话中说"下载到 X" → Agent 加 -d "X"。向用户交付时只用 stdout 的 agentResult.value 原文(截断时读 reportFile= 兜底),禁止读 Downloads/ 附件展示。
Q3:PowerShell 报 && 不是有效语句分隔符 / 中文乱码?
A:(a) PowerShell 5.x 不支持 &&——Windows 只能用方案 A(amssm.ps1 绝对路径,见「调用红线」)。(b) 若 live 仍乱码,读 CLI 输出的 ALICE_SESSION_LOG= 路径(Get-Content -Encoding UTF8),或直接用 Cursor / VS Code 打开 .log / .md 文件。
Q4:用户 Ctrl+C 停掉后再发同样 prompt,会重新跑还是续接?
A:自动续接。tasks.json 保留了 taskId / contextId,下次同 prompt 启动会通过 tasks/resubscribe 接续,不重复扣额度。若续接时旧任务已失败,CLI 会自动回退到新建任务(同一进程内最多 1 次)。想真正丢弃,用 --new。
Q5:探针一直显示 submitted,可以 --new 吗?
A:不可以。submitted 是排队态,高峰期几分钟内会转 working → completed。继续用同一条 --no-wait 等即可(CLI 内部自旋,默认最长 60 分钟)。只有用户明确说"重新跑一遍"或服务端终态 failed 时才考虑 --new。
Q6:退出码 75 是什么?
A:服务端临时拒绝新任务(并发上限 / 额度 / 繁忙)。立即停止,告知用户「当前分析任务较多,请稍等 5-15 分钟后再试」;禁止换 prompt / --new / 改下载目录"绕过"——它们都会再占用并发槽。把 stdout 的 [严重] 原文转述给用户。
Q7:CLI exit=0 但 stdout 末尾只有 [等待中],没看到 DONE 行,怎么办?
A:这表示进程被沙箱 / 终端在 SSE 长连接中途 kill 了——tasks.json 永远停在 running、results/<taskId>.md 永远不出现。唯一正确做法:用完全一致的 prompt 再发一条 --no-wait,让 CLI 内部自旋问服务端:
# Windows(方案 A)
powershell -NoProfile -ExecutionPolicy Bypass -File "<SKILL_DIR>\scripts\amssm.ps1" --prompt "<和首次完全一致的 prompt>" --no-wait
# macOS / Linux
node scripts/cli.mjs --prompt "<和首次完全一致的 prompt>" --no-wait
# exit=0 + DONE 行 = 完成;exit=4(60min 触顶)再发一次同命令
禁止做的事:反复 Get-Content tasks.json / Get-ChildItem results/(CLI 已死、永远不会更新)、--new(占新并发槽)、连发多条 --no-wait(Trae「模型循环」熔断)、--no-wait --once 外层手工循环(脚本调试专用)。
注:strict 模式(默认开启)会把这种「exit=0 但无 DONE」改成退出码
6,让 Agent 一眼识别。
Q8:CLI 还没输出 DONE,但 Downloads/ 里已有同名报告,能直接读吗?
A:不能。 (1) / (2) 后缀只表示同名冲突自动重命名,不代表「本次 prompt 的第 N 次运行」。若 status -p "<prompt>" 返回 ALICE_ARTIFACT_GUARD 或列出 SIMILAR_COMPLETED_TASK / ORPHAN_DOWNLOAD_CANDIDATE / STALE_REPORT_CANDIDATE,说明本地没有本次 prompt 的登记记录,或存在其它 prompt / 其它会话留下的同名主体文件。必须阻塞等待 ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE(含匹配的 promptHash=),禁止用 view_files 扫目录猜报告。
Q9:典型误读现场(海思科复盘)—— Agent 做了什么错事?
A:下列组合几乎必然把上一次的报告当成这一次的结果(本次现场已复现):
run_command启动--no-wait后看到status: running,转而用check_command_status轮询(禁止);view_folder logs/后打开3c6ab9cc7835.session.log——这是另一句 prompt 的旧会话(promptHash=3c6ab9cc...),不是本次帮我做一份海思科的市场规模测算与战略建模报告(promptHash=f6013601...);- 旧 log 末尾有
ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE,Agent 未核对promptHash=与本次PROMPT_HASH=; - 再
view_files打开download/海思科市场规模测算与战略建模报告_20260623.md——磁盘上仍是旧附件;而tasks.json里本次taskId=019ef374-...仍是 running。
正确做法:阻塞等待 CLI 进程结束;stdout 必须含 ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE 且 promptHash= 与本次 PROMPT_HASH= 完全一致,再交付 stdout 中的 agentResult.value 原文。若进程被沙箱 kill(exit 4/6),用完全相同 prompt 再发一条 --no-wait 续接——不要读 logs/、download/、tasks.json 猜正文。
Q10:detach + 连发多条 --no-wait 为什么会在 Downloads/ 里出现 (1)(2)(3) 多份同名报告?
A:CLI 绝不覆盖已有同名文件——苏美达市场规模测算与战略建模报告.md 已存在时,新下载自动落到 (1).md。本次现场 Agent 违规连发了:--no-wait --watch ×N → --detach → --no-wait ×N,多个进程几乎同时看到服务端 completed,在 tasks.json 写入 downloadedFiles 之前各自走 resolveUniqueTargetPath,于是 26 秒内连出 (1)–(4) 四份副本(旧版 lockBypass 路径会加剧此问题,已移除)。
正确做法:--detach 后只读 detach 打印的日志路径 + 最多一条 status/--no-wait 查 DONE;禁止 detach 运行中再连发 --no-wait。本次 detach 的 DONE 行指向 reportFullFile=...\苏美达市场规模测算与战略建模报告 (1).md,因 15:54:59 已有另一进程先落了无后缀 .md。
Q11:兴业科技复盘——为什么连发 --no-wait 会调两次接口?
A:Agent 对同一用户问题连发了 8 次以上 --no-wait(还用了 check_command_status)。其中某次让任务 019ef391 在本地变成 completed;下一次 --no-wait 按旧规则看到 completed 会 清除记录并 message/stream 新建 019ef39a(第二次扣费)。修复后:--no-wait 遇到本地 completed 直接 replay_completed,不再误提交新任务。
Q12:科思科技复盘——换了一句 prompt,为什么又读了旧报告?
A:本次 Agent 用 帮我生成科思科技的市场规模测算与战略建模报告,本地已完成的是 帮我做一份科思科技的市场规模测算与战略建模报告——promptHash 不同(0cba32fc… vs fb6fa9cd…)。Agent 在 --no-wait 轮询期间说「先查看该报告,同时重新发起」并 view_files 读 download/——明确违规。CLI 启动时会打印 SIMILAR_COMPLETED_REPORT + ALICE_FORBIDDEN_READ_UNTIL_DONE;只有本次 PROMPT_HASH= 对应 DONE 后的 agentResult.value 才可交付。
Q13:什么时候不该用本技能?
A:用户只是普通金融问答(股价 / 利率 / 财经新闻),对市场规模测算 / 增长预测 / TAM·SAM·SOM 没有需求时,让上层模型直接回答;不要硬套本技能。
Q14:泰山石油复盘——多 Agent 同时问同一主体为什么会「串台」?
A:本次现场三个 Agent 用了三种措辞,产生三个 promptHash,服务端跑了三次分析,download/ 里堆了多份 泰山石油_*.md,评分还不一致(A+ 72.3 vs AA- 78)。
CLI 已加固(v1.0+):
- 同主体 running 自动续接:
resolveTaskDispatchPlan在本地无 exact 记录时,会按主体名(如「泰山石油」)匹配相似 running,自动 attach,不再新建第三条任务。 - 同主体 completed 自动重放:
--no-wait模式下,30min 内有相似 completed 会 replay_completed(ALICE_NO_SERVER_CALL=1),不发服务端请求。 - running 防护与 replay 统一:
findSimilarRunning与findSimilarCompleted共用comparePromptsForReplay(含 subject 匹配),「信用报告」vs「市场规模测算与战略建模报告」视为同主体。 - 跨进程主体锁:除 promptHash 锁外,增加
computeSubjectKey主体锁,防止三进程冷启动同时 submit。
Agent 仍须遵守(程序层不能替代 Agent 纪律):
| Agent 措辞 | 典型错误 | 后果 |
|------------|----------|------|
| 给我一份泰山石油的信用报告 | --detach + 手工 Get-Content 日志 + 读 download/ | 可能交付旧 prompt 的报告 |
| 给我做一份泰山石油的市场规模测算与战略建模报告 | 连发 8 次 --no-wait / --watch + 读 tasks.json 挑 completed | 误读其它 taskId 的摘要 |
| 给我一份泰山石油的市场规模测算与战略建模报告 | 相对规范,但仍可能与上两者并行扣费 | 用户看到三份不同结论 |
共同违规(违反任一条即可能串台):
- 没用
amssm.ps1方案 A——cd && node/Set-Location; node在 PowerShell 5.x 易失败;命令末尾拼undefined是 Agent 工具 bug。 - 没做
check-conflict——exit=12 时应先问用户「重放还是新建」,而不是默默再开一条分析。 - 连发多条 CLI /
check_command_status/--detach后轮询——应只发一条--no-wait并阻塞等到 DONE。 - DONE 之前读
download/、tasks.json、results/——泰山石油_市场规模测算与战略建模报告.md可能绑定另一个 promptHash;ALICE_FORBIDDEN_READ_UNTIL_DONE不是报告路径。 - 换措辞当「重试」——
信用报告vs市场规模测算与战略建模报告会被判为相似任务;应续接/重放原 prompt,不要换句。
正确做法(单 Agent):check-conflict → 若 exit=12 问用户 → 一条 amssm.ps1 ... --no-wait 阻塞等待 → stdout ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE 且 promptHash= 一致 → 交付 agentResult.value 原文,禁止展示 download/ 附件。
Q15:永辉超市复盘——为什么 Agent 交付的 PD / 评级与真实报告不一致?
A:Agent 违规组合:(1) 连发多条 --no-wait 且用 check_command_status 轮询,未阻塞等到 DONE;(2) 读 results/ 或 download/ 附件后自行概括成表格——定量指标会被改错。正确做法:阻塞等到 ALICE_MARKET_SIZING_STRATEGIC_MODELING_DONE → 将 stdout 的 agentResult.value 原文交给用户(截断时读 reportFile= 兜底)→ 禁止概括 → 禁止展示下载附件正文。
Q16:苏美达复盘——任务明明成功了,为什么 Agent 却说"找不到 API Key"?
A:这是凭 stderr 噪声 / 子命令返回脑补出"Key 缺失"结论的典型误判,本次现场已复现。真实情况:API Key 配得好好的(config.env 存在且有效),任务已在服务端成功完成、报告已落盘。Agent 错误链路:
--no-wait主调用进程被沙箱 / IDE 终端在 SSE 长连接中途 kill(exit=6 strict 兜底,或 exit=0 无 DONE);- Agent 不识别这是"被杀",反复
check_command_status说"输出似乎不完整"; - 转去跑
status/apikey-get子命令想"排查",却没读懂返回值(apikey-get的 JSONstatus: configured被忽略或误读成missing); - 最终向用户下结论"需要先配置 API Key",引导用户做根本不必要的配置。
为什么这是错的:
request.js主路径在发请求前就会getApiKey()(request.js:877),Key 真缺失会立刻die("KEY_MISSING")exit=2,绝不可能"已经发了服务端请求再说没 Key"——这在逻辑上自相矛盾。- strict 兜底输出(
request.jsinstallStrictExitHook)只说"未输出 DONE,请用相同 prompt 续接",不含任何 Key 配置文案。 apikey-get(printApiKeyStatus)是只读探针,返回 JSON:status: configured(正常,含脱敏 key)/missing(缺失)/error(读文件失败)。必须按status字段判定,禁止凭印象。
正确做法:
- 退出码 不是 2 且 stderr 不含
"code":"KEY_MISSING"→ 禁止声称 Key 缺失; - 想核实 Key → 跑
apikey-get,读 JSON 的status字段:configured= Key 没问题,往别处查; - 进程被杀(exit=4/6)→ 任务可能仍在服务端跑,用完全相同 prompt 再发一条
--no-wait续接(见 Q7); - 想确认任务真实状态 → 跑
status --prompt "<原 prompt>",它会从本地tasks.json给出completed/running/failed及落盘路径,不访问服务端; - 禁止把"输出不完整""进程退出""apikey-get 某行看不懂"等同于"Key 缺失"。
一句话:Key 缺失有唯一的确定信号(exit=2 +
KEY_MISSINGJSON);其它一切"看起来不对劲"都不是 Key 问题,应按对应的退出码 / 信号处理(续接、等 DONE、报真实错误),不要引导用户去配置一个根本没问题的 Key。
Scan to join WeChat group