gangtise-openapi-cli 0.43.1 → 0.45.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 (41) hide show
  1. package/README.md +92 -19
  2. package/dist/src/cli.js +29 -18
  3. package/dist/src/commands/ai.js +20 -29
  4. package/dist/src/commands/auth.js +5 -4
  5. package/dist/src/commands/bond.js +5 -4
  6. package/dist/src/commands/fund.js +100 -0
  7. package/dist/src/commands/fundamental.js +2 -0
  8. package/dist/src/commands/groups.js +14 -0
  9. package/dist/src/commands/indicator.js +5 -5
  10. package/dist/src/commands/insight.js +3 -4
  11. package/dist/src/commands/raw.js +4 -3
  12. package/dist/src/commands/shared.js +35 -6
  13. package/dist/src/commands/tool.js +2 -2
  14. package/dist/src/commands/vault.js +56 -38
  15. package/dist/src/core/args.js +23 -7
  16. package/dist/src/core/asyncContent.js +1 -1
  17. package/dist/src/core/auth.js +2 -10
  18. package/dist/src/core/client.js +70 -24
  19. package/dist/src/core/commandBodies.js +1 -27
  20. package/dist/src/core/config.js +31 -5
  21. package/dist/src/core/download.js +47 -10
  22. package/dist/src/core/endpoints.js +196 -1
  23. package/dist/src/core/errors.js +1 -1
  24. package/dist/src/core/output.js +103 -75
  25. package/dist/src/core/printer.js +10 -5
  26. package/dist/src/core/quoteSharding.js +28 -4
  27. package/dist/src/core/rowSink.js +24 -10
  28. package/dist/src/core/titleCache.js +2 -10
  29. package/dist/src/core/transport.js +25 -7
  30. package/dist/src/core/updateCheck.js +3 -9
  31. package/gangtise-openapi/SKILL.md +53 -17
  32. package/gangtise-openapi/references/commands/bond.md +3 -1
  33. package/gangtise-openapi/references/commands/fund.md +193 -0
  34. package/gangtise-openapi/references/commands/fundamental.md +2 -2
  35. package/gangtise-openapi/references/commands/insight.md +2 -2
  36. package/gangtise-openapi/references/commands/quote.md +1 -1
  37. package/gangtise-openapi/references/commands/tool.md +1 -1
  38. package/gangtise-openapi/references/commands/vault.md +3 -2
  39. package/gangtise-openapi/references/errors.md +4 -4
  40. package/gangtise-openapi/references/response-schema.md +11 -1
  41. package/package.json +1 -1
@@ -1,12 +1,12 @@
1
1
  ---
2
2
  name: gangtise-openapi
3
- version: "0.43.1"
3
+ version: "0.45.0"
4
4
  description: |-
5
5
  通过 gangtise CLI 直接调用 Gangtise OpenAPI,拉取投研原始数据、批量导出、下载文件、调用 AI 能力。
6
6
 
7
- **触发词**:Gangtise / 钢尼斯 / gtIC(Gangtise 语音误识别)/ 调接口 / CLI / openapi / 导出 / 下载研报 / 批量查 / 拉数据 / 跑一下 / 研报 / 纪要 / 公告 / K线 / 财报 / 估值 / 选股 / 债券
7
+ **触发词**:Gangtise / 冈底斯 / 岗底斯 / gtIC(Gangtise 语音误识别)/ 调接口 / CLI / openapi / 导出 / 下载研报 / 批量查 / 拉数据 / 跑一下 / 研报 / 纪要 / 公告 / K线 / 财报 / 估值 / 选股 / 债券 / 基金 / ETF
8
8
 
9
- **适用**:原始数据导出、批量 jsonl/csv、下载 PDF/MD、行情 K 线、财务报表、估值指标、证券级数据指标(EDE 截面/时序/条件选股)、财报日历(业绩预告/快报/公告)、会议线索、帕米尔专家纪要、资金流向、题材与板块、债券(资料/行情/估值/评级/公告)、联网搜索、PDF 解析为 Markdown、AI 能力(一页通/投资逻辑/同业对比/个股看点·投研总结/投研线索/业绩点评/观点PK·多空辩论/主题跟踪/热点话题/管理层讨论/调研提纲/知识库搜索)、云盘文件管理(Vault)
9
+ **适用**:原始数据导出、批量 jsonl/csv、下载 PDF/MD、行情 K 线、财务报表、估值指标、证券级数据指标(EDE 截面/时序/条件选股)、财报日历(业绩预告/快报/公告)、会议线索、帕米尔专家纪要、资金流向、题材与板块、债券(资料/行情/估值/评级/公告)、公募基金(资料/净值/费率/经理/规模/持有人/持仓与配置/ETF 申赎)、联网搜索、PDF 解析为 Markdown、AI 能力(一页通/投资逻辑/同业对比/个股看点·投研总结/投研线索/业绩点评/观点PK·多空辩论/主题跟踪/热点话题/管理层讨论/调研提纲/知识库搜索)、云盘文件管理(Vault)
10
10
 
11
11
  **不适用**:不脱离 OpenAPI 自行撰写研报、编造投研结论或做自由问答——观点总结、多空 PK 等 AI 产物本 skill 只经由 Gangtise 平台 AI 接口获取,不自行生成
12
12
 
@@ -25,8 +25,8 @@ description: |-
25
25
  1. **`--format json`**:列表/数据类必加。AI 内容生成(`one-pager` / `investment-logic` / `peer-comparison` / `research-outline` / `*-check`)也加 json,但呈现时**直接取 `content` 字段**,不要展示 JSON 包装层。
26
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
27
  3. **公司名 → 证券代码**:先查下方速查表(几只常用大盘股),其余一律 `gangtise reference securities-search --keyword <名> --category stock` 取 `list[0].gtsCode`。
28
- 4. **时间格式**:datetime `"YYYY-MM-DD HH:mm:ss"`(引号包裹),date `YYYY-MM-DD`(`YYYY/MM/DD`、`YYYYMMDD` 也收,会归一;**年在后写法一律拒绝**)。
29
- 5. **多值参数**:优先重复传(最稳、最明确):`--security 600519.SH --security 000858.SZ`。CLI 也支持半/全角逗号分隔(语音输入容错),但重复传不易被 shell 吞。
28
+ 4. **时间格式**:datetime `"YYYY-MM-DD HH:mm:ss"`(引号包裹),date `YYYY-MM-DD`(`YYYY/MM/DD`、`YYYYMMDD` 也收,会归一;**年在后写法一律拒绝**);`--indicator-param` 里 `reportDate` / `tradeDate` 等以 `Date` 结尾的值同样适用。
29
+ 5. **多值参数**:优先重复传(最稳、最明确):`--security 600519.SH --security 000858.SZ`。代码 / ID / 字段名类参数也接受半/全角逗号、顿号、分号或空格分隔(语音输入容错),重复值自动去掉;名称类(`--manager` / `--issuer` / `--room-name` / `--knowledge-name`)只按逗号分隔,名称里的空格和顿号原样保留。**只收一个值的参数(如 `--security-code`)重复传会直接报错**,不会只取最后一个。
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
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` 已弃用、别用——它们不校验代码,传错返空不报错。
@@ -35,8 +35,8 @@ description: |-
35
35
  - 翻页 → 首页拿 total 后剩余页并发拉取;🔴 **全量拉取结束会多探一行验证 `total` 是不是服务端封顶**(`total` 若只是服务端封顶值,按它翻完会停在上限、看起来却像全量)——探到就标 `partial` + `totalCapped` + 退出 3,**这时导出的是截断结果,要缩小时间范围分片拉**
36
36
  - K 线全市场关键字(`aShares` / `hkStocks` / `usStocks`;旧命令 `all`)跨日期 → 自动按日切片并合并,粒度按各市场单日行数定(A 1 个工作日 / 港 2 个工作日 / 美 1 个工作日)
37
37
  - 5xx / `429` / 网络错误 / `999999` → 自动指数退避重试(🔴 贵档端点例外:仅连接失败 / 429 / token 自愈重试,5xx/超时不重放防重复扣分;`indicator` 端点对 `999999` 不重试)
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`。
38
+ - Token 失效 → 自动换用已刷新的 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`;`fund manager-info` 按人名查、用 `--manager`;其余(Insight 其他命令、Quote、Vault、Bond、Fund、Indicator、`ai stock-summary`)一律用 `--security`。
40
40
  9. **调试**:`--verbose` 或 `GANGTISE_VERBOSE=1` 打印每个请求的耗时/字节数到 stderr。
41
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
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`。
@@ -66,7 +66,7 @@ description: |-
66
66
  - 公司名 → 先速查表,否则 `reference securities-search`
67
67
  - opaque ID → 先 `references/lookup-ids.md`
68
68
  - 模糊时间词 → 查"时间词映射"
