Skill: woshixihongtu-cyber/stockclaw-yingyan (version 1.1.4)

--- name: stockClaw-yingyan description: 为该股票量化项目提供 OpenClaw 接入说明，支持股票量化图生成、股票行情问答、自然语言 AI 搜股与 WebSocket 实时监控信号推送。凭证须从与本 Skill 同目录的 config.json 中 openclawCredentials 读取：user_id 与 openClaw_api_key 为必填（用于所有需鉴权的 HTTP 接口，请求体/查询参数中字段名仍为 apikey）；monitor_api_key 为选填，仅 WebSocket 实时监控需要，不订阅监控可不配置。首次配置或用户在对话中修改后写回 config.json；禁止在配置已有效时重复索要；用户也可直接编辑 config.json 修改凭证。 --- # stockClaw-yingyan ## 适用场景 - 用户只发送股票名称或股票代码 - 用户发送"股票名称/股票代码 + 行情" - 用户发送自然语言选股条件，想搜索某一类股票 - 用户要查询今天有哪些涨停股 - 用户要接收实时监控信号推送 ## 输入规则 1. 如果消息只包含股票名称或股票代码，调用 `POST /api/openclaw/stock/message` 2. 如果消息包含"行情"关键词，调用 `POST /api/openclaw/stock/message` 3. 如果消息是自然语言选股条件，调用 `POST /api/openclaw/stock/query` 4. 如果用户明确要查询涨停股股票列表，调用 `GET /api/openclaw/stock/limit-up` 5. 如果要接收实时信号推送，先调用 `GET /api/openclaw/stock/monitor/stream` 获取 WebSocket 连接模板 ### 自然语言 AI 搜股意图识别 满足以下特征时，应优先判断为"自然语言 AI 搜股"： - 用户在描述一类股票，而不是单只股票，例如："涨幅超过 8% 的科技股"、"换手率高的深圳股票"、"近 20 日涨幅靠前的半导体股票" - 用户带有筛选、排序、区间、排除、前 N 名等表达，例如："大于"、"小于"、"区间"、"按涨幅排序"、"取前 20 只"、"剔除 ST" - 用户意图是"找股票列表"，而不是生成单只股票量化图，也不是诊断单只股票行情 不要误判为自然语言 AI 搜股的场景： - 纯股票名称或代码：如 `平安银行`、`000001` - 明确包含"行情"并指向单只股票诊断：如 `平安银行行情` - 明确要求查询"涨停股"、"今日涨停股票"、"今天涨停股有哪些" - 仅要求连接实时监控、订阅监控信号 ## 凭证持久化（config.json，必读） 本 Skill 目录下与本文件同级的 `config.json` 中设有对象 **`openclawCredentials`**，包含三个字符串字段： | 字段 | 是否必填 | 用途 | |------|----------|------| | **`user_id`** | **必填** | 所有接口的用户标识 | | **`openClaw_api_key`** | **必填** | 量化图、行情问答、自然语言搜股、涨停股、`rating-changes-to-await` 等 **HTTP** 鉴权；调用接口时请求体/Query 里参数名仍为 **`apikey`**，取值必须为本字段 | | **`monitor_api_key`** | **选填** | **仅** WebSocket 实时监控：`/ws/monitor/open?apikey=...` 中的 `apikey` 须填会员中心「监控信号」Key，即本字段。若用户不需要实时监控，**可不设置**（留空字符串即可） | ### 读取顺序（每次调用前执行） 1. **读取** `config.json` 的 `openclawCredentials.user_id`、`openClaw_api_key`、`monitor_api_key`（仅含空格的字符串视为未配置）。 2. **若用户在当轮对话中提供了新凭证**（粘贴 key、更换账号等），以当轮值为准，并**写回** `config.json`（见「写回规则」）。 3. **合并**：文件中的非空值为默认；当轮用户输入覆盖对应字段。 4. **HTTP 能力**（规则 1～4 及 `rating-changes-to-await`）：合并后 **`user_id` 与 `openClaw_api_key` 均须为有效 12 位字母数字**，方可请求；满足后**不得**再索要这两项。 5. **WebSocket 实时监控**（规则 5）：除 `user_id` 外，还须 **`monitor_api_key` 有效**；若用户要连监控但该字段空，**单独提示**其到会员中心「开放API」→「监控信号」保存 Key，**不要**与 OpenClaw Key 混淆。 6. **强约束（防重复索要）**：只要 `user_id` + `openClaw_api_key` 已有效，调用 HTTP 接口时**禁止**以新会话、换话题等理由再次索要；`monitor_api_key` 同理——仅在用户要连 WS 且该字段缺失/无效时再提示。 ### 写回规则（持久保存） - 首次凑齐必填项或用户主动更新任一字段后，将当前合并结果**写回** `config.json` 的 `openclawCredentials`（`user_id`、`openClaw_api_key`、`monitor_api_key` 按需更新），**保留**其余顶层键不变；合法 JSON，勿写多余注释。 - 后续会话**优先读文件**。 ### 用户修改凭证 1. **对话中修改**：用户粘贴新 Key 或新 `user_id` 时，覆盖对应字段并写回 `config.json`；未提及的字段保留原 config。 2. **手动编辑 `config.json`**：下次执行须以文件为准，勿因对话未出现而重复索要。 ### HTTP 与 URL 中的 `apikey` 名对照（避免搞混） - **POST/GET 的 JSON 或 Query 参数名**统一叫 **`apikey`**，其值 = 合并后的 **`openClaw_api_key`**。 - **WebSocket** URL 查询参数名也叫 **`apikey`**，其值 = 合并后的 **`monitor_api_key`**（与 HTTP 不是同一把 Key 时两者不同）。 ### 仍缺必填凭证时的提示（user_id / openClaw_api_key） 仅在 **`user_id` 或 `openClaw_api_key` 缺失或非法**时提示（与是否使用监控无关）： ```text 使用股票量化图、行情问答、自然语言搜股或涨停查询前，必须配置 user_id 与 openClaw_api_key（均为 12 位 OpenClaw Key 对应会员中心「OpenClaw」卡片）。 获取方式：鹰眼量化网站「用户中心」→「开放API」：https://yingyan.chatface.com/ 配置后我会写入本 Skill 的 config.json（openclawCredentials），之后 HTTP 调用无需重复填写。 ``` ### 仅缺监控 Key 时的提示（要连 WebSocket 时） 当用户明确要求实时监控，但 **`monitor_api_key` 为空或无效**时： ```text 连接实时监控还需要「监控信号」API Key（会员中心「开放API」页面第一个卡片）。若你不需要 WebSocket 推送，可忽略此项。 请配置 monitor_api_key 后写入 config.json，或到上述页面保存监控 Key 后再试连接。 ``` ### 鉴权失败时 - HTTP 报错多与 **`openClaw_api_key`** 或 `user_id` 不一致有关，请核对会员中心 **OpenClaw** 卡片。 - WebSocket 关闭码 `1008` 等多与 **`monitor_api_key`**、会员等级或 `monitor.html` 权限有关，请核对 **监控信号** Key 与权限。 ## 调用约定 （以下请求体中的 **`apikey`** 取值均为合并后的 **`openClaw_api_key`**，字段名与 HTTP API 一致。） ### 1. 量化图 请求： ```json { "message": "平安银行", "user_id": "your_user_id", "apikey": "YOUR_OPENCLAW_12_CHAR_KEY" } ``` 处理规则： - `intent=chart`：返回量化图 URL - `ok=false`：读取 `error.code` 与 `error.message` ### 2. 行情问答 请求： ```json { "message": "平安银行行情", "user_id": "your_user_id", "apikey": "YOUR_OPENCLAW_12_CHAR_KEY" } ``` 处理规则： - `intent=market_query`：返回结构化 TDX 截面数据、`system_prompt`、`user_prompt` - 收到响应后，**你（OpenClaw 大模型）必须使用返回的 `system_prompt` 和 `user_prompt` 来生成趋势诊断** - `ok=false`：读取 `error.code` 与 `error.message` ### 3. 自然语言 AI 搜股 请求： ```json { "query": "涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只", "user_id": "your_user_id", "apikey": "YOUR_OPENCLAW_12_CHAR_KEY" } ``` 处理规则： - 调用 `POST /api/openclaw/stock/query` - 该能力参考 `web/query/queryFundamentals.html` 的自然语言理解思路，但**不要复用**网页端 `POST /api/query/tdx` 接口 - OpenClaw 场景只返回轻量结果，**最多 20 只** - 返回结果仅允许包含以下字段： - `代码` - `名称` - `涨幅%` - `现价` - `涨跌` - `换手%` - `细分行业` - `活跃度` - `连涨天` - `昨涨幅%` - `3日涨幅%` - `5日涨幅%` - `10日涨幅%` - `20日涨幅%` - `60日涨幅%` - `一年涨幅%` - `月初至今%` - `年初至今%` - `近日指标提示` - OpenClaw 应直接把结构化股票列表返回给用户；如果接口同时返回摘要字段，可优先使用摘要，再附表格结果 - `ok=false`：读取 `error.code` 与 `error.message` ### 4. 涨停股专用查询 请求： ```text GET /api/openclaw/stock/limit-up?user_id=your_user_id&[REDACTED_SECRET] ``` 处理规则： - 当用户明确要查"今天涨停股有哪些"、"涨停股票列表"时，优先调用该专用接口 - 不要把这类请求误走通用自然语言搜股 `POST /api/openclaw/stock/query` - 该接口按股票代码和名称对应的涨停阈值识别结果：主板约 10%，创业板/科创板约 20%，北交所约 30%，ST 约 5% - 返回结果为结构化股票列表，可直接展示给用户 ### 5. WebSocket 实时监控 请求： ```text GET /api/openclaw/stock/monitor/stream?user_id=your_user_id ``` 处理规则： - 返回 `ws_url_template`，模板中查询参数名为 `apikey`、`user_id`（占位符可能写作 `{apikey}` 与 `{user_id}`） - **URL 中的 `apikey` 必须填入 `monitor_api_key`**（监控信号 Key），**不要**填 `openClaw_api_key` - `user_id` 填合并后的用户 ID - 连接地址示例：`wss://yingyan.chatface.com/ws/monitor/open?[REDACTED_SECRET]` - 连接成功后将持续接收监控信号变化推送（JSON 数组格式） - 每条推送包含：`ticker`（代码）、`name`（名称）、`prev_rating`（原评级）、`latest_rating`（新评级）、`close`（现价）、`zhangdie`（涨跌幅比例）、`latest_time`（时间） - **信号过滤**：当评级变为 `await`（等待）时，服务端不会推送通知，仅推送有实际买卖意义的信号变化 ### 6. OpenClaw 自然语言 AI 搜股的执行要求 - 若用户输入明显是选股条件，应调用 `POST /api/openclaw/stock/query`，不要误走单股量化图或单股行情诊断。 - 搜股接口返回的是股票列表，不是自由发挥的分析长文；应以结构化结果为主。 - 默认最多返回 20 只股票；即使用户要求更多，也应以接口上限为准。 - 不要自行扩充返回字段，严格使用接口定义的固定字段集合。 - 可识别的意图包括：涨幅筛选、换手率筛选、区间筛选、行业筛选、地区筛选、排序、前 N 名、排除 ST、排除北交所、排除科创板、排除创业板等。 - 如果用户明确要的是"涨停股列表"，应改走涨停股专用接口，而不是通用搜股接口。 ### 7. OpenClaw 连接实时监控的推荐执行顺序 当用户要求"连接实时监控"、"配置 WebSocket 监控"、"接收实时监控信号"时，OpenClaw 应按以下顺序执行： 1. 确认合并后的 **`user_id`、`monitor_api_key` 均有效**；若缺 `monitor_api_key`，使用上文「仅缺监控 Key 时的提示」，**不要**用 `openClaw_api_key` 冒充监控 Key。 2. （可选）用 `user_id` + **`openClaw_api_key`** 调用一次 `POST /api/openclaw/stock/message` 验证 HTTP 凭证；此步**不能**代替监控 Key 校验。 3. 调用 `GET /api/openclaw/stock/monitor/stream` 获取 `ws_url_template`。 4. 将模板中 **`apikey` 占位替换为 `monitor_api_key`**，`user_id` 占位替换为真实 `user_id`，再建立 WebSocket。 5. **优先使用原生 WebSocket 客户端能力建立连接**，不要把安装 `wscat`、`websocat`、`curl` WebSocket 插件当成默认流程。 6. WebSocket `onopen` 或等价握手成功后，就应判定为"实时监控连接成功"。 7. 连接成功后保持等待；如果暂时没有收到任何消息，不能据此判定失败。 ### 8. OpenClaw 在实时监控场景下的强约束 - 不要默认先尝试安装或调用 `wscat`、`websocat`、`curl` 特殊模式；这些只可作为人工排障兜底方案，不是首选接入路径。 - 若平台本身支持 WebSocket 客户端，应直接连接 `ws_url_template` 替换后的正式地址。 - 服务端**不会**在连接建立后主动发送欢迎包、首包或心跳说明；连接后暂时沉默是正常现象。 - 只有监控信号发生变化时，服务端才会推送 JSON 数组消息。 - 当最新评级变为 `await` 时，服务端不会推送，所以"已连接但暂时无消息"通常代表当前没有有效买卖信号变化。 - 如果连接被关闭且关闭码为策略拒绝（常见为 `1008`），应优先检查：**`monitor_api_key`** 是否与会员中心「监控信号」Key 一致、`user_id` 是否正确、会员状态是否有效、会员等级是否满足 `monitor.html` 权限要求（不要用 OpenClaw Key 连监控 WS）。 ### 9. 连接成功后的用户反馈要求 - 一旦握手成功，应明确告诉用户："WebSocket 连接已成功建立，当前正在等待实时监控信号。" - 如果几秒到几十秒内没有推送，应补充说明："这是正常现象，服务端只在监控信号变化时推送。" - 如果收到 JSON 数组消息，再把结构化内容转述给用户。 - 如果连接失败，不要笼统说"连接异常"；要优先说明最可能的鉴权或权限原因。 ## 返回处理 - 如果返回 `image_url`，直接把图片 URL 返回给用户 - 如果返回 `render_markdown`，优先把它作为聊天渲染内容返回给客户端 - 如果返回 `system_prompt` 和 `user_prompt`，按照下方"行情问答提示词"完成分析并返回 - 如果返回自然语言搜股结果，优先返回精简表格或结构化列表，保留字段顺序与接口一致 - 如果返回 `candidates`，提示用户从候选股票中进一步明确代码或名称 ## 行情问答提示词 当 `intent=market_query` 时，API 返回 `system_prompt` 和 `user_prompt` 字段。你应按如下方式使用： ### 系统提示词（system_prompt） ``` 你是一个只基于给定 TDX 股票字段和规则摘要进行推理的 A 股趋势诊断器。 任务边界： 1. 只能使用输入中明确提供的字段、数值和规则侧摘要，不得虚构新闻、公告、财报细节、资金流细节或 K 线结构。 2. 若信号互相冲突、字段缺失较多、估值无法判断或趋势不稳，必须主动降低置信度并说明原因。 3. 趋势判断只能使用"偏强 / 震荡 / 偏弱"等概率性语言，禁止"必涨""一定反转""稳健翻倍"等绝对化表述。 4. 分析重点是未来短期（1-2 周）与中期（1-3 个月）的趋势倾向、观察条件和风险，不要写成长篇泛化研报。 5. 如果某个结论的支撑不足，就明确说"当前证据不足"，不要硬给结论。 输出要求： - 使用 Markdown。 - 严格按照以下标题输出，不要改标题名： ## 趋势判断 - 短期趋势：... - 中期趋势：... - 置信度：高 / 中 / 低，理由... ## 关键依据 - ... - ... ## 风险与反证 - ... - ... ## 操作建议 - ... - ... ## 免责声明 - 仅基于最新 TDX 截面数据生成，不构成投资建议。 写作要求： - 先结论，后依据。 - 每条依据尽量引用具体字段名和数值。 - 风险部分必须包含至少一个反证点；如果暂未发现极端风险，也要写"当前未见明显极端风险，但仍需继续观察 xxx"。 - 操作建议要与趋势和置信度一致，避免一边说高波动一边给出激进追涨建议。 ``` ### 用户提示词（user_prompt） API 会返回基于 TDX 截面数据自动构建的用户提示词，包含以下结构化信息： - 诊断对象（股票名称、代码、行业、地区） - 规则侧预判（短期趋势、中期趋势、置信度、可用信号数、主要冲突） - 行情快照（现价、涨幅、今开、最高、最低等） - 短线动量信号（涨幅、量比、换手率、近日指标提示等） - 中线趋势信号（20/60 日涨幅、强弱度、连涨天等） - 资金与基本面信号（主力资金、估值、财务概况等） - 已识别风险 请直接将 `user_prompt` 作为用户消息，配合上方系统提示词完成趋势诊断。 ## 参考资料 - 接口字段说明见 [reference.md](reference.md) - 调用示例见 [examples.md](examples.md)

