@helloxiaohu/plugin-sina-stock 0.0.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 +109 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/sina-client.d.ts +30 -0
- package/dist/lib/sina-client.d.ts.map +1 -0
- package/dist/lib/sina-client.js +201 -0
- package/dist/lib/sina-client.js.map +1 -0
- package/dist/lib/sina-stock.plugin.d.ts +10 -0
- package/dist/lib/sina-stock.plugin.d.ts.map +1 -0
- package/dist/lib/sina-stock.plugin.js +33 -0
- package/dist/lib/sina-stock.plugin.js.map +1 -0
- package/dist/lib/sina-stock.strategy.d.ts +52 -0
- package/dist/lib/sina-stock.strategy.d.ts.map +1 -0
- package/dist/lib/sina-stock.strategy.js +53 -0
- package/dist/lib/sina-stock.strategy.js.map +1 -0
- package/dist/lib/tools/stock-quotes.tool.d.ts +33 -0
- package/dist/lib/tools/stock-quotes.tool.d.ts.map +1 -0
- package/dist/lib/tools/stock-quotes.tool.js +105 -0
- package/dist/lib/tools/stock-quotes.tool.js.map +1 -0
- package/dist/lib/toolset.d.ts +10 -0
- package/dist/lib/toolset.d.ts.map +1 -0
- package/dist/lib/toolset.js +18 -0
- package/dist/lib/toolset.js.map +1 -0
- package/dist/lib/types.d.ts +30 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/package.json +37 -0
package/README.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Xpert Plugin: Sina Stock
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
`@xpert-ai/plugin-sina-stock` is a stock quote plugin that enables XpertAI agents to fetch real-time A-share and Hong Kong stock data via the Sina Finance API. It provides free, no-API-key-required access to stock market data including prices, trading volume, and price changes.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- Fetches real-time stock quotes for A-shares (Shanghai and Shenzhen) and Hong Kong stocks
|
|
10
|
+
- Uses the free Sina Finance API - no API key required
|
|
11
|
+
- Supports multiple stock codes in a single request
|
|
12
|
+
- Returns formatted human-readable results including:
|
|
13
|
+
- Current price
|
|
14
|
+
- Price change and percentage
|
|
15
|
+
- Open, high, low, previous close prices
|
|
16
|
+
- Trading volume and amount
|
|
17
|
+
- Update timestamp
|
|
18
|
+
- Provides two tools:
|
|
19
|
+
- `sina_stock_quotes`: Get quotes for multiple stocks
|
|
20
|
+
- `sina_stock_detail`: Get detailed quote for a single stock (JSON format)
|
|
21
|
+
|
|
22
|
+
## Installation
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npm install @xpert-ai/plugin-sina-stock
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
> **Peer dependencies:** ensure the host environment already provides `@xpert-ai/plugin-sdk`, `@nestjs/common`, `@nestjs/config`, `@langchain/core`, `chalk`, and `zod` in the versions listed in `package.json`.
|
|
29
|
+
|
|
30
|
+
## Configuration
|
|
31
|
+
|
|
32
|
+
This plugin has no runtime configuration. The strategy publishes an empty JSON schema, so you can register the toolset without credentials or additional options.
|
|
33
|
+
|
|
34
|
+
| Option | Type | Required | Description |
|
|
35
|
+
| --- | --- | --- | --- |
|
|
36
|
+
| _none_ | – | – | The sina-stock toolset works out of the box. |
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
1. Add the plugin to the `PLUGINS` environment variable so that the XpertAI host loads it:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
PLUGINS=@xpert-ai/plugin-sina-stock
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
2. Create a toolset instance (via the XpertAI admin UI or API) referencing the `sina-stock` provider:
|
|
47
|
+
|
|
48
|
+
```jsonc
|
|
49
|
+
{
|
|
50
|
+
"provider": "sina-stock",
|
|
51
|
+
"options": {}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
3. Once attached to an agent, the tools become available to the LLM.
|
|
56
|
+
|
|
57
|
+
### Stock Code Format
|
|
58
|
+
|
|
59
|
+
- **Shanghai A-shares**: `sh` + 6-digit code (e.g., `sh600519` for Kweichow Moutai)
|
|
60
|
+
- **Shenzhen A-shares**: `sz` + 6-digit code (e.g., `sz000001` for Ping An Bank)
|
|
61
|
+
- **Hong Kong stocks**: `hk` + 5-digit code (e.g., `hk00700` for Tencent)
|
|
62
|
+
|
|
63
|
+
### Example Usage
|
|
64
|
+
|
|
65
|
+
**Get multiple stock quotes:**
|
|
66
|
+
```
|
|
67
|
+
Input: 600519, 000001, 00700
|
|
68
|
+
Output:
|
|
69
|
+
【贵州茅台(sh600519)】
|
|
70
|
+
当前价: 1688.00 元
|
|
71
|
+
涨跌额: +10.00 元
|
|
72
|
+
涨跌幅: +0.60%
|
|
73
|
+
...
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Get single stock detail:**
|
|
77
|
+
```
|
|
78
|
+
Input: 600519
|
|
79
|
+
Output: (JSON format with all stock details)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Sina Finance API
|
|
83
|
+
|
|
84
|
+
This plugin uses the free Sina Finance API:
|
|
85
|
+
|
|
86
|
+
- **Endpoint**: `https://hq.sinajs.cn/list=sh600519,sz000001,hk00700`
|
|
87
|
+
- **Rate Limit**: Please respect reasonable usage limits
|
|
88
|
+
- **Data**: Real-time delayed data (15-30 minutes)
|
|
89
|
+
|
|
90
|
+
## Development
|
|
91
|
+
|
|
92
|
+
From the monorepo root (`xpertai/`), use Nx to build or test:
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
npx nx build @xpert-ai/plugin-sina-stock
|
|
96
|
+
npx nx test @xpert-ai/plugin-sina-stock
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Or directly:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
cd tools/sina-stock
|
|
103
|
+
corepack pnpm exec tsc -p tsconfig.lib.json
|
|
104
|
+
corepack pnpm exec jest -c jest.config.ts
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## License
|
|
108
|
+
|
|
109
|
+
MIT – see the repository root `LICENSE`.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集插件入口
|
|
3
|
+
*/
|
|
4
|
+
import type { XpertPlugin } from '@xpert-ai/plugin-sdk';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
declare const ConfigSchema: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
7
|
+
declare const plugin: XpertPlugin<z.infer<typeof ConfigSchema>>;
|
|
8
|
+
export default plugin;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAIvD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAYvB,QAAA,MAAM,YAAY,gDAAe,CAAA;AAEjC,QAAA,MAAM,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,YAAY,CAAC,CA2BrD,CAAA;AAED,eAAe,MAAM,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集插件入口
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync } from 'fs';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { dirname, join } from 'path';
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
import { SinaStockPlugin } from './lib/sina-stock.plugin.js';
|
|
9
|
+
import { icon } from './lib/types.js';
|
|
10
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
11
|
+
const __dirname = dirname(__filename);
|
|
12
|
+
const packageJson = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
13
|
+
const ConfigSchema = z.object({});
|
|
14
|
+
const plugin = {
|
|
15
|
+
meta: {
|
|
16
|
+
name: packageJson.name,
|
|
17
|
+
version: packageJson.version,
|
|
18
|
+
category: 'tools',
|
|
19
|
+
icon: {
|
|
20
|
+
type: 'image',
|
|
21
|
+
value: icon
|
|
22
|
+
},
|
|
23
|
+
displayName: 'Sina Stock',
|
|
24
|
+
description: 'Real-time stock quotes for A-shares and Hong Kong stocks via Sina Finance API',
|
|
25
|
+
keywords: ['stock', 'finance', 'quotes', 'sina', 'A股', '港股'],
|
|
26
|
+
author: 'XpertAI Team',
|
|
27
|
+
},
|
|
28
|
+
config: {
|
|
29
|
+
schema: ConfigSchema,
|
|
30
|
+
},
|
|
31
|
+
register(ctx) {
|
|
32
|
+
ctx.logger.log('register sina-stock plugin');
|
|
33
|
+
return { module: SinaStockPlugin, global: true };
|
|
34
|
+
},
|
|
35
|
+
async onStart(ctx) {
|
|
36
|
+
ctx.logger.log('sina-stock plugin started');
|
|
37
|
+
},
|
|
38
|
+
async onStop(ctx) {
|
|
39
|
+
ctx.logger.log('sina-stock plugin stopped');
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
export default plugin;
|
|
43
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACjD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAA;AAErC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAGtF,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEjC,MAAM,MAAM,GAA8C;IACxD,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW,CAAC,IAAI;QACtB,OAAO,EAAE,WAAW,CAAC,OAAO;QAC5B,QAAQ,EAAE,OAAO;QACjB,IAAI,EAAE;YACJ,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,IAAI;SACZ;QACD,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,+EAA+E;QAC5F,QAAQ,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;QAC5D,MAAM,EAAE,cAAc;KACvB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,YAAY;KACrB;IACD,QAAQ,CAAC,GAAG;QACV,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAA;QAC5C,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;IAClD,CAAC;IACD,KAAK,CAAC,OAAO,CAAC,GAAG;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IAC7C,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,GAAG;QACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IAC7C,CAAC;CACF,CAAA;AAED,eAAe,MAAM,CAAA"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经 API 客户端
|
|
3
|
+
* 免费获取 A股、港股实时行情数据
|
|
4
|
+
*/
|
|
5
|
+
import { StockMarket, StockQuote } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* 根据股票代码判断市场
|
|
8
|
+
*/
|
|
9
|
+
export declare function getMarketByCode(code: string): StockMarket;
|
|
10
|
+
/**
|
|
11
|
+
* 格式化股票代码为新浪格式
|
|
12
|
+
* - 上海: sh600519
|
|
13
|
+
* - 深圳: sz000001
|
|
14
|
+
* - 港股: hk00700
|
|
15
|
+
*/
|
|
16
|
+
export declare function formatCodeForSina(code: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* 解析新浪返回的行情数据
|
|
19
|
+
* 格式: var hq_str_sh600519="贵州茅台,1678.00,1688.00,1690.00,1668.00,1668.00,14234,239345600.00,..."
|
|
20
|
+
*/
|
|
21
|
+
export declare function parseSinaQuote(rawData: string): Map<string, StockQuote>;
|
|
22
|
+
/**
|
|
23
|
+
* 获取股票行情(单只或多只)
|
|
24
|
+
*/
|
|
25
|
+
export declare function fetchStockQuotes(codes: string[]): Promise<Map<string, StockQuote>>;
|
|
26
|
+
/**
|
|
27
|
+
* 获取单只股票行情
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchStockQuote(code: string): Promise<StockQuote | null>;
|
|
30
|
+
//# sourceMappingURL=sina-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-client.d.ts","sourceRoot":"","sources":["../../src/lib/sina-client.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAA;AAclE;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAoBzD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAatD;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CA4BvE;AAsFD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CA2BxF;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAM9E"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经 API 客户端
|
|
3
|
+
* 免费获取 A股、港股实时行情数据
|
|
4
|
+
*/
|
|
5
|
+
import { StockMarket } from './types.js';
|
|
6
|
+
import iconv from 'iconv-lite';
|
|
7
|
+
// 新浪财经 API 地址
|
|
8
|
+
const SINA_QUOTE_URL = 'https://hq.sinajs.cn/list=';
|
|
9
|
+
// 请求头(模拟浏览器)
|
|
10
|
+
const DEFAULT_HEADERS = {
|
|
11
|
+
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
|
|
12
|
+
'Referer': 'https://finance.sina.com.cn',
|
|
13
|
+
'Accept': '*/*',
|
|
14
|
+
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* 根据股票代码判断市场
|
|
18
|
+
*/
|
|
19
|
+
export function getMarketByCode(code) {
|
|
20
|
+
const cleanCode = code.replace(/^(sh|sz|hk)/i, '');
|
|
21
|
+
// 港股:5位数字,通常以0、1、2开头
|
|
22
|
+
if (/^\d{5}$/.test(cleanCode) || /^hk/i.test(code)) {
|
|
23
|
+
return StockMarket.HK;
|
|
24
|
+
}
|
|
25
|
+
// 上海:6开头
|
|
26
|
+
if (/^6\d{5}$/.test(cleanCode)) {
|
|
27
|
+
return StockMarket.SH;
|
|
28
|
+
}
|
|
29
|
+
// 深圳:0、3开头
|
|
30
|
+
if (/^(0|3)\d{5}$/.test(cleanCode)) {
|
|
31
|
+
return StockMarket.SZ;
|
|
32
|
+
}
|
|
33
|
+
// 默认上海
|
|
34
|
+
return StockMarket.SH;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 格式化股票代码为新浪格式
|
|
38
|
+
* - 上海: sh600519
|
|
39
|
+
* - 深圳: sz000001
|
|
40
|
+
* - 港股: hk00700
|
|
41
|
+
*/
|
|
42
|
+
export function formatCodeForSina(code) {
|
|
43
|
+
// 先去除已有前缀
|
|
44
|
+
const cleanCode = code.replace(/^(sh|sz|hk)/i, '');
|
|
45
|
+
// 港股特殊处理 - 5位代码
|
|
46
|
+
if (cleanCode.length === 5 || /^hk/i.test(code)) {
|
|
47
|
+
return `hk${cleanCode.padStart(5, '0')}`;
|
|
48
|
+
}
|
|
49
|
+
// A股 - 6位代码
|
|
50
|
+
const paddedCode = cleanCode.padStart(6, '0');
|
|
51
|
+
const market = getMarketByCode(paddedCode);
|
|
52
|
+
return `${market}${paddedCode}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 解析新浪返回的行情数据
|
|
56
|
+
* 格式: var hq_str_sh600519="贵州茅台,1678.00,1688.00,1690.00,1668.00,1668.00,14234,239345600.00,..."
|
|
57
|
+
*/
|
|
58
|
+
export function parseSinaQuote(rawData) {
|
|
59
|
+
const result = new Map();
|
|
60
|
+
// 正则匹配: var hq_str_sh600519="..."
|
|
61
|
+
const regex = /var hq_str_([^=]+)="([^"]*)"/g;
|
|
62
|
+
let match;
|
|
63
|
+
while ((match = regex.exec(rawData)) !== null) {
|
|
64
|
+
const code = match[1]; // sh600519
|
|
65
|
+
const data = match[2]; // 贵州茅台,1678.00,...
|
|
66
|
+
if (!data || data.trim() === '') {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
const fields = data.split(',');
|
|
70
|
+
if (fields.length < 10) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
// 解析字段
|
|
74
|
+
const quote = parseQuoteFields(code, fields);
|
|
75
|
+
if (quote) {
|
|
76
|
+
result.set(quote.code, quote);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* 解析字段数据
|
|
83
|
+
* 新浪数据字段说明(A股):
|
|
84
|
+
* 0: 名称, 1: 开盘, 2: 昨收, 3: 当前, 4: 最高, 5: 最低,
|
|
85
|
+
* 6: 买入, 7: 卖出, 8: 成交量(股), 9: 成交额(元),
|
|
86
|
+
* ...
|
|
87
|
+
* 30: 日期, 31: 时间
|
|
88
|
+
*/
|
|
89
|
+
function parseQuoteFields(sinaCode, fields) {
|
|
90
|
+
try {
|
|
91
|
+
const code = sinaCode.replace(/^(sh|sz|hk)/, '');
|
|
92
|
+
const market = getMarketByCode(code);
|
|
93
|
+
let name = fields[0] || '';
|
|
94
|
+
let open = 0;
|
|
95
|
+
let preClose = 0;
|
|
96
|
+
let price = 0;
|
|
97
|
+
let high = 0;
|
|
98
|
+
let low = 0;
|
|
99
|
+
let volume = 0;
|
|
100
|
+
let amount = 0;
|
|
101
|
+
let change = 0;
|
|
102
|
+
let changePercent = 0;
|
|
103
|
+
let date = '';
|
|
104
|
+
let time = '';
|
|
105
|
+
if (market === StockMarket.HK) {
|
|
106
|
+
// 港股字段(新浪 hk):
|
|
107
|
+
// 0: 英文名, 1: 中文名, 2: 今开, 3: 昨收, 4: 最高, 5: 最低,
|
|
108
|
+
// 6: 最新价, 7: 涨跌额, 8: 涨跌幅(%), 11: 成交额, 12: 成交量, 17: 日期, 18: 时间
|
|
109
|
+
name = fields[1] || fields[0] || '';
|
|
110
|
+
open = parseFloat(fields[2]) || 0;
|
|
111
|
+
preClose = parseFloat(fields[3]) || 0;
|
|
112
|
+
high = parseFloat(fields[4]) || 0;
|
|
113
|
+
low = parseFloat(fields[5]) || 0;
|
|
114
|
+
price = parseFloat(fields[6]) || 0;
|
|
115
|
+
change = parseFloat(fields[7]);
|
|
116
|
+
if (Number.isNaN(change)) {
|
|
117
|
+
change = price - preClose;
|
|
118
|
+
}
|
|
119
|
+
changePercent = parseFloat(fields[8]);
|
|
120
|
+
if (Number.isNaN(changePercent)) {
|
|
121
|
+
changePercent = preClose > 0 ? (change / preClose) * 100 : 0;
|
|
122
|
+
}
|
|
123
|
+
amount = parseFloat(fields[11]) || 0;
|
|
124
|
+
volume = parseFloat(fields[12]) || 0;
|
|
125
|
+
date = fields[17] || '';
|
|
126
|
+
time = fields[18] || '';
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
// 新浪实时行情中 A 股返回值已是:成交量(股)、成交额(元)
|
|
130
|
+
name = fields[0];
|
|
131
|
+
open = parseFloat(fields[1]) || 0;
|
|
132
|
+
preClose = parseFloat(fields[2]) || 0;
|
|
133
|
+
price = parseFloat(fields[3]) || 0;
|
|
134
|
+
high = parseFloat(fields[4]) || 0;
|
|
135
|
+
low = parseFloat(fields[5]) || 0;
|
|
136
|
+
volume = parseFloat(fields[8]) || 0;
|
|
137
|
+
amount = parseFloat(fields[9]) || 0;
|
|
138
|
+
change = price - preClose;
|
|
139
|
+
changePercent = preClose > 0 ? (change / preClose) * 100 : 0;
|
|
140
|
+
date = fields[30] || '';
|
|
141
|
+
time = fields[31] || '';
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
code,
|
|
145
|
+
name,
|
|
146
|
+
price,
|
|
147
|
+
open,
|
|
148
|
+
high,
|
|
149
|
+
low,
|
|
150
|
+
preClose,
|
|
151
|
+
volume,
|
|
152
|
+
amount,
|
|
153
|
+
change,
|
|
154
|
+
changePercent: Math.round(changePercent * 100) / 100,
|
|
155
|
+
time: `${date} ${time}`,
|
|
156
|
+
market,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* 获取股票行情(单只或多只)
|
|
165
|
+
*/
|
|
166
|
+
export async function fetchStockQuotes(codes) {
|
|
167
|
+
if (codes.length === 0) {
|
|
168
|
+
return new Map();
|
|
169
|
+
}
|
|
170
|
+
// 格式化代码
|
|
171
|
+
const sinaCodes = codes.map(formatCodeForSina);
|
|
172
|
+
const url = `${SINA_QUOTE_URL}${sinaCodes.join(',')}`;
|
|
173
|
+
try {
|
|
174
|
+
const response = await fetch(url, {
|
|
175
|
+
method: 'GET',
|
|
176
|
+
headers: DEFAULT_HEADERS,
|
|
177
|
+
});
|
|
178
|
+
if (!response.ok) {
|
|
179
|
+
throw new Error(`HTTP error! status: ${response.status}`);
|
|
180
|
+
}
|
|
181
|
+
// 新浪接口默认返回 GBK 编码,直接 text() 会导致中文乱码
|
|
182
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
183
|
+
const text = iconv.decode(buffer, 'gbk');
|
|
184
|
+
return parseSinaQuote(text);
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
console.error('Failed to fetch stock quotes:', error);
|
|
188
|
+
return new Map();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 获取单只股票行情
|
|
193
|
+
*/
|
|
194
|
+
export async function fetchStockQuote(code) {
|
|
195
|
+
const quotes = await fetchStockQuotes([code]);
|
|
196
|
+
const cleanCode = code.replace(/^(sh|sz|hk)/i, '');
|
|
197
|
+
const market = getMarketByCode(code);
|
|
198
|
+
const normalizedCode = market === StockMarket.HK ? cleanCode.padStart(5, '0') : cleanCode.padStart(6, '0');
|
|
199
|
+
return quotes.get(normalizedCode) || null;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=sina-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-client.js","sourceRoot":"","sources":["../../src/lib/sina-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票插件模块
|
|
3
|
+
*/
|
|
4
|
+
import { IOnPluginBootstrap, IOnPluginDestroy } from '@xpert-ai/plugin-sdk';
|
|
5
|
+
export declare class SinaStockPlugin implements IOnPluginBootstrap, IOnPluginDestroy {
|
|
6
|
+
private logEnabled;
|
|
7
|
+
onPluginBootstrap(): void | Promise<void>;
|
|
8
|
+
onPluginDestroy(): void | Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=sina-stock.plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-stock.plugin.d.ts","sourceRoot":"","sources":["../../src/lib/sina-stock.plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAqB,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AAI9F,qBAKa,eAAgB,YAAW,kBAAkB,EAAE,gBAAgB;IAC1E,OAAO,CAAC,UAAU,CAAO;IAEzB,iBAAiB,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC,eAAe,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;CAKxC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票插件模块
|
|
3
|
+
*/
|
|
4
|
+
var SinaStockPlugin_1;
|
|
5
|
+
import { __decorate } from "tslib";
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { XpertServerPlugin } from '@xpert-ai/plugin-sdk';
|
|
8
|
+
import { ConfigModule } from '@nestjs/config';
|
|
9
|
+
import { SinaStockStrategy } from './sina-stock.strategy.js';
|
|
10
|
+
let SinaStockPlugin = SinaStockPlugin_1 = class SinaStockPlugin {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.logEnabled = true;
|
|
13
|
+
}
|
|
14
|
+
onPluginBootstrap() {
|
|
15
|
+
if (this.logEnabled) {
|
|
16
|
+
console.log(chalk.green(`${SinaStockPlugin_1.name} is being bootstrapped...`));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
onPluginDestroy() {
|
|
20
|
+
if (this.logEnabled) {
|
|
21
|
+
console.log(chalk.green(`${SinaStockPlugin_1.name} is being destroyed...`));
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
SinaStockPlugin = SinaStockPlugin_1 = __decorate([
|
|
26
|
+
XpertServerPlugin({
|
|
27
|
+
imports: [ConfigModule],
|
|
28
|
+
entities: [],
|
|
29
|
+
providers: [SinaStockStrategy]
|
|
30
|
+
})
|
|
31
|
+
], SinaStockPlugin);
|
|
32
|
+
export { SinaStockPlugin };
|
|
33
|
+
//# sourceMappingURL=sina-stock.plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-stock.plugin.js","sourceRoot":"","sources":["../../src/lib/sina-stock.plugin.ts"],"names":[],"mappings":"AAAA;;GAEG;;;AAEH,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,iBAAiB,EAAwC,MAAM,sBAAsB,CAAA;AAC9F,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAOrD,IAAM,eAAe,uBAArB,MAAM,eAAe;IAArB;QACG,eAAU,GAAG,IAAI,CAAA;IAa3B,CAAC;IAXC,iBAAiB;QACf,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,iBAAe,CAAC,IAAI,2BAA2B,CAAC,CAAC,CAAA;QAC9E,CAAC;IACH,CAAC;IAED,eAAe;QACb,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,iBAAe,CAAC,IAAI,wBAAwB,CAAC,CAAC,CAAA;QAC3E,CAAC;IACH,CAAC;CACF,CAAA;AAdY,eAAe;IAL3B,iBAAiB,CAAC;QACjB,OAAO,EAAE,CAAC,YAAY,CAAC;QACvB,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,CAAC,iBAAiB,CAAC;KAC/B,CAAC;GACW,eAAe,CAc3B"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集策略
|
|
3
|
+
*/
|
|
4
|
+
import { BuiltinToolset, IToolsetStrategy } from '@xpert-ai/plugin-sdk';
|
|
5
|
+
export declare class SinaStockStrategy implements IToolsetStrategy<any> {
|
|
6
|
+
meta: {
|
|
7
|
+
author: string;
|
|
8
|
+
tags: string[];
|
|
9
|
+
name: string;
|
|
10
|
+
label: {
|
|
11
|
+
en_US: string;
|
|
12
|
+
zh_Hans: string;
|
|
13
|
+
};
|
|
14
|
+
description: {
|
|
15
|
+
en_US: string;
|
|
16
|
+
zh_Hans: string;
|
|
17
|
+
};
|
|
18
|
+
icon: {
|
|
19
|
+
type: "svg";
|
|
20
|
+
value: string;
|
|
21
|
+
};
|
|
22
|
+
configSchema: {
|
|
23
|
+
type: string;
|
|
24
|
+
properties: {};
|
|
25
|
+
required: any[];
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
validateConfig(config: any): Promise<void>;
|
|
29
|
+
create(config: any): Promise<BuiltinToolset>;
|
|
30
|
+
createTools(): (import("@langchain/core/tools").DynamicStructuredTool<import("zod").ZodObject<{
|
|
31
|
+
codes: import("zod").ZodString;
|
|
32
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
33
|
+
codes?: string;
|
|
34
|
+
}, {
|
|
35
|
+
codes?: string;
|
|
36
|
+
}>, {
|
|
37
|
+
codes?: string;
|
|
38
|
+
}, {
|
|
39
|
+
codes?: string;
|
|
40
|
+
}, string> | import("@langchain/core/tools").DynamicStructuredTool<import("zod").ZodObject<{
|
|
41
|
+
code: import("zod").ZodString;
|
|
42
|
+
}, "strip", import("zod").ZodTypeAny, {
|
|
43
|
+
code?: string;
|
|
44
|
+
}, {
|
|
45
|
+
code?: string;
|
|
46
|
+
}>, {
|
|
47
|
+
code?: string;
|
|
48
|
+
}, {
|
|
49
|
+
code?: string;
|
|
50
|
+
}, string>)[];
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=sina-stock.strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-stock.strategy.d.ts","sourceRoot":"","sources":["../../src/lib/sina-stock.strategy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAmB,MAAM,sBAAsB,CAAA;AAKxF,qBAEa,iBAAkB,YAAW,gBAAgB,CAAC,GAAG,CAAC;IAE7D,IAAI;;;;;;;;;;;;;;;;;;;;;MAqBH;IAED,cAAc,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,cAAc,CAAC;IAIlD,WAAW;;;;;;;;;;;;;;;;;;;;;CAMZ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集策略
|
|
3
|
+
*/
|
|
4
|
+
import { __decorate } from "tslib";
|
|
5
|
+
import { Injectable } from '@nestjs/common';
|
|
6
|
+
import { ToolsetStrategy } from '@xpert-ai/plugin-sdk';
|
|
7
|
+
import { SinaStock, icon } from './types.js';
|
|
8
|
+
import { SinaStockToolset } from './toolset.js';
|
|
9
|
+
import { buildStockQuotesTool, buildStockDetailTool } from './tools/stock-quotes.tool.js';
|
|
10
|
+
let SinaStockStrategy = class SinaStockStrategy {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.meta = {
|
|
13
|
+
author: 'Xpert AI',
|
|
14
|
+
tags: ['stock', 'finance', 'quotes', 'sina', 'A股', '港股'],
|
|
15
|
+
name: SinaStock,
|
|
16
|
+
label: {
|
|
17
|
+
en_US: 'Sina Stock',
|
|
18
|
+
zh_Hans: '新浪财经股票'
|
|
19
|
+
},
|
|
20
|
+
description: {
|
|
21
|
+
en_US: 'Real-time stock quotes for A-shares and Hong Kong stocks via Sina Finance API. Free, no API key required.',
|
|
22
|
+
zh_Hans: '通过新浪财经API获取A股和港股实时行情。免费使用,无需API密钥。'
|
|
23
|
+
},
|
|
24
|
+
icon: {
|
|
25
|
+
type: 'svg',
|
|
26
|
+
value: icon
|
|
27
|
+
},
|
|
28
|
+
configSchema: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {},
|
|
31
|
+
required: []
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
validateConfig(config) {
|
|
36
|
+
return Promise.resolve();
|
|
37
|
+
}
|
|
38
|
+
async create(config) {
|
|
39
|
+
return new SinaStockToolset(config);
|
|
40
|
+
}
|
|
41
|
+
createTools() {
|
|
42
|
+
return [
|
|
43
|
+
buildStockQuotesTool(),
|
|
44
|
+
buildStockDetailTool()
|
|
45
|
+
];
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
SinaStockStrategy = __decorate([
|
|
49
|
+
Injectable(),
|
|
50
|
+
ToolsetStrategy(SinaStock)
|
|
51
|
+
], SinaStockStrategy);
|
|
52
|
+
export { SinaStockStrategy };
|
|
53
|
+
//# sourceMappingURL=sina-stock.strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sina-stock.strategy.js","sourceRoot":"","sources":["../../src/lib/sina-stock.strategy.ts"],"names":[],"mappings":"AAAA;;GAEG;;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC3C,OAAO,EAAoC,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAIlF,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAAvB;QAEL,SAAI,GAAG;YACL,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC;YACxD,IAAI,EAAE,SAAS;YACf,KAAK,EAAE;gBACL,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,QAAQ;aAClB;YACD,WAAW,EAAE;gBACX,KAAK,EAAE,2GAA2G;gBAClH,OAAO,EAAE,oCAAoC;aAC9C;YACD,IAAI,EAAE;gBACJ,IAAI,EAAE,KAAc;gBACpB,KAAK,EAAE,IAAI;aACZ;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;gBACd,QAAQ,EAAE,EAAE;aACb;SACF,CAAA;IAgBH,CAAC;IAdC,cAAc,CAAC,MAAW;QACxB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,MAAW;QACtB,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAA;IACrC,CAAC;IAED,WAAW;QACT,OAAO;YACL,oBAAoB,EAAE;YACtB,oBAAoB,EAAE;SACvB,CAAA;IACH,CAAC;CACF,CAAA;AAvCY,iBAAiB;IAF7B,UAAU,EAAE;IACZ,eAAe,CAAC,SAAS,CAAC;GACd,iBAAiB,CAuC7B"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取股票行情工具
|
|
3
|
+
*/
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
/**
|
|
6
|
+
* 获取股票实时行情工具
|
|
7
|
+
*/
|
|
8
|
+
export declare function buildStockQuotesTool(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
9
|
+
codes: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
codes?: string;
|
|
12
|
+
}, {
|
|
13
|
+
codes?: string;
|
|
14
|
+
}>, {
|
|
15
|
+
codes?: string;
|
|
16
|
+
}, {
|
|
17
|
+
codes?: string;
|
|
18
|
+
}, string>;
|
|
19
|
+
/**
|
|
20
|
+
* 获取单只股票详情工具
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildStockDetailTool(): import("@langchain/core/tools").DynamicStructuredTool<z.ZodObject<{
|
|
23
|
+
code: z.ZodString;
|
|
24
|
+
}, "strip", z.ZodTypeAny, {
|
|
25
|
+
code?: string;
|
|
26
|
+
}, {
|
|
27
|
+
code?: string;
|
|
28
|
+
}>, {
|
|
29
|
+
code?: string;
|
|
30
|
+
}, {
|
|
31
|
+
code?: string;
|
|
32
|
+
}, string>;
|
|
33
|
+
//# sourceMappingURL=stock-quotes.tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock-quotes.tool.d.ts","sourceRoot":"","sources":["../../../src/lib/tools/stock-quotes.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB;;GAEG;AACH,wBAAgB,oBAAoB;;;;;;;;;;WAmDnC;AAED;;GAEG;AACH,wBAAgB,oBAAoB;;;;;;;;;;WAuDnC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 获取股票行情工具
|
|
3
|
+
*/
|
|
4
|
+
import { tool } from '@langchain/core/tools';
|
|
5
|
+
import { getErrorMessage } from '@xpert-ai/plugin-sdk';
|
|
6
|
+
import { z } from 'zod';
|
|
7
|
+
import { fetchStockQuotes } from '../sina-client.js';
|
|
8
|
+
/**
|
|
9
|
+
* 获取股票实时行情工具
|
|
10
|
+
*/
|
|
11
|
+
export function buildStockQuotesTool() {
|
|
12
|
+
return tool(async (input) => {
|
|
13
|
+
try {
|
|
14
|
+
const codes = input.codes.split(',').map((c) => c.trim()).filter(Boolean);
|
|
15
|
+
if (codes.length === 0) {
|
|
16
|
+
return '请提供有效的股票代码';
|
|
17
|
+
}
|
|
18
|
+
const quotes = await fetchStockQuotes(codes);
|
|
19
|
+
if (quotes.size === 0) {
|
|
20
|
+
return '未获取到股票数据,请检查股票代码是否正确';
|
|
21
|
+
}
|
|
22
|
+
// 格式化输出
|
|
23
|
+
const results = [];
|
|
24
|
+
quotes.forEach((quote, code) => {
|
|
25
|
+
const changeSign = quote.change >= 0 ? '+' : '';
|
|
26
|
+
results.push(`【${quote.name}(${quote.code})】\n` +
|
|
27
|
+
` 当前价: ${quote.price.toFixed(2)} 元\n` +
|
|
28
|
+
` 涨跌额: ${changeSign}${quote.change.toFixed(2)} 元\n` +
|
|
29
|
+
` 涨跌幅: ${changeSign}${quote.changePercent.toFixed(2)}%\n` +
|
|
30
|
+
` 今开: ${quote.open.toFixed(2)} 元\n` +
|
|
31
|
+
` 最高: ${quote.high.toFixed(2)} 元\n` +
|
|
32
|
+
` 最低: ${quote.low.toFixed(2)} 元\n` +
|
|
33
|
+
` 昨收: ${quote.preClose.toFixed(2)} 元\n` +
|
|
34
|
+
` 成交量: ${(quote.volume / 10000).toFixed(2)} 万股\n` +
|
|
35
|
+
` 成交额: ${(quote.amount / 100000000).toFixed(2)} 亿元\n` +
|
|
36
|
+
` 更新时间: ${quote.time}`);
|
|
37
|
+
});
|
|
38
|
+
return results.join('\n\n');
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return `获取股票行情失败: ${getErrorMessage(error)}`;
|
|
42
|
+
}
|
|
43
|
+
}, {
|
|
44
|
+
name: 'sina_stock_quotes',
|
|
45
|
+
description: `获取A股和港股的实时行情数据。
|
|
46
|
+
支持上海证券交易所(6开头)、深圳证券交易所(0/3开头)和港股。
|
|
47
|
+
输入股票代码,返回当前价格、涨跌幅、成交量等信息。
|
|
48
|
+
示例: 600519 (贵州茅台), 000001 (平安银行), 00700 (腾讯控股)`,
|
|
49
|
+
schema: z.object({
|
|
50
|
+
codes: z.string().describe('股票代码,多个用逗号分隔,如: 600519,000001,00700')
|
|
51
|
+
})
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* 获取单只股票详情工具
|
|
56
|
+
*/
|
|
57
|
+
export function buildStockDetailTool() {
|
|
58
|
+
return tool(async (input) => {
|
|
59
|
+
try {
|
|
60
|
+
const code = input.code.trim();
|
|
61
|
+
if (!code) {
|
|
62
|
+
return '请提供有效的股票代码';
|
|
63
|
+
}
|
|
64
|
+
const quotes = await fetchStockQuotes([code]);
|
|
65
|
+
if (quotes.size === 0) {
|
|
66
|
+
return `未找到股票 ${code} 的数据,请检查代码是否正确`;
|
|
67
|
+
}
|
|
68
|
+
const quote = quotes.values().next().value;
|
|
69
|
+
// 计算更多指标
|
|
70
|
+
const amplitude = quote.preClose > 0
|
|
71
|
+
? ((quote.high - quote.low) / quote.preClose * 100).toFixed(2)
|
|
72
|
+
: '0.00';
|
|
73
|
+
const turnoverRate = quote.amount > 0 && quote.preClose > 0
|
|
74
|
+
? (quote.volume * quote.price / (quote.amount * 100) * 100).toFixed(2)
|
|
75
|
+
: 'N/A';
|
|
76
|
+
return JSON.stringify({
|
|
77
|
+
code: quote.code,
|
|
78
|
+
name: quote.name,
|
|
79
|
+
market: quote.market.toUpperCase(),
|
|
80
|
+
price: quote.price,
|
|
81
|
+
change: quote.change,
|
|
82
|
+
changePercent: quote.changePercent,
|
|
83
|
+
open: quote.open,
|
|
84
|
+
high: quote.high,
|
|
85
|
+
low: quote.low,
|
|
86
|
+
preClose: quote.preClose,
|
|
87
|
+
volume: quote.volume,
|
|
88
|
+
amount: quote.amount,
|
|
89
|
+
amplitude: `${amplitude}%`,
|
|
90
|
+
time: quote.time
|
|
91
|
+
}, null, 2);
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
return `获取股票详情失败: ${getErrorMessage(error)}`;
|
|
95
|
+
}
|
|
96
|
+
}, {
|
|
97
|
+
name: 'sina_stock_detail',
|
|
98
|
+
description: `获取单只股票的详细行情数据,返回JSON格式。
|
|
99
|
+
包含: 代码、名称、市场、价格、涨跌、成交量、成交额、振幅等。`,
|
|
100
|
+
schema: z.object({
|
|
101
|
+
code: z.string().describe('股票代码,如: 600519, 000001, 00700')
|
|
102
|
+
})
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=stock-quotes.tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stock-quotes.tool.js","sourceRoot":"","sources":["../../../src/lib/tools/stock-quotes.tool.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,gBAAgB,EAAqB,MAAM,mBAAmB,CAAA;AAEvE;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CACT,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAEjF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,YAAY,CAAA;YACrB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAE5C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,sBAAsB,CAAA;YAC/B,CAAC;YAED,QAAQ;YACR,MAAM,OAAO,GAAa,EAAE,CAAA;YAC5B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC/C,OAAO,CAAC,IAAI,CACV,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,MAAM;oBAClC,UAAU,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACtC,UAAU,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACpD,UAAU,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;oBAC1D,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACpC,SAAS,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACpC,SAAS,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACnC,SAAS,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;oBACxC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBAClD,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;oBACtD,WAAW,KAAK,CAAC,IAAI,EAAE,CACxB,CAAA;YACH,CAAC,CAAC,CAAA;YAEF,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,eAAe,CAAC,KAAK,CAAC,EAAE,CAAA;QAC9C,CAAC;IACH,CAAC,EACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE;;;+CAG4B;QACzC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;SAClE,CAAC;KACH,CACF,CAAA;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,IAAI,CACT,KAAK,EAAE,KAAK,EAAE,EAAE;QACd,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAC9B,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,YAAY,CAAA;YACrB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;YAE7C,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,SAAS,IAAI,gBAAgB,CAAA;YACtC,CAAC;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAA;YAE1C,SAAS;YACT,MAAM,SAAS,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC;gBAClC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC9D,CAAC,CAAC,MAAM,CAAA;YAEV,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC;gBACzD,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;gBACtE,CAAC,CAAC,KAAK,CAAA;YAET,OAAO,IAAI,CAAC,SAAS,CAAC;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE;gBAClC,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,aAAa,EAAE,KAAK,CAAC,aAAa;gBAClC,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,GAAG,EAAE,KAAK,CAAC,GAAG;gBACd,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,SAAS,EAAE,GAAG,SAAS,GAAG;gBAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACb,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,aAAa,eAAe,CAAC,KAAK,CAAC,EAAE,CAAA;QAC9C,CAAC;IACH,CAAC,EACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE;gCACa;QAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,+BAA+B,CAAC;SAC3D,CAAC;KACH,CACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集
|
|
3
|
+
*/
|
|
4
|
+
import { StructuredToolInterface, ToolSchemaBase } from '@langchain/core/tools';
|
|
5
|
+
import { BuiltinToolset } from '@xpert-ai/plugin-sdk';
|
|
6
|
+
export declare class SinaStockToolset extends BuiltinToolset<StructuredToolInterface, Record<string, never>> {
|
|
7
|
+
_validateCredentials(credentials: Record<string, never>): Promise<void>;
|
|
8
|
+
initTools(): Promise<StructuredToolInterface<ToolSchemaBase, any, any>[]>;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=toolset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolset.d.ts","sourceRoot":"","sources":["../../src/lib/toolset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAGrD,qBAAa,gBAAiB,SAAQ,cAAc,CAAC,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACnF,oBAAoB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,SAAS,IAAI,OAAO,CAAC,uBAAuB,CAAC,cAAc,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;CAOzF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集
|
|
3
|
+
*/
|
|
4
|
+
import { BuiltinToolset } from '@xpert-ai/plugin-sdk';
|
|
5
|
+
import { buildStockQuotesTool, buildStockDetailTool } from './tools/stock-quotes.tool.js';
|
|
6
|
+
export class SinaStockToolset extends BuiltinToolset {
|
|
7
|
+
async _validateCredentials(credentials) {
|
|
8
|
+
// 新浪财经API无需凭证,免费使用
|
|
9
|
+
}
|
|
10
|
+
async initTools() {
|
|
11
|
+
this.tools = [
|
|
12
|
+
buildStockQuotesTool(),
|
|
13
|
+
buildStockDetailTool(),
|
|
14
|
+
];
|
|
15
|
+
return this.tools;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=toolset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toolset.js","sourceRoot":"","sources":["../../src/lib/toolset.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAEzF,MAAM,OAAO,gBAAiB,SAAQ,cAA8D;IACzF,KAAK,CAAC,oBAAoB,CAAC,WAAkC;QACpE,mBAAmB;IACrB,CAAC;IAEQ,KAAK,CAAC,SAAS;QACtB,IAAI,CAAC,KAAK,GAAG;YACX,oBAAoB,EAAE;YACtB,oBAAoB,EAAE;SACvB,CAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;CACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集类型定义
|
|
3
|
+
*/
|
|
4
|
+
export declare const SinaStock = "sina-stock";
|
|
5
|
+
export declare enum StockMarket {
|
|
6
|
+
SH = "sh",// 上海证券交易所
|
|
7
|
+
SZ = "sz",// 深圳证券交易所
|
|
8
|
+
HK = "hk"
|
|
9
|
+
}
|
|
10
|
+
export interface StockQuote {
|
|
11
|
+
code: string;
|
|
12
|
+
name: string;
|
|
13
|
+
price: number;
|
|
14
|
+
open: number;
|
|
15
|
+
high: number;
|
|
16
|
+
low: number;
|
|
17
|
+
preClose: number;
|
|
18
|
+
volume: number;
|
|
19
|
+
amount: number;
|
|
20
|
+
change: number;
|
|
21
|
+
changePercent: number;
|
|
22
|
+
time: string;
|
|
23
|
+
market: StockMarket;
|
|
24
|
+
}
|
|
25
|
+
export interface SinaRawQuote {
|
|
26
|
+
code: string;
|
|
27
|
+
data: string[];
|
|
28
|
+
}
|
|
29
|
+
export declare const icon = "data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNGE5MGUyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgPHBvbHlsaW5lIHBvaW50cz0iMjIgMTIgMTggMTIgMTUgMjEgOSAzIDEyIDkgNiA5Ij48L3BvbHlsaW5lPgogIDxsaW5lIHgxPSIyIiB5MT0iMTIiIHgyPSIyMiIgeTI9IjEyIj48L2xpbmU+Cjwvc3ZnPg==";
|
|
30
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,eAAO,MAAM,SAAS,eAAe,CAAA;AAGrC,oBAAY,WAAW;IACrB,EAAE,OAAO,CAAE,UAAU;IACrB,EAAE,OAAO,CAAE,UAAU;IACrB,EAAE,OAAO;CACV;AAGD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,WAAW,CAAA;CACpB;AAGD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,EAAE,CAAA;CACf;AAGD,eAAO,MAAM,IAAI,2YAA2Y,CAAA"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 新浪财经股票工具集类型定义
|
|
3
|
+
*/
|
|
4
|
+
// 插件名称常量
|
|
5
|
+
export const SinaStock = 'sina-stock';
|
|
6
|
+
// 股票市场类型
|
|
7
|
+
export var StockMarket;
|
|
8
|
+
(function (StockMarket) {
|
|
9
|
+
StockMarket["SH"] = "sh";
|
|
10
|
+
StockMarket["SZ"] = "sz";
|
|
11
|
+
StockMarket["HK"] = "hk";
|
|
12
|
+
})(StockMarket || (StockMarket = {}));
|
|
13
|
+
// 插件图标(股票图标)
|
|
14
|
+
export const icon = `data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjNGE5MGUyIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+CiAgPHBvbHlsaW5lIHBvaW50cz0iMjIgMTIgMTggMTIgMTUgMjEgOSAzIDEyIDkgNiA5Ij48L3BvbHlsaW5lPgogIDxsaW5lIHgxPSIyIiB5MT0iMTIiIHgyPSIyMiIgeTI9IjEyIj48L2xpbmU+Cjwvc3ZnPg==`;
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,SAAS;AACT,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAA;AAErC,SAAS;AACT,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,wBAAS,CAAA;IACT,wBAAS,CAAA;IACT,wBAAS,CAAA;AACX,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAyBD,aAAa;AACb,MAAM,CAAC,MAAM,IAAI,GAAG,wYAAwY,CAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@helloxiaohu/plugin-sina-stock",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/xpert-ai/xpert-plugins"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"module": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"exports": {
|
|
13
|
+
"./package.json": "./package.json",
|
|
14
|
+
".": {
|
|
15
|
+
"@xpert-plugins-starter/source": "./src/index.ts",
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist",
|
|
23
|
+
"!**/*.tsbuildinfo"
|
|
24
|
+
],
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"iconv-lite": "^0.7.0",
|
|
27
|
+
"tslib": "^2.3.0"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"@xpert-ai/plugin-sdk": "^3.6.2",
|
|
31
|
+
"zod": "3.25.67",
|
|
32
|
+
"chalk": "4.1.2",
|
|
33
|
+
"@nestjs/config": "^4.0.2",
|
|
34
|
+
"@nestjs/common": "^11.1.6",
|
|
35
|
+
"@langchain/core": "0.3.72"
|
|
36
|
+
}
|
|
37
|
+
}
|