69
- - 列表类命令用户没要求全量 → 按单价主动加 `--size` 兜底(不必问):免费或 0.1 积分/条的列表用 `--size 200`;**≥1 积分/条的(观点、独立观点、路演四件套、会议线索、个股线索、热点话题等)用 `--size 20`**,要更多先 `--size 1` 看 stderr 的 `Total` 估总价再定。CLI 省略 `--size` 会拉全量;按条计费的列表估算全量超过 1000 积分时报错退出(报错里有估算积分),此时把估算积分告诉用户,确认后加 `--yes` 重跑或改传 `--size N`
69
+ - 列表类命令用户没要求全量 → 按单价主动加 `--size` 兜底(不必问):免费或 0.1 积分/条的列表用 `--size 200`;**≥1 积分/条的(观点、独立观点、路演四件套、会议线索、个股线索、热点话题等)用 `--size 20`**,要更多先 `--size 1` 看 stderr 的 `Total` 估总价再定。CLI 省略 `--size` 会拉全量;按条计费的列表估算全量超过 1000 积分时报错退出(报错里有估算积分),此时把估算积分告诉用户,确认后加 `--yes` 重跑或改传较小的 `--size N`。**显式 `--size` 本身估算超过 1000 积分也同样拦截**(别用 `--size 100000` 当「全量」绕过),`fundamental earning-forecast` 按日期区间估算、同一条线
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
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,不必问
@@ -80,6 +80,7 @@ description: |-
80
80
  - **按条(观点/含详情类 list)**:independent-opinion list 与 `ai security-clue` 5;roadshow/site-visit/strategy/forum list 20;**opinion / foreign-opinion list 1(只含摘要 `brief`)**,要正文用 `detail` 30/条或 `list --with-content` 30/条;`fundamental earning-forecast` 0.5;`ai stock-summary` 3(无看点的证券不返回也不扣);`alternative edb-data` 30
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
+ - **0.4 的 `fund` 系**:`fund` 全部命令 **0.4/次**(按次,与返回行数、基金只数无关)——多只基金合并成一次调用最省
83
84
  - **`tool web-search` 1/次**(按次,与返回条数、是否带 `--include-content` 无关;零结果与报错不扣)
84
85
  - 🔴 **`insight highlight list` 5/条**——**按返回条数计**,`--size 20` 的一页 = 100 积分。省略 `--size` 时 CLI 先估算,超过 1000 积分(约 200 条)报错退出,要全量须加 `--yes`
85
86
  - **按页**:`tool file-parse` 0.8/页,**提交(`--file`)时按实际页数一次性扣**,取结果(`file-parse-check`)免费——50 页 PDF = 40 积分,别重复提交同一文件
@@ -88,7 +89,7 @@ description: |-
88
89
  - **题材**:`alternative concept-info` / `concept-securities` **50/次**;🔴 加 `--full`(催化事件 / 重点个股标识 / 纳入理由)走旧版 **500/次**,不需要这几列就别加
89
90
  - ✅ **扣费发生在接口成功返回数据之后**(平台计费规则):没查到内容(空结果)、报错都不扣分——各 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
91
  - ⚠️ **同参数重复调用不免费**:按次计费的那批无缓存命中豁免(`one-pager` 等生成类重复调用每次扣分,即使秒回缓存内容);**按篇/按条的也一样**——重拉同一批 `hot-topic` 就是按条数再计一次费。生成类与列表结果拿到后自行留存复用,别为「刷新」重调
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
+ - ⚠️ **这些端点超时 / 5xx 不自动重放**(共 64 个,完整清单见下方注释块:按次计费的 AI Agent 那批、`ai knowledge-batch` / `management-discuss-*` / `hot-topic`、题材两接口(含 `--full`)、`bond` 与 `fund` 全部命令、`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
93
 
93
94
  <!-- no-replay-endpoints
94
95
  上面那句点名的「不重放」端点,完整清单如下(endpoint key,与 `gangtise raw list` 一致):
@@ -120,6 +121,24 @@ bond.issuer-rating-change
120
121
  bond.rating-change
121
122
  bond.rating-overview
122
123
  bond.valuation
124
+ fund.asset-allocation
125
+ fund.asset-size
126
+ fund.basic-info
127
+ fund.bond-portfolio
128
+ fund.bond-type-allocation
129
+ fund.etf-pcf-components
130
+ fund.etf-pcf-header
131
+ fund.etf-share-change
132
+ fund.fee-rate
133
+ fund.fund-portfolio
134
+ fund.fund-type-allocation
135
+ fund.holder-structure
136
+ fund.industry-allocation
137
+ fund.manager-history
138
+ fund.manager-info
139
+ fund.nav
140
+ fund.stock-portfolio
141
+ fund.top10-holders
123
142
  fundamental.earning-forecast
124
143
  insight.foreign-opinion.detail
125
144
  insight.foreign-opinion.list-with-content
@@ -152,13 +171,15 @@ vault.stock-pool.create
152
171
  | `quote` 行情 / `fundamental` 财报、主营、估值、股东 / `indicator`(EDE) | 前溯 **5 年** |
153
172
  | `bond daily-quote` / `bond valuation` / `bond issuance-plan` | 前溯 **5 年**(试用账号 3 年) |
154
173
  | `bond` 其余命令 | **不限**(返回最新静态资料或全部历史记录) |
174
+ | `fund` 净值 / 规模 / 持有人 / 资产配置 / 持仓与分布 / `etf-share-change` | 前溯 **5 年**(试用账号 3 年);两端日期都不传 = 窗口内全部 |
175
+ | `fund` 其余命令(`basic-info` / `fee-rate` / 经理两个 / `etf-pcf-*`) | **不限**(返回当前资料或全部任职记录) |
155
176
  | `insight highlight list` 会议线索 | 前溯 **3 个月**(试用账号 1 个月) |
156
177
  | `ai security-clue` 投研线索 | 前溯 **1 个月** |
157
178
  | 主题 / 热点 / QA / 日程(路演·调研·策略会·论坛)/ 纪要 / 观点 / 研报 / 公众号 | 前溯 **3 个月** |
158
179
  | 管理层讨论 / A·港·美股公告 / `alternative edb-*` 行业指标 | 前溯 **3 年** |
159
180
  | `insight pamirs-summary` 帕米尔纪要 | **不限**(但需单独购买专家纪要库) |
160
181
 
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` 超出账号可查范围时也返回空结果、不报错。
182
+ ⚠️ **实际窗口按账号配**,换接口绕不过去(`indicator` 与 `quote day-kline` 同界)。整段在界外返回 `110003`(不是空结果),把日期移进范围或联系客户经理。🔴 **区间跨过下界时各接口不同**:`quote` 日 K / 分钟 K / 资金流向与 `fundamental valuation-analysis` 从下界起返回、**不报错**(首行明显晚于起始日时 CLI 在 stderr 提示);`indicator`、`bond` 与 `fund` 整批报 `110003`;`bond daily-quote` / `bond valuation` 的数据还可能比账号窗口短——区间早于数据起点时返回 `130001`,跨过数据起点时从有数据的那天起返回、不报错,核对首行日期。**例外**:`quote minute-kline` 窗口短得多且随日期滚动,整段在窗外返回空结果、不报错(CLI 在 stderr 提示);`ai hot-topic` 超出账号可查范围时也返回空结果、不报错。
162
183
 
163
184
  ### 下载规则(`--file-type` / `--content-type`)
164
185
 
@@ -234,11 +255,24 @@ vault.stock-pool.create
234
255
  | 评级调整 / 评级变动历史 | `bond rating-change`(债项评级,最多 10 只)、`bond issuer-rating-change`(主体评级,`--security` 或 `--issuer` 二选一) |
235
256
  | 利率债发行计划 / 国债发行安排 | `bond issuance-plan`(**只按日期区间查,不收债券码**) |
236
257
  | 含权债行权 / 回售 / 赎回提示 | `bond exercise-notice` |
258
+ | 基金资料 / 基金分类 / 管理人 / 成立日 / 业绩基准 / 跟踪指数 / 风险等级 | `fund basic-info`(`--security` 用 `005827.OF` / `159967.SZ` 这类带后缀代码;只知道名称时,场内基金用 `reference securities-search --keyword <场内简称或 6 位代码> --category fund` 换代码(全称常搜不到),场外 `.OF` 搜不到、需自备;`--field` 写错**整批拒绝** `100003`) |
259
+ | 基金净值 / 复权净值 / 区间收益 / 货币基金七日年化 | `fund nav`(算收益用 `navAdjusted`) |
260
+ | 基金费率 / 管理费 / 申购赎回费 | `fund fee-rate`(`feeRate` 是字符串) |
261
+ | 基金经理画像(按人名) | `fund manager-info --manager <姓名>`(精确匹配,同名全返回,用 `currentCompany` 区分) |
262
+ | 某只基金的历任 / 现任经理 | `fund manager-history`(`endDate` 为 `null` = 现任) |
263
+ | 基金规模 / 份额变动 / 申赎份额 | `fund asset-size`(报告期口径);ETF 逐日份额与规模 → `fund etf-share-change` |
264
+ | 基金持有人结构 / 机构占比 / 前十大持有人 | `fund holder-structure`(`holderCount` 是带千分位的字符串)、`fund top10-holders`(仅上市基金) |
265
+ | 基金资产配置 / 股票仓位 / 债券仓位 | `fund asset-allocation` |
266
+ | 基金重仓股 / 全部持股 / 持仓明细 | `fund stock-portfolio`(`--position-type all` 仅中报、年报有;只返回股票简称、无代码) |
267
+ | 基金行业配置 / 行业分布 | `fund industry-allocation`(申万 / 中信一级二选一) |
268
+ | 基金持债 / 券种分布 | `fund bond-portfolio` / `fund bond-type-allocation` |
269
+ | FOF 持有的基金 / 持有基金类型分布 | `fund fund-portfolio` / `fund fund-type-allocation` |
270
+ | ETF 申购赎回清单 / 成分股 / 现金差额 | `fund etf-pcf-components` / `fund etf-pcf-header`(**只有最新一份清单**,无历史) |
237
271
  | 会议线索 / 会议要点 / 核心结论信息流 / 今天有什么会 | `insight highlight list`(🔴 **5 积分/条**,必须带 `--size`;`content` 是 HTML 片段) |
238
272
  | 联网搜索 / 查公开信息 / 政策原文 / 传闻核实 | `tool web-search`(1 积分/次;`--site` 定向站点、`--min-tier` 收信源、`--include-content` 取正文〔此时 `--size` ≤5〕) |
239
273
  | 云盘文件 | `vault drive-list / drive-download` |
240
274
  | 云盘目录 / 文件夹里有什么 | `vault drive-folder-list`(`--space-type 1` 我的云盘〔默认〕/ `2` 租户云盘,`--parent-id` 不传即根目录) |
241
- | 云盘上传 / 新建文件夹 / 重命名 / 移动 / 跨空间复制文件 / 删除(会改动账号数据) | `vault drive-upload / drive-create-folder / drive-rename / drive-move-file / drive-move-folder / drive-copy / drive-delete-file / drive-delete-folder`(删除须加 `--yes`;详见 `references/commands/vault.md`) |
275
+ | 云盘上传 / 新建文件夹 / 重命名 / 移动 / 跨空间复制文件或文件夹 / 删除(会改动账号数据) | `vault drive-upload / drive-create-folder / drive-rename / drive-move-file / drive-move-folder / drive-copy / drive-delete-file / drive-delete-folder`(删除须加 `--yes`;详见 `references/commands/vault.md`) |
242
276
  | 录音速记 | `vault record-list / record-download` |
243
277
  | 我的会议(业绩会/策略会/路演内部记录) | `vault my-conference-list / my-conference-download` |
244
278
  | 微信群消息 | `vault wechat-message-list`(先 `vault wechat-chatroom-list` 拿群 ID) |
@@ -266,6 +300,7 @@ vault.stock-pool.create
266
300
  - "纪要" → 外部信息走 `insight summary`;明确点名"帕米尔 / Pamirs"才走 `insight pamirs-summary`(另一个库,不是 `summary` 的子集);公司内部录音/会议走 `vault my-conference`
267
301
  - "搜索 X" → 数据维度精确(按行业/券商)走对应 `insight ... list`;跨类型语义搜索走 `ai knowledge-batch`
268
302
  - 港股代码用在 `insight foreign-opinion --security` 还是 `quote day-kline --security`?前者要"境外"格式(`UBER.N`),后者要 `.HK`
303
+ - "基金" → `fund` 命令组(资料 / 净值 / 持仓 / ETF 申赎);`quote fund-flow` 是 **A 股个股资金流向**,与基金无关。ETF 的日 K 与实时行情仍走 `quote day-kline` / `realtime`,ETF 净值、份额与申赎清单走 `fund`
269
304
  - "成分股" → 题材深度(分组;重点标记/纳入理由需 `--full`)走 `alternative concept-securities`;板块(行业/概念分类树,纯代码名单)走 `reference sector-constituents`
270
305
  - **证券指标按任务形态路由,不是搜到 EDE 就一律走 EDE**(细节见 `references/commands/indicator.md`):
271
306
  - 单证券 → 优先 `fundamental` 专用命令(多数免费 / 低价);多证券批量取**已实现**指标 → `indicator`(EDE)一次拉取:同一日期 / 报告期横比用 `cross-section`,区间走势用 `time-series`(不能多指标 × 多证券同时)
@@ -296,7 +331,7 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
296
331
  ```
297
332
  取 `list[0].gtsCode`(CLI 已剥掉信封,输出顶层就是 `{returnedCount, list}`)。matchScore < 0.5 时让用户从前 3 条选。
298
333
 
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`,**别猜**)。
334
+ **交易所后缀**:`.SH` 上交所(6 开头)| `.SZ` 深交所(0/3 开头)| `.BJ` 北交所 | `.HK` 港股 | `.O` 纳斯达克 | `.N` 纽交所 | `.A` AMEX | 沪深 ETF 同 `.SH` / `.SZ` | 场外基金 `.OF`(`fund` 命令组) | 全球指数用数据源后缀(`SPX.SPI` `N225.NKI` `HSI.HI` `GDAXI.FRA` …,清单见 `references/commands/quote.md`,**别猜**)。
300
335
 
301
336
  **跨市场**:`quote day-kline` 与 `quote realtime` 都可一次混合传入多市场代码(含 ETF 与全球指数):`quote realtime --security 600519.SH --security 00700.HK --security AAPL.O --security SPX.SPI` 单接口同时返回。
302
337
 
@@ -343,15 +378,15 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
343
378
  | 最新一期 / 最新报告期(财报) | — | — | 省略 `--fiscal-year`,传 `--period latest`(默认) |
344
379
  | 最新观点 / 今日观点 | 1 天范围 + `--rank-type 2` | — | — |
345
380
 
346
- 🔴 **`--end-time` 一律写到当天末尾 `23:59:59`**:只写日期时,A 股公告与 `knowledge-batch` 按当日 00:00:00 处理,「今天」就成了零宽窗口、取不到当天任何数据。
381
+ 🔴 **`--end-time` 写到当天末尾 `23:59:59` 最稳**:A 股公告与 `knowledge-batch` 只写日期时 CLI 按当日 23:59:59 换算;其余列表把时间串原样交给接口,写全时间才不依赖接口对「只有日期」的理解。
347
382
 
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`。
383
+ 日期参数**按参数名判断、不按命令组**:名字带 `-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` / `fund` / `edb-data` 用 `-date`。拿不准看该命令 `--help`。
349
384
 
350
385
  支持排序切换的 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` 开头。
351
386
 
352
387
  ## 异常处理
353
388
 
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 时务必带上**。
389
+ **退出码**:`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`。`outOfWindowShards` 不影响退出码:列的是早于账号可回溯窗口、被跳过的日期区间,告诉用户结果从哪天开始即可。报错行带 `[trace <id>]`,**报障给 Gangtise 时务必带上**。
355
390
 
356
391
  最高频的几个码(全表、「不报错的坑」、`screener` 缺列判据与困境自救见 `references/errors.md`):
357
392
 
@@ -367,8 +402,8 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
367
402
  | `999999` | 系统错误(EDE 无数据不用此码) | 参数无误仍报即服务端故障 |
368
403
  | `999011` | 凭证无效 | 查 AK/SK 环境变量,CLI 不重试 |
369
404
  | `999004` | 无资源权限(整库未开通与单条不可见都走这个码) | 先确认该数据库是否已购买 |
370
- | `0000001008` / `999002` | token 失效 | CLI 自动重登一次,无 AK/SK 时提示重新登录 |
371
- | `100006` | 查询/下载数量超限 | 缩短日期范围或调小 `--size`/`--limit` |
405
+ | `0000001008` / `999002` | token 失效 | CLI 自动换 token(必要时重新登录)后重发,无 AK/SK 时提示重新登录 |
406
+ | `100006` | 查询/下载数量超限 | 缩短日期范围或调小 `--size`/`--limit`;`fund` 没有这两个参数,减少 `--security` 只数或缩短区间 |
372
407
 
373
408
  其他场景:CLI 未安装 → `npm install -g gangtise-openapi-cli`;空结果 → 扩大时间范围 / 换关键词 / 去掉部分筛选;模糊公司名匹配多只 → 列出让用户选;下载路径冲突 → 询问覆盖。
374
409
 
@@ -384,6 +419,7 @@ gangtise reference securities-search --keyword <公司名> --category stock --to
384
419
  - 行业指标数据库(EDB)/ 题材指数画像与成分股(concept-info / concept-securities)→ `references/commands/alternative.md`
385
420
  - 数据指标(EDE:search / cross-section / time-series / screener,证券级指标截面、时序与条件选股)→ `references/commands/indicator.md`
386
421
  - 债券(basic-info / issuer-info / daily-quote / valuation / cash-flow / announcement / issuance-* / rating-overview / rating-change / issuer-rating-change / exercise-notice)→ `references/commands/bond.md`
422
+ - 公募基金(basic-info / nav / fee-rate / manager-* / asset-size / holder-structure / top10-holders / asset-allocation / 持仓与分布六个 / etf-pcf-* / etf-share-change)→ `references/commands/fund.md`
387
423
  - PDF 解析(file-parse)/ 联网搜索(web-search)→ `references/commands/tool.md`
388
424
  - securities-search / chiefs-search(首席 ID)/ institution-search(机构 ID)/ official-account-search(公众号 ID)/ 常量查询(constant-category / constant-list)/ 题材 ID(concept-search)/ 板块(sector-search / sector-constituents)/ lookup 本地表 / 行业别名 / raw call → `references/commands/reference-and-lookup.md`
389
425
  - 错误码全表 / 不报错的坑 / 退出码 3 与 `screener` 缺列判据 / Troubleshooting → `references/errors.md`
@@ -18,6 +18,8 @@
18
18
 
19
19
  ⚠️ **`--start-date` 早于可回溯下界时整批返回 `110003`「超出时间范围限制」**(这三个命令都是)——即使 `--end-date` 在窗口内,也不会只返回窗口内那一段。把 `--start-date` 移进窗口再查;实际下界随账号服务等级而定,以返回为准。
20
20
 
21
+ ⚠️ **`bond daily-quote` / `bond valuation` 的数据可能比账号窗口短**:区间在窗口内、但早于数据起点时整段返回 `130001`「数据未找到」;跨过数据起点时从有数据的那天起返回、不报错。按年份取长序列时核对返回的首行日期。
22
+
21
23
  ## `basic-info` 债券基本资料
22
24
 
23
25
  ```bash
@@ -113,7 +115,7 @@ gangtise bond announcement (--security <code>... | --start-date <d> --end-date <
113
115
  - 翻过末页返回**空数组**(`--format json` 输出 `[]`,退出码 0)——到这一页就停
114
116
  - 条件下**一条公告都没有**时,任何页码都返回 `404` / `130001`(退出码 1)——第 1 页收到它就是没有数据,不用再翻
115
117
 
116
- ⚠️ **按日期区间查询时,返回的 `securityCode` 不带市场后缀**(如 `012682337`);按 `--security` 查询时带后缀。要把结果接着传给其他 `bond` 命令(它们只收带后缀的代码,否则 `120001`),用该行的 `securityName` 走 `reference securities-search --keyword <简称>` 换回带后缀的 `gtsCode`,并核对它去掉后缀后与原代码一致。**别拿不带后缀的代码本身去搜**——检索按相似度返回,可能给出相邻的其他代码;部分资产支持证券按简称也检索不到。
118
+ 按日期区间查询时,部分行的 `securityCode` 为空(如不对应已上市证券的公告、部分新发行债券的发行文件),这类行无法接着传给其他 `bond` 命令;有代码的行都带市场后缀,可以直接传。
117
119
 
118
120
  其余债券命令一次返回全部匹配行。
119
121
 
@@ -0,0 +1,193 @@
1
+ # Fund 命令详细参数
2
+
3
+ **全部按次计费,0.4 积分/次**(与返回行数、基金只数无关);空结果与报错不扣。
4
+
5
+ `--security` 收**基金交易代码**,后缀大写:场外 `005827.OF`;场内 `159967.SZ` / `510300.SH`。可重复,也接受逗号分隔;重复代码服务端自动去重。
6
+
7
+ - 🔴 **代码不存在、不带后缀(`005827`)、后缀小写(`.of`)、传成股票代码,都返回空结果、不报错**——拿到空先核对代码与后缀
8
+ - **只知道基金名称时**:场内基金(ETF、LOF 的场内份额)用 `reference securities-search --keyword <场内简称或 6 位代码> --category fund` 换代码(基金全称常搜不到,如「华泰柏瑞沪深300ETF」要搜「沪深300ETF」或 `510300`);场外 `.OF` 代码搜不到,需要自备
9
+ - LOF / ETF 的场内代码(`161005.SZ`)与场外代码(`161005.OF`)都能查,返回的 `fundCode` 与 `fundName` 跟随传入的代码(场内简称 / 场外简称不同);同一只基金别两种代码混着传,会重复
10
+ - A / C 等份额各有代码,要合并到同一只基金用 `basic-info` 的 `mainFundCode`
11
+ - 多只基金的结果**按 `fundCode` 字段对应**,别按请求顺序对位
12
+
13
+ ⚠️ **超时 / 5xx 不自动重放**(避免重复扣费),偶发失败自行重跑。
14
+
15
+ ---
16
+
17
+ ## 通用规则
18
+
19
+ **不分页**:一次返回全部行,**单次上限 10000 行**。超出时整批报 `100006`「查询/下载数量超出限制」、不返回部分结果——减少基金只数或缩短日期区间分批查。
20
+
21
+ **日期**:`--start-date` / `--end-date` 收年在前日期(`YYYY-MM-DD`,`YYYY/MM/DD` / `YYYYMMDD` 也收,CLI 统一成 `YYYY-MM-DD` 发出)。持仓 / 规模 / 持有人类命令筛的是**报告期**(季末日 `2026-06-30`),`nav` 与 `etf-share-change` 筛的是**交易日**。
22
+
23
+ | 命令 | 可回溯 |
24
+ |------|--------|
25
+ | `nav` / `asset-size` / `holder-structure` / `top10-holders` / `asset-allocation` / 持仓与分布六个 / `etf-share-change` | 正式账号前溯 **5 年**、试用账号 **3 年**;实际窗口随账号服务等级而定,以返回为准 |
26
+ | `basic-info` / `fee-rate` / `manager-info` / `manager-history` / `etf-pcf-header` / `etf-pcf-components` | 不限(返回当前资料或全部任职记录) |
27
+
28
+ - **两端都不传 = 取账号窗口内的全部**,不是只取最新一期。只要最新一期就把起止都设成那个报告期
29
+ - 只传 `--start-date` = 从该日到最新;只传 `--end-date` = 从账号窗口下界到该日
30
+ - 🔴 **`--start-date` 早于可回溯下界时整批返回 `110003`「超出时间范围限制」**,即使 `--end-date` 在窗口内也不会只返回窗口内那一段。把起点移进窗口再查
31
+ - 起 > 止报 `110002`;区间内没有报告期(如 `2026-05-01`~`2026-05-31`)返回空结果
32
+
33
+ **枚举参数**(`--position-type` / `--industry-standard` / `--fee-type` / `--asset-level`)写错时报 `100003` 并指明参数与取值,不会按默认值静默取数。
34
+
35
+ **单位各命令不同**,入库前逐列核对:`nav` 与 `asset-allocation` 的金额是**元**;`asset-size` 是**万份 / 万元**;`holder-structure` 与 `top10-holders` 的份额是**份**;`stock-portfolio` 是**万股 / 万元**;`bond-portfolio` 是**万张 / 万元**;`fund-portfolio` 是**万元**;`etf-share-change` 是**万份 / 万元**;`manager-info` 的在管规模是**亿元**。百分比字段都已是百分数(`5.72` = 5.72%)。
36
+
37
+ ---
38
+
39
+ ## `basic-info` 基金基本信息
40
+
41
+ ```bash
42
+ gangtise fund basic-info --security <code> [--security <code>...] [--field <name>...]
43
+ ```
44
+
45
+ 分类(一级 / 二级)、管理人与托管人、成立与存续、运行状态与运作方式、申赎规则、业绩比较基准、风险等级、投资范围、跟踪指数。当前资料,**不提供历史快照**。
46
+
47
+ - `--field` 可重复,不传返回全部;**`fundCode` 始终返回**。字段名写错**整批报 `100003`** 并指名,不会静默丢列
48
+ - `mainFundCode`:A / C 等份额共用的主代码,做份额合并时按它分组
49
+ - `investTypeCodeLevel1` / `investTypeCodeLevel2`:与 `reference constant-list --category fundType` 的常量 ID 一致(FOF 类一级分类的 ID 不是整百,如 `149051404` 混合型 FOF,按常量表的 `level` 判层级,别按 ID 尾数猜)
50
+ - `exchange`:场内基金为交易所名称(如 `上海证券交易所` / `深圳证券交易所`),场外基金为 `null`
51
+ - `isIndexFund` 是布尔值;非指数型基金的 `trackIndexCode` / `trackIndexName` 为 `null`
52
+ - `maturityDate` 为 `null` 表示无固定存续期;`largePurchaseLimit` 为 `null` 表示不限
53
+ - `investScope` 是长文本,批量导出时用 `--field` 去掉可显著缩小体积
54
+
55
+ ## `nav` 基金净值
56
+
57
+ ```bash
58
+ gangtise fund nav --security <code>... [--start-date <d>] [--end-date <d>]
59
+ ```
60
+
61
+ 逐交易日一行:`navUnit` 单位净值、`navAccumulated` 累计净值、`adjustFactor` 复权因子、`navAdjusted` 复权净值(元)。**算区间收益用 `navAdjusted`**,单位净值在分红 / 拆分时会跳变。货币基金另有 `mmfAnnualizedYield`(7 日年化,%)与 `mmfUnitYield`(每万份收益,元),其 `adjustFactor` 为 `null`;非货币基金这两列为 `null`。结果按日期倒序。
62
+
63
+ 多只基金 × 长区间容易撞 10000 行上限(每只每年约 240~250 行),按只数分批。
64
+
65
+ ## `fee-rate` 基金费率
66
+
67
+ ```bash
68
+ gangtise fund fee-rate --security <code>... [--fee-type <type>...]
69
+ ```
70
+
71
+ - `--fee-type`:`purchaseFee` 申购 / `redemptionFee` 赎回 / `managementFee` 管理 / `custodianFee` 托管 / `saleFee` 销售服务。可重复,不传返回全部
72
+ - 一只基金一个费率类型可能多行——申购费按金额分档、赎回费按持有期限分档,每档一行,`feeCondition` 是条件区间(如 `持有期限<7日`);无分档的为 `null`
73
+ - `feeRate` 是**字符串**(`"1.5%"` / `"0%"`),大额固定收费时是金额描述(`"每笔1000元"`),**不能直接当数字用**
74
+
75
+ ## `manager-info` 基金经理基本信息
76
+
77
+ ```bash
78
+ gangtise fund manager-info --manager <name> [--manager <name>...]
79
+ ```
80
+
81
+ 🔴 **查的是人名,不是基金代码**。按姓名**精确匹配**,查不到返回空结果;同名经理**全部返回**(常见名可能一次返回多位),用 `currentCompany` 区分(可能为 `null`)。返回学历、从业日期与年限、在管规模(亿元)与只数、历任基金数与公司数、简介。
82
+
83
+ - ⚠️ `workingYears`(从业年限)与由 `careerStartDate` 推算出的年限、简介里写的从业年数**可能对不上**,`currentCompanyYears` 同理。需要准确的从业年限时按 `careerStartDate` 自行计算
84
+ - `birthYear` 未披露时为 `null`
85
+
86
+ ## `manager-history` 基金历任基金经理
87
+
88
+ ```bash
89
+ gangtise fund manager-history --security <code>...
90
+ ```
91
+
92
+ 每位经理的每段任职各一行;同期共同管理的多位经理各占一行。`endDate` 为 `null` 的是**现任**。`managedDays` 任职天数,`managedReturn` 任职期间业绩表现(%)。
93
+
94
+ ## `asset-size` 资产规模
95
+
96
+ ```bash
97
+ gangtise fund asset-size --security <code>... [--start-date <d>] [--end-date <d>]
98
+ ```
99
+
100
+ 每个报告期一行:期初份额、期间申购 / 赎回 / 净申购份额(赎回大于申购时为负)、期末份额(**万份**),基金资产净值(**万元**)。
101
+
102
+ ## `holder-structure` 持有人结构
103
+
104
+ ```bash
105
+ gangtise fund holder-structure --security <code>... [--start-date <d>] [--end-date <d>]
106
+ ```
107
+
108
+ 持有人户数、户均份额,机构 / 个人 / 员工持有份额(份)与占比(%)。只有半年报与年报披露,季报期没有行。
109
+
110
+ - 🔴 **`holderCount` 是带千分位逗号的字符串**(如 `"2,219,140"`),不是数字。做数值计算或排序前先去掉逗号再转数字,否则按字符串比较会排错
111
+ - 占比字段可能为 `null`
112
+
113
+ ## `top10-holders` 前十大持有人
114
+
115
+ ```bash
116
+ gangtise fund top10-holders --security <code>... [--start-date <d>] [--end-date <d>]
117
+ ```
118
+
119
+ **仅上市基金**(LOF / ETF 等)。每个报告期按 `serialNumber` 排名各一行:持有人名称、持有份额(份)、占上市总份额比例(%)。半年报与年报披露。
120
+
121
+ - ETF 在前十名之外可能多一行 `serialNumber = 11`,是该 ETF 的**联接基金**(定期报告单列披露),它的占比可能高于前十中的多位。只要前十名就按 `serialNumber <= 10` 过滤
122
+ - 最新一期的更新可能晚于其他持仓类命令。按最新报告期查不到时,先不带日期查一次,看已有哪些报告期
123
+
124
+ ## `asset-allocation` 资产配置
125
+
126
+ ```bash
127
+ gangtise fund asset-allocation --security <code>... [--start-date <d>] [--end-date <d>] [--asset-level level1|level2]
128
+ ```
129
+
130
+ 「报告期末基金资产组合情况」口径,一只基金一个报告期按资产类型多行:`assetType`(代码)+ `assetTypeName`(中文)、`holdingValue`(**元**)、`pctToTotalAsset`(**占基金资产总值**,不是占净值)。
131
+
132
+ - `--asset-level`:`level1` 一级 / `level2` 二级,可重复,不传两级都返回。**一二级混在同一结果里时别直接加总**,二级是一级的拆分
133
+ - 一级 `assetType`:`equityInv` 权益 / `fundInv` 基金 / `fixedIncomeInv` 固定收益 / `preciousMetals` 贵金属 / `deriv` 金融衍生品 / `reverseRepo` 买入返售 / `moneyMarket` 货币市场工具 / `cash` 银行存款和结算备付金 / `otherAssets` 其他
134
+ - 二级 `assetType`:`stock` 股票 / `prefShares` 优先股 / `dr` 存托凭证 / `reits`(属权益);`bond` / `abs`(属固定收益);`forward` / `futures` / `option` / `warrant`(属衍生品);`outrightReverseRepo`(属买入返售)
135
+ - 基金没有持有的资产类型可能不出现在结果里(而不是给一行 0),按「缺行 = 0」处理
136
+
137
+ ## 持仓与分布(六个命令)
138
+
139
+ ```bash
140
+ gangtise fund stock-portfolio --security <code>... [--start-date <d>] [--end-date <d>] [--position-type top|all]
141
+ gangtise fund industry-allocation --security <code>... [--start-date <d>] [--end-date <d>] [--industry-standard swIndustry|citicIndustry] [--position-type top|all]
142
+ gangtise fund bond-portfolio --security <code>... [--start-date <d>] [--end-date <d>]
143
+ gangtise fund bond-type-allocation --security <code>... [--start-date <d>] [--end-date <d>]
144
+ gangtise fund fund-portfolio --security <code>... [--start-date <d>] [--end-date <d>]
145
+ gangtise fund fund-type-allocation --security <code>... [--start-date <d>] [--end-date <d>]
146
+ ```
147
+
148
+ **`--position-type`**(`stock-portfolio` / `industry-allocation`):`top` 重仓股票,各季度都披露(不传时的默认);`all` 全部持股,**仅半年报与年报披露**——用 `all` 查一季度 / 三季度得到空结果,不是故障。`all` 的行数通常远多于 `top`(重仓只有前十只)。
149
+
150
+ - **`stock-portfolio`**:持股数量(万股)、占流通股比例、持仓市值(万元)、占净值比,以及 `pctToNavChg`(较上一报告期的占净值比变化)。🔴 **只返回股票简称 `stockName`,不返回代码**——要代码用 `reference securities-search --keyword <简称>` 换,注意 A / H 同名与改名
151
+ - **`industry-allocation`**:`--industry-standard` 选 `swIndustry` 申万一级(不传时的默认)/ `citicIndustry` 中信一级。`industryCode` 与 `reference constant-list --category swIndustry` / `citicIndustry` 的常量 ID 一致。两套分类划分不同,跨基金比较时统一用一套。占比为 0 的行业也可能出现
152
+ - **`bond-portfolio`**:债券简称 `bondName`(**无代码**)、持仓量(万张)、持仓市值(万元)、占净值比
153
+ - **`bond-type-allocation`**:按券种汇总的占净值比。`bondTypeCode` 与 `reference constant-list --category fundBondType` 一致。**`金融债券` 与 `政策性金融债券` 是两行、前者包含后者**,按券种加总会重复计算
154
+ - **`fund-portfolio`**(FOF):持仓基金简称 `holdingFundName`(**无代码**)、持仓市值(万元)、占净值比
155
+ - **`fund-type-allocation`**(FOF):持仓基金按基金分类(一级)汇总的占净值比,`investTypeCodeLevel1` 与 `fundType` 常量一致。**没有 `--position-type` 参数**,口径随报告期而定、看返回的 `positionType` 列:季报期为 `top`(只含重仓基金),半年报 / 年报为 `all`(全部持基)——同一只基金不同报告期的合计口径不同,做时序对比前先按 `positionType` 分开
156
+
157
+ ## ETF 申赎与份额(三个命令)
158
+
159
+ ```bash
160
+ gangtise fund etf-pcf-header --security <code>...
161
+ gangtise fund etf-pcf-components --security <code>...
162
+ gangtise fund etf-share-change --security <code>... [--start-date <d>] [--end-date <d>]
163
+ ```
164
+
165
+ - **`etf-pcf-header` / `etf-pcf-components` 只返回最新一份申购赎回清单**,无日期参数,查不了历史清单。`tradeDate` 是清单对应的交易日(清单盘前发布,可能就是当天)
166
+ - **`etf-pcf-header`**:申赎允许情况(`允许申购·允许赎回` 这种 `·` 分隔的组合)、最小申赎单位(份)及其净值(元)、单日申购 / 赎回上限(份,无上限为 `null`)、现金差额与预估现金(元,可为负)、现金替代比例上限(%)、`componentCount` 成分记录数
167
+ - **`etf-pcf-components`**:每个成分一行,按 `serialNumber` 排序:成分代码 `componentCode` 与名称、收盘价、涨跌幅、市值占比(%)、申购数量(股)、`cashSubstituteFlag`(`允许` / `必须`,中文)、申购 / 赎回现金替代溢价比例(%)、固定替代金额与申购 / 赎回替代金额(元)。宽基 ETF 动辄数百行,多只一起查注意 10000 行上限。`componentCode` **不带市场后缀**(如 `600519`),要接着查行情先补上后缀
168
+ - **`etf-share-change`**:逐交易日一行,份额(万份)、规模(万元)及较上期变动,`sharesChangeRate` 为份额变化率(%)。按日期倒序
169
+
170
+ ---
171
+
172
+ ## 常见任务
173
+
174
+ ```bash
175
+ # 基金画像:基本信息 + 现任经理 + 费率
176
+ gangtise fund basic-info --security 005827.OF --field fundName --field investTypeNameLevel2 --field mgrComp --field setupDate --field riskLevel
177
+ gangtise fund manager-history --security 005827.OF
178
+ gangtise fund fee-rate --security 005827.OF --fee-type managementFee --fee-type custodianFee
179
+
180
+ # 最新一期重仓股(季报)/ 全部持股(中报、年报)
181
+ gangtise fund stock-portfolio --security 005827.OF --start-date 2026-06-30 --end-date 2026-06-30
182
+ gangtise fund stock-portfolio --security 005827.OF --start-date 2026-06-30 --end-date 2026-06-30 --position-type all --format csv --output ./005827-2026H1.csv
183
+
184
+ # 近一年复权净值,算区间收益
185
+ gangtise fund nav --security 005827.OF --security 159967.SZ --start-date 2025-09-30 --end-date 2026-09-29 --format jsonl --output ./nav.jsonl
186
+
187
+ # ETF 申赎清单与份额变动
188
+ gangtise fund etf-pcf-components --security 510300.SH --format csv --output ./510300-pcf.csv
189
+ gangtise fund etf-share-change --security 510300.SH --start-date 2026-09-01 --end-date 2026-09-30
190
+
191
+ # 基金经理(按姓名)
192
+ gangtise fund manager-info --manager 张坤
193
+ ```
@@ -100,7 +100,7 @@ gangtise fundamental valuation-analysis --security-code <code> --indicator <name
100
100
  ## A股盈利预测 `fundamental earning-forecast`
101
101
 
102
102
  ```bash
103
- gangtise fundamental earning-forecast --security-code <code> [--start-date <date>] [--end-date <date>] [--consensus <name>]
103
+ gangtise fundamental earning-forecast --security-code <code> [--start-date <date>] [--end-date <date>] [--consensus <name>] [--yes]
104
104
  ```
105
105
 
106
106
  - **市场与路由**:本命令仅支持 A 股(港股 / 美股会报 `120001`「非有效A股」)。A股盈利预测 / 一致预期始终走本命令,不走 EDE;EDE 搜索目前没有一致预期语义,搜到的基本 / 稀释 EPS 是已实现值,不能冒充预测 EPS。港 / 美股盈利预测当前 CLI 不支持
@@ -108,7 +108,7 @@ gangtise fundamental earning-forecast --security-code <code> [--start-date <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` 里唯一收费项,其余报表/主营/估值/股东均免费)。行数随日期区间增长(每个交易日一组、每组 3 年预测),长区间一次可达数千积分,所以超时 / 5xx **不自动重试**;长区间按年分段拉
111
+ - **积分**:`0.5`/条(盈利预测是 `fundamental` 里唯一收费项,其余报表/主营/估值/股东均免费)。行数随日期区间增长(每个交易日一组、每组 3 年预测),长区间一次可达数千积分,所以超时 / 5xx **不自动重试**;长区间按年分段拉。**CLI 先按区间估算(工作日数 × 3 条 × 0.5),超过 1000 积分(约两年半)报错退出并给出估算值**,确认后加 `--yes` 或缩短区间
112
112
 
113
113
  ## 前十大股东 `fundamental top-holders`
114
114
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  `insight ... list` 大多共享:`--keyword <text>` `--start-time <datetime>` `--end-time <datetime>` `--from <n>` `--size <n>`。**例外**:`highlight list` 与 `qa list` 没有 `--keyword`;`report-image list` 用 `--top` 而不是 `--from` / `--size`;`performance-calendar list` 用 `--start-date` / `--end-date` 且没有 `--keyword`
4
4
 
5
- 按条计费的列表省略 `--size` 时,CLI 先估算全量积分,超过 1000 积分报错退出 1(报错写明估算值);确认后加 `--yes` 拉全量,或改传 `--size N`。
5
+ 按条计费的列表省略 `--size` 时,CLI 先估算全量积分,超过 1000 积分报错退出 1(报错写明估算值);确认后加 `--yes` 拉全量,或改传 `--size N`。显式 `--size` 按 `min(--size, total) × 单价` 估算仍超过 1000 积分时同样拦截。
6
6
 
7
- 时间格式:`"YYYY-MM-DD HH:mm:ss"`(datetime,需引号)。**`--end-time` 写到当天末尾 `23:59:59`**——只写日期时,A 股公告按当日 00:00:00 处理,截止日当天的数据取不到。
7
+ 时间格式:`"YYYY-MM-DD HH:mm:ss"`(datetime,需引号)。**`--end-time` 写到当天末尾 `23:59:59` 最稳**——A 股公告只写日期时 CLI 按当日 23:59:59 换算,其余列表把时间串原样交给接口。
8
8
 
9
9
  支持 `--rank-type` 的命令:opinion / summary / **pamirs-summary** / research / foreign-report / announcement / announcement-hk / announcement-us / foreign-opinion / independent-opinion / official-account。
10
10
 
@@ -18,7 +18,7 @@
18
18
  | `fund-flow` | `aShares` | 1 个工作日/片 |
19
19
  | `day-kline-hk` / `day-kline-us`(旧) | `all` | 2 / 1 个工作日/片 |
20
20
 
21
- 分片路径在没传 `--limit` 时自动把它抬到 10000(API 上限),避免默认 6000 行截断;传了 `--limit` 就按每片生效,低于单日行数时每片都会截断(标 `partial`)。分片只数工作日:周六日不单独发请求,跨周末的一片(如周五 + 周一)照常覆盖两边的交易日。
21
+ 分片路径在没传 `--limit` 时自动把它抬到 10000(API 上限),避免默认 6000 行截断;传了 `--limit` 就按每片生效,低于单日行数时每片都会截断(标 `partial`)。分片只数工作日:周六日不单独发请求,跨周末的一片(如周五 + 周一)照常覆盖两边的交易日。区间起点早于账号可回溯窗口时,窗口外的分片(接口报 `110003`)跳过、不影响其余分片,结果从窗口内开始,跳过的区间列在 `outOfWindowShards`(不算不完整、退出码 0;整段都在窗口外时仍报 `110003`)。
22
22
 
23
23
  **日K线历史性**:所有日K线接口仅返回**历史数据**,不提供实时行情。盘中实时数据请改用 `quote realtime`。当日数据入库时间:A 股约 15:30、港股约 16:30、美股约 07:00(北京时间)。
24
24
 
@@ -45,7 +45,7 @@ gangtise tool web-search --query "<标题>" --site csrc.gov.cn --include-content
45
45
  ```
46
46
 
47
47
  - `--query`(**必填**):1–200 字符。**服务端不做意图推断或改写**,检索词原样发送;要限定站点必须显式用 `--site`
48
- - `--size`:1–20,默认 10;**带 `--include-content` 时上限降为 5**(CLI 本地拦截并说明是哪个 flag 压低了上限)。指去重与过滤**之后**的条数,不足不补
48
+ - `--size`:1–20,默认 10;**带 `--include-content` 时上限降为 5、默认也随之取 5**(显式传超过 5 的值 CLI 本地拦截并说明是哪个 flag 压低了上限)。指去重与过滤**之后**的条数,不足不补
49
49
  - `--freshness`:`day` / `week` / `month` / `none`(默认)。按 `publishTime` 过滤,⚠️ **判不出发布日期(`publishTime` 为 `null`)的结果在 `day`/`week`/`month` 下不返回**——收窄时效会连带丢掉这批
50
50
  - `--min-tier`:`T0` / `T1` / `T2` / `T3`(默认 T3 = 不过滤)。低于该等级不返回
51
51
  - `--site`:注册域或子域(`csrc.gov.cn`、`finance.sina.com.cn`),可重复,**最多 10 个**(按去重后计),相互之间是**或**关系,子域按后缀匹配
@@ -26,6 +26,7 @@ gangtise vault drive-rename --type file|folder --id <id> --name <name>
26
26
  gangtise vault drive-move-file --file-id <id>... --target-folder-id <id|root>
27
27
  gangtise vault drive-move-folder --folder-id <id> --target-parent-id <id|root>
28
28
  gangtise vault drive-copy --file-id <id>... --target-folder-id <id|root>
29
+ gangtise vault drive-copy --folder-id <id> --target-parent-id <id|root>
29
30
  gangtise vault drive-delete-file --file-id <id>... --yes
30
31
  gangtise vault drive-delete-folder --folder-id <id> --yes
31
32
  ```
@@ -36,7 +37,7 @@ gangtise vault drive-delete-folder --folder-id <id> --yes
36
37
  - `drive-upload`:单个文件 ≤100MB(CLI 本地先拦);试用账号每天累计上传 ≤500MB(超出 `230008`)。`--title` 不传用本地文件名
37
38
  - 名称(`--name` / `--title`)≤200 个字符,按 UTF-16 计——中文算 1、emoji 算 2;超出 `230004`
38
39
  - **移动只能在同一空间内**:`drive-move-file` 里跨空间的文件进 `failList`(「空间不一致」);`drive-move-folder` 移到其他空间、自身或其子文件夹报 `230005`
39
- - **跨空间用 `drive-copy`**:把文件在「我的云盘 ↔ 租户云盘」之间复制(可批量),源保留不动;`--target-folder-id` 必须在另一空间,`root` 即另一空间的根目录,同空间复制报 `100003`。返回 `successList[]{fileId, newFileId}`。**目前只支持复制文件**,整个文件夹的复制暂未提供
40
+ - **跨空间用 `drive-copy`**:在「我的云盘 ↔ 租户云盘」之间复制,源保留不动,同空间复制报 `100003`。两种用法二选一:复制文件用 `--file-id`(可批量)+ `--target-folder-id`,返回 `successList[]{fileId, newFileId}`;复制整个文件夹用 `--folder-id` + `--target-parent-id`,连同其中的子文件夹与文件一起复制,返回 `{folderId, newFolderId}`。目标 ID 必须在另一空间,`root` 即另一空间的根目录
40
41
  - 🔴 **删除不可恢复,必须 `--yes`**:`drive-delete-file` 可批量;`drive-delete-folder` **连同其中全部子文件夹与文件一起删除**,删前先 `drive-folder-list --parent-id <id>` 看清里面有什么。拒绝后**不要自行补 `--yes` 重跑**,把要删的名称列给用户确认
41
42
  - **批量命令的部分失败**:`drive-delete-file` / `drive-move-file` / `drive-copy` 对单条失败仍返回成功,明细在 `failList`(`fileId` + `failReason`,如「文件不存在」)。CLI 把失败的 ID 写到 stderr、结果标 `partial` 并**退出 3**
42
43
 
@@ -93,7 +94,7 @@ gangtise vault wechat-message-list [--keyword <text>] [--security <code>] [--wec
93
94
  gangtise vault wechat-chatroom-list [--room-name <name>] [--from <n>] [--size <n>]
94
95
  ```
95
96
 
96
- - `--room-name`:可重复或英文逗号分隔
97
+ - `--room-name`:可重复或逗号分隔(名称里的空格、顿号原样保留)
97
98
  - 省略 `--size` 拉全量(接口返回 `total`,CLI 按 total 并发翻页);传 `--size N` 只取前 N 条。单页最大 50
98
99
  - 返回字段:`total`(总条数)/ `chatroomName` / `chatroomId`
99
100
 
@@ -21,14 +21,14 @@
21
21
  | `100001` | 缺必填参数——**msg 带字段名**(「缺少必填参数: reportId」) | — | 按 msg 指的字段补上 |
22
22
  | `110001` / `110002` | 日期格式错(msg 带字段名)/ 起晚于止。⚠️ **服务端对多种格式做宽松解析**(`2026/07/01`、`20260701`、`07/01/2026` 都能被接受),所以「没报 110001」不等于「格式被按你的意思理解了」 | — | 按参数名:`--*-date` 用 `YYYY-MM-DD`、`--*-time` 用 `YYYY-MM-DD HH:mm:ss`;`ai knowledge-batch` 的 --start-time/--end-time 收时间戳或 datetime,CLI 统一转 13 位毫秒 |
23
23
  | `120001` | 证券代码无效——msg 带原因(「非有效A股」)。Fundamental 系与 `quote day-kline`/`realtime`/`minute-kline`/`fund-flow` 都会报;**旧版 `day-kline-hk`/`day-kline-us`/`index-day-kline` 静默返回空** | — | `reference securities-search` 确认代码与后缀(`600519.SH` / `00700.HK`) |
24
- | `110003` | **超出账号数据权限的时间范围**。范围按账号等级而定、**不是平台常量**;窗口按**账号**配、不按接口配 | — | 把日期移进权限范围内;整个区间都早于下界时缩短窗口无用(`--fiscal-year 2015` 无论怎么缩都报错);**换接口绕不过去**,要更长历史联系客户经理开通。⚠️ 区间**跨过**下界时,`indicator` 与 `bond` 报这个码,`quote` 日 K 与 `valuation-analysis` 则从下界起返回、不报错——核对首行日期 |
25
- | `100006` | 查询/下载数量超限;**`indicator cross-section` / `time-series` 单次单元格数超 30000** 也是此码(msg 写明限额) | — | 缩短日期范围或调小 `--size`/`--limit`;全市场场景应已自动分片;EDE 按「截面=证券数×指标数、时序=证券数或指标数×日期数」拆批 |
24
+ | `110003` | **超出账号数据权限的时间范围**。范围按账号等级而定、**不是平台常量**;窗口按**账号**配、不按接口配 | — | 把日期移进权限范围内;整个区间都早于下界时缩短窗口无用(`--fiscal-year 2015` 无论怎么缩都报错);**换接口绕不过去**,要更长历史联系客户经理开通。⚠️ 区间**跨过**下界时,`indicator`、`bond` 与 `fund` 报这个码,`quote` 日 K 与 `valuation-analysis` 则从下界起返回、不报错——核对首行日期 |
25
+ | `100006` | 查询/下载数量超限;**`indicator cross-section` / `time-series` 单次单元格数超 30000**、**`fund` 命令单次超过 10000 行**也是此码(msg 写明限额) | — | 缩短日期范围或调小 `--size`/`--limit`;全市场场景应已自动分片;EDE 按「截面=证券数×指标数、时序=证券数或指标数×日期数」拆批;`fund` 不分页、没有 `--size`,减少 `--security` 只数或缩短日期区间分批查 |
26
26
  | `240001` | 财报期未披露或超出查询期(`earnings-review` 提交阶段就报,**不扣积分**) | — | 换更早的 `--period`(`2025q3` → `2025interim`) |
27
27
  | `250001` | 不支持的数据源 | — | 检查 `resourceType + sourceId` 组合 |
28
28
  | `999011` | 开发账号凭证无效(不区分 AK 错还是 SK 错) | 登录即失败,**不重试** | 检查 `GANGTISE_ACCESS_KEY`/`GANGTISE_SECRET_KEY` 是否写反或未 export |
29
29
  | `999010` | 接口地址不存在 | — | `raw call` 的 key 可能已下线,用 `gangtise raw list` 核对 |
30
30
  | `999004` | 无资源权限。**整库未开通与单条记录不可见都走这个码**——`insight pamirs-summary list`(专家纪要库需单独购买)未开通时即报此码 | — | `list` 撞上多为整库未开通,先确认该数据库是否已购买;`download` 撞上再考虑换一条本账号可见的记录 |
31
- | `0000001008` | Token 服务端失效(他处登录挤掉)——**旧码,token 自愈依赖它** | **强制重新登录并重试一次** | 无 AK/SK 时无法自愈,提示重新登录 |
31
+ | `0000001008` | Token 服务端失效(他处登录挤掉)——**旧码,token 自愈依赖它** | **换用已刷新的 token,不行再重新登录,然后重发** | 无 AK/SK 时无法自愈,提示重新登录 |
32
32
  | `0000001007` | 请求未携带 Bearer token | — | 检查 `GANGTISE_TOKEN` / AK/SK 是否已 export |
33
33
  | `900002` | **请求方法不正确**(msg「请求类型有误」,HTTP 405) | — | 请求方法由 CLI 按端点固定、用户改不了;出现说明接口的方法变了,带 trace 反馈 |
34
34
  | `140002` | 终态失败:AI 异步生成失败;`indicator` 的枚举越界 / 表达式语法错;或其他接口的「业务处理失败」(与入参无关) | **不立即重试**(终态码) | msg 指向参数就按 msg 改参数重提(EDE 的参数名与枚举读 `indicator search --format json` 的 `parameterList`);「业务处理失败」则稍后再试,持续出现带 trace 报障 |
@@ -81,7 +81,7 @@
81
81
 
82
82
  ## 退出码 4:数据写全了,但文件被另一次导出替换
83
83
 
84
- 本次导出的数据完整写出了,`--output` 指向的文件却在收尾期间被**另一次写向同一路径的导出**替换掉——文件在,只是不是这条命令的产物。stderr 会给出两边的 `sha256` 前缀。给并发的导出各自的 `--output` 即可。本次生成的 `.meta.json` 记录的是替换检查之前的判定;并发导出时,数据文件和元信息都可能被另一次导出覆盖。所以退出码 4 以本次进程的退出码和 stderr 为准,`sha256` 只能说明当前的数据文件与旁边的元信息是否匹配。
84
+ 本次导出的数据完整写出了,`--output` 指向的文件却在收尾期间被**另一次写向同一路径的导出**替换掉——文件在,只是不是这条命令的产物。stderr 会给出本次写出的 `sha256` 前缀。给并发的导出各自的 `--output` 即可。本次生成的 `.meta.json` 记录的是替换检查之前的判定;并发导出时,数据文件和元信息都可能被另一次导出覆盖。所以退出码 4 以本次进程的退出码和 stderr 为准,`sha256` 只能说明当前的数据文件与旁边的元信息是否匹配。
85
85
 
86
86
  与 `3` 分开是因为行没有缺、缺的是目的地。**两者同时发生时退出码是 `3`**——少了行是更重的那一个,替换另在 stderr 说明。
87
87
 
@@ -86,7 +86,7 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
86
86
  | vault drive-create-folder | `{folderId, parentId, folderName, spaceType, createTime}` | `folderId` |
87
87
  | vault drive-rename | `{id, name}` | — |
88
88
  | vault drive-move-folder / drive-delete-folder | `{folderId, parentId}` / `{folderId}` | — |
89
- | vault drive-copy | `{successList, failList}` | `successList[]{fileId, newFileId}`(`newFileId` 是另一空间里副本的 ID);`failList[]{fileId, failReason}`,非空时 `partial` + 退出码 3 |
89
+ | vault drive-copy | 复制文件:`{successList, failList}`;复制文件夹:`{folderId, newFolderId}` | `successList[]{fileId, newFileId}`(`newFileId` 是另一空间里副本的 ID);`failList[]{fileId, failReason}`,非空时 `partial` + 退出码 3。复制文件夹时 `newFolderId` 是另一空间里副本文件夹的 ID |
90
90
  | vault drive-move-file / drive-delete-file | `{successList, failList}` | `successList[]` 为文件 ID;`failList[]{fileId, failReason}`,非空时 `partial` + 退出码 3 |
91
91
  | vault record-list | `{list, total}` | `list[].recordId` / `list[].title` / `list[].category` / `list[].createTime` / `list[].recordDuration` |
92
92
  | vault record-download | 文件路径(stdout) | — |
@@ -105,6 +105,16 @@ CLI 自动处理 envelope:`{code, msg, data}` 信封会按 `code === "000000"`
105
105
  | alternative concept-securities | `{conceptId, conceptName, securityCount, securityDetail}`(单对象,分组) | `securityCount` / `securityDetail[].groupName` / `securityDetail[].securityList[].securityCode` / `.securityName` / `.isKey` / `.inclusionReason`(**这两列仅 `--full`**);无成分股时 `securityDetail` 为 `null` |
106
106
  | bond basic-info / issuer-info / daily-quote / valuation / cash-flow / issuance-detail / rating-overview / rating-change / issuer-rating-change / issuance-plan / exercise-notice | 列式 `{fieldList, list, total}` → 规范化后 `{list: [{...}], total}` | 字段名按 `--field` 或全部;每条命令的默认列恒在最前(如 `securityCode` + `tradeDate`、`issuerName`、`issueDate`),见 `commands/bond.md` |
107
107
  | bond announcement | 列式 `{fieldList, list}`(**无 `total`**)→ 规范化后为行数组 | `announcementDate` / `securityCode` + 其余字段;翻过末页为 `[]` |
108
+ | fund basic-info | `{list}`(**无 `total`**、不分页)→ 行数组;代码不存在返回 `[]` | `[].fundCode` / `fundName` / `mainFundCode`(A/C 份额共用)/ `investTypeCodeLevel1` / `investTypeNameLevel1` / `…Level2` / `mgrComp` / `setupDate` / `operationMode` / `exchange`(场外为 `null`)/ `riskLevel` / `isIndexFund`(布尔)/ `trackIndexCode` / `trackIndexName` |
109
+ | fund nav | 同上 | `[].fundCode` / `tradeDate`(倒序)/ `navUnit` / `navAccumulated` / `adjustFactor` / `navAdjusted` / `mmfAnnualizedYield` / `mmfUnitYield`(后两列仅货币基金有值) |
110
+ | fund fee-rate | 同上 | `[].fundCode` / `feeType` / `feeCondition`(分档条件,无分档为 `null`)/ `feeRate`(**字符串**,如 `"1.5%"`) |
111
+ | fund manager-info | 同上 | `[].managerName` / `currentCompany` / `careerStartDate` / `workingYears` / `managedFundScale`(亿元)/ `managedFundCount` / `historyFundCount` / `introduction`;同名经理多行 |
112
+ | fund manager-history | 同上 | `[].fundCode` / `managerName` / `startDate` / `endDate`(`null` = 现任)/ `managedDays` / `managedReturn`(%) |
113
+ | fund asset-size / holder-structure / top10-holders | 同上,每报告期一行(`top10-holders` 每期按名次多行) | `[].fundCode` / `reportDate` + 规模(`sharesEnd` / `netAsset`,万份 / 万元)、持有人结构(`holderCount` 是**带千分位的字符串** / `pctInstitution` / `pctIndividual`)、前十大(`serialNumber` / `holderName` / `holdingShares` / `holdingPct`) |
114
+ | fund asset-allocation | 同上,每报告期按资产类型多行 | `[].fundCode` / `reportDate` / `assetLevel` / `assetType` / `assetTypeName` / `holdingValue`(元)/ `pctToTotalAsset` |
115
+ | fund stock-portfolio / bond-portfolio / fund-portfolio | 同上,每报告期按持仓多行 | `[].fundCode` / `reportDate` / `stockName` · `bondName` · `holdingFundName`(**只有简称、无代码**)/ `holdingQuantity` / `holdingValue`(万元)/ `pctToNav`;股票另有 `pctToFloatShares` / `pctToNavChg` |
116
+ | fund industry-allocation / bond-type-allocation / fund-type-allocation | 同上,每报告期按分类多行 | `[].fundCode` / `reportDate` / `industryCode` + `industryName` · `bondTypeCode` + `bondTypeName` · `investTypeCodeLevel1` + `investTypeNameLevel1` / `pctToNav`;行业与基金类型另有 `positionType`(`top` / `all`) |
117
+ | fund etf-pcf-header / etf-pcf-components / etf-share-change | 同上 | 申赎参数(`tradeDate` / `purchaseRedemptionStatus` / `minUnitShares` / `cashBalance` / `componentCount`);成分清单(`serialNumber` / `componentCode` / `componentName` / `pctWeight` / `purchaseQuantity` / `cashSubstituteFlag`);份额变动(`tradeDate` / `shares` / `sharesChange` / `scale`,万份 / 万元) |
108
118
  | indicator search | `[{indicatorCode, indicatorName, ...}]`(列表) | `indicatorCode` / `indicatorName` / `description` / `scopeList[].market` / `scopeList[].securityType` / `scopeList[].usageRestriction`(接口限制,`null`=无限制) / `parameterList[].paramKey`(**参数名以此为准**) / `.enumList[].value` / `score` |
109
119
  | indicator cross-section | CLI 拍平为宽表 `{list, total}` | `list[].security` / `list[].name` + 每个指标名一列;**单日多指标 × 多证券**,每行一只证券。**没有 `date` 列**(查询日期挂在每个指标的参数上,各列可为不同日期);原始响应的 `values` 为 `[证券][指标]` |
110
120
  | indicator time-series | CLI 拍平为宽表 `{list, total}` | `list[].date` + 序列列:单证券时列=各指标、多证券时列=各证券;每行一个日期。原始响应 `values` 仍为 `[序列][日期]` |