path: config.json
content: {
  "platform": "ClawHub",
  "uploadPage": "https://clawhub.ai/upload",
  "uploadFormDefaults": {
    "slug": "stockclaw-yingyan",
    "displayName": "stockClaw-yingyan 股票量化助手",
    "version": "1.1.4",
    "tagsText": "latest, stock, quant, openclaw",
    "mit0Accepted": true,
    "updateLog": "1.1.4：openclawCredentials 拆分为 openClaw_api_key / monitor_api_key；HTTP 与 WebSocket 分钥。1.1.3：凭证防重复索要。"
  },
  "uploadFolder": {
    "path": "examples_skill/stockClaw-yingyan",
    "mustInclude": [
      "SKILL.md"
    ],
    "shouldInclude": [
      "reference.md",
      "examples.md",
      "CLAWHUB_UPLOAD.md"
    ]
  },
  "openclawCredentials": {
    "user_id": "",
    "openClaw_api_key": "",
    "monitor_api_key": ""
  },
  "runtimeEndpoints": {
    "baseUrl": "https://yingyan.chatface.com",
    "healthUrl": "https://yingyan.chatface.com/api/openclaw/health",
    "demoUrl": "https://yingyan.chatface.com/web/openclaw_demo.html",
    "messageApi": "https://yingyan.chatface.com/api/openclaw/stock/message",
    "stockQueryApi": "https://yingyan.chatface.com/api/openclaw/stock/query",
    "limitUpApi": "https://yingyan.chatface.com/api/openclaw/stock/limit-up",
    "monitorStreamApi": "https://yingyan.chatface.com/api/openclaw/stock/monitor/stream",
    "monitorWsTemplate": "wss://yingyan.chatface.com/ws/monitor/open?[REDACTED_SECRET]"
  },
  "testInputs": {
    "userId": "",
    "chartMessage": "000001",
    "marketMessage": "000001行情",
    "stockQuery": "涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只"
  }
}


path: examples.md
content: # Examples

## 0. `openclawCredentials`：从 config.json 读取与持久化

`config.json` → `openclawCredentials` 含 **`user_id`**、**`openClaw_api_key`**、**`monitor_api_key`**。

- **`user_id` + `openClaw_api_key`**：**必填**，用于所有需鉴权的 **HTTP** 接口（请求里参数名仍为 `apikey`，取值用 `openClaw_api_key`）。
- **`monitor_api_key`**：**选填**；仅 **WebSocket 实时监控** 需要。不需要监控可留空。

场景：用户想用量化图、行情、搜股、涨停等，但对话里未粘贴凭证。

OpenClaw 应：
1. **先读** `openclawCredentials.user_id` 与 `openClaw_api_key`；二者均有效则用于 HTTP，**不要**重复询问。
2. 若用户本轮提供了新值：合并后**写回** `config.json`（保留其他键）。
3. 仍缺 **`user_id` 或 `openClaw_api_key`** 时，提示补充（见 SKILL.md 必填提示）；**不要**要求用户必须填 `monitor_api_key`，除非用户要连监控。

示例提示（仅缺必填项时）：

```text
继续之前需要配置 user_id 与 openClaw_api_key（HTTP 请求里的 apikey 填后者）。

获取：鹰眼量化「用户中心」→「开放 API」https://yingyan.chatface.com/

保存到本 Skill 的 config.json（openclawCredentials）后可自动沿用。
```

## 0b. 用户要修改或更换凭证

场景：用户说换 Key、换账号、粘贴新的 12 位 Key 等。

处理：
1. 用新值覆盖 `user_id` / `openClaw_api_key` / `monitor_api_key` 中用户明确要改的项，其余保留 config 原值。
2. 可选：用 `user_id` + `openClaw_api_key` 调用 `POST /api/openclaw/stock/message` 做 HTTP 侧验证。
3. **写回** `openclawCredentials` 到 `config.json`。
4. 告知已保存；配置有效时勿重复索要。

用户**手动编辑** `config.json` 后：下次执行**必须先读文件**，以文件为准。

## 1. 用户发送自然语言选股条件

请求：

```http
POST /api/openclaw/stock/query
Content-Type: application/json

{
  "query": "涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只",
  "user_id": "68b26718213929ab1d78aae5",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `intent=stock_query`
- 最多返回 20 条股票记录
- 只返回固定字段，不返回网页端那种大字段全集
- 适合在 OpenClaw 对话中直接渲染成精简表格

## 2. 用户只发股票代码

请求：

```http
POST /api/openclaw/stock/message
Content-Type: application/json

{
  "message": "000001",
  "user_id": "68b267182139",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `intent=chart`
- 读取 `render_markdown`
- 将量化图 markdown 直接渲染到聊天界面

## 3. 用户只发股票名称

请求：

```http
POST /api/openclaw/stock/message
Content-Type: application/json

{
  "message": "平安银行",
  "user_id": "68b26718213929",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `intent=chart`
- 读取 `render_markdown`

## 4. 用户发送"股票+行情"

请求：

```http
POST /api/openclaw/stock/message
Content-Type: application/json

{
  "message": "平安银行行情",
  "user_id": "68b267182139",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `intent=market_query`
- 返回 `stock_context`（TDX 截面数据结构化信息）
- 返回 `system_prompt` 和 `user_prompt`
- OpenClaw 大模型使用 `system_prompt` 作为系统角色、`user_prompt` 作为用户消息，生成趋势诊断并返回给用户

## 5. 股票匹配到多个候选

请求：

```http
POST /api/openclaw/stock/message
Content-Type: application/json

{
  "message": "平安行情",
  "user_id": "68b267182139",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `ok=false`
- `error.code=multiple`
- 提示用户从 `error.candidates` 中选择更精确的股票

## 6. 获取实时监控接入信息

请求：

```http
GET /api/openclaw/stock/monitor/stream?user_id=68b2671
```

预期：
- 返回 `ws_url_template`
- 将模板中 **`apikey` 占位** 填为 **`monitor_api_key`**（监控信号 Key），`user_id` 填真实 ID，再连 WebSocket

## 7. 建立 WebSocket 实时监控连接

连接地址（由 `ws_url_template` 拼接，**URL 中 [REDACTED_SECRET]

```text
wss://yingyan.chatface.com/ws/monitor/open?[REDACTED_SECRET]
```

预期：
- 连接成功后持续接收 JSON 数组格式的监控信号推送
- 每条推送包含 `ticker`、`name`、`prev_rating`、`latest_rating`、`close`、`zhangdie`、`latest_time`
- 连接断开后可自动重连

补充说明：
- 建议直接使用原生 WebSocket 客户端连接，不要默认先安装 `wscat`、`websocat`。
- 连接建立后如果暂时没有消息，属于正常现象；服务端不会先发送欢迎包。
- 只有监控信号发生有效变化时才会推送；若最新评级变为 `await`，不会推送。

## 8. OpenClaw 配置实时监控的推荐流程

步骤 1：先验证凭证

```http
POST /api/openclaw/stock/message
Content-Type: application/json

{
  "message": "000001",
  "user_id": "68b26718213929ab1d78aae5",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

预期：
- 返回 `ok=true`
- 说明 `user_id` 与 **OpenClaw** Key（请求字段 `apikey`）对消息接口鉴权有效

如果缺 **`user_id` 或 `openClaw_api_key`**：
- 不要继续走步骤 2 和步骤 3
- 先按 SKILL.md 补全必填项

若用户要连监控但缺 **`monitor_api_key`**：
- 提示到「开放 API」保存**监控信号** Key，勿用 OpenClaw Key 顶替

步骤 2：获取监控流模板

```http
GET /api/openclaw/stock/monitor/stream?user_id=68b26718213929ab1d78aae5
```

预期：
- 返回 `ws_url_template`
- 模板类似 `wss://.../ws/monitor/open?[REDACTED_SECRET]`，其中 `{apikey}` 替换为 **`monitor_api_key`**

步骤 3：直接建立 WebSocket 连接

```text
wss://yingyan.chatface.com/ws/monitor/open?[REDACTED_SECRET]
```

预期：
- WebSocket 握手成功即表示连接成功
- 若连接后暂无消息，不应判定为失败
- 应向用户说明："连接正常，当前正在等待实时监控信号变化"

## 9. WebSocket 成功但没有立即收到消息

现象：
- 连接已经建立
- 一段时间内没有收到任何 JSON 消息

正确结论：
- 这是正常现象，不代表连接失败
- 服务端只在监控信号变化时推送
- 当评级变为 `await` 时不会推送

错误做法：
- 因为短时间没有消息，就反复改用 `wscat`、`websocat`、`curl` 等工具
- 把"连接后暂无消息"误判成"WebSocket 不可用"

## 10. OpenClaw 自然语言搜股与网页端选股的区别

网页端：
- 页面：`web/query/queryFundamentals.html`
- 接口：`POST /api/query/tdx`
- 返回可能较多列，偏完整分析表

OpenClaw：
- 接口：`POST /api/openclaw/stock/query`
- 最多只返回 20 只
- 只返回以下字段：
  - `代码`
  - `名称`
  - `涨幅%`
  - `现价`
  - `涨跌`
  - `换手%`
  - `细分行业`
  - `活跃度`
  - `连涨天`
  - `昨涨幅%`
  - `3日涨幅%`
  - `5日涨幅%`
  - `10日涨幅%`
  - `20日涨幅%`
  - `60日涨幅%`
  - `一年涨幅%`
  - `月初至今%`
  - `年初至今%`
  - `近日指标提示`

## 11. 健康检查

请求：

```http
GET /api/openclaw/health
```

预期：
- 返回 `service`、`endpoints`、`demo_page`
- 可用于平台接入前自检

## 12. 打开 demo 页面

地址：

```text
https://yingyan.chatface.com/web/openclaw_demo.html
```

预期：
- 可直接点按测试健康检查、消息入口、WebSocket 实时监控


path: manifest.json
content: {
  "platform": "ClawHub",
  "uploadPage": "https://clawhub.ai/upload",
  "uploadMode": "folder",
  "formFields": {
    "slug": "stockclaw-yingyan",
    "displayName": "stockClaw-yingyan 股票量化助手",
    "version": "1.1.4",
    "tags": [
      "latest",
      "stock",
      "quant",
      "openclaw"
    ],
    "license": "MIT-0",
    "updateLog": "1.1.4：openclawCredentials 拆分为 openClaw_api_key / monitor_api_key；HTTP 与 WS 分钥。1.1.3：防重复索要凭证。"
  },
  "uploadValidation": {
    "requiresSlug": true,
    "requiresDisplayName": true,
    "requiresAtLeastOneFile": true,
    "requiresSkillMd": true,
    "requiresMit0Agreement": true
  },
  "folderPayload": {
    "rootFolderName": "stockClaw-yingyan",
    "requiredFiles": [
      "SKILL.md"
    ],
    "recommendedFiles": [
      "reference.md",
      "examples.md",
      "CLAWHUB_UPLOAD.md",
      "openapi.json",
      "manifest.json",
      "config.json"
    ],
    "notes": [
      "上传页面提示应上传包含 SKILL.md 文件和文本文件的文件夹。",
      "页面会保留文件夹路径并自动扁平化外部包装器。"
    ]
  }
}


path: openapi.json
content: {
  "openapi": "3.0.3",
  "info": {
    "title": "stockClaw-yingyan OpenClaw API",
    "version": "1.1.4",
    "description": "HTTP 接口中参数名 apikey 须为会员中心「OpenClaw」12 位 Key。WebSocket /ws/monitor/open 的查询参数 apikey 须为「监控信号」Key。详见 SKILL.md openclawCredentials。"
  },
  "servers": [
    {
      "url": "https://yingyan.chatface.com",
      "description": "生产环境"
    }
  ],
  "paths": {
    "/api/openclaw/stock/message": {
      "post": {
        "summary": "Handle stock message (chart or market query)",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["message", "user_id", "apikey"],
                "properties": {
                  "message": {
                    "type": "string",
                    "description": "股票代码/名称，或股票+行情"
                  },
                  "user_id": {
                    "type": "string"
                  },
                  "apikey": {
                    "type": "string",
                    "minLength": 12,
                    "maxLength": 12,
                    "description": "会员中心 OpenClaw API Key（config.openClaw_api_key）"
                  },
                  "start_date": {
                    "type": "string",
                    "description": "仅量化图请求使用"
                  },
                  "end_date": {
                    "type": "string",
                    "description": "仅量化图请求使用"
                  },
                  "initial_capital": {
                    "type": "number",
                    "description": "仅量化图请求使用"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OpenClaw unified response (chart or market_query with TDX data and prompts)"
          }
        }
      }
    },
    "/api/openclaw/stock/query": {
      "post": {
        "summary": "Natural language stock screener for OpenClaw",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["query", "user_id", "apikey"],
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "自然语言选股条件，例如：涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只"
                  },
                  "user_id": {
                    "type": "string"
                  },
                  "apikey": {
                    "type": "string",
                    "minLength": 12,
                    "maxLength": 12,
                    "description": "会员中心 OpenClaw API Key（config.openClaw_api_key）"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OpenClaw stock screener response, max 20 rows and fixed fields only"
          }
        }
      }
    },
    "/api/openclaw/stock/limit-up": {
      "get": {
        "summary": "Get today's limit-up stocks for OpenClaw",
        "parameters": [
          {
            "name": "user_id",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "apikey",
            "in": "query",
            "required": true,
            "description": "会员中心 OpenClaw API Key（config.openClaw_api_key）",
            "schema": {
              "type": "string",
              "minLength": 12,
              "maxLength": 12
            }
          }
        ],
        "responses": {
          "200": {
            "description": "OpenClaw limit-up stock list based on latest TDX CSV"
          }
        }
      }
    },
    "/api/openclaw/stock/monitor/stream": {
      "get": {
        "summary": "Get WebSocket monitor connection info",
        "parameters": [
          {
            "name": "user_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "WebSocket 模板中 apikey 占位须替换为监控信号 Key（config.monitor_api_key），非 OpenClaw Key"
          }
        }
      }
    },
    "/api/openclaw/health": {
      "get": {
        "summary": "Health check",
        "responses": {
          "200": {
            "description": "Service health and endpoint info"
          }
        }
      }
    }
  }
}


path: reference.md
content: # API Reference

## 企业微信专用接口（`/api/wecom`）

企业微信 API 插件鉴权方式与 OpenClaw 不同，需使用 Header/Query 传递 `X-API-Key` 与 `userid`。详见 `job/wechat_enterprise/README.md`。

- `GET /api/wecom/health`：健康检查
- `POST /api/wecom/stock/message`：股票消息（Header: `X-API-Key`, `X-User-Id`；Body: `message` / `query` / `content`）
- `POST /api/wecom/stock/query`：自然语言搜股（Header: `X-API-Key`, `X-User-Id`；Body: `message` / `query` / `content`）
- `GET /api/wecom/stock/limit-up`：涨停股专用查询（Header/Query: `X-API-Key`, `X-User-Id` / `userid`）
- `GET /api/wecom/stock/monitor/stream`：实时监控流模板（Header/Query: `X-API-Key`, `X-User-Id` / `userid`）

---

## `GET /api/openclaw/health`

用于健康检查与快速发现接口入口。

### 响应示例

```json
{
  "ok": true,
  "service": "stockClaw-yingyan",
  "platform_hint": "ClawHub",
  "base_url": "https://yingyan.chatface.com",
  "endpoints": {
    "message": "https://yingyan.chatface.com/api/openclaw/stock/message"
  },
  "demo_page": "https://yingyan.chatface.com/web/openclaw_demo.html"
}
```

## `POST /api/openclaw/stock/message`

统一入口，根据用户消息自动判断是生成量化图还是返回行情数据。

### 请求体

```json
{
  "message": "000001",
  "user_id": "your_user_id",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY",
  "start_date": "2025-03-01",
  "end_date": "2026-03-01",
  "initial_capital": 1000000
}
```

### 识别规则
- 仅股票名称或股票代码：`intent=chart`
- 包含"行情"关键词：`intent=market_query`
- 其他输入：`ok=false` 且 `error.code=invalid_message`

### 鉴权要求
- 必须传 `user_id`
- 必须传 `apikey`（**HTTP 参数名**；取值须为会员中心 **OpenClaw** 卡片保存的 12 位 Key，即 `config.json` 的 `openclawCredentials.openClaw_api_key`）
- 图表服务已使用 `Agg` 后端，适合服务端无界面部署

### 缺失 `user_id` 或 OpenClaw Key 时
- OpenClaw 不应在缺少 `user_id` 或有效 **`openClaw_api_key`**（请求里仍放在字段 `apikey`）的情况下直接请求本接口。
- **优先**从本 Skill 同目录 `config.json` 的 `openclawCredentials` 读取 `user_id`、`openClaw_api_key`；二者均有效则用于请求体中的 `user_id` 与 `apikey`。
- **监控 WebSocket** 使用另一字段 `monitor_api_key`，见下文 monitor/stream 与 SKILL.md；不需要监控可不配置 `monitor_api_key`。
- 用户在本轮对话中提供或更新凭证时，将最终值**写回** `openclawCredentials`，保留文件内其他键。
- 获取路径：鹰眼量化「用户中心」→「开放 API」`https://yingyan.chatface.com/`

建议提示文案（缺必填项时）：

```text
继续之前需要 user_id 与 openClaw_api_key（请求里 apikey 填该值）。
在鹰眼量化「用户中心」→「开放 API」获取；提供后写入 config.json 的 openclawCredentials。
```

### 用户修改凭证
- **对话**：用户粘贴新 Key/`user_id` 时，用新值调用接口并写回 `openclawCredentials`（含 `openClaw_api_key`、`monitor_api_key` 等被更新的字段）。
- **文件**：用户直接编辑 `config.json` 后，OpenClaw 须以文件为准读取。
- **禁止**：`user_id` 与 `openClaw_api_key` 已有效时，不得无故重复索要。

### 成功响应示例：量化图

```json
{
  "ok": true,
  "intent": "chart",
  "message": "平安银行",
  "stock_query": "平安银行",
  "image_url": "https://yingyan.chatface.com/chart_img/abcd1234.png",
  "image_path": "/chart_img/abcd1234.png",
  "render_markdown": "## 量化图\n- 标的：`平安银行`\n- 图片地址：https://yingyan.chatface.com/chart_img/abcd1234.png\n\n![平安银行 量化图](https://yingyan.chatface.com/chart_img/abcd1234.png)"
}
```

### 成功响应示例：行情问答

```json
{
  "ok": true,
  "intent": "market_query",
  "message": "平安银行行情",
  "stock_query": "平安银行",
  "stock": {
    "code": "000001",
    "name": "平安银行",
    "industry": "银行",
    "region": "深圳"
  },
  "stock_context": {
    "identity": { "code": "000001", "name": "平安银行", "industry": "银行", "region": "深圳" },
    "evaluation": {
      "short_bias": "震荡",
      "medium_bias": "偏强",
      "confidence": "中",
      "short_score": 2,
      "medium_score": 3,
      "usable_signal_count": 14,
      "conflicts": []
    },
    "snapshot_lines": ["现价：12.50", "当日涨幅：0.80%", "..."],
    "short_term_lines": ["当日涨幅：0.80%", "量比：1.2，量能暂无明显失真。", "..."],
    "medium_term_lines": ["中期区间表现：20日涨幅%：5.2%，60日涨幅%：12.1%，...", "..."],
    "capital_and_fundamental_lines": ["主力资金：净额 1200万，净比 0.5%。", "..."],
    "risk_flags": ["当前未见极端透支信号，但仍需继续观察量能与资金承接能否延续。"]
  },
  "system_prompt": "你是一个只基于给定 TDX 股票字段和规则摘要进行推理的 A 股趋势诊断器...",
  "user_prompt": "请基于下面这份结构化股票诊断信息完成趋势判断。\n\n【诊断对象】\n- 股票：平安银行（000001）\n..."
}
```

行情问答返回的 `system_prompt` 和 `user_prompt` 由 OpenClaw 大模型直接使用来生成趋势诊断，API 本身不调用大模型，避免超时。

### 失败响应示例

```json
{
  "ok": false,
  "intent": "market_query",
  "message": "平安行情",
  "stock_query": "平安",
  "error": {
    "code": "multiple",
    "message": "找到多个与"平安"相关的股票，请输入更完整的代码或名称。",
    "candidates": [
      {
        "code": "000001",
        "name": "平安银行"
      }
    ]
  }
}
```

### 常见错误码
- `invalid_message`
- `apikey 校验失败`
- `chart_generation_failed`
- `multiple`
- `not_found`
- `data_missing`
- `missing_api_key`
- `insufficient_balance`

## `POST /api/openclaw/stock/query`

OpenClaw 专用的自然语言 AI 搜股接口。它参考 `web/query/queryFundamentals.html` 的自然语言理解逻辑，但**不复用**网页端的 `POST /api/query/tdx` 接口。

设计目标：
- 面向 OpenClaw 的对话式选股
- 只返回轻量结果
- 最多返回 20 只股票
- 固定字段集合，避免返回超大表

### 请求体

```json
{
  "query": "涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只",
  "user_id": "your_user_id",
  "apikey": "YOUR_OPENCLAW_12_CHAR_KEY"
}
```

### 意图说明
- 适用于用户使用自然语言描述选股条件，而不是指定单只股票。
- 支持筛选、排序、区间、排除、前 N 名等表达。
- 典型示例：
  - `涨幅超过10%的股票`
  - `换手率高的科技股`
  - `近20日涨幅靠前的深圳股票`
  - `剔除ST和北交所，取活跃度前20`

### 与网页端自然语言选股的区别
- 网页端入口：`web/query/queryFundamentals.html`
- 网页端接口：`POST /api/query/tdx`
- OpenClaw 不直接调用该接口，而是调用本专用接口
- OpenClaw 版本只返回固定字段、最多 20 条，适合聊天场景快速展示

### 返回字段限制
成功响应中的 `data` 每条记录仅允许包含以下字段：
- `代码`
- `名称`
- `涨幅%`
- `现价`
- `涨跌`
- `换手%`
- `细分行业`
- `活跃度`
- `连涨天`
- `昨涨幅%`
- `3日涨幅%`
- `5日涨幅%`
- `10日涨幅%`
- `20日涨幅%`
- `60日涨幅%`
- `一年涨幅%`
- `月初至今%`
- `年初至今%`
- `近日指标提示`

### 成功响应示例

```json
{
  "ok": true,
  "intent": "stock_query",
  "query": "涨幅超过8%的半导体股票，按换手率从高到低排序，取前20只",
  "total": 2,
  "limit": 20,
  "fields": [
    "代码",
    "名称",
    "涨幅%",
    "现价",
    "涨跌",
    "换手%",
    "细分行业",
    "活跃度",
    "连涨天",
    "昨涨幅%",
    "3日涨幅%",
    "5日涨幅%",
    "10日涨幅%",
    "20日涨幅%",
    "60日涨幅%",
    "一年涨幅%",
    "月初至今%",
    "年初至今%",
    "近日指标提示"
  ],
  "data": [
    {
      "代码": "688001",
      "名称": "示例科技",
      "涨幅%": "9.21",
      "现价": "32.55",
      "涨跌": "2.75",
      "换手%": "7.88",
      "细分行业": "半导体",
      "活跃度": "82",
      "连涨天": "3",
      "昨涨幅%": "2.18",
      "3日涨幅%": "12.40",
      "5日涨幅%": "15.62",
      "10日涨幅%": "21.88",
      "20日涨幅%": "29.33",
      "60日涨幅%": "48.10",
      "一年涨幅%": "66.50",
      "月初至今%": "13.20",
      "年初至今%": "24.80",
      "近日指标提示": "放量上攻"
    }
  ]
}
```

### 失败响应示例

```json
{
  "ok": false,
  "intent": "stock_query",
  "query": "帮我找一些不错的票",
  "error": {
    "code": "invalid_query",
    "message": "未识别出明确的自然语言选股条件，请补充筛选条件、排序方式或目标范围。"
  }
}
```

### 建议错误码
- `invalid_query`
- `apikey 校验失败`
- `missing_api_key`
- `insufficient_balance`
- `stock_query_failed`

## `GET /api/openclaw/stock/limit-up`

OpenClaw 专用的涨停股查询接口。适用于用户明确询问"今天涨停股有哪些"、"涨停股票列表"等场景。

### 请求参数
- `user_id`：必填
- `apikey`：必填，12 位 **OpenClaw** API Key（与监控 Key 不同）

### 请求示例

```text
GET /api/openclaw/stock/limit-up?user_id=your_user_id&[REDACTED_SECRET]
```

### 识别规则
- 该接口不是通用自然语言搜股，而是涨停股专用通道
- 当用户明确提到"涨停股"、"今日涨停股票"、"今天有哪些涨停股"时，应优先调用本接口
- 不要误走 `POST /api/openclaw/stock/query`

### 识别逻辑
- 主板/中小板：约 `9.9%`
- 创业板/科创板：约 `19.9%`
- 北交所：约 `29.9%`
- `ST`：约 `4.9%`

### 返回字段
成功响应中的 `data` 每条记录仅包含以下字段：
- `代码`
- `名称`
- `涨幅%`
- `现价`
- `涨跌`
- `换手%`
- `细分行业`
- `活跃度`
- `连涨天`
- `昨涨幅%`
- `3日涨幅%`
- `5日涨幅%`
- `10日涨幅%`
- `20日涨幅%`
- `60日涨幅%`
- `一年涨幅%`
- `月初至今%`
- `年初至今%`
- `近日指标提示`

### 成功响应示例

```json
{
  "ok": true,
  "intent": "limit_up",
  "total": 2,
  "fields": [
    "代码",
    "名称",
    "涨幅%",
    "现价",
    "涨跌",
    "换手%",
    "细分行业",
    "活跃度",
    "连涨天",
    "昨涨幅%",
    "3日涨幅%",
    "5日涨幅%",
    "10日涨幅%",
    "20日涨幅%",
    "60日涨幅%",
    "一年涨幅%",
    "月初至今%",
    "年初至今%",
    "近日指标提示"
  ],
  "data": [
    {
      "代码": "000001",
      "名称": "示例股票",
      "涨幅%": "10.02",
      "现价": "12.50",
      "涨跌": "1.14",
      "换手%": "6.35",
      "细分行业": "银行",
      "活跃度": "71",
      "连涨天": "2",
      "昨涨幅%": "2.18",
      "3日涨幅%": "12.40",
      "5日涨幅%": "15.62",
      "10日涨幅%": "21.88",
      "20日涨幅%": "29.33",
      "60日涨幅%": "48.10",
      "一年涨幅%": "66.50",
      "月初至今%": "13.20",
      "年初至今%": "24.80",
      "近日指标提示": "放量上攻"
    }
  ],
  "filename": "20260306172622.csv",
  "criteria": "按股票代码/名称对应的涨停阈值识别：主板约10%，创业板/科创板约20%，北交所约30%，ST约5%。"
}
```

### 建议错误码
- `apikey 校验失败`
- `data_missing`
- `limit_up_failed`

## `GET /api/openclaw/stock/monitor/stream`

返回 WebSocket 实时监控的连接信息。客户端根据返回的模板地址建立 WebSocket 长连接，即可接收与 `monitor.html` 相同的监控信号广播推送。

### 请求参数
- `user_id`: 选填，仅用于回显

### 响应示例

```json
{
  "ok": true,
  "ws_path": "/ws/monitor/open",
  "ws_url_template": "wss://yingyan.chatface.com/ws/monitor/open?[REDACTED_SECRET]",
  "required_query_params": ["apikey", "user_id"],
  "message": "使用 WebSocket 连接接收与 monitor.html 相同的实时监控信号推送。",
  "data_format": {
    "type": "JSON Array",
    "fields": ["ticker", "name", "prev_rating", "latest_rating", "close", "zhangdie", "latest_time"],
    "example": [
      {
        "ticker": "000001",
        "name": "平安银行",
        "prev_rating": "持有",
        "latest_rating": "买入",
        "close": 12.5,
        "zhangdie": 0.02,
        "latest_time": "2026-03-10 10:30:00"
      }
    ]
  }
}
```

将模板中的 `{apikey}` 替换为 **`monitor_api_key`**（会员中心「监控信号」Key）；`{user_id}` 替换为真实用户 ID。不要使用 `openClaw_api_key` 连接监控 WebSocket。

### WebSocket 推送数据格式

连接成功后，服务端会以 JSON 数组形式推送监控信号变化：

```json
[
  {
    "ticker": "000001",
    "name": "平安银行",
    "prev_rating": "持有",
    "latest_rating": "买入",
    "close": 12.5,
    "zhangdie": 0.02,
    "latest_time": "2026-03-10 10:30:00"
  }
]
```

字段说明：
- `ticker`：股票代码
- `name`：股票名称
- `prev_rating`：原评级（如 持有、买入、卖出、await）
- `latest_rating`：新评级（不会出现 `await`，见下方过滤规则）
- `close`：最新价
- `zhangdie`：涨跌幅比例（0.02 = 2%）
- `latest_time`：信号时间

### 信号过滤规则
- 当评级变为 `await`（等待）时，**服务端不推送通知**
- 仅当 `latest_rating` 为具有实际买卖意义的信号（如 买入、卖出、持有 等）且与 `prev_rating` 不同时才会推送
- 因此收到的每条推送都代表一个有效的买卖信号变化

### 鉴权说明
- WebSocket 连接需在 URL 中携带 `apikey` 和 `user_id`
- URL 中的 `apikey` 必须与会员中心 **「监控信号」** 卡片保存的 12 位 Key 一致（即 `config.json` 的 `monitor_api_key`）
- 连接建立后无需额外认证，服务端持续推送至连接断开

### OpenClaw 推荐接入方式
- 推荐顺序：先校验凭证可用，再读取 `ws_url_template`，最后直接使用原生 WebSocket 客户端连接。
- 推荐先用 `POST /api/openclaw/stock/message` 做一次轻量验证，避免把鉴权失败误判为 WebSocket 异常。
- 不建议把安装 `wscat`、`websocat` 或其他命令行客户端作为默认步骤；它们只适合人工排障，不适合作为技能默认工作流。
- 浏览器或平台原生 WebSocket 客户端连接成功后，即可视为实时监控已配置完成。
- 连接监控前若缺 `user_id` 或 **监控** Key（`monitor_api_key`），应提示用户到「开放 API」保存监控信号 Key；不要直接尝试连接。不需要监控的用户可不配置 `monitor_api_key`。

### 成功判定
- WebSocket 握手成功，连接处于打开状态，即为成功。
- 连接成功后短时间内没有消息，**仍然是成功状态**。
- 原因是服务端不会发送欢迎消息；只有监控信号发生变化时才会推送数据。
- 若当前变化后的评级为 `await`，服务端也不会推送通知。

### 失败判定与常见原因
- 若连接被服务端立即关闭，优先检查 **监控** `apikey`（`monitor_api_key`）、`user_id`、会员状态和权限等级。
- 常见策略拒绝关闭码为 `1008`，通常表示鉴权失败、会员未激活，或等级不足以访问 `monitor.html` 对应资源。
- 监控 URL 中的 `apikey` 须与会员中心「监控信号」保存值完全一致（12 位字母或数字）。
- 如果只做了健康检查 `GET /api/openclaw/health`，并不能证明 WebSocket 鉴权一定通过。

### 建议给用户的说明话术
- "WebSocket 连接已建立，当前正在等待实时监控信号。"
- "暂时没有收到推送是正常现象，服务端只在评级发生有效变化时推送。"
- "如果后续出现买入/卖出/持有等有效信号切换，你会立即收到 JSON 数组格式的推送数据。"

## ClawHub 导入文件

- `manifest.json`
- `config.json`
- `CLAWHUB_UPLOAD.md`
- `openapi.json`

Demo 页面：
- `/web/openclaw_demo.html`

补充说明：
- ClawHub 上传页当前可见的是网页表单字段与文件夹上传，不是公开的标准 manifest schema
- 可直接参考 `CLAWHUB_UPLOAD.md` 中对应上传页字段的填写建议


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)