gangtise-openapi-cli 0.8.0 → 0.10.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.
- package/README.md +40 -2
- package/dist/src/cli.js +97 -0
- package/dist/src/core/endpoints.js +86 -0
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -59,9 +59,12 @@ export GANGTISE_TOKEN="Bearer xxx"
|
|
|
59
59
|
| | `foreign-report list` / `download` | 外资研报(含中文翻译下载) |
|
|
60
60
|
| | `announcement list` / `download` | 公告(含 Markdown 下载) |
|
|
61
61
|
| **Quote** | `day-kline` / `day-kline-hk` | A股/港股日K线 |
|
|
62
|
-
|
|
|
62
|
+
| | `minute-kline` | A股分钟K线 |
|
|
63
|
+
| **Fundamental** | `income-statement` / `balance-sheet` / `cash-flow` | 三大财务报表(累计) |
|
|
64
|
+
| | `income-statement-quarterly` / `cash-flow-quarterly` | 利润表/现金流量表(单季度) |
|
|
63
65
|
| | `main-business` | 主营构成(按地区/产品拆分) |
|
|
64
66
|
| | `valuation-analysis` | 估值分析 |
|
|
67
|
+
| | `earning-forecast` | 盈利预测(一致预期) |
|
|
65
68
|
| **AI** | `knowledge-batch` | 知识库批量检索 |
|
|
66
69
|
| | `knowledge-resource-download` | 知识资源下载 |
|
|
67
70
|
| | `security-clue` | 个股线索 |
|
|
@@ -72,7 +75,12 @@ export GANGTISE_TOKEN="Bearer xxx"
|
|
|
72
75
|
| | `theme-tracking` | 主题跟踪 |
|
|
73
76
|
| | `hot-topic` | 热点话题 |
|
|
74
77
|
| | `research-outline` | 研究提纲 |
|
|
78
|
+
| | `management-discuss-announcement` | 管理层讨论-财报 |
|
|
79
|
+
| | `management-discuss-earnings-call` | 管理层讨论-业绩会 |
|
|
80
|
+
| | `viewpoint-debate` / `viewpoint-debate-check` | 观点PK(异步) |
|
|
75
81
|
| **Vault** | `drive-list` / `drive-download` | 云盘文件列表与下载 |
|
|
82
|
+
| | `record-list` / `record-download` | 录音速记列表与下载 |
|
|
83
|
+
| | `my-conference-list` / `my-conference-download` | 我的会议列表与下载 |
|
|
76
84
|
| **Raw** | `call` | 原始接口调用(可访问任意 endpoint) |
|
|
77
85
|
|
|
78
86
|
## AI Agent Skill
|
|
@@ -160,6 +168,8 @@ gangtise ai knowledge-batch --query 比亚迪 --query 最近热门概念
|
|
|
160
168
|
- `insight announcement list`
|
|
161
169
|
- `ai security-clue`
|
|
162
170
|
- `vault drive-list`
|
|
171
|
+
- `vault record-list`
|
|
172
|
+
- `vault my-conference-list`
|
|
163
173
|
- `ai hot-topic`
|
|
164
174
|
|
|
165
175
|
规则:
|
|
@@ -169,7 +179,7 @@ gangtise ai knowledge-batch --query 比亚迪 --query 最近热门概念
|
|
|
169
179
|
|
|
170
180
|
## 智能文件命名
|
|
171
181
|
|
|
172
|
-
下载命令(`summary download`、`research download`、`foreign-report download`、`announcement download`、`vault drive-download`)省略 `--output` 时,自动使用真实标题作为文件名:
|
|
182
|
+
下载命令(`summary download`、`research download`、`foreign-report download`、`announcement download`、`vault drive-download`、`vault record-download`、`vault my-conference-download`)省略 `--output` 时,自动使用真实标题作为文件名:
|
|
173
183
|
|
|
174
184
|
1. **缓存优先** — 如果之前执行过对应的 `list` 命令,标题已缓存在 `~/.config/gangtise/title-cache.json`,直接使用,无额外 API 调用
|
|
175
185
|
2. **API 回查** — 缓存未命中时,自动查询最近 200 条记录匹配标题
|
|
@@ -226,6 +236,8 @@ gangtise quote day-kline --security 600519.SH --start-date 2026-03-01 --end-date
|
|
|
226
236
|
gangtise quote day-kline --format json
|
|
227
237
|
# 港股日K线
|
|
228
238
|
gangtise quote day-kline-hk --security 00700.HK --start-date 2026-03-01 --end-date 2026-03-31
|
|
239
|
+
# A股分钟K线
|
|
240
|
+
gangtise quote minute-kline --security 600519.SH --start-time "2026-04-15 09:30:00" --end-time "2026-04-15 15:00:00" --field open --field close --field volume
|
|
229
241
|
```
|
|
230
242
|
|
|
231
243
|
### Fundamental
|
|
@@ -246,6 +258,12 @@ gangtise fundamental main-business --security-code 600519.SH --breakdown region
|
|
|
246
258
|
# 多报告期:--period 可传多个值
|
|
247
259
|
gangtise fundamental main-business --security-code 600519.SH --breakdown product --period annual --period interim
|
|
248
260
|
gangtise fundamental valuation-analysis --security-code 600519.SH --indicator peTtm
|
|
261
|
+
# 盈利预测(一致预期)
|
|
262
|
+
gangtise fundamental earning-forecast --security-code 600519.SH --consensus netIncome --consensus eps --consensus pe
|
|
263
|
+
# 利润表(单季度)
|
|
264
|
+
gangtise fundamental income-statement-quarterly --security-code 600519.SH --fiscal-year 2025 --period q2 --field netProfit
|
|
265
|
+
# 现金流量表(单季度)
|
|
266
|
+
gangtise fundamental cash-flow-quarterly --security-code 600519.SH --fiscal-year 2025 --period q2 --field netOpCashFlows
|
|
249
267
|
```
|
|
250
268
|
|
|
251
269
|
### AI
|
|
@@ -264,6 +282,16 @@ gangtise ai hot-topic --start-date 2026-03-22 --end-date 2026-03-27 --category m
|
|
|
264
282
|
# 不传 --category 默认查全部类型(早报+午报+盘中快报+晚报),--with-related-securities 和 --with-close-reading 默认开启
|
|
265
283
|
gangtise ai hot-topic --start-date 2026-04-15 --end-date 2026-04-17
|
|
266
284
|
gangtise ai research-outline --security-code 600519.SH
|
|
285
|
+
# 管理层讨论-财报
|
|
286
|
+
gangtise ai management-discuss-announcement --report-date 2025-06-30 --security-code 000001.SZ --dimension businessOperation
|
|
287
|
+
# 管理层讨论-业绩会
|
|
288
|
+
gangtise ai management-discuss-earnings-call --report-date 2025-06-30 --security-code 000001.SZ --dimension financialPerformance
|
|
289
|
+
# 观点PK(异步,返回 dataId)
|
|
290
|
+
gangtise ai viewpoint-debate --viewpoint "飞天茅台的批价低点是1500元"
|
|
291
|
+
# 等待生成完成后查询结果
|
|
292
|
+
gangtise ai viewpoint-debate-check --data-id 202603310528
|
|
293
|
+
# 也可以 --wait 同步等待结果(最长3分钟)
|
|
294
|
+
gangtise ai viewpoint-debate --viewpoint "比亚迪股价将突破500元" --wait
|
|
267
295
|
gangtise ai knowledge-resource-download --resource-type 60 --source-id 3052524 --output ./resource.txt
|
|
268
296
|
```
|
|
269
297
|
|
|
@@ -275,6 +303,16 @@ gangtise vault drive-list --keyword 部门文档 --space-type 1 --file-type 1
|
|
|
275
303
|
# 云盘下载:自动使用文件标题命名
|
|
276
304
|
gangtise vault drive-download --file-id 62130
|
|
277
305
|
# → 2028 全球智能危机 一份来自未来的金融史思想实验 .pdf
|
|
306
|
+
|
|
307
|
+
# 录音速记列表
|
|
308
|
+
gangtise vault record-list --keyword 晨会 --category upload --category mobile
|
|
309
|
+
# 录音速记下载(--content-type: original/asr/summary)
|
|
310
|
+
gangtise vault record-download --record-id 49412 --content-type summary
|
|
311
|
+
|
|
312
|
+
# 我的会议列表
|
|
313
|
+
gangtise vault my-conference-list --keyword AI --category earningsCall --institution C100000027
|
|
314
|
+
# 我的会议下载(--content-type: asr/summary)
|
|
315
|
+
gangtise vault my-conference-download --conference-id 43319 --content-type asr
|
|
278
316
|
```
|
|
279
317
|
|
|
280
318
|
### Raw
|
package/dist/src/cli.js
CHANGED
|
@@ -356,12 +356,20 @@ quote.command("day-kline-hk").option("--security <code>", "Security code (HK sto
|
|
|
356
356
|
const client = await createClient();
|
|
357
357
|
await printData(await client.call("quote.day-kline-hk", { securityList: maybeArray(options.security), startDate: options.startDate, endDate: options.endDate, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
358
358
|
});
|
|
359
|
+
quote.command("minute-kline").option("--security <code>", "Security code (A-share only: .SH/.SZ/.BJ)").option("--start-time <datetime>", "Start time (yyyy-MM-dd HH:mm:ss)").option("--end-time <datetime>", "End time (yyyy-MM-dd HH:mm:ss)").option("--limit <number>", "Max rows per request (default: 5000, max: 10000)").option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
360
|
+
const client = await createClient();
|
|
361
|
+
await printData(await client.call("quote.minute-kline", { securityCode: options.security, startTime: options.startTime, endTime: options.endTime, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
362
|
+
});
|
|
359
363
|
program.addCommand(quote);
|
|
360
364
|
const fundamental = new Command("fundamental").description("Fundamental APIs");
|
|
361
365
|
fundamental.command("income-statement").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
362
366
|
const client = await createClient();
|
|
363
367
|
await printData(await client.call("fundamental.income-statement", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
364
368
|
});
|
|
369
|
+
fundamental.command("income-statement-quarterly").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period: q1/q2/q3/q4/latest", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
370
|
+
const client = await createClient();
|
|
371
|
+
await printData(await client.call("fundamental.income-statement-quarterly", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
372
|
+
});
|
|
365
373
|
fundamental.command("balance-sheet").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
366
374
|
const client = await createClient();
|
|
367
375
|
await printData(await client.call("fundamental.balance-sheet", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
@@ -370,6 +378,10 @@ fundamental.command("cash-flow").requiredOption("--security-code <code>").option
|
|
|
370
378
|
const client = await createClient();
|
|
371
379
|
await printData(await client.call("fundamental.cash-flow", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
372
380
|
});
|
|
381
|
+
fundamental.command("cash-flow-quarterly").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--fiscal-year <year>", "Fiscal year", collectList, []).option("--period <period>", "Period: q1/q2/q3/q4/latest", collectList, []).option("--report-type <type>", "Report type", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
382
|
+
const client = await createClient();
|
|
383
|
+
await printData(await client.call("fundamental.cash-flow-quarterly", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, fiscalYear: maybeArray(options.fiscalYear), period: options.period.length ? options.period : undefined, reportType: options.reportType.length ? options.reportType : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
384
|
+
});
|
|
373
385
|
fundamental.command("main-business").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").addOption(new Option("--breakdown <type>", "Breakdown: product/industry/region").choices(["product", "industry", "region"]).default("product")).option("--period <type>", "Period: interim/annual", collectList, []).option("--field <field>", "Field", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
374
386
|
const client = await createClient();
|
|
375
387
|
await printData(await client.call("fundamental.main-business", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, breakdown: options.breakdown, periodList: maybeArray(options.period), fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
@@ -378,6 +390,10 @@ fundamental.command("valuation-analysis").requiredOption("--security-code <code>
|
|
|
378
390
|
const client = await createClient();
|
|
379
391
|
await printData(await client.call("fundamental.valuation-analysis", { securityCode: options.securityCode, indicator: options.indicator, startDate: options.startDate, endDate: options.endDate, limit: options.limit ? Number(options.limit) : undefined, fieldList: maybeArray(options.field) }), parseFormat(options.format), options.output);
|
|
380
392
|
});
|
|
393
|
+
fundamental.command("earning-forecast").requiredOption("--security-code <code>").option("--start-date <date>").option("--end-date <date>").option("--consensus <name>", "Consensus indicator: netIncome/netIncomeYoy/eps/pe/bps/pb/peg/roe/ps", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
394
|
+
const client = await createClient();
|
|
395
|
+
await printData(await client.call("fundamental.earning-forecast", { securityCode: options.securityCode, startDate: options.startDate, endDate: options.endDate, consensusList: maybeArray(options.consensus) }), parseFormat(options.format), options.output);
|
|
396
|
+
});
|
|
381
397
|
program.addCommand(fundamental);
|
|
382
398
|
const ai = new Command("ai").description("AI APIs");
|
|
383
399
|
ai.command("knowledge-batch").requiredOption("--query <text>", "Query", collectList, []).option("--top <number>", "Top", "10").option("--resource-type <number>", "Resource type", collectNumberList, []).option("--knowledge-name <name>", "Knowledge name", collectList, []).option("--start-time <ms>").option("--end-time <ms>").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
|
|
@@ -480,6 +496,67 @@ ai.command("hot-topic").option("--from <number>", "Starting offset", "0").option
|
|
|
480
496
|
withCloseReading: options.withCloseReading || undefined,
|
|
481
497
|
}), parseFormat(options.format), options.output);
|
|
482
498
|
});
|
|
499
|
+
ai.command("management-discuss-announcement").requiredOption("--report-date <date>", "Report date (yyyy-MM-dd, e.g. 2025-06-30)").requiredOption("--security-code <code>", "Security code (e.g. 000001.SZ)").addOption(new Option("--dimension <name>", "Discussion dimension").choices(["businessOperation", "financialPerformance", "developmentAndRisk"]).makeOptionMandatory()).option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
|
|
500
|
+
const client = await createClient();
|
|
501
|
+
await printData(await client.call("ai.management-discuss-announcement", {
|
|
502
|
+
reportDate: options.reportDate,
|
|
503
|
+
securityCode: options.securityCode,
|
|
504
|
+
discussionDimension: options.dimension,
|
|
505
|
+
}), parseFormat(options.format), options.output);
|
|
506
|
+
});
|
|
507
|
+
ai.command("management-discuss-earnings-call").requiredOption("--report-date <date>", "Report date (yyyy-MM-dd, e.g. 2025-06-30)").requiredOption("--security-code <code>", "Security code (e.g. 000001.SZ)").addOption(new Option("--dimension <name>", "Discussion dimension").choices(["businessOperation", "financialPerformance", "developmentAndRisk"]).makeOptionMandatory()).option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
|
|
508
|
+
const client = await createClient();
|
|
509
|
+
await printData(await client.call("ai.management-discuss-earnings-call", {
|
|
510
|
+
reportDate: options.reportDate,
|
|
511
|
+
securityCode: options.securityCode,
|
|
512
|
+
discussionDimension: options.dimension,
|
|
513
|
+
}), parseFormat(options.format), options.output);
|
|
514
|
+
});
|
|
515
|
+
ai.command("viewpoint-debate").requiredOption("--viewpoint <text>", "Viewpoint text (max 1000 chars)").option("--wait", "Wait for content generation (blocking, up to 3 min)").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
|
|
516
|
+
const client = await createClient();
|
|
517
|
+
// Step 1: get dataId
|
|
518
|
+
const idResult = await client.call("ai.viewpoint-debate.get-id", { viewpoint: options.viewpoint });
|
|
519
|
+
const dataId = idResult?.dataId;
|
|
520
|
+
if (!dataId) {
|
|
521
|
+
process.stderr.write("Failed to get viewpoint debate ID.\n");
|
|
522
|
+
process.exitCode = 1;
|
|
523
|
+
return;
|
|
524
|
+
}
|
|
525
|
+
// Non-blocking: return dataId immediately
|
|
526
|
+
if (!options.wait) {
|
|
527
|
+
process.stderr.write(`Viewpoint debate task submitted. dataId: ${dataId}\n`);
|
|
528
|
+
process.stdout.write(`${JSON.stringify({ dataId, status: "pending", hint: `Run 'gangtise ai viewpoint-debate-check --data-id ${dataId}' in ~2 minutes to get results` })}\n`);
|
|
529
|
+
return;
|
|
530
|
+
}
|
|
531
|
+
// Blocking (--wait): poll for content
|
|
532
|
+
process.stderr.write(`Got dataId: ${dataId}, waiting for content generation...\n`);
|
|
533
|
+
let attempts = 0;
|
|
534
|
+
const maxAttempts = 12;
|
|
535
|
+
const delayMs = 15_000;
|
|
536
|
+
while (attempts < maxAttempts) {
|
|
537
|
+
attempts++;
|
|
538
|
+
const contentResult = await client.call("ai.viewpoint-debate.get-content", { dataId });
|
|
539
|
+
if (contentResult?.data?.content) {
|
|
540
|
+
await printData(contentResult.data, parseFormat(options.format), options.output);
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (attempts < maxAttempts) {
|
|
544
|
+
process.stderr.write(`Attempt ${attempts}/${maxAttempts}: content not ready, retrying in 15s...\n`);
|
|
545
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
process.stderr.write(`Content not available after ${maxAttempts} attempts. Try again later with: gangtise ai viewpoint-debate-check --data-id ${dataId}\n`);
|
|
549
|
+
process.exitCode = 1;
|
|
550
|
+
});
|
|
551
|
+
ai.command("viewpoint-debate-check").requiredOption("--data-id <id>", "dataId from viewpoint-debate").option("--format <format>", "Output format", "json").option("--output <path>").action(async (options) => {
|
|
552
|
+
const client = await createClient();
|
|
553
|
+
const contentResult = await client.call("ai.viewpoint-debate.get-content", { dataId: options.dataId });
|
|
554
|
+
if (contentResult?.data?.content) {
|
|
555
|
+
await printData(contentResult.data, parseFormat(options.format), options.output);
|
|
556
|
+
return;
|
|
557
|
+
}
|
|
558
|
+
process.stdout.write(`${JSON.stringify({ dataId: options.dataId, status: "pending", hint: "Content not ready yet, retry in ~2 minutes" })}\n`);
|
|
559
|
+
});
|
|
483
560
|
const vault = new Command("vault").description("Vault APIs");
|
|
484
561
|
vault.command("drive-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--file-type <number>", "File type", collectNumberList, []).option("--space-type <number>", "Space type", collectNumberList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
485
562
|
const client = await createClient();
|
|
@@ -491,6 +568,26 @@ vault.command("drive-download").requiredOption("--file-id <id>").option("--outpu
|
|
|
491
568
|
const title = options.output ? undefined : await resolveTitle(client, result, "vault.drive.list", "fileId", options.fileId);
|
|
492
569
|
await saveDownloadResult(result, `file-${options.fileId}`, options.output ?? title);
|
|
493
570
|
});
|
|
571
|
+
vault.command("record-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--category <name>", "Recording type: upload/link/mobile/gtNote/pc/share", collectList, []).option("--space-type <number>", "Space type: 1=my records / 2=tenant records", collectNumberList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
572
|
+
const client = await createClient();
|
|
573
|
+
await printData(await client.call("vault.record.list", { from: Number(options.from), size: options.size === undefined ? undefined : Number(options.size), startTime: options.startTime, endTime: options.endTime, keyword: options.keyword, categoryList: maybeArray(options.category), spaceTypeList: options.spaceType.length ? options.spaceType : undefined }), parseFormat(options.format), options.output, { endpointKey: "vault.record.list", idField: "recordId" });
|
|
574
|
+
});
|
|
575
|
+
vault.command("record-download").requiredOption("--record-id <id>").requiredOption("--content-type <type>", "Content type: original/asr/summary").option("--output <path>").action(async (options) => {
|
|
576
|
+
const client = await createClient();
|
|
577
|
+
const result = await client.call("vault.record.download", undefined, { recordId: options.recordId, contentType: options.contentType });
|
|
578
|
+
const title = options.output ? undefined : await resolveTitle(client, result, "vault.record.list", "recordId", options.recordId);
|
|
579
|
+
await saveDownloadResult(result, `record-${options.recordId}`, options.output ?? title);
|
|
580
|
+
});
|
|
581
|
+
vault.command("my-conference-list").option("--from <number>", "Starting offset", "0").option("--size <number>", "Total rows to return; omit to fetch all").option("--start-time <datetime>").option("--end-time <datetime>").option("--keyword <text>").option("--research-area <id>", "Research area ID", collectList, []).option("--security <code>", "Security code", collectList, []).option("--institution <id>", "Institution ID", collectList, []).option("--category <name>", "Conference category: earningsCall/strategyMeeting/fundRoadshow/shareholdersMeeting/maMeeting/specialMeeting/companyAnalysis/industryAnalysis/other", collectList, []).option("--format <format>", "Output format", "table").option("--output <path>").action(async (options) => {
|
|
582
|
+
const client = await createClient();
|
|
583
|
+
await printData(await client.call("vault.my-conference.list", { from: Number(options.from), size: options.size === undefined ? undefined : Number(options.size), startTime: options.startTime, endTime: options.endTime, keyword: options.keyword, researchAreaList: maybeArray(options.researchArea), securityList: maybeArray(options.security), institutionList: maybeArray(options.institution), categoryList: maybeArray(options.category) }), parseFormat(options.format), options.output, { endpointKey: "vault.my-conference.list", idField: "conferenceId" });
|
|
584
|
+
});
|
|
585
|
+
vault.command("my-conference-download").requiredOption("--conference-id <id>").requiredOption("--content-type <type>", "Content type: asr/summary").option("--output <path>").action(async (options) => {
|
|
586
|
+
const client = await createClient();
|
|
587
|
+
const result = await client.call("vault.my-conference.download", undefined, { conferenceId: options.conferenceId, contentType: options.contentType });
|
|
588
|
+
const title = options.output ? undefined : await resolveTitle(client, result, "vault.my-conference.list", "conferenceId", options.conferenceId);
|
|
589
|
+
await saveDownloadResult(result, `conference-${options.conferenceId}`, options.output ?? title);
|
|
590
|
+
});
|
|
494
591
|
program.addCommand(vault);
|
|
495
592
|
program.addCommand(ai);
|
|
496
593
|
program.command("raw").description("Raw API calls").addCommand(new Command("call").argument("<endpointKey>").option("--body <json>").option("--query <key=value>", "Query string pair", collectKeyValue, {}).option("--format <format>", "Output format", "json").option("--output <path>").action(async (endpointKey, options) => {
|
|
@@ -204,6 +204,13 @@ export const ENDPOINTS = {
|
|
|
204
204
|
kind: "json",
|
|
205
205
|
description: "Query main business composition",
|
|
206
206
|
},
|
|
207
|
+
fundamentalEarningForecast: {
|
|
208
|
+
key: "fundamental.earning-forecast",
|
|
209
|
+
method: "POST",
|
|
210
|
+
path: "/application/open-fundamental/earning-forecast",
|
|
211
|
+
kind: "json",
|
|
212
|
+
description: "Query earning forecast (consensus estimates)",
|
|
213
|
+
},
|
|
207
214
|
fundamentalValuationAnalysis: {
|
|
208
215
|
key: "fundamental.valuation-analysis",
|
|
209
216
|
method: "POST",
|
|
@@ -290,6 +297,55 @@ export const ENDPOINTS = {
|
|
|
290
297
|
description: "List hot topic reports",
|
|
291
298
|
pagination: { enabled: true, maxPageSize: 20 },
|
|
292
299
|
},
|
|
300
|
+
aiManagementDiscussAnnouncement: {
|
|
301
|
+
key: "ai.management-discuss-announcement",
|
|
302
|
+
method: "POST",
|
|
303
|
+
path: "/application/open-ai/management-discuss/from-announcement",
|
|
304
|
+
kind: "json",
|
|
305
|
+
description: "Management discussion from financial reports (half-year/annual)",
|
|
306
|
+
},
|
|
307
|
+
aiManagementDiscussEarningsCall: {
|
|
308
|
+
key: "ai.management-discuss-earnings-call",
|
|
309
|
+
method: "POST",
|
|
310
|
+
path: "/application/open-ai/management-discuss/from-earningsCall",
|
|
311
|
+
kind: "json",
|
|
312
|
+
description: "Management discussion from earnings calls",
|
|
313
|
+
},
|
|
314
|
+
aiViewpointDebateGetId: {
|
|
315
|
+
key: "ai.viewpoint-debate.get-id",
|
|
316
|
+
method: "POST",
|
|
317
|
+
path: "/application/open-ai/agent/viewpoint-debate-getid",
|
|
318
|
+
kind: "json",
|
|
319
|
+
description: "Get viewpoint debate ID",
|
|
320
|
+
},
|
|
321
|
+
aiViewpointDebateGetContent: {
|
|
322
|
+
key: "ai.viewpoint-debate.get-content",
|
|
323
|
+
method: "POST",
|
|
324
|
+
path: "/application/open-ai/agent/viewpoint-debate-getcontent",
|
|
325
|
+
kind: "json",
|
|
326
|
+
description: "Get viewpoint debate content",
|
|
327
|
+
},
|
|
328
|
+
quoteMinuteKline: {
|
|
329
|
+
key: "quote.minute-kline",
|
|
330
|
+
method: "POST",
|
|
331
|
+
path: "/application/open-quote/kline/minute",
|
|
332
|
+
kind: "json",
|
|
333
|
+
description: "Query A-share minute kline (SH/SZ/BJ)",
|
|
334
|
+
},
|
|
335
|
+
fundamentalIncomeStatementQuarterly: {
|
|
336
|
+
key: "fundamental.income-statement-quarterly",
|
|
337
|
+
method: "POST",
|
|
338
|
+
path: "/application/open-fundamental/financial-report/income-statement/quarterly",
|
|
339
|
+
kind: "json",
|
|
340
|
+
description: "Query income statement (quarterly)",
|
|
341
|
+
},
|
|
342
|
+
fundamentalCashFlowQuarterly: {
|
|
343
|
+
key: "fundamental.cash-flow-quarterly",
|
|
344
|
+
method: "POST",
|
|
345
|
+
path: "/application/open-fundamental/financial-report/cash-flow-statement/quarterly",
|
|
346
|
+
kind: "json",
|
|
347
|
+
description: "Query cash flow statement (quarterly)",
|
|
348
|
+
},
|
|
293
349
|
vaultDriveList: {
|
|
294
350
|
key: "vault.drive.list",
|
|
295
351
|
method: "POST",
|
|
@@ -305,6 +361,36 @@ export const ENDPOINTS = {
|
|
|
305
361
|
kind: "download",
|
|
306
362
|
description: "Download vault drive file",
|
|
307
363
|
},
|
|
364
|
+
vaultRecordList: {
|
|
365
|
+
key: "vault.record.list",
|
|
366
|
+
method: "POST",
|
|
367
|
+
path: "/application/open-vault/record/getList",
|
|
368
|
+
kind: "json",
|
|
369
|
+
description: "List voice recording transcriptions",
|
|
370
|
+
pagination: { enabled: true, maxPageSize: 50 },
|
|
371
|
+
},
|
|
372
|
+
vaultRecordDownload: {
|
|
373
|
+
key: "vault.record.download",
|
|
374
|
+
method: "GET",
|
|
375
|
+
path: "/application/open-vault/record/download/file",
|
|
376
|
+
kind: "download",
|
|
377
|
+
description: "Download voice recording transcription file",
|
|
378
|
+
},
|
|
379
|
+
vaultMyConferenceList: {
|
|
380
|
+
key: "vault.my-conference.list",
|
|
381
|
+
method: "POST",
|
|
382
|
+
path: "/application/open-vault/my-conference/getList",
|
|
383
|
+
kind: "json",
|
|
384
|
+
description: "List my conferences",
|
|
385
|
+
pagination: { enabled: true, maxPageSize: 50 },
|
|
386
|
+
},
|
|
387
|
+
vaultMyConferenceDownload: {
|
|
388
|
+
key: "vault.my-conference.download",
|
|
389
|
+
method: "GET",
|
|
390
|
+
path: "/application/open-vault/my-conference/download/file",
|
|
391
|
+
kind: "download",
|
|
392
|
+
description: "Download my conference resource",
|
|
393
|
+
},
|
|
308
394
|
};
|
|
309
395
|
export const ENDPOINT_REGISTRY = Object.values(ENDPOINTS).reduce((accumulator, endpoint) => {
|
|
310
396
|
accumulator[endpoint.key] = endpoint;
|
package/dist/src/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated — DO NOT EDIT
|
|
2
|
-
export const CLI_VERSION = "0.
|
|
2
|
+
export const CLI_VERSION = "0.10.0";
|