gangtise-openapi-cli 0.42.0 → 0.43.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/README.md +37 -33
  2. package/dist/src/cli.js +29 -11
  3. package/dist/src/commands/ai.js +7 -6
  4. package/dist/src/commands/fundamental.js +3 -3
  5. package/dist/src/commands/indicator.js +3 -3
  6. package/dist/src/commands/insight.js +5 -4
  7. package/dist/src/commands/quote.js +46 -12
  8. package/dist/src/commands/raw.js +2 -2
  9. package/dist/src/commands/shared.js +60 -8
  10. package/dist/src/commands/vault.js +2 -2
  11. package/dist/src/core/args.js +6 -5
  12. package/dist/src/core/auth.js +3 -2
  13. package/dist/src/core/client.js +101 -11
  14. package/dist/src/core/commandBodies.js +2 -1
  15. package/dist/src/core/download.js +9 -5
  16. package/dist/src/core/endpoints.js +103 -1
  17. package/dist/src/core/output.js +37 -8
  18. package/dist/src/core/perSecurity.js +29 -11
  19. package/dist/src/core/quoteSharding.js +19 -15
  20. package/dist/src/core/rowSink.js +21 -0
  21. package/dist/src/core/titleCache.js +28 -2
  22. package/dist/src/core/transport.js +3 -1
  23. package/dist/src/core/updateCheck.js +51 -0
  24. package/dist/src/version.js +19 -1
  25. package/gangtise-openapi/SKILL.md +50 -49
  26. package/gangtise-openapi/references/commands/ai.md +34 -15
  27. package/gangtise-openapi/references/commands/alternative.md +2 -2
  28. package/gangtise-openapi/references/commands/bond.md +1 -1
  29. package/gangtise-openapi/references/commands/fundamental.md +4 -4
  30. package/gangtise-openapi/references/commands/indicator.md +29 -27
  31. package/gangtise-openapi/references/commands/insight.md +39 -31
  32. package/gangtise-openapi/references/commands/quote.md +19 -19
  33. package/gangtise-openapi/references/commands/reference-and-lookup.md +18 -15
  34. package/gangtise-openapi/references/commands/vault.md +10 -7
  35. package/gangtise-openapi/references/errors.md +22 -23
  36. package/gangtise-openapi/references/examples.md +36 -34
  37. package/gangtise-openapi/references/fields.md +8 -6
  38. package/gangtise-openapi/references/lookup-ids.md +10 -8
  39. package/gangtise-openapi/references/response-schema.md +7 -7
  40. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: gangtise-openapi
3
- version: "0.42.0"
3
+ version: "0.43.0"
4
4
  description: |-
5
5
  通过 gangtise CLI 直接调用 Gangtise OpenAPI,拉取投研原始数据、批量导出、下载文件、调用 AI 能力。
6
6
 
7
- **触发词**:调接口 / CLI / openapi / 导出 / 下载研报 / 批量查 / 拉数据 / 跑一下 / 钢尼斯 / gtIC(Gangtise 语音误识别)
7
+ **触发词**:Gangtise / 钢尼斯 / gtIC(Gangtise 语音误识别)/ 调接口 / CLI / openapi / 导出 / 下载研报 / 批量查 / 拉数据 / 跑一下 / 研报 / 纪要 / 公告 / K线 / 财报 / 估值 / 选股 / 债券
8
8
 
9
- **适用**:原始数据导出、批量 jsonl/csv、下载 PDF/MD、行情 K 线、财务报表、估值指标、证券级数据指标(EDE 截面/时序/条件选股)、财报日历(业绩预告/快报/公告)、PDF 解析为 Markdown、AI 能力(一页通/投资逻辑/同业对比/个股看点·投研总结/投研线索/业绩点评/观点PK·多空辩论/主题跟踪/热点话题/管理层讨论/调研提纲/知识库搜索)、云盘文件管理(Vault)
9
+ **适用**:原始数据导出、批量 jsonl/csv、下载 PDF/MD、行情 K 线、财务报表、估值指标、证券级数据指标(EDE 截面/时序/条件选股)、财报日历(业绩预告/快报/公告)、会议线索、帕米尔专家纪要、资金流向、题材与板块、债券(资料/行情/估值/评级/公告)、联网搜索、PDF 解析为 Markdown、AI 能力(一页通/投资逻辑/同业对比/个股看点·投研总结/投研线索/业绩点评/观点PK·多空辩论/主题跟踪/热点话题/管理层讨论/调研提纲/知识库搜索)、云盘文件管理(Vault)
10
10
 
11
11
  **不适用**:不脱离 OpenAPI 自行撰写研报、编造投研结论或做自由问答——观点总结、多空 PK 等 AI 产物本 skill 只经由 Gangtise 平台 AI 接口获取,不自行生成
12
12
 
@@ -23,23 +23,23 @@ description: |-
23
23
  ## 必备规则
24
24
 
25
25
  1. **`--format json`**:列表/数据类必加。AI 内容生成(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `*-check`)也加 json,但呈现时**直接取 `content` 字段**,不要展示 JSON 包装层。
26
- 2. **opaque ID**:先读 `references/lookup-ids.md`;找不到再按类型查:行业/区域/公告分类/城市 → `reference constant-list --category <分类>`(分类代码用 `reference constant-category` 查);题材 → `reference concept-search --keyword <名>`;板块 → `reference sector-search --keyword <名>`;申万 `--gts-code` 行业代码全量 → `sector-search --keyword 申万一级行业指数` 取指数数据板块层级的 sectorId 再 `sector-constituents`;券商/牵头/观点机构(按名称找 ID)→ `reference institution-search --keyword <名> [--category ...]`(服务端搜索,返回 `institutionId` + `usageScopes` 标明该 ID 用于哪个接口的哪个参数;覆盖 `--broker` / `--institution` 全部 5 类机构,含 `foreignOpinionInstitution`)——仅当要**全量枚举**时才用本地表 `gangtise lookup broker-org/meeting-org list`(institution-search 是搜索型:top≤10、非全量)。**绝不猜测**。
27
- 3. **公司名 → 证券代码**:先查下方速查表(5 只 mega-cap),其余一律 `gangtise reference securities-search --keyword <名> --category stock` 取 `list[0].gtsCode`。
26
+ 2. **opaque ID**:先读 `references/lookup-ids.md`;找不到再按类型查——行业 / 区域 / 公告分类 / 城市 → `reference constant-list --category <分类>`(分类代码用 `reference constant-category` 查);题材 → `reference concept-search`;板块 → `reference sector-search`;券商 / 牵头 / 观点机构 → `reference institution-search`(按返回的 `usageScopes` 选能喂给目标参数的 ID)。**绝不猜测**。
27
+ 3. **公司名 → 证券代码**:先查下方速查表(几只常用大盘股),其余一律 `gangtise reference securities-search --keyword <名> --category stock` 取 `list[0].gtsCode`。
28
28
  4. **时间格式**:datetime `"YYYY-MM-DD HH:mm:ss"`(引号包裹),date `YYYY-MM-DD`(`YYYY/MM/DD`、`YYYYMMDD` 也收,会归一;**年在后写法一律拒绝**)。
29
29
  5. **多值参数**:优先重复传(最稳、最明确):`--security 600519.SH --security 000858.SZ`。CLI 也支持半/全角逗号分隔(语音输入容错),但重复传不易被 shell 吞。
30
30
  6. **K 线"最近 N 条"**:必须用 `--start-date`/`--end-date` 拉日期范围,从结果按 `tradeDate` 取尾部最近 N 条。**不要只用 `--limit N`**(截取的是窗口开头)。
31
31
  6.1. **日 K 仅历史**:`day-kline` **不返回盘中实时数据**。当日数据入库时间:A 股 ~15:30 / 港股 ~16:30 / 美股 ~07:00(北京时间)。需要盘中快照请走 `quote realtime`。
32
- 6.1.1. 🔴 **`quote day-kline` 一个命令覆盖 A 股 / 港股 / 美股 / 沪深 ETF / 各类指数(含 20 个全球指数)**,可混着传代码。**全市场关键字是 `aShares` / `hkStocks` / `usStocks`,必须单独传**(不能与代码或另一个关键字混填;`--security all` 会被 CLI 拒并提示改用哪个)。**关键字只覆盖个股**:ETF 与各类指数(`.SH`/`.SZ`/`.BJ` 交易所指数、`.GT` 概念、`.CI`/`.SWI` 行业、`SPX.SPI` 等全球指数,清单见 `references/commands/quote.md`)须逐个传代码。全球指数 realtime 的 `volume` / `amount` / `amplitude` 与分钟 K 的 `volume` / `amount` 为 `null`,日 K 只有 `amount` 为 `null`;`tradeTime` 是交易所当地时间。`day-kline-hk` / `day-kline-us` / `index-day-kline` 已下线(接口仍可调;前两个仍用 `all`,`index-day-kline` 的 `all` 取不到数、CLI 会拒绝),**新代码别用**——它们不校验证券代码,传错返空而不报错。
33
- 6.2. **多标的日 K**:显式传多个 `--security` 时,「证券数 × 交易日数」不超过 `--limit`(默认 6000 / 上限 10000)走单请求;超过则 CLI 自动逐只请求并按传入顺序合并,每只各自受 `--limit` 约束,撞上的标 `partial` + `truncatedSecurities`、退出码 3。单只超 10000 行仍要缩日期区间分批。
32
+ 6.1.1. 🔴 **`quote day-kline` 一个命令覆盖 A / 港 / 美股、沪深 ETF 与各类指数(含全球指数),可混传代码**。全市场关键字 `aShares` / `hkStocks` / `usStocks` 必须单独传(不认 `--security all`),且**必须同时给 `--start-date` 与 `--end-date`**(「某天至今」把 `--end-date` 写成今天)。**关键字只覆盖个股**:ETF 与指数须逐个传代码(全球指数代码清单、`null` 列与当地时间口径见 `references/commands/quote.md`)。`day-kline-hk` / `day-kline-us` / `index-day-kline` 已弃用、别用——它们不校验代码,传错返空不报错。
33
+ 6.2. **多标的日 K**:显式传多个 `--security` 时,「证券数 × 交易日数」小于 `--limit`(默认 6000 / 上限 10000)走单请求;达到或超过则 CLI 自动分批请求(每批按行数上限装入尽量多的证券,未传 `--limit` 时上限按 10000 算)并按传入顺序合并,单只行数超过 `--limit` 的标 `partial` + `truncatedSecurities`、退出码 3。单只超 10000 行仍要缩日期区间分批。
34
34
  7. **CLI 已内置自动化,不要手动复刻**:
35
35
  - 翻页 → 首页拿 total 后剩余页并发拉取;🔴 **全量拉取结束会多探一行验证 `total` 是不是服务端封顶**(`total` 若只是服务端封顶值,按它翻完会停在上限、看起来却像全量)——探到就标 `partial` + `totalCapped` + 退出 3,**这时导出的是截断结果,要缩小时间范围分片拉**
36
- - K 线全市场关键字(`aShares` / `hkStocks` / `usStocks`;旧命令 `all`)跨日期 → 自动按日切片并合并,粒度按各市场单日行数定(A 1 天 / 港 2 天 / 美 1 天)
36
+ - K 线全市场关键字(`aShares` / `hkStocks` / `usStocks`;旧命令 `all`)跨日期 → 自动按日切片并合并,粒度按各市场单日行数定(A 1 个工作日 / 港 2 个工作日 / 美 1 个工作日)
37
37
  - 5xx / `429` / 网络错误 / `999999` → 自动指数退避重试(🔴 贵档端点例外:仅连接失败 / 429 / token 自愈重试,5xx/超时不重放防重复扣分;`indicator` 端点对 `999999` 不重试)
38
- - Token 失效(`0000001008` / `999002`,含已废弃的 `8000014`/`8000015`)→ 自动重新登录并重试一次;凭证错 `999011` → **不重试**(AK/SK 不对不会自己好),查环境变量
39
- 8. **参数命名差异**:Insight/Quote/Vault 用 `--security`,Fundamental/AI 用 `--security-code`(例外:`ai stock-summary` 用 `--security`,`ai security-clue` 用 `--gts-code`)。
38
+ - Token 失效 → 自动重新登录并重试一次;凭证错 `999011` → **不重试**(AK/SK 不对不会自己好),查环境变量
39
+ 8. **参数命名差异**:`--security-code` 只用于 **Fundamental 全组、AI 单证券生成类**(`one-pager` / `investment-logic` / `peer-comparison` / `earnings-review` / `research-outline` / `management-discuss-*`)**与 `insight qa list`**;`ai security-clue` 用 `--gts-code`;其余(Insight 其他命令、Quote、Vault、Bond、Indicator、`ai stock-summary`)一律用 `--security`。
40
40
  9. **调试**:`--verbose` 或 `GANGTISE_VERBOSE=1` 打印每个请求的耗时/字节数到 stderr。
41
- 10. **`--field` 字段名必须核对,不确定就别传**(返回全量最稳)。上游对不存在的字段名有两种处理:`quote` 系(realtime / day-kline / minute-kline / fund-flow)名和值一起丢、不报错——CLI 比对请求与返回的列名,缺列标 `partial` + `missingFields` 并退出 3;`fundamental main-business` / `valuation-analysis` 只丢值、字段名照请求回显——CLI 检测到长度不匹配直接报错退出 1(没有 `--field` 的命令如 `alternative edb-data` 报此错则是上游响应结构异常,报障时带上报错末尾的 `(trace …)`)。`--field` 只回点名的列、不自动附带身份列(`fund-flow` 除外):日 K 要一起写进 `securityCode` / `tradeDate`,分钟 K 是 `securityCode` / `tradeTime`,实时行情是 `securityCode`。realtime **无 `close`**(用 `latestPrice`)、**无市值**(总市值走 `indicator cross-section --indicator qte_mkt_cptl`,A/港/美股均有数)。
42
- 11. 🔴 **EDE 取不到数时返 `null` 占位,行列都保留**(`indicator` 截面 / 时序 / 选股),无告警、退出码 0。**报告期类指标(`is_*` 等)的时序尤其要当心**:按日返回,**只有报告期末那几行是真值**,其余全是 `null`,而时序没有任何参数能只返回报告期末——**别对整列直接求均值 / 求和**(`null` 会被 Excel / pandas / SQL 的聚合跳过但行数不变;`jq` 的 `add/length` 连跳都不跳,要先 `map(select(. != null))`)。截面上日期不落在报告期末时整批返 `null`,`screener` 会筛出空集——**那是日期用错了,不是「没有符合条件的标的」**。所以:报告期类指标的日期一律落**报告期末**(`03-31` / `06-30` / `09-30` / `12-31`),截面用 `--indicator-param "<指标code>:reportDate=YYYY-MM-DD"` 显式给(`screener` 用 `"F1:reportDate=..."`)。🔴 **时序的日历别手动传错**:报告期末常落在非交易日(2024-03-31 / 06-30 都是周日),`--calendar-type TD` 的日期轴里没有那一列,报告期类指标会整行全 `null` 且退出 0。**不传 `--calendar-type` 时 CLI 会自动选**(用免费的 `indicator search` 读 `parameterList`,去重后每个指标码各查一次:全是交易日类指标才发 `TD`,只要有一个报告期类的就走 `ND`,拿不准也走 `ND`),所以**默认不传是安全的**;显式传了就完全按你给的发。详见 `references/commands/indicator.md`。
41
+ 10. **`--field` 字段名必须核对,不确定就别传**(返回全量最稳)。上游对不存在的字段名有两种处理:`quote` 系(realtime / day-kline / minute-kline / fund-flow)名和值一起丢、不报错——CLI 比对请求与返回的列名,缺列标 `partial` + `missingFields` 并退出 3;`fundamental main-business` / `valuation-analysis` 只丢值、字段名照请求回显——CLI 检测到长度不匹配直接报错退出 1(没有 `--field` 的命令如 `alternative edb-data` 报此错则是上游响应结构异常,报障时带上报错末尾的 `(trace …)`)。多只证券或全市场时,缺的身份列 CLI 会补到最前(日 K 补 `securityCode` / `tradeDate`、分钟 K 补 `securityCode` / `tradeTime`、realtime 补 `securityCode`);单只不补。realtime **无 `close`**(用 `latestPrice`)、**无市值**(总市值走 `indicator cross-section --indicator qte_mkt_cptl`,A/港/美股均有数)。
42
+ 11. 🔴 **EDE(`indicator` 截面 / 时序 / 选股)取不到数返 `null` 占位、行列都保留、退出码 0**;代码写错才报 `100003` 并指名。报告期类指标(`is_*` 等)的日期一律落**报告期末**(`03-31` / `06-30` / `09-30` / `12-31`),截面用 `--indicator-param "<指标code>:reportDate=YYYY-MM-DD"`(`screener` 用 `"F1:reportDate=..."`)——日期不在报告期末时整批 `null`,`screener` 筛出空集是**日期用错,不是没有符合条件的标的**。时序按日返回、只有报告期末那几行是真值,**别对整列直接求均值 / 求和**。**`--calendar-type` 默认别传**(CLI 自动选日期轴;显式传 `TD` 会让报告期类指标整行 `null`)。详见 `references/commands/indicator.md`。
43
43
 
44
44
  ## 工作流(3 步)
45
45
 
@@ -50,9 +50,9 @@ description: |-
50
50
  ### Pre-flight(执行前必过)
51
51
 
52
52
  🔴 **需用户确认**:
53
- - `gangtise auth status` 未登录 → 提示配置 AK/SK 并中止
53
+ - 凭证:`gangtise auth status` 只看本地(缓存的 token、`GANGTISE_TOKEN`),不联服务端。两项都没有、环境变量里也没配 `GANGTISE_ACCESS_KEY` / `GANGTISE_SECRET_KEY` → 提示配置 AK/SK 并中止;**只配了 AK/SK 时首次调用会自动登录,不算未登录**。要确认凭证有效或账号状态,用 `gangtise auth login`
54
54
  - 多个命令同时匹配 → 复述理解让用户挑(如"搜索研报" → research list 还是 knowledge-batch?)
55
- - 用户说"全部 / 全量 / 全市场" → 确认量级再拉:省略 `--size` 就是拉全量(自动翻页,上限 1000 页);先 `--size 1` 看 stderr 的 `Total: N` 再决定(探量这步别加 `--format json`——json 下不打 `Total` 行);全市场/跨一年分片等大批量可 `GANGTISE_PAGE_CONCURRENCY=10` 提速(默认 5,同时管翻页与 K 线分片)
55
+ - 用户说"全部 / 全量 / 全市场" → 确认量级再拉:省略 `--size` 就是拉全量(自动翻页,上限 1000 页);先 `--size 1` 看 stderr 的 `Total: N` 再决定(探量这步别加 `--format json`——json 下不打 `Total` 行);全市场/跨一年分片等大批量可 `GANGTISE_PAGE_CONCURRENCY=10` 提速(默认 5,同时管翻页与 K 线分片);预计很长的全市场导出按年或按季度分段拉,别让单条命令超过你的工具超时——被超时终止的导出不会留下结果文件
56
56
  - **高积分操作先确认**:任何 50 积分/次及以上、或"按条 × 大批量"(如 `stock-summary` 按代码批量数千只、`opinion detail` / `--with-content` 批量取正文、`concept-info --full` 500/次)→ 先估总积分告知用户再执行(单价见下「积分计费速查」)
57
57
  - 下载**必选**格式未定才问:`independent-opinion --file-type`(必选)、`vault record/my-conference --content-type`(record 三种 original/asr/summary、my-conference 两种 asr/summary);其余 download 有默认(多为 `1`=PDF/原始),用户没提格式就用默认、不必问
58
58
  - list→download 用户没指定具体文件 → 展示前 10 条让用户挑
@@ -66,9 +66,9 @@ description: |-
66
66
  - 公司名 → 先速查表,否则 `reference securities-search`
67
67
  - opaque ID → 先 `references/lookup-ids.md`
68
68
  - 模糊时间词 → 查"时间词映射"
69
- - 无时间范围且用户没要求全量 → 主动加 `--size 200` 兜底(不必问);注意 CLI 省略 `--size` 会拉全量
69
+ - 列表类命令用户没要求全量 → 按单价主动加 `--size` 兜底(不必问):免费或 0.1 积分/条的列表用 `--size 200`;**≥1 积分/条的(观点、独立观点、路演四件套、会议线索、个股线索、热点话题等)用 `--size 20`**,要更多先 `--size 1` 看 stderr 的 `Total` 估总价再定。CLI 省略 `--size` 会拉全量;按条计费的列表估算全量超过 1000 积分时报错退出(报错里有估算积分),此时把估算积分告诉用户,确认后加 `--yes` 重跑或改传 `--size N`
70
70
  - 预估结果 >200 行 → 别全量 `--format json` 引进上下文,改 `--format jsonl --output <file>` 落盘(行边取边写、内存不随行数增长,stdout 只回显文件路径),再 `wc -l` + `head` 采样呈现。落盘的 `csv` / `jsonl` 旁边会有 `<file>.meta.json`:`complete` / `rows` / `result.partial` 与缺失项标记都在里面,转交文件时一并给、核验完整性先看它(`complete: false` = 那次导出退出码 3)
71
- - 路由到 AI 同步生成命令 → 7 个 agent 类(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `theme-tracking` / `management-discuss-*`)CLI 已内置 120s 超时下限,无需前缀;`stock-summary` / `hot-topic` 仍建议前置 `GANGTISE_TIMEOUT_MS=120000`。**贵档端点超时/5xx 不自动重试**(重放=重复扣分)——超时报错后内容可能已在服务端生成并扣费,同参数再调仍会**再扣一次**(无缓存豁免),所以一次调用给足超时比失败重跑省钱。`earnings-review` / `viewpoint-debate` 是异步(`--wait` 或 `*-check` 轮询),不吃这个超时
71
+ - 路由到 AI 同步生成命令 → 同步生成类(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `theme-tracking` / `management-discuss-*`)CLI 已内置 120s 超时下限,无需前缀;`stock-summary` 同样有 120s 下限;`hot-topic` 仍建议前置 `GANGTISE_TIMEOUT_MS=120000`。**贵档端点超时/5xx 不自动重试**(重放=重复扣分)——超时报错后内容可能已在服务端生成并扣费,同参数再调仍会**再扣一次**(无缓存豁免),所以一次调用给足超时比失败重跑省钱。`earnings-review` / `viewpoint-debate` 是异步(`--wait` 或 `*-check` 轮询),不吃这个超时
72
72
  - "AI速记/智能摘要/会议纪要"→`summary`、"原始文件/原文件"→`original`、"语音识别/转写文本/ASR"→`asr` — 用户已明示时直接映射 content-type,不必问
73
73
 
74
74
  ### 积分计费速查
@@ -81,14 +81,14 @@ description: |-
81
81
  - **各 download(/篇)**:announcement / official-account / research 10;announcement-hk / announcement-us 20;independent-opinion 30;summary / foreign-report / my-conference 50;`performance-calendar download` A 股 10 / 港美股 20
82
82
  - **0.4 的 `bond` 系**:`bond` 全部命令 **0.4/次**(按次,与返回行数无关),三个例外按量计:`rating-overview` 0.4/**条**、`rating-change` 0.4/**只有数据的债券**、`issuer-rating-change` 0.4/**个发行人**
83
83
  - **`tool web-search` 1/次**(按次,与返回条数、是否带 `--include-content` 无关;零结果与报错不扣)
84
- - 🔴 **`insight highlight list` 5/条**——**按返回条数计**,`--size 20` 的一页 = 100 积分。别省略 `--size` 直接拉全量(全量是数千条)
84
+ - 🔴 **`insight highlight list` 5/条**——**按返回条数计**,`--size 20` 的一页 = 100 积分。省略 `--size` 时 CLI 先估算,超过 1000 积分(约 200 条)报错退出,要全量须加 `--yes`
85
85
  - **按页**:`tool file-parse` 0.8/页,**提交(`--file`)时按实际页数一次性扣**,取结果(`file-parse-check`)免费——50 页 PDF = 40 积分,别重复提交同一文件
86
86
  - 🔴 **按次贵**:`ai knowledge-batch` 10、`management-discuss-*` 10;AI Agent(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `earnings-review` / `viewpoint-debate` / `theme-tracking`)**50/次**
87
87
  - 🔴 **`ai hot-topic` 50/篇,按返回条数计**(不是按调用次数)。📌 **一「篇」= 一整份报告**(一份早报 / 午报 / 盘中快报 / 晚报),**不是报告里的一条话题**——一份报告通常包含多条热点话题。所以 `--size 20` 的一页 = 最多 20 份报告 = 1000 积分,**先用 `--start-date`/`--end-date` + `--category` 收窄再拉**,别省略 `--size` 直接全量。**可查的历史范围跟账号权限走**(试用档是滚动的「当前 −1 个月」,正式/定制档更长)——超出范围的日期返回空结果而不是报错,拿到空先想想是不是撞了权限窗口
88
88
  - **题材**:`alternative concept-info` / `concept-securities` **50/次**;🔴 加 `--full`(催化事件 / 重点个股标识 / 纳入理由)走旧版 **500/次**,不需要这几列就别加
89
- - ✅ **按篇 / 按条计费的接口,没查到内容就不扣分**(空结果 = 0 积分):各 download(`pamirs-summary` 除外,见 ②)、`ai hot-topic`(50/篇)、`ai stock-summary`(3/条,无看点总结的个股不进返回列表也不计费)。**所以「先小范围试探再放大」是安全的**——先用窄条件确认能查到东西,再扩范围。⚠️ **两类不适用**:① **按次计费的**——`ai knowledge-batch` / `management-discuss-*`、AI Agent 那批 50/次、`alternative concept-info` / `concept-securities` 50/次(`--full` 500/次),不管有没有内容都扣,超时报错也可能已经扣过;② **单价未公布的**——`pamirs-summary`(见下),别据此假定
89
+ - ✅ **扣费发生在接口成功返回数据之后**(平台计费规则):没查到内容(空结果)、报错都不扣分——各 download、`ai hot-topic`(50/篇)、`ai stock-summary`(3/条,无看点总结的个股不进返回列表也不计费)、AI 生成类(`one-pager` 等 50/次),以及按次计费的 `ai knowledge-batch`、题材、`tool web-search` 都是这样。**所以「先小范围试探再放大」是安全的**——先用窄条件确认能查到东西,再扩范围。⚠️ **「成功返回」按服务端算**:超时报错时服务端可能已经生成并返回了内容(只是客户端没收到),这次已经扣过,同参数重调会再扣一次;异步的 `earnings-review` / `viewpoint-debate` 在提交成功(拿到任务 ID)时就扣,之后生成失败不退。**单价未公布的** `pamirs-summary`(见下)别据此假定
90
90
  - ⚠️ **同参数重复调用不免费**:按次计费的那批无缓存命中豁免(`one-pager` 等生成类重复调用每次扣分,即使秒回缓存内容);**按篇/按条的也一样**——重拉同一批 `hot-topic` 就是按条数再计一次费。生成类与列表结果拿到后自行留存复用,别为「刷新」重调
91
- - ⚠️ **这些端点超时/5xx 不自动重放**(共 44 个:AI Agent 那批 + `ai knowledge-batch` / `management-discuss-*` / `hot-topic`、`alternative concept-info`·`concept-securities`(含 `--full`)、50/篇 的 `summary`·`foreign-report`·`my-conference` download 与同档处理的 `pamirs-summary` download、`tool file-parse` 提交、**`bond` 全部命令**与 `tool web-search`(按次计费)、`insight highlight list`、观点 `detail` 与 `list --with-content`(按条计费),以及**不计分**的 `vault stock-pool-create` 与云盘 `drive-upload` / `drive-create-folder` / `drive-copy` / `drive-delete-file` / `drive-delete-folder`)。仅连接失败、429 与 token 自愈会重试。**贵档那批的理由是重放会重复扣分**——服务端可能已经执行并计费,重发按次计费的会再扣一次,重发按篇/按条计费的会把**已交付的行**再计一次;两种都亏。**不计分的那几个是重放有副作用或会把成功报成失败**——股票池名不允许重复,重发一个其实已经建成的请求回来 `230006 股票池名称重复`;云盘允许同名,重发上传 / 新建 / 复制会多出一份;重发一个其实已经删掉的删除,回来的是「文件不存在」或 `130002`
91
+ - ⚠️ **这些端点超时 / 5xx 不自动重放**(共 46 个,完整清单见下方注释块:按次计费的 AI Agent 那批、`ai knowledge-batch` / `management-discuss-*` / `hot-topic`、题材两接口(含 `--full`)、`bond` 全部命令、`tool web-search`、`tool file-parse` 提交;50/篇 的几个 download;按条计费的 `insight highlight list`、观点 `detail` / `list --with-content`、`ai stock-summary` 与 `fundamental earning-forecast`;以及不计分但重放有副作用的 `vault stock-pool-create` 与云盘上传 / 新建文件夹 / 复制 / 删除)。仅连接失败、429 与 token 自愈会重试。服务端可能已经执行并计费,重放会重复扣分、多建一份或把成功报成失败——**一次调用给足超时比失败重跑省钱**
92
92
 
93
93
  <!-- no-replay-endpoints
94
94
  上面那句点名的「不重放」端点,完整清单如下(endpoint key,与 `gangtise raw list` 一致):
@@ -101,6 +101,7 @@ ai.management-discuss-earnings-call
101
101
  ai.one-pager
102
102
  ai.peer-comparison
103
103
  ai.research-outline
104
+ ai.stock-summary.list
104
105
  ai.theme-tracking
105
106
  ai.viewpoint-debate.get-id
106
107
  alternative.concept-info
@@ -119,6 +120,7 @@ bond.issuer-rating-change
119
120
  bond.rating-change
120
121
  bond.rating-overview
121
122
  bond.valuation
123
+ fundamental.earning-forecast
122
124
  insight.foreign-opinion.detail
123
125
  insight.foreign-opinion.list-with-content
124
126
  insight.foreign-report.download
@@ -156,7 +158,7 @@ vault.stock-pool.create
156
158
  | 管理层讨论 / A·港·美股公告 / `alternative edb-*` 行业指标 | 前溯 **3 年** |
157
159
  | `insight pamirs-summary` 帕米尔纪要 | **不限**(但需单独购买专家纪要库) |
158
160
 
159
- ⚠️ **这是官方口径,不是硬边界**:服务端按**账号**配这个时间窗口、不按接口配——**换接口绕不过去**(`indicator` 三接口与 `quote day-kline` 同界)。整段都在界外返回 `110003`,**不是空结果**——缩窗口对这种查询无效,要把日期移进范围或联系客户经理。🔴 **区间跨过下界时各接口不同**:`quote` 日 K 与 `fundamental valuation-analysis` 从下界起返回、**不报错**(结果看着完整,要核对首行日期;估值分析 CLI 会在 stderr 提示);`indicator` 三接口与 `bond` 整批报 `110003`,把起点移进窗口再查。
161
+ ⚠️ **实际窗口按账号配**,换接口绕不过去(`indicator` 与 `quote day-kline` 同界)。整段在界外返回 `110003`(不是空结果),把日期移进范围或联系客户经理。🔴 **区间跨过下界时各接口不同**:`quote` 日 K / 分钟 K / 资金流向与 `fundamental valuation-analysis` 从下界起返回、**不报错**(首行明显晚于起始日时 CLI 在 stderr 提示);`indicator` 与 `bond` 整批报 `110003`。**例外**:`quote minute-kline` 窗口短得多,整段在窗外返回空结果、不报错(CLI 在 stderr 提示);`ai hot-topic` 超出账号可查范围时也返回空结果、不报错。
160
162
 
161
163
  ### 下载规则(`--file-type` / `--content-type`)
162
164
 
@@ -174,7 +176,7 @@ vault.stock-pool.create
174
176
  | `vault record-download` | `--content-type` | `original` 原始文件 / `asr` 语音识别 / `summary` AI 速记 |
175
177
  | `vault my-conference-download` | `--content-type` | `asr` 语音识别 / `summary` AI 速记 |
176
178
 
177
- 省略 `--output` 时 CLI 用本地 title-cache 里的真实标题做文件名——**只读缓存**,命中就零额外调用。缓存由同端点的 `list` 写入,所以「先 `list` 再 `download`」这个正常工作流本来就免费拿到正确文件名。
179
+ 省略 `--output` 时 CLI 用本地 title-cache 里的真实标题做文件名(`independent-opinion` 与 `report-image` 的下载不在此列,也没有 `--resolve-title`)——**只读缓存**,命中就零额外调用。缓存由同端点的 `list` 写入,所以「先 `list` 再 `download`」这个正常工作流本来就免费拿到正确文件名。
178
180
 
179
181
  🔴 **未命中时默认不回查**,退回服务端文件名或 `<type>-<id>.<ext>`。要回查得显式加 `--resolve-title`——它拉最近 200 条(4 次请求),而这些 list 多数按 **0.1 积分/条**计费,约 20 积分,只用于取一个更易读的文件名(下载本身 10–50)。**批量下载或按 ID 下旧文件**时:要么先跑一次 `list` 把标题灌进缓存,要么直接 `--output ./<名>.<ext>` 自己定名;`--resolve-title` 会把取回的 200 条一并写回缓存,同批后续下载不再重复消耗。
180
182
 
@@ -198,7 +200,7 @@ vault.stock-pool.create
198
200
  | 投资者问答 / 互动平台 / 电话会议 / 调研纪要 QA | `insight qa list`(按证券,`--security-code` 必填;`--source`/`--question-category`/`--answer-important` 精筛) |
199
201
  | 研报图表 / 研报图片搜索 | `insight report-image list`(`--keyword`;下载原图 `insight report-image download --chunk-id`) |
200
202
  | 跨类型语义搜索(研报+纪要+...) | `ai knowledge-batch`(多个 `--resource-type`) |
201
- | 知识库原文下载(搜到后取全文) | `ai knowledge-resource-download`(前置:`knowledge-batch` 拿 `resourceType`+`sourceId`;`250001`/旧 `433007`=组合不匹配) |
203
+ | 知识库原文下载(搜到后取全文) | `ai knowledge-resource-download`(前置:`knowledge-batch` 拿 `resourceType`+`sourceId`;`250001`=组合不匹配) |
202
204
  | 一页通 / 投资逻辑 / 同业对比 / 调研提纲 | `ai one-pager / investment-logic / peer-comparison / research-outline` |
203
205
  | 个股看点 / 投研总结 / 公司速览 | `ai stock-summary`(`--security` **只收具体代码**,单次最多 6000 个、超过时 CLI 报错并提示分批;仅 A 股/港股,不支持 `aShares`/`hkStocks` 全市场批量) |
204
206
  | 业绩点评(异步) | `ai earnings-review` |
@@ -208,9 +210,9 @@ vault.stock-pool.create
208
210
  | 热点话题 / 早午晚报 | `ai hot-topic` |
209
211
  | 管理层讨论(财报) | `ai management-discuss-announcement` |
210
212
  | 管理层讨论(业绩会) | `ai management-discuss-earnings-call` |
211
- | 日 K(历史,A 股 / 港股 / 美股 / 沪深 ETF / 各类指数含 20 个全球指数,可混查) | `quote day-kline` |
212
- | 沪深京指数日 K / 要指数名称 | `quote day-kline` 逐个传指数代码(**没有一次拿全部指数的写法**,旧命令 `index-day-kline --security all` 已取不到数、CLI 会拒绝);指数名称用 `reference securities-search --keyword <指数代码> --category index`(返回 `gtsName`) |
213
- | ~~港股 / 美股日 K~~ | ⚠️ 已下线,用 `quote day-kline`(`day-kline-hk` / `day-kline-us` 仍可调但不校验代码) |
213
+ | 日 K(历史,A 股 / 港股 / 美股 / 沪深 ETF / 各类指数含全球指数,可混查) | `quote day-kline` |
214
+ | 沪深京指数日 K / 要指数名称 | `quote day-kline` 逐个传指数代码(**没有一次拿全部指数的写法**,`index-day-kline --security all` 会被 CLI 拒绝);指数名称用 `reference securities-search --keyword <指数代码> --category index`(返回 `gtsName`) |
215
+ | ~~港股 / 美股日 K~~ | ⚠️ 已弃用,用 `quote day-kline`(`day-kline-hk` / `day-kline-us` 仍可调但不校验代码) |
214
216
  | 分钟 K(沪深 A 股 / ETF + 各类指数含全球指数) | `quote minute-kline`(`--security` 可重复,逐只并发合并) |
215
217
  | 实时行情(A / 港 / 美 / 沪深 ETF / 各类指数含全球指数) | `quote realtime` |
216
218
  | A股资金流向(主力/大单净流入,日频) | `quote fund-flow`(`--security` 或 `aShares` 全市场〔须带 `--start-date`/`--end-date`,按日自动分片〕;免费) |
@@ -222,7 +224,7 @@ vault.stock-pool.create
222
224
  | A股盈利预测 / 一致预期 | `fundamental earning-forecast` |
223
225
  | 前十大股东 | `fundamental top-holders` |
224
226
  | 债券基本资料 / 票面利率 / 到期日 / 债券条款 | `bond basic-info`(`--field` 写错**整批拒绝** `100003`,不会静默丢列) |
225
- | 发债主体 / 发行人画像 / 存续债券 | `bond issuer-info`(`--security` 按债券码 或 `--issuer` 按主体名模糊匹配,**二选一**,同传报 `100003`) |
227
+ | 发债主体 / 发行人画像 / 存续债券 | `bond issuer-info`(`--security` 按债券码 或 `--issuer` 按主体名模糊匹配,**二选一**,同传或都不传 CLI 在本地拒绝) |
226
228
  | 债券行情 / 净价 / 全价 / YTM / 久期 | `bond daily-quote`(`--start-date`/`--end-date` **必填**) |
227
229
  | 上清所估值 / 债券估值 | `bond valuation`(日期必填;默认只返回可信度「推荐」的估值) |
228
230
  | 付息兑付 / 现金流 / 还本付息计划 | `bond cash-flow` |
@@ -251,7 +253,7 @@ vault.stock-pool.create
251
253
  | 多证券已实现指标时序(单指标 × 多证券,按区间) | `indicator time-series`(前置:`indicator search --format json` 通过三项校验) |
252
254
  | 条件选股 / 按指标筛股票(市值+PE+经营范围等多条件组合) | `indicator screener`(前置:`indicator search` 拿 code;范围可传板块 ID,见 `reference sector-search`) |
253
255
  | 证券代码 / gtsCode 搜索 | `reference securities-search` |
254
- | 首席 ID / 分析师 ID 搜索 | `reference chiefs-search`(按姓名/机构/团队,用于 `insight opinion --chief`) |
256
+ | 首席 ID / 分析师 ID 搜索 | `reference chiefs-search`(按姓名/机构/团队,用于 `insight opinion list --chief`) |
255
257
  | 机构 ID 搜索(内资券商/外资/牵头/观点机构) | `reference institution-search`(按机构名,用于 `--institution` / `--broker`;免费) |
256
258
  | 公众号 ID 搜索(按公众号名/机构/分类) | `reference official-account-search`(返回 `accountId`,喂 `insight official-account list --account-id`;免费) |
257
259
  | 常量/枚举 ID(行业/城市/公告分类/区域/债券类型/评级类型/交易市场等,分类以 `reference constant-category` 的返回为准) | `reference constant-list --category <code>`(分类代码用 `reference constant-category` 查;该接口会列出每个分类适用于哪些接口的哪个参数) |
@@ -265,17 +267,14 @@ vault.stock-pool.create
265
267
  - "搜索 X" → 数据维度精确(按行业/券商)走对应 `insight ... list`;跨类型语义搜索走 `ai knowledge-batch`
266
268
  - 港股代码用在 `insight foreign-opinion --security` 还是 `quote day-kline --security`?前者要"境外"格式(`UBER.N`),后者要 `.HK`
267
269
  - "成分股" → 题材深度(分组;重点标记/纳入理由需 `--full`)走 `alternative concept-securities`;板块(行业/概念分类树,纯代码名单)走 `reference sector-constituents`
268
- - **证券基本面 / 指标先按任务形态路由,不是搜到 EDE 就一律走 EDE**:
269
- - 单证券先优先对应 `fundamental` 专用命令(财务、估值、盈利预测、股东、主营或完整三大报表,多数免费 / 低价)。`valuation-analysis` / `earning-forecast` 仅支持 A 股,港 / 美股的**估值历史分位**与**盈利预测**无可用口径。但**估值指标本身别照抄旧结论**:`finc_pe_ttm` 港股、`qte_mkt_cptl`/`shr_tot` 港美股都有数。⚠️ **凡「仅 A 股」「无数据」这类否定结论都只是某时点抽查**,数据覆盖在持续扩展;负面结论过期不会报错、只会让你白白拒掉一个能跑的查询。**一律以当次 `scopeList` + 抽查一行为准**
270
- - 多证券批量取一组**已实现**财务 / 估值指标 → 优先 `indicator search` 后用 EDE 一次拉取,替代逐只循环;单日或同一报告期横向比较用 `cross-section`,区间走势用 `time-series`(后者不能多指标 × 多证券同时)。**批量按 code 回填加 `--key-by code`**(列头用 `indicatorCode`,防同名指标碰撞)。⚠️ **两个轴的顺序规则不同**:`indicatorList` = 请求顺序,但 **`securityCodeList` 是按代码升序重排的**——**行绝不能按请求下标对位**,一律按 `security` 字段取值
271
- - ⚠️ **估值指标的历史序列:两个接口的财报口径切换时点不同**——`indicator time-series`(EDE)按**正式财报披露日**切,`fundamental valuation-analysis` 按**业绩快报**口径切、通常更早,同一天取到的估值指标可能不一样。历史期所用的财报版本也不同(`valuation-analysis` 保留当时披露的原始数据,EDE 按含重述后的最新数据回算,重述过的标的会持续分叉)。做估值分位 / 回测先定要哪个版本,**两个接口都拉一遍交叉核**;时点对齐用三大报表的 `earliestAnncDate`(首次公告日),不要用 `announcementDate`(它是返回版本的公告日)。详见 `indicator.md`
272
- - 始终排除 EDE:A股盈利预测 / 一致预期(含预测 EPS)→ `fundamental earning-forecast`;A股估值历史分位 → `fundamental valuation-analysis`;开高低收 / 成交量等行情与 K 线 → `quote`;单证券完整报表 → 对应三大报表命令。**例外:总市值只有 EDE 有**——`quote realtime` / `day-kline` 都不返回市值,走 `indicator cross-section --indicator qte_mkt_cptl`(默认单位「元」,用 `--scale` 缩放)。EDE 搜到的基本 / 稀释 EPS 是已实现值,**不能冒充预测 EPS**;港 / 美股缺少上述专用能力时应如实说明不支持,不能用别的语义代替
273
- - EDE 取数前必须用 `search --format json` 同时核对:`indicatorName` + `description` 语义准确、`scopeList` 覆盖全部目标市场 / 证券类型、`parameterList` 必填参数与枚举可满足;任一不符都视为无法证明覆盖并回退专用接口。`scopeList` 按指标各不相同,不能因 EDE 服务支持 A / 港 / 美股就假定某个指标三市场都覆盖。`search` 免费,取数按单元格计费;除多证券批量的效率收益外,仍优先免费 / 低价的 `quote` 或 `fundamental`
274
- - 行业 / 宏观指标(空调销量、社融等,无证券维度)走 `alternative edb-*`(EDB),不要与证券级 EDE 混用
275
- - **EDE「没数据」和「代码写错」是两回事**:**①代码写错 → 直接报 `100003` 并指名是哪个**(指标写错报「指标 xxx 不存在」,证券写错报「xxx 不是有效证券或者板块ID」,美股用 `.US` 而非 `.O`/`.N` 同理),无论同批有没有其它正确的 code 都会报;**②代码有效但无数据 / 无覆盖 / 未来日期 → 行列都保留**(含 1×1)并给占位单元格 `null`,**退出码 0**。日期语义按指标分两类:财务报表指标=报告期末(可为非交易日)、`finc_pe_ttm` / `finc_pb_mrq` 等日频估值=最新交易日(⚠️ `finc_pb_mrq` 是日频的,用报告期末日期会取到几个月前的陈值)
276
- - **EDE 指标参数名一律以 `indicator search --format json` 的 `parameterList` 为准**,不要凭记忆或照抄示例;参数名写错会报 `100003` 并指出是哪个指标的哪个参数(如复权参数是 `adjustType`)。🔴 **日期参数不能按 code 前缀推**——**唯一判据是 `parameterList` 里必填的是哪个**:有 `tradeDate` 就用 `--date`,有 `reportDate` 就补 `--indicator-param "code:reportDate=YYYY-MM-DD"`。多数报告期类指标(`is_*` 利润表等)要 `reportDate`(只传 `--date` 会报「不支持参数 tradeDate; 缺少必填参数 reportDate」),**但 `_ttm` 后缀整族相反、必填 `tradeDate`**(跨 `is_`/`cf_`/`div_`/`finc_` 四族都有)。行情 / 估值类(`qte_*` / `finc_pe_ttm` 等)用 `--date` 即可。`--security` 支持板块 ID(`reference sector-search` 的 10 位 `sectorId`);根级 `--scale` 只作用于声明了 `scale` 的指标,价格与金额可以混查
277
- - 指标族速记:融资融券 21 个 `mgn_*`(`mgn_bal` 两融余额 / `mgn_fin_*` 融资 / `mgn_sl_*` 融券 / `mgn_flag` 是否标的,**仅 A 股有数**);行业分类 `scr_indu`(一个指标覆盖申万/中信/恒生/GICS,**必填** `industryType` 1-4 + `industryLevel` 0-4,返回字符串)与三个行业组合指标 `scr_indu_citic` / `scr_indu_sw` / `scr_indu_gics`(体系写进编码,只需可选的 `industryLevel`;单套体系用它们更省事,横比多套仍用 `scr_indu`)。详见 `indicator.md`
278
- - "业绩点评"双义消歧:**检索已有**(研报/纪要里的业绩点评内容)走 `insight ... list --llm-tag earningsReview`(0.1/条);**AI 现生成**一份走 `ai earnings-review`(异步、50/次)。不确定问一句
270
+ - **证券指标按任务形态路由,不是搜到 EDE 就一律走 EDE**(细节见 `references/commands/indicator.md`):
271
+ - 单证券 → 优先 `fundamental` 专用命令(多数免费 / 低价);多证券批量取**已实现**指标 → `indicator`(EDE)一次拉取:同一日期 / 报告期横比用 `cross-section`,区间走势用 `time-series`(不能多指标 × 多证券同时)
272
+ - 始终不走 EDE:盈利预测 / 一致预期 → `fundamental earning-forecast`(EDE 的 EPS 是已实现值,**不能冒充预测**);A 股估值历史分位 → `valuation-analysis`;行情与 K 线 → `quote`;行业 / 宏观指标(无证券维度)→ `alternative edb-*`。**例外:总市值只有 EDE 有**——`indicator cross-section --indicator qte_mkt_cptl`(单位「元」,用 `--scale` 缩放)
273
+ - 取数前 `indicator search --format json` 核三项:`indicatorName` + `description` 语义对、`scopeList` 覆盖全部目标市场、`parameterList` 必填参数可满足;任一不符就回退专用接口,港 / 美股缺专用能力时如实说不支持。「某市场无数据」这类否定结论以当次 `scopeList` + 抽查一行为准
274
+ - 日期参数**只看 `parameterList` 必填哪个**:`tradeDate` → `--date`,`reportDate` → `--indicator-param "code:reportDate=..."`(多数报告期类要后者,但 `_ttm` 整族要 `tradeDate`);两个都必填(如 `div_cash_yld`)就两个都用 `--indicator-param` 显式给,只给 `reportDate` 时 `--date` 不再注入、会报 `100001`。日频估值(`finc_pe_ttm` / `finc_pb_mrq`)用最新交易日,用报告期末日期会取到陈值;参数名同样以 `parameterList` 为准(复权是 `adjustType`)
275
+ - 结果**按 `security` 字段取值**,别按请求下标对位(证券会按代码升序重排);批量回填加 `--key-by code`
276
+ - 估值历史:EDE 与 `valuation-analysis` 的财报口径切换时点与财报版本都不同,做分位 / 回测两边都拉交叉核
277
+ - "业绩点评"双义消歧:**检索已有**的业绩点评:研报走 `insight research list --llm-tag earningsReview`(0.1/条;`--llm-tag` 只有 `opinion` / `research` / `foreign-report` 三个列表有),业绩会纪要走 `insight summary list --category earningsCall`;**AI 现生成**一份走 `ai earnings-review`(异步、50/次)。不确定问一句
279
278
 
280
279
  ## 公司名 → 证券代码
281
280
 
@@ -297,19 +296,19 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
297
296
  ```
298
297
  取 `list[0].gtsCode`(CLI 已剥掉信封,输出顶层就是 `{returnedCount, list}`)。matchScore < 0.5 时让用户从前 3 条选。
299
298
 
300
- **交易所后缀**:`.SH` 上交所(6 开头)| `.SZ` 深交所(0/3 开头)| `.BJ` 北交所 | `.HK` 港股 | `.O` 纳斯达克 | `.N` 纽交所 | `.A` AMEX | 沪深 ETF 同 `.SH` / `.SZ` | 全球指数用数据源后缀(`SPX.SPI` `N225.NKI` `HSI.HI` `GDAXI.FRA` …,20 个清单见 `references/commands/quote.md`,**别猜**)。
299
+ **交易所后缀**:`.SH` 上交所(6 开头)| `.SZ` 深交所(0/3 开头)| `.BJ` 北交所 | `.HK` 港股 | `.O` 纳斯达克 | `.N` 纽交所 | `.A` AMEX | 沪深 ETF 同 `.SH` / `.SZ` | 全球指数用数据源后缀(`SPX.SPI` `N225.NKI` `HSI.HI` `GDAXI.FRA` …,清单见 `references/commands/quote.md`,**别猜**)。
301
300
 
302
301
  **跨市场**:`quote day-kline` 与 `quote realtime` 都可一次混合传入多市场代码(含 ETF 与全球指数):`quote realtime --security 600519.SH --security 00700.HK --security AAPL.O --security SPX.SPI` 单接口同时返回。
303
302
 
304
- ## 响应解析骨架(5 类通用模式)
303
+ ## 响应解析骨架(通用模式)
305
304
 
306
305
  | 模式 | 出现命令 | 结构 | 处理 |
307
306
  |------|---------|------|------|
308
307
  | **列表** | 大多数 `list` | `{list: [...], total: N}` | 遍历 list;CLI 已自动翻页 |
309
308
  | **下载** | 各 `download` | stdout = 文件路径字符串 | 直接读 stdout 整行 |
310
- | **AI 内容** | one-pager / investment-logic / peer-comparison / research-outline | `{content: "markdown文本"}` | 取 `content` 直接呈现 |
309
+ | **AI 内容** | one-pager / investment-logic / peer-comparison / research-outline | `{content: "markdown文本"}`(one-pager 另带 `date`,即生成日期) | 取 `content` 直接呈现 |
311
310
  | **K 线** | quote * | `{list: [{tradeDate, ...}]}` | 按 tradeDate 排序,取需要的尾部 |
312
- | **异步(含 *-check)** | earnings-review / viewpoint-debate / earnings-review-check / viewpoint-debate-check | 提交 `{dataId, status, hint}`;check 成功 `{date, content}` / pending `{status:"pending"}` 或抛 `140001`(旧 `410110`) | 见下方"异步任务流程" |
311
+ | **异步(含 *-check)** | earnings-review / viewpoint-debate / earnings-review-check / viewpoint-debate-check | 提交 `{dataId, status, hint}`;check 成功 `{date, content}`;仍在生成 `{dataId, status:"pending", hint}`(退出 0);终态失败 stderr 报错、退出 1 | 见下方"异步任务流程" |
313
312
  | **异步文件** | tool file-parse / file-parse-check | 提交 `{taskId, status, hint}`;就绪后 stdout = ZIP 路径,未就绪 `{status:"pending"}` | 解压取 `file.md`;重取用 `file-parse-check`(免费),别重跑 `file-parse`(按页重扣) |
314
313
 
315
314
  完整字段对照见 `references/response-schema.md`。
@@ -339,18 +338,20 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
339
338
  | 最近一个月 | 30 天 | 30 天 | — |
340
339
  | 过去一年 / 近一年 | 1 年 | 1 年 | 1 年 |
341
340
  | 今年 | 1/1 至今 | 1/1 至今 | 1/1 至今 |
342
- | 今天 / 今日 | 当天(`start=end=`今天) | 见下行「最新 / 今日 / 当前(K 线)」 | — |
343
- | 最新 / 今日 / 当前(K 线) | — | **45 天范围 → 从尾部取最近交易日**,不要只用 `--limit` | — |
341
+ | 今天 / 今日 | 当天:`--start-time "<今天> 00:00:00" --end-time "<今天> 23:59:59"` | 见下行「最新 / 当前(K 线)」 | — |
342
+ | 最新 / 当前(K 线) | — | **45 天范围 → 从尾部取最近交易日**,不要只用 `--limit` | — |
344
343
  | 最新一期 / 最新报告期(财报) | — | — | 省略 `--fiscal-year`,传 `--period latest`(默认) |
345
344
  | 最新观点 / 今日观点 | 1 天范围 + `--rank-type 2` | — | — |
346
345
 
347
- 日期参数**按参数名判断、不按命令组**(命令组会误导——AI 里既有 `--start-time` 又有 `--date`/`--report-date`;Insight 里 `performance-calendar` 是唯一用 `--start-date`/`--end-date` 的 list):名字带 `-date` 的(`--start-date`/`--end-date`/`--date`/`--report-date`)一律年在前日期(`YYYY-MM-DD` 首选,`YYYY/MM/DD`/`YYYYMMDD` 也收),覆盖 Quote/Fundamental、`insight performance-calendar`、AI 的 `theme-tracking`(`--date`)/`hot-topic`/`management-discuss-*`(`--report-date`)、Alternative `edb-data`、Indicator `cross-section`(`--date`)/`time-series`;名字带 `-time` 的(`--start-time`/`--end-time`)用年在前日期 + `[ HH:mm[:ss]]`(秒可省、空格或 `T` 分隔)或 10/13 位时间戳,覆盖 Insight/Vault 各 list、`quote minute-kline`、`ai security-clue`、`ai knowledge-batch`。其中 **A 股公告(`insight announcement list`)与 `knowledge-batch` 会把输入转成 13 位毫秒**(10 位秒自动 ×1000),其余 `-time` 命令(含 `announcement-hk`/`announcement-us`)原样透传字符串;CLI 输入统一接受 10/13 位纯数字或 `YYYY-MM-DD[ HH:mm[:ss]]`(同上:秒可省、空格或 `T` 分隔)。
346
+ 🔴 **`--end-time` 一律写到当天末尾 `23:59:59`**:只写日期时,A 股公告与 `knowledge-batch` 按当日 00:00:00 处理,「今天」就成了零宽窗口、取不到当天任何数据。
348
347
 
349
- 支持排序切换的命令:opinion / summary / pamirs-summary / research / foreign-report / announcement / announcement-hk / announcement-us / foreign-opinion / independent-opinion / official-account。**要最新的加 `--rank-type 2`(严格按 `publishTime` 倒序);要最相关的用默认 `--rank-type 1` + `--keyword`(综合排序按相关度挑条目)**——两者从同一结果集里取的是**不同的子集**,不是同一批内容换个排法。🔴 **`--search-type` 不改变 `--rank-type 1` 取回哪些条目**(同一关键词下,两档的 `--rank-type 1` 结果相同——即使 `--search-type 2` 让 `total` 大出一个数量级),**要相关度不必加 `--search-type 2`**;它扩大的是命中总数和 `--rank-type 2` 的候选池。🔴 **两档差别有多大取决于关键词,别拿一个词判断参数有没有用**:有些关键词下两档返回同一批,有些交集接近 0,判据见 `insight.md` 开头。⚠️ 综合排序**挑完之后仍按时间倒序排列**,所以别用「结果是不是时间倒序」判断它有没有生效,要比条目 ID。没有 `--keyword` 时两者无差异,属正常。其他 list 命令按 API 默认排序。
348
+ 日期参数**按参数名判断、不按命令组**:名字带 `-date` 的(`--start-date` / `--end-date` / `--date` / `--report-date`)收年在前日期(`YYYY-MM-DD` 首选,`YYYY/MM/DD` / `YYYYMMDD` 也收);名字带 `-time` 的(`--start-time` / `--end-time`)收年在前日期 + 可选 ` HH:mm[:ss]`(空格或 `T` 分隔)或 10 / 13 位时间戳。易错:Insight / Vault 各 list 用 `-time`,**唯独 `insight performance-calendar` 用 `-date`**;AI 组两种都有(`theme-tracking --date`、`hot-topic` / `management-discuss-*` 用 `-date`,`security-clue` / `knowledge-batch` 用 `-time`);`quote minute-kline` 用 `-time`,其余 Quote / Fundamental / Indicator / `bond` / `edb-data` 用 `-date`。拿不准看该命令 `--help`。
349
+
350
+ 支持排序切换的 list:opinion / summary / pamirs-summary / research / foreign-report / 三个公告 / foreign-opinion / independent-opinion / official-account。**要最新加 `--rank-type 2`(按 `publishTime` 倒序);要最相关用默认 `--rank-type 1` + `--keyword`**——两者从同一结果集取的是**不同子集**,没有 `--keyword` 时无差异。`--search-type 2`(只有 summary / pamirs-summary / research / foreign-report / 三个公告 / official-account 有)扩大命中总数与 `--rank-type 2` 的候选池,**不改变 `--rank-type 1` 取回的条目**,要相关度不必加。判断这两个参数是否生效的方法见 `references/commands/insight.md` 开头。
350
351
 
351
352
  ## 异常处理
352
353
 
353
- **退出码**:`0` 完整成功(含合法空结果)/ `3` 有数据但不完整(`partial: true`;stderr 有 warning,`--format json` 才看得见标记,table/csv/jsonl 只有数据行、看不出问题——csv/jsonl 落盘时看旁边 `<file>.meta.json` 的 `complete` 与 `result`;该文件还带 `bytes` / `sha256`,用 `shasum -a 256 <file>` 核一下就能确认这份元信息描述的是旁边这份数据。定位字段:页失败 `failedPages`、分片失败 `failedShards`、分片撞行数上限 `truncatedShards`、只有部分分片返回而合并时放不下的列 `droppedColumns`(缩小日期区间单独拉)、`total` 撞服务端上限 `totalCapped`、`--field` 请求了但没回的列 `missingFields`、逐只请求里撞行数上限的证券 `truncatedSecurities`、EDE 整轴没回 `omittedIndicators` / `omittedSecurities`)/ `4` 数据本身写全了,但 `--output` 那个文件在收尾期间被另一次写向同一路径的导出替换(并发跑同一路径才会出现,给它们各自的 `--output` 即可;与 `3` 同时发生时退出 `3`)/ `1` 硬失败。**拿到 3 就必须告知用户缺了哪段,不能当成功静默继续。** 报错行带 `[trace <id>]`,**报障给 Gangtise 时务必带上**。
354
+ **退出码**:`0` 完整成功(含合法空结果)/ `3` 有数据但不完整(`partial: true`,stderr 有 warning;标记只在 `--format json` 里看得见,csv / jsonl 落盘看旁边 `<file>.meta.json` 的 `complete` 与 `result`)/ `4` 数据写全了,但 `--output` 文件在收尾时被另一次写向同一路径的导出替换(给并发导出各自的 `--output` 即可)/ `1` 硬失败/ `130` / `143` / `129` 被 Ctrl-C / `kill` / 终端断开中断(本次的暂存文件已删除)。**拿到 3 就必须告知用户缺了哪段,不能当成功静默继续**。按标记处理:`failedPages` / `failedShards` 重拉失败段;`truncatedShards` / `truncatedSecurities` / `totalCapped` / `duplicateRows` 缩小日期范围分批重拉;`changedRows` 直接重拉;`missingFields` 核对字段名;其余标记见 `references/errors.md`。报错行带 `[trace <id>]`,**报障给 Gangtise 时务必带上**。
354
355
 
355
356
  最高频的几个码(全表、「不报错的坑」、`screener` 缺列判据与困境自救见 `references/errors.md`):
356
357
 
@@ -364,7 +365,7 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
364
365
  | `410110`(新码 `140001`) | 异步生成中 | 继续轮询 |
365
366
  | `410111`(新码 `140002`) | 异步生成失败,或 EDE 终态参数错 | **不重试**,换参数 |
366
367
  | `999999` | 系统错误(EDE 无数据不用此码) | 参数无误仍报即服务端故障 |
367
- | `999011` | 凭证无效(旧码 `8000014`/`8000015`) | 查 AK/SK 环境变量,CLI 不重试 |
368
+ | `999011` | 凭证无效 | 查 AK/SK 环境变量,CLI 不重试 |
368
369
  | `999004` | 无资源权限(整库未开通与单条不可见都走这个码) | 先确认该数据库是否已购买 |
369
370
  | `0000001008` / `999002` | token 失效 | CLI 自动重登一次,无 AK/SK 时提示重新登录 |
370
371
  | `100006` | 查询/下载数量超限 | 缩短日期范围或调小 `--size`/`--limit` |
@@ -376,7 +377,7 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
376
377
  按需 Read 对应文件:
377
378
 
378
379
  - 内资观点 / 纪要 / 路演 / 调研 / 策略 / 论坛 / 财报日历(performance-calendar)/ 研报 / 外资研报 / A 股公告 / 港股公告 / 美股公告 / 外资观点 / 独立观点 / 公众号(official-account)/ 投资者问答(qa)/ 研报图表(report-image)→ `references/commands/insight.md`
379
- - 行情命令(A 股 / 港股 / 美股 / ETF / 指数日 K、分钟 K、实时行情、资金流向 fund-flow,含 20 个全球指数清单) → `references/commands/quote.md`
380
+ - 行情命令(A 股 / 港股 / 美股 / ETF / 指数日 K、分钟 K、实时行情、资金流向 fund-flow,含全球指数清单) → `references/commands/quote.md`
380
381
  - 三大报表(A 股 / 港股 / 美股)/ 主营 / 估值 / 盈利预测 / 股东 → `references/commands/fundamental.md`
381
382
  - knowledge-batch / security-clue / 个股看点(stock-summary)/ AI agent / 异步任务 / 主题跟踪 / 热点 / 管理层讨论 → `references/commands/ai.md`
382
383
  - drive / record / my-conference / wechat / 股票池 → `references/commands/vault.md`
@@ -1,8 +1,8 @@
1
1
  # AI 命令详细参数
2
2
 
3
- 注意:`ai one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `viewpoint-debate-check` / `earnings-review-check` 返回 `{content: "markdown文本"}`;这类命令仍然加 `--format json`,但呈现给用户时直接取 `content` 字段,不要展示 JSON 包装层。
3
+ 注意:`ai investment-logic` / `peer-comparison` / `research-outline` 返回 `{content: "markdown文本"}`,`ai one-pager` 与 `viewpoint-debate-check` / `earnings-review-check`(完成时)返回 `{date, content}`;这类命令仍然加 `--format json`,但呈现给用户时直接取 `content` 字段,不要展示 JSON 包装层。
4
4
 
5
- **⏱ 超时与重复扣分**:7 个 agent 类(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `theme-tracking` / `management-discuss-*`)CLI 已内置 120s 超时下限,**无需前缀**;`stock-summary` / `hot-topic` 首次生成也常 >30s,仍建议前置 `GANGTISE_TIMEOUT_MS=120000`。**贵档端点超时/5xx 不自动重试**(重放=重复扣分)——超时报错后内容可能已在服务端生成并扣费,同参数再调会**再扣一次**(`one-pager` 等生成类按次计费、无缓存命中豁免),所以一次调用给足超时比失败重跑省钱;拿到的生成内容自行留存复用,别为"刷新"重调。`earnings-review` / `viewpoint-debate` 是异步——用 `--wait`(工具超时 ≥360s)或 `*-check` 轮询,不吃这个超时。
5
+ **⏱ 超时与重复扣分**:同步生成类(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `theme-tracking` / `management-discuss-*`)CLI 已内置 120s 超时下限,**无需前缀**;`stock-summary` 同样有 120s 下限;`hot-topic` 首次生成也常 >30s,仍建议前置 `GANGTISE_TIMEOUT_MS=120000`。**贵档端点超时/5xx 不自动重试**(重放=重复扣分)——超时报错后内容可能已在服务端生成并扣费,同参数再调会**再扣一次**(`one-pager` 等生成类按次计费、无缓存命中豁免),所以一次调用给足超时比失败重跑省钱;拿到的生成内容自行留存复用,别为"刷新"重调。`earnings-review` / `viewpoint-debate` 是异步——用 `--wait`(工具超时 ≥360s)或 `*-check` 轮询,不吃这个超时。
6
6
 
7
7
  ---
8
8
 
@@ -12,7 +12,9 @@
12
12
  gangtise ai knowledge-batch --query <text> [--query <text2>] [--top <n>] [--resource-type <n>] [--knowledge-name <name>] [--start-time <ts|datetime>] [--end-time <ts|datetime>]
13
13
  ```
14
14
 
15
- - `--query`(**必选**,可重复,最多 5 个):缺失时本地报错,不发空请求。**每个 `--query` 整段送出**——句子里的逗号是标点,不会被当成分隔符拆成两个查询;要问多个问题就重复传 `--query`
15
+ - **积分**:10/次(按次计费;没检索到内容与报错不扣;超时不自动重发)
16
+
17
+ - `--query`(**必选**,可重复,最多 5 个——上限由接口校验,CLI 不拦):缺失时本地报错,不发空请求。**每个 `--query` 整段送出**——句子里的逗号是标点,不会被当成分隔符拆成两个查询;要问多个问题就重复传 `--query`
16
18
  - `--top` 默认 10,最大 20
17
19
  - `--resource-type`:`10` 券商研报 | `11` 外资研报 | `20` 内部报告 | `40` 首席观点 | `50` 公司公告 | `51` 港股公告 | `60` 会议平台纪要 | `70` 调研纪要公告 | `80` 网络资源纪要 | `90` 产业公众号
18
20
  - `--knowledge-name`:`system_knowledge_doc` 系统知识库 | `tenant_knowledge_doc` 机构知识库
@@ -24,7 +26,7 @@ gangtise ai knowledge-batch --query <text> [--query <text2>] [--top <n>] [--reso
24
26
  gangtise ai knowledge-resource-download --resource-type <n> --source-id <id> [--output <path>]
25
27
  ```
26
28
 
27
- `resourceType + sourceId` 必须匹配(来自 knowledge-batch 返回),错配返回 `250001`(旧 `433007`)。
29
+ `resourceType + sourceId` 必须匹配(来自 knowledge-batch 返回),错配返回 `250001`。
28
30
 
29
31
  ## 投研线索 `ai security-clue`
30
32
 
@@ -32,9 +34,11 @@ gangtise ai knowledge-resource-download --resource-type <n> --source-id <id> [--
32
34
  gangtise ai security-clue --start-time <datetime> --end-time <datetime> --query-mode <mode> [--gts-code <code>] [--source <name>] [--from <n>] [--size <n>]
33
35
  ```
34
36
 
37
+ - **积分:5/条**(按返回条数计)。`--start-time` / `--end-time` 必填,省略 `--size` 即拉全量(估算超过 1000 积分时 CLI 报错拦下,加 `--yes` 才放行)——**务必带 `--size`**,先 `--size 1` 看 `Total` 再估总价
38
+ - `--start-time` / `--end-time`(**必选**)
35
39
  - `--query-mode`(**必选**):`bySecurity` 按证券 | `byIndustry` 按行业
36
- - `--gts-code`(建议必传,CLI 未强制):个股代码(如 `600519.SH`)或申万行业代码(如 `821035.SWI`)。**先用 `reference securities-search` 查个股,或读 `references/lookup-ids.md` 查行业**(全量行业代码:`reference sector-constituents --sector-id 2000000014`)
37
- - `--source`:`researchReport` | `conference` | `announcement` | `view`
40
+ - `--gts-code`(必传:`bySecurity` 下不传,接口报 `410120 gtsCodeList不能为空`;CLI 未强制):个股代码(如 `600519.SH`)或申万行业代码(如 `821035.SWI`)。**先用 `reference securities-search` 查个股,或读 `references/lookup-ids.md` 查行业**(全量行业代码:`reference sector-constituents --sector-id 2000000014`)
41
+ - `--source`:`researchReport` | `conference` | `announcement` | `view`(可重复;其他取值 CLI 在本地拒绝——接口对错值不报错,会返回不按来源过滤的全部结果)
38
42
  - `--from` / `--size`:自动翻页(单页 500);省略 `--size` 拉全量
39
43
 
40
44
  ## 一页通 / 投资逻辑 / 同业对比
@@ -45,8 +49,10 @@ gangtise ai investment-logic --security-code <code>
45
49
  gangtise ai peer-comparison --security-code <code>
46
50
  ```
47
51
 
52
+ - **积分**:50/次(按次计费,重复调用每次都扣;超时不自动重发)
53
+
48
54
  - 都支持 A 股 / 港股
49
- - 返回 `{content: "markdown"}` — 直接呈现 content
55
+ - 返回 `{content: "markdown"}`(`one-pager` 另带 `date`,即一页通的生成日期;取的是该公司最新一份)— 直接呈现 content
50
56
  - 首次调用可能耗时数十秒,告知用户
51
57
 
52
58
  ## 个股看点 `ai stock-summary`
@@ -55,16 +61,16 @@ gangtise ai peer-comparison --security-code <code>
55
61
  gangtise ai stock-summary --security <code> [--security <code2> ...]
56
62
  ```
57
63
 
58
- - `--security`(**必选**,可重复):**只收具体证券代码**,单次最多 6000 个(接口上限,CLI 同值拦截,超过报错并提示分批)——全 A 股可一次提交完
64
+ - `--security`(**必选**,可重复):**只收具体证券代码**,单次最多 6000 个(接口上限,CLI 同值拦截,超过报错并提示分批)——全 A 股可一次提交完,但**按返回条数 3 积分/条计**,数千只就是上万积分,提交前先把估算总价告诉用户
59
65
  - 🔴 **不支持全市场批量**:`aShares` / `hkStocks` 这类市场关键词不被接受,CLI 会本地报错(服务端对它们返 `120001`,读起来像代码写错,容易误判)。需要覆盖一批标的就先用 `reference securities-search` 或自有清单取到代码,再分批传入
60
66
  - **仅支持 A 股和港股**
61
- - **积分**:`3`/条;个股若无看点总结则不在返回列表中,也不扣分——所以**返回行数少于提交数是正常的**,不是丢了数据
67
+ - **积分**:`3`/条;个股若无看点总结则不在返回列表中,也不扣分——所以**返回行数少于提交数是正常的**,不是丢了数据。超时 / 5xx **不自动重试**(一次最多可扣 18000 积分,重放可能重复扣分):CLI 已给它 120 秒超时下限;失败后先确认再重跑
62
68
  - 🔴 **整批返 0 行别直接读成「这批都没有看点」**:它与「确实都没有看点」长得一样。挑其中一两只单查确认后再下结论
63
69
  - 返回字段:`securityCode` / `securityName` / `summary`(精炼投研总结)/ `date`(更新日期 `yyyy-MM-dd`)
64
70
 
65
71
  **示例:**
66
72
  ```bash
67
- GANGTISE_TIMEOUT_MS=120000 gangtise ai stock-summary --security 600519.SH --security 00700.HK --format json # 茅台 / 腾讯看点
73
+ gangtise ai stock-summary --security 600519.SH --security 00700.HK --format json # 茅台 / 腾讯看点
68
74
  ```
69
75
 
70
76
  ## 调研提纲 `ai research-outline`
@@ -73,6 +79,8 @@ GANGTISE_TIMEOUT_MS=120000 gangtise ai stock-summary --security 600519.SH --secu
73
79
  gangtise ai research-outline --security-code <code>
74
80
  ```
75
81
 
82
+ - **积分**:50/次(按次计费;超时不自动重发)
83
+
76
84
  - 仅 A 股
77
85
  - 返回 `{content: "markdown"}`
78
86
 
@@ -83,12 +91,14 @@ gangtise ai earnings-review --security-code <code> --period <period> [--wait]
83
91
  gangtise ai earnings-review-check --data-id <id>
84
92
  ```
85
93
 
94
+ - **积分**:提交 50/次(按次计费;超时不自动重发,重提会再扣一次)
95
+
86
96
  - `--period`:`年份+报告期`,如 `2025q3`(q1/interim/q3/annual),仅 A 股,覆盖最近 6 期
87
97
  - `--wait`(**推荐**):阻塞等待到出结果(最长约 5 分钟:14 次指数退避轮询 5s→30s,累计 ≈316s)——**用它时把工具/命令超时设到 ≥360s**,否则外层先超时
88
98
  - 不带 `--wait` 的手动轮询:① `earnings-review` → 拿 `{dataId, status, hint}` → ② 间隔 ~30s `*-check`(预算 ~2-3 分钟)→ pending 继续 → 多次仍 pending 交用户稍后手动 check
89
99
  - 这一步的 `{dataId, status, hint}` 同样受 `--format` / `--output` 控制,**加了 `--output` 就会落盘**,脚本可以直接从文件里取 `dataId` 再去轮询
90
100
  - `*-check` 返回「还在生成中」时同样落盘(`{dataId, status: "pending", hint}`),所以轮询脚本每一轮都能从同一个文件读状态,不必区分「出结果了」和「还没好」两种取法
91
- - 错误码:`140001`(旧 `410110`)生成中,继续等待;`140002`(旧 `410111`)生成失败,终态不重试。CLI 两代码都识别
101
+ - 错误码:异步端点返回 `410110`(生成中,继续等待)/ `410111`(生成失败,终态不重试),对应新码 `140001` / `140002`,CLI 两代都认
92
102
 
93
103
  ## 观点 PK `ai viewpoint-debate`(异步)
94
104
 
@@ -97,8 +107,11 @@ gangtise ai viewpoint-debate --viewpoint <text> [--wait]
97
107
  gangtise ai viewpoint-debate-check --data-id <id>
98
108
  ```
99
109
 
110
+ - **积分**:提交 50/次(按次计费;超时不自动重发,重提会再扣一次)
111
+
100
112
  - `--viewpoint`:观点文本,**上限 1000 字**
101
113
  - 双向逻辑校验:看多→拆解风险,看空→挖反转
114
+ - ⚠️ 观点过不了平台的敏感词检测时,提交照常受理并扣分,生成阶段以 `410111` 失败;同样的内容重提仍会失败,提交前自己把关措辞
102
115
  - 异步流程同 earnings-review
103
116
 
104
117
  ## 主题跟踪 `ai theme-tracking`
@@ -107,9 +120,11 @@ gangtise ai viewpoint-debate-check --data-id <id>
107
120
  gangtise ai theme-tracking --theme-id <id> --date <yyyy-MM-dd> [--type <name>]
108
121
  ```
109
122
 
123
+ - **积分**:50/次(按次计费;超时不自动重发)
124
+
110
125
  - `--theme-id`(**必选**):用 `gangtise reference concept-search --keyword <主题名>` 查,取 `conceptId`(题材与主题共用 ID 体系)
111
- - `--date`:支持近 30 天
112
- - `--type`:`morning` 晨报 | `night` 晚报(不传返回两者)
126
+ - `--date`(**必选**):支持近 30 天
127
+ - `--type`:`morning` 晨报 | `night` 晚报(不传返回两者)(**逐字照抄**:CLI 不在本地校验这个取值,拼错会原样发给接口)
113
128
  - **返回**:`[{type, date, content}, ...]` — 列表,每个元素是一份报告。某主题在指定日期可能只有一种类型(如只有晚报)或两种都没(空列表)。空结果不代表接口出错,建议换主题或换日期再试
114
129
 
115
130
  **示例:**
@@ -126,10 +141,10 @@ gangtise ai hot-topic [--start-date <date>] [--end-date <date>] [--category <nam
126
141
  ```
127
142
 
128
143
  - 结构化数据:驱动事件 / 投资逻辑 / 核心标的 / 话题精读
129
- - `--category`:`morningBriefing` 早报 | `noonBriefing` 午报 | `afternoonFlash` 盘中快报 | `eveningBriefing` 晚报(可重复,默认全部)
144
+ - `--category`:`morningBriefing` 早报 | `noonBriefing` 午报 | `afternoonFlash` 盘中快报 | `eveningBriefing` 晚报(可重复,默认全部;其他取值 CLI 在本地拒绝——接口对错值不报错,结果看着像正常查询)
130
145
  - `--with-related-securities` / `--with-close-reading`:默认开启;`--no-with-related-securities` / `--no-with-close-reading` 显式排除(响应里相应字段置空)
131
146
  - 自动翻页,单页最大 20
132
- - 🔴 **计费 50/篇,按返回条数计**(不是按调用次数)。📌 **一「篇」= 一整份报告**(一份早报 / 午报 / 盘中快报 / 晚报),**不是报告里的一条话题**——一份报告通常包含多条热点话题,`--category` 选的也是报告类型而不是话题。所以一页 20 条 = 20 份报告 = 1000 积分:**先用 `--start-date`/`--end-date` + `--category` 把范围收窄,再考虑要不要全量**(省略 `--size` 即拉全量)
147
+ - 🔴 **计费 50/篇,按返回条数计**(不是按调用次数)。📌 **一「篇」= 一整份报告**(一份早报 / 午报 / 盘中快报 / 晚报),**不是报告里的一条话题**——一份报告通常包含多条热点话题,`--category` 选的也是报告类型而不是话题。所以一页 20 条 = 20 份报告 = 1000 积分:**先用 `--start-date`/`--end-date` + `--category` 把范围收窄,再考虑要不要全量**(省略 `--size` 时 CLI 先取 1 篇拿到总数来估算,超过 1000 积分报错,确认要全量加 `--yes`;结果多于 1 篇时这 1 篇会多计一次,知道要几篇就直接传 `--size`)
133
148
  - **可查的历史范围跟账号权限走**:试用档是滚动的「当前 −1 个月」,正式/定制档更长。超出范围的日期**返回空结果、不报错**——拿到空先确认是不是撞了本账号的窗口,别当成「那天没有报告」
134
149
 
135
150
  ## 管理层讨论-财报 `ai management-discuss-announcement`
@@ -138,6 +153,8 @@ gangtise ai hot-topic [--start-date <date>] [--end-date <date>] [--category <nam
138
153
  gangtise ai management-discuss-announcement --report-date <date> --security-code <code> --dimension <name>
139
154
  ```
140
155
 
156
+ - **积分**:10/次(按次计费;超时不自动重发)
157
+
141
158
  - `--report-date`(**严格**):仅接受 `xxxx-06-30`(半年报)/ `xxxx-12-31`(年报)
142
159
  - `--dimension`(**必选**):`businessOperation` 业务经营与行业 | `financialPerformance` 财务与经营成果 | `developmentAndRisk` 发展规划与风险 | `all` 返回报告中完整的管理层讨论内容(内容可能过长,谨慎使用)
143
160
  - 返回 `content` 为字符串数组(每段一个元素)
@@ -148,6 +165,8 @@ gangtise ai management-discuss-announcement --report-date <date> --security-code
148
165
  gangtise ai management-discuss-earnings-call --report-date <date> --security-code <code> --dimension <name>
149
166
  ```
150
167
 
168
+ - **积分**:10/次(按次计费;超时不自动重发)
169
+
151
170
  - `--report-date`:接受 `xxxx-03-31` / `xxxx-06-30` / `xxxx-09-30` / `xxxx-12-31`
152
171
  - `--dimension`(**必选**):`businessOperation` | `financialPerformance` | `developmentAndRisk`(注意:不支持 `all`,与财报版不同)
153
172
  - 返回 `content` 为字符串
@@ -24,7 +24,7 @@ gangtise alternative edb-search --keyword 空调 --limit 50 --format table
24
24
  gangtise alternative edb-data --indicator-id <id> [--indicator-id <id2>] --start-date <date> --end-date <date>
25
25
  ```
26
26
 
27
- - `--indicator-id`(**至少 1 个**,最多 10 个):指标 ID,来自 `edb-search` 返回的 `indicatorId`,可重复传
27
+ - `--indicator-id`(**至少 1 个**,最多 10 个——上限由接口校验,CLI 不拦):指标 ID,来自 `edb-search` 返回的 `indicatorId`,可重复传
28
28
  - `--start-date`(**必选**):开始日期,格式 `yyyy-MM-dd`
29
29
  - `--end-date`(**必选**):结束日期,格式 `yyyy-MM-dd`
30
30
  - 返回格式:列表,每行为 `{date, <indicatorId1>: value, <indicatorId2>: value, ...}`
@@ -84,7 +84,7 @@ gangtise alternative concept-info --concept-id 121000130 --format json
84
84
  gangtise alternative concept-securities --concept-id <id> [--full]
85
85
  ```
86
86
 
87
- - **积分**:**50/次**,题材无成分股时不扣;加 `--full` 走旧版接口,**500/次**,每只成分股多两列 `isKey`(重点个股)与 `inclusionReason`(纳入理由)
87
+ - **积分**:**50/次**(按次计费;没有内容与报错不扣);加 `--full` 走旧版接口,**500/次**,每只成分股多两列 `isKey`(重点个股)与 `inclusionReason`(纳入理由)
88
88
 
89
89
  - `--concept-id`(**必选**):题材指数 ID,同上(`reference concept-search` 查)
90
90
  - 返回当前成分股,**按分组结构**组织(题材深度 F8);仅最新截面,不支持历史回溯
@@ -108,7 +108,7 @@ gangtise bond announcement (--security <code>... | --start-date <d> --end-date <
108
108
 
109
109
  🔴 **`--security` 与 `--start-date`/`--end-date` 二选一**,同传报 `100003`(CLI 先本地拦下)。默认返回 `announcementDate`+`securityCode`。
110
110
 
111
- 🔴 **本命令需要手动翻页**:它是本族唯一分页的接口,且响应里**没有 `total`**,因此不走 CLI 的自动翻页。`--page-no` 从 1 开始逐页递增,`--page-size` 取值 1–200(超出报 `100004`)。终止条件:
111
+ 🔴 **本命令需要手动翻页**:它是本族唯一分页的接口,且响应里**没有 `total`**,因此不走 CLI 的自动翻页。`--page-no` 从 1 开始逐页递增,`--page-size` 取值 1–200、**默认 50**(超出 200 在本地就被拒绝)。本族按次计费(0.4/次)且不自动重发,每翻一页扣一次——**批量翻页显式传 `--page-size 200`**,调用次数只有默认的四分之一。终止条件:
112
112
 
113
113
  - 翻过末页返回**空数组**(`--format json` 输出 `[]`,退出码 0)——到这一页就停
114
114
  - 条件下**一条公告都没有**时,任何页码都返回 `404` / `130001`(退出码 1)——第 1 页收到它就是没有数据,不用再翻
@@ -80,7 +80,7 @@ gangtise fundamental main-business --security-code <code> [--breakdown <type>] [
80
80
  - `--breakdown`(默认 `product`):`product` 按产品 | `industry` 按行业 | `region` 按地区
81
81
  - `--period`:`interim` 中报 | `annual` 年报(可重复)
82
82
  - 默认时间窗:`endDate` 当前日期、`startDate` 三年前
83
- - **不支持 `--fiscal-year`**(误传触发 `100001`/`100003`,旧 `900001`);按年份筛选用 `--start-date`/`--end-date`
83
+ - **没有 `--fiscal-year`**(误传报 unknown option);按年份筛选用 `--start-date`/`--end-date`
84
84
  - `--field` 只认 `references/fields.md` 「主营业务」小节的字段(`opRevenue` / `grossProfit` 等);`securityCode`、`itemName` 这类**不是**该接口字段,传了会报「响应字段数与 fieldList 不匹配」(前 3 列 `periodName` / `periodEndDate` / `categoryName` 恒定返回)
85
85
 
86
86
  ## A股估值分析 `fundamental valuation-analysis`
@@ -92,7 +92,7 @@ gangtise fundamental valuation-analysis --security-code <code> --indicator <name
92
92
  - **市场与路由**:本命令仅支持 A 股(港股 / 美股会报 `120001`「非有效A股」)。A股单证券估值序列与估值历史分位始终优先本命令;多证券批量取一组已实现估值点值,且 `indicator search` 三项校验都通过时,才优先 EDE `cross-section` / `time-series`。港 / 美股估值历史分位当前 CLI 不支持,不能用普通 EDE 点值冒充
93
93
  - `--indicator`(**必选**):`peTtm` 滚动PE | `pbMrq` PB | `peg` PEG | `psTtm` 滚动PS | `pcfTtm` 滚动PCF | `em` 企业倍数
94
94
  - `--limit` 默认 2000,省略 `--start-date` 时自动查近一年
95
- - 🔴 **序列按自然日逐日一行(含周末)**,行数超过 `--limit` 时接口**保留最近的行、丢掉区间开头**。CLI 撞满即标 `partial`、退出码 3 并在 stderr 说明(首行恰好就是 `--start-date` 时说明没丢,不标)。取长区间把 `--limit` 设到不小于区间天数(账号权限窗口内的十年约 3700 行,可设 `--limit 4000`)
95
+ - 🔴 **序列按自然日逐日一行(含周末)**,行数超过 `--limit` 时接口**保留最近的行、丢掉区间开头**。CLI 撞满即标 `partial`、退出码 3 并在 stderr 说明(首行恰好就是 `--start-date` 时说明没丢,不标)。取长区间把 `--limit` 设到不小于区间天数:取 N 年就设 `--limit` ≥ 366 × N(且不早于账号权限窗口的起点)
96
96
  - 🔴 **`--start-date` 早于账号回溯下界时,接口从下界起返回、不报错**(整段都在界外才报 `110003`)。首行晚于 `--start-date` 时 CLI 在 stderr 提示——可能是该证券上市较晚,也可能是撞了权限窗口,看首行日期判断
97
97
  - `--skip-null`:丢弃 `value`/`percentileRank` 为 null 的行(最新交易日可能未入库)
98
98
  - **返回字段只有 7 个**:`tradeDate` `value` `percentileRank` `average` `median` `upper1Std` `lower1Std`,**没有 `securityCode`**。🔴 `--field` 里**至少要有一个数值列**(`tradeDate` 以外的 6 个):只传 `tradeDate`、只传不存在的名字(含 `securityCode`)时接口返回 0 行、**不报错**,读起来像「这只票没有估值数据」(CLI 会在 stderr 提示原因);数值列与不存在的名字混传时,回显的字段比每行的值多,CLI 直接报错退出 1。`tradeDate` 总在第一列返回,不用写进 `--field`(写了 CLI 会在发请求前去掉;同一字段写两次也只发一次)。**建议不传 `--field`**,证券代码本来就是你自己传进去的
@@ -104,11 +104,11 @@ gangtise fundamental earning-forecast --security-code <code> [--start-date <date
104
104
  ```
105
105
 
106
106
  - **市场与路由**:本命令仅支持 A 股(港股 / 美股会报 `120001`「非有效A股」)。A股盈利预测 / 一致预期始终走本命令,不走 EDE;EDE 搜索目前没有一致预期语义,搜到的基本 / 稀释 EPS 是已实现值,不能冒充预测 EPS。港 / 美股盈利预测当前 CLI 不支持
107
- - `--start-date` / `--end-date`:默认近一年
107
+ - `--start-date` / `--end-date`:默认截至北京时间的今天、向前一年
108
108
  - `--consensus` 可重复:`netIncome` 归母净利润 | `netIncomeYoy` 同比增速 | `eps` 每股收益 | `pe` 市盈率 | `bps` 每股净资产 | `pb` 市净率 | `peg` PEG | `roe` 净资产收益率 | `ps` 市销率
109
109
  - **`roe` 的单位是百分比(%)**:`35.6` 即 35.6%,**不要再做 ÷100 之类的单位换算**——换算后的数字看着仍像个 ROE,不会报错
110
110
  - 返回结构:`{securityCode, securityName, updateList: [{date, fieldList: [{forecastYear, ...consensus}]}]}` — 每个日期固定返回 3 年预测(如 `2026E` / `2027E` / `2028E`)
111
- - **积分**:`0.5`/条(盈利预测是 `fundamental` 里唯一收费项,其余报表/主营/估值/股东均免费)
111
+ - **积分**:`0.5`/条(盈利预测是 `fundamental` 里唯一收费项,其余报表/主营/估值/股东均免费)。行数随日期区间增长(每个交易日一组、每组 3 年预测),长区间一次可达数千积分,所以超时 / 5xx **不自动重试**;长区间按年分段拉
112
112
 
113
113
  ## 前十大股东 `fundamental top-holders`
114
114