gangtise-openapi-cli 0.40.0 → 0.40.1

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.
package/README.md CHANGED
@@ -6,14 +6,16 @@
6
6
 
7
7
  README 仅列最近 5 个版本摘要:
8
8
 
9
+ - **v0.40.1 — 2026-09-19**:**文档修正,无代码变更**。① **字段名写错时两族接口的表现完全不同,现在写明了**:`quote realtime` / `day-kline` / `minute-kline` / `fund-flow` 是**字段名和值一起消失**(列数与值数始终对得上,CLI 标 `partial` + `missingFields`、退出码 3);`fundamental main-business` / `valuation-analysis` 是**字段名照请求回显、行里少一个值**(`fieldList` 比行长,按下标对位会让缺口之后每个值都贴到错误的表头上,CLI 因此直接报错退出 1)。对照表在 `gangtise-openapi/references/fields.md` 顶部。② 订正 `references/commands/fundamental.md` 里一处把这两族说反的类比。**两族都不报错**,所以 `--field` 的字段名要以 `fields.md` 为准,不确定就别传(不传即返回全部字段)。
10
+
9
11
  - **v0.40.0 — 2026-09-19**:① **自选股股票池可增删改**:新增 `vault stock-pool-create` / `stock-pool-rename` / `stock-pool-add-stock` / `stock-pool-remove-stock` / `stock-pool-delete` 五个命令,全部免费、只操作本账号数据。**这是本 CLI 仅有的写操作**——`stock-pool-delete` 会连带移除池内全部关注关系且不可恢复,必须显式加 `--yes`(不加则直接报错、不发请求;个股的投资笔记不受影响)。加 / 删自选与删池是**逐条处理**的:单条失败(如证券代码不存在)服务端仍返回成功信封、明细放在 `failList`,CLI 检测到后在 stderr 点名、标 `partial`、**退出码 3**,批量脚本按退出码判断即可。池名上限 10 个字符、不可与已有池重名(分别返回 `230007` / `230006`),每账号最多 30 个池(`230003`);证券代码大小写敏感且要带市场后缀,`600519.sh` / `700.HK` 这类会进 `failList` 而不是报错。**`raw call` 打这些端点时规则完全相同**——`raw call vault.stock-pool.delete` 一样要 `--yes`,逐条失败一样退出 3。② **`indicator time-series` 的日期轴改为自动判定**:不传 `--calendar-type` 时,CLI 先用免费的 `indicator search` 读各指标的 `parameterList`(去重后每个指标码各查一次,并发)——**全部是交易日类指标才按交易日取**(无非交易日空行,单元格也更省),只要有一个报告期类指标就按自然日取。这条很要紧:报告期末常落在非交易日(如 2024-03-31、2024-06-30 均为周日),按交易日取会让报告期类指标**整行全 `null`、退出码 0、不报错**。显式传了 `--calendar-type` 就完全按给的发。③ **`indicator` 截面 / 时序新增单次 30000 单元格上限**(截面 = 证券数 × 指标数,时序 = 序列数 × 日期数),超出报 `100006` 且不返回部分结果——按这个乘积拆批。⚠️ `--security` 传板块 ID 时服务端会展开成全部成分股,实际证券数远大于写进命令的条数。④ 🔴 **Token 缓存绑定签发它的凭证**:同一台机器上换掉 `GANGTISE_ACCESS_KEY` 后,只要上一个账号的 token 还没过期,此前会继续拿它发请求——取到的是**上一个账号**的数据;本版新增的股票池写命令若撞上,改的也会是上一个账号的池。现在凭证一换即重新登录。**`auth login` 报告的是接下来真正会用的身份**(新增 `source` 字段):设了 `GANGTISE_TOKEN` 就报那个注入的 token 并说明未登录,只有走 AK/SK 时才真的登录;返回的 `cache` 描述这次登录本身,缓存落盘失败也不会混进上一个账号。⑤ **`ai knowledge-batch --query` 整段送出**:此前按逗号拆,`--query "比较两家公司毛利率,并解释差异"` 会被拆成两个半句各查一次;多个问题仍用重复 `--query`。⑥ **异步任务的提交与查询都遵守 `--output` / `--format`**:`ai earnings-review` / `viewpoint-debate` 不加 `--wait` 的提交结果,以及 `*-check` 返回「还在生成中」时的 pending 结果,此前都直接打到 stdout——传了 `--output` 却拿到退出 0 加一个不存在的文件,而 pending 恰恰是轮询脚本最需要读的那个。⑦ 错误码:新增 `230003` / `230006` / `230007` 的处置提示;`100006` 的提示补上 EDE 单元格口径。⑧ 文档:分钟线加总对日线的口径更正——**个别历史交易日的分钟数据与日线不一致**,成交量 / 成交额统计一律以日线为准,**别把「Σ分钟 = 日线」写成校验条件**(详见 `gangtise-openapi/references/fields.md`)。
10
12
 
11
13
  - **v0.39.0 — 2026-09-12**:① **导出文件可核验**:`csv` / `jsonl` 的 `<文件>.meta.json` 增加数据文件的字节数 `bytes` 与内容哈希 `sha256`,转交或归档前 `shasum -a 256 <文件>` 比一下,就能确认这份元信息描述的是旁边这份数据。② **并发导出到同一 `--output` 不再互相掺混**:两个进程同时写同一路径时各写各的暂存文件,最终文件是其中某一次的完整产物(此前可能把两次的行混进一个文件、还报成功);收尾时回读比对哈希,文件已被另一次导出替换就在 stderr 说明并**退出码 4**——数据是完整的,只是那个位置上的文件不是本次产物(与退出码 3 同时发生时退出 3)。并发导出请给各自不同的 `--output`。③ **K 线分片合并的缺列护栏**:合并结果的列集取自第一个有数据的分片,只有靠后分片才返回的列放不下——现在标 `partial` + `droppedColumns`、退出码 3 并在 stderr 点名(此前静默丢弃),需要这些列就缩小日期区间单独拉。④ **`fundamental valuation-analysis` 的 `--skip-null` 与 `--field` 同用**:`--skip-null` 判的是 `value` 与 `percentileRank` 两列,`--field` 没点名它们时此前会把每一行都判成空、返回 `{total: 0, list: []}`(读起来像「这只票没有估值历史」);现在自动补取这两列做过滤,输出仍只给 `--field` 点名的列。⑤ `ai stock-summary` 单次上限由 5000 放宽到接口上限 **6000**,全 A 股可一次提交完。⑥ 文档:EDE 指标覆盖按当前实测更新——`finc_pe_ttm` / `finc_pb_mrq` 港股均有数。分钟线加总对日线的口径见 `gangtise-openapi/references/fields.md`。
12
14
  - **v0.38.0 — 2026-09-06**:① `quote realtime` / `day-kline` / `minute-kline` 支持**沪深 ETF**(`512800.SH`)与 **20 个全球指数**(`SPX.SPI` 标普500 / `N225.NKI` 日经225 / `HSI.HI` 恒生…,清单见 `gangtise-openapi/references/commands/quote.md`),代码直接传即可;全市场关键字 `aShares` 不含 ETF;全球指数 realtime 的 `volume` / `amount` / `amplitude` 与分钟 K 的 `volume` / `amount` 为 `null`,日 K 只有 `amount` 为 `null`;`tradeTime` 是交易所当地时间。② `quote realtime` 字段集:新增 `tradeStatus`(仅 A 股 / 港股个股有值),`turnoverRate` / `volumeRatio` 不返回,美股 `amount` 为 `null`。③ **缺列护栏**:`quote` 系带 `--field` 时,请求了但服务端没回的列(字段名写错或已下线,服务端不报错)标 `partial` + `missingFields`、退出码 3 并在 stderr 点名;`--field` 只回点名的列、不自动附带身份列(日 K 要自己写进 `securityCode` / `tradeDate`,分钟 K 是 `securityCode` / `tradeTime`,realtime 是 `securityCode`;`fund-flow` 会自动附带)。④ **列结构护栏**:K 线全市场分片合并按列名对齐各片;响应的 `fieldList` 有重名列、或数组行没有 `fieldList` 时报错退出 1,不按位置拍平;`quote` 单请求收到无 `list` 的载荷报错退出 1;全量翻页从末页起步时同样做 `total` 封顶探测;后续页 / 分片自带的 `partial` 保留到合并结果。⑤ `fundamental earning-forecast` 的 `roe` 单位为百分比(`35.6` = 35.6%)。⑥ ETF 有复权因子:day-kline `adjustFactor` 与 EDE `qte_adj_factor` 都覆盖。⑦ 文档:`SKILL.md` 精简为规则 + 路由 + 引用,错误码全表、不报错的坑、`screener` 缺列判据与困境自救集中在 `references/errors.md`。⑧ `quote minute-kline` 的 `--security` 可重复,逐只并发请求后按传入顺序合并;`quote day-kline` 显式多证券在「证券数 × 交易日数」超过 `--limit` 时自动逐只请求合并,撞上限的证券标 `partial` + `truncatedSecurities`。⑨ **大导出**:`--format jsonl` / `csv` 加 `--output` 时,翻页 / 分片 / 逐只结果按到达顺序逐批写盘,内存不随行数增长(csv 磁盘两遍);落盘时旁边生成 `<文件>.meta.json`(命令、数据行数、列、`complete` 与 `partial` 等完整性标记、抓取时间与时区、CLI 版本;密钥类字段脱敏),文件转交后仍可核验。⑩ `ai stock-summary` 单次最多 5000 只(更大的批次服务端返回空列表,CLI 本地拦截并提示分批)。⑪ A 股公告与 `ai knowledge-batch` 的 `--start-time` / `--end-time` 按**北京时间**换算成毫秒,与运行机器的时区无关。⑫ 省略 `--output` 的自动命名下载并发时各得其名、不互相覆盖;`raw call auth.login` 不需要环境里先有凭证。
13
15
  - **v0.37.1 — 2026-08-31**:**文档修正,无代码变更**。① `indicator screener` 用静态属性选股的示例补进 README——`pty_*`(经营范围·注册地…)/ `scr_*`(上市板块·ISIN…)两族用 `--indicator-param "F1:"`(冒号后留空)声明该指标不吃查询日期后,可直接用于条件选股。② **数据权限时间范围的说明按实测更正**:这个窗口按**账号**配、不按接口配——`indicator` 的 `cross-section` / `time-series` / `screener` 与 `quote day-kline` 在同一条边界上,**撞到 `110003` 换接口绕不过去**,正确做法是把日期移进权限范围,或联系客户经理开通更长历史。③ EDE 文本筛选示例换成有区分度的条件,避免示例条件把整个板块原样返回、看不出筛选是否生效。
14
- - **v0.37.0 — 2026-08-29**:🔴 **下载的「智能文件命名」改为默认只读缓存**。省略 `--output` 时仍优先用 `title-cache` 里的真实标题——先 `list` 再 `download` 的常规用法**不受影响,也不产生额外调用**;但**缓存未命中时不再自动回查 list 接口**,改为退回服务端返回的文件名或 `<type>-<id>.<ext>`。回查一次要拉 200 条记录(4 次请求),而这 12 个下载命令里有 9 个的 list 按 0.1 积分/条计费,约 20 积分——这笔开销只用于取一个更易读的文件名,所以改成显式的 `--resolve-title`。加了该参数时,取回的 200 条标题会一并写入缓存,同一批后续下载不再重复回查。⚠️ **依赖旧行为拿中文文件名的脚本**:升级后会得到 ID 文件名,补 `--resolve-title`,或按推荐用法先跑一次 `list`。**另有三项修正**:① 下载已成功、仅标题回查阶段遇到异常响应时,退出码会变成 3(脚本按 `!= 0` 判失败会误判为下载失败),现已隔离——下载完整就是 0;② `indicator cross-section` / `time-series` 的 `--indicator-param` 若写了 `--indicator` 里没有的指标编码(多为拼写错误),发请求前直接报错并指出是哪个编码(与 `screener` 一致);③ 下载请求的超时改为与其他请求同一套解析逻辑,行为对齐。
15
16
  ### 历史里程碑
16
17
 
18
+ - **v0.37.0**:下载的「智能文件命名」改为默认只读缓存,缓存未命中不再自动回查 list 接口(省下按条计费的开销),要中文文件名加 `--resolve-title`。
17
19
  - **v0.36.0**:日期写法放宽为三种「年在前」格式(「年在后」仍拒收,接口会按美式解析导致差半年),`indicator screener` 支持无日期指标。
18
20
  - **v0.29.0**:新增财报日历与 PDF 解析工具,群消息补 `quoteMsg`,并加强大整数 ID 与高积分调用防护。
19
21
  - **v0.26.0–v0.27.0**:建立高积分端点 `no-replay`、原子下载与容错分页机制,并补齐 Skill 分发和发布质量门禁。
@@ -1 +1 @@
1
- export const CLI_VERSION = "0.40.0";
1
+ export const CLI_VERSION = "0.40.1";
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: gangtise-openapi
3
- version: "0.40.0"
3
+ version: "0.40.1"
4
4
  description: |-
5
5
  通过 gangtise CLI 直接调用 Gangtise OpenAPI,拉取投研原始数据、批量导出、下载文件、调用 AI 能力。
6
6
 
@@ -2,7 +2,9 @@
2
2
 
3
3
  通用:所有命令都需 `--security-code`(如 `600519.SH`,注意是 `--security-code` 不是 `--security`)。`--field` 可重复,可用字段见 `references/fields.md`;A / 港 / 美股三大报表命令都在省略 `--field` 时返回完整报表,指定后只保留基础字段与所选科目。
4
4
 
5
- **`--field` 字段名必须核对**:三大报表遇到不存在的字段名会补 `null`(安全),但 `main-business` / `valuation-analysis` 是**只丢值、字段名照请求回显**,按位置拍平会把值贴到错误的字段上(同 `quote realtime`,详见 `references/commands/quote.md`)。CLI 长度不匹配就直接失败(退出码 1),不输出错位数据。不确定字段名就别传 `--field`。
5
+ **`--field` 字段名必须核对**:三大报表遇到不存在的字段名会补 `null`(安全),但 `main-business` / `valuation-analysis` 是**只丢值、字段名照请求回显**,`fieldList` 比行长,按位置拍平会把值贴到错误的字段上。CLI 长度不匹配就直接失败(退出码 1),不输出错位数据。不确定字段名就别传 `--field`。
6
+
7
+ ⚠️ **别把这个行为套到 `quote` 系上**——那边是**字段名和值一起消失**、列数与值数始终对得上,CLI 的处理也不同(标 `partial` + `missingFields`、退出码 3)。两族的完整对照见 `references/fields.md` 顶部。
6
8
 
7
9
  ---
8
10
 
@@ -2,6 +2,24 @@
2
2
 
3
3
  > 按命令分组,`--field` 参数可重复传入。不传 `--field` 时返回全部字段。`quote` 系传了 `--field` 就只回点名的列、不自动附带身份列(`fund-flow` 除外,它自动带 `securityCode` / `tradeDate`):日 K 要一起写进 `securityCode` / `tradeDate`,分钟 K 是 `securityCode` / `tradeTime`,实时行情是 `securityCode`。
4
4
 
5
+ ## 🔴 字段名写错时,两族接口的表现完全不同
6
+
7
+ `--field` 里写了一个不存在的字段名(拼错、或该字段已下线),**没有任何接口会报错**,但丢的东西不一样——这决定了你能不能按位置拍平结果:
8
+
9
+ | 接口 | 响应里发生什么 | CLI 怎么处理 |
10
+ | :-- | :-- | :-- |
11
+ | `quote realtime` / `day-kline` / `minute-kline` / `fund-flow` | **字段名和值一起消失**,`fieldList` 里也没有它,列数与值数始终对得上 | 比对请求与返回的列名,缺列标 `partial` + `missingFields`、在 stderr 点名、**退出码 3** |
12
+ | `fundamental main-business` / `valuation-analysis` | **字段名照请求回显在 `fieldList` 里,行里却少一个值**,两者长度对不上 | 检测到长度不匹配**直接报错退出 1**,不输出任何可能错位的数据 |
13
+
14
+ **第二族才是危险的那个**:`fieldList` 比行长,按下标对位会让缺口之后的每一个值都贴到错误的字段名上——一列合理的数字配着错误的表头,肉眼看不出来。CLI 因此选择整条失败而不是给你一份错位的表。
15
+
16
+ **结论一样**:`--field` 的字段名以本文件为准,不确定就别传(不传即返回全部字段,永远安全)。
17
+
18
+ 绕过 CLI 直连接口时**两族要查的东西不同,别只做一种**:
19
+
20
+ - `quote` 系:`fieldList` 与行**始终等长**,只比长度什么都查不出来——要拿**请求的字段名**去比**返回的 `fieldList`**,少了哪个就是那个名字没被认出来
21
+ - `fundamental` 两个:`fieldList` 会把你写的名字原样回显,所以对比请求没用——要比 **`fieldList` 长度与每行的值个数**,对不上就不能按下标取值
22
+
5
23
  ---
6
24
 
7
25
  ## Quote 行情
@@ -171,6 +189,8 @@
171
189
 
172
190
  ### 主营业务 (`fundamental main-business`)
173
191
 
192
+ > ⚠️ `--field` 写错字段名时**只丢值、字段名照回显**,CLI 会因长度不匹配报错退出 1——见本文顶部「字段名写错时,两族接口的表现完全不同」。
193
+
174
194
  | 字段 | 含义 | 字段 | 含义 |
175
195
  |------|------|------|------|
176
196
  | `opRevenue` | 营业收入 | `opRevenueYoy` | 营业收入同比增速 |
@@ -182,6 +202,8 @@
182
202
 
183
203
  ### 估值分析 (`fundamental valuation-analysis`)
184
204
 
205
+ > ⚠️ `--field` 写错字段名时**只丢值、字段名照回显**,CLI 会因长度不匹配报错退出 1——见本文顶部「字段名写错时,两族接口的表现完全不同」。
206
+
185
207
  | 字段 | 含义 | 字段 | 含义 |
186
208
  |------|------|------|------|
187
209
  | `value` | 原始值 | `percentileRank` | 分位点 |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gangtise-openapi-cli",
3
- "version": "0.40.0",
3
+ "version": "0.40.1",
4
4
  "description": "CLI for Gangtise OpenAPI",
5
5
  "license": "MIT",
6
6
  "repository": {