@zhin.js/plugin-qrcode 3.0.0 → 3.0.2
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/agent/skills/qrcode.md +38 -0
- package/agent/tools/qrcode_generate.ts +14 -0
- package/lib/agent/tools/qrcode_generate.js +14 -0
- package/lib/agent/tools/qrcode_generate.js.map +1 -0
- package/lib/{index.js → src/index.js} +4 -17
- package/lib/src/index.js.map +1 -0
- package/lib/src/qrcode-lib.js +9 -0
- package/lib/src/qrcode-lib.js.map +1 -0
- package/package.json +19 -6
- package/src/index.ts +20 -36
- package/src/qrcode-lib.ts +10 -0
- package/lib/index.d.ts +0 -2
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js.map +0 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: qrcode
|
|
3
|
+
description: >-
|
|
4
|
+
二维码生成能力。当用户想把文本或 URL 转成二维码图片时使用。
|
|
5
|
+
用户说「生成个二维码」「帮我做个二维码」或给了一个链接想生成二维码时应触发。
|
|
6
|
+
keywords:
|
|
7
|
+
- qrcode
|
|
8
|
+
- 二维码
|
|
9
|
+
- QR
|
|
10
|
+
- 扫码
|
|
11
|
+
- 生成
|
|
12
|
+
tags:
|
|
13
|
+
- qrcode
|
|
14
|
+
- utility
|
|
15
|
+
tools:
|
|
16
|
+
- qrcode_generate
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
# 二维码生成技能
|
|
20
|
+
|
|
21
|
+
## 工具
|
|
22
|
+
|
|
23
|
+
| 工具 | 用途 | 参数 |
|
|
24
|
+
|------|------|------|
|
|
25
|
+
| `qrcode_generate` | 生成二维码图片 | `text`(要编码的文本或 URL) |
|
|
26
|
+
|
|
27
|
+
**Example:**
|
|
28
|
+
```
|
|
29
|
+
用户: 把这个链接做成二维码 https://example.com
|
|
30
|
+
→ qrcode_generate(text="https://example.com")
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
生成 300×300 像素的 PNG 图片,支持任意文本和 URL。
|
|
34
|
+
|
|
35
|
+
## 注意
|
|
36
|
+
|
|
37
|
+
- 二维码扫描功能通过聊天命令 `扫码 <url>` 使用,不是 AI 工具。
|
|
38
|
+
- 文本过长可能导致二维码密度过高、难以扫描。建议先 `short_url` 缩短链接再生成。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { buildQrImageUrl } from '../../src/qrcode-lib.js';
|
|
4
|
+
|
|
5
|
+
export default defineTool<{ text: string }>({
|
|
6
|
+
description: '根据文本或 URL 生成二维码图片',
|
|
7
|
+
inputSchema: z.object({ text: z.string().min(1) }),
|
|
8
|
+
keywords: ['二维码', 'QR', 'qrcode'],
|
|
9
|
+
tags: ['qrcode', 'image'],
|
|
10
|
+
async execute({ text }) {
|
|
11
|
+
const qrUrl = buildQrImageUrl(text);
|
|
12
|
+
return JSON.stringify([{ type: 'image', data: { url: qrUrl } }]);
|
|
13
|
+
},
|
|
14
|
+
});
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineTool } from '@zhin.js/agent/tools';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { buildQrImageUrl } from '../../src/qrcode-lib.js';
|
|
4
|
+
export default defineTool({
|
|
5
|
+
description: '根据文本或 URL 生成二维码图片',
|
|
6
|
+
inputSchema: z.object({ text: z.string().min(1) }),
|
|
7
|
+
keywords: ['二维码', 'QR', 'qrcode'],
|
|
8
|
+
tags: ['qrcode', 'image'],
|
|
9
|
+
async execute({ text }) {
|
|
10
|
+
const qrUrl = buildQrImageUrl(text);
|
|
11
|
+
return JSON.stringify([{ type: 'image', data: { url: qrUrl } }]);
|
|
12
|
+
},
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=qrcode_generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode_generate.js","sourceRoot":"","sources":["../../../agent/tools/qrcode_generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,eAAe,UAAU,CAAmB;IAC1C,WAAW,EAAE,mBAAmB;IAChC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC;IACjC,IAAI,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;IACzB,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE;QACpB,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IACnE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { formatCompact, MessageCommand, usePlugin
|
|
2
|
-
|
|
1
|
+
import { formatCompact, MessageCommand, usePlugin } from 'zhin.js';
|
|
2
|
+
import { qrImageSegment } from './qrcode-lib.js';
|
|
3
|
+
const { addCommand, logger } = usePlugin();
|
|
3
4
|
const QR_API_BASE = 'https://api.qrserver.com/v1';
|
|
4
|
-
// ====== 命令:二维码 <text> ======
|
|
5
5
|
addCommand(new MessageCommand('二维码 <text:text>')
|
|
6
6
|
.desc('根据文本或链接生成二维码图片')
|
|
7
7
|
.action(async (_message, result) => {
|
|
8
8
|
const text = result.params.text;
|
|
9
|
-
const qrUrl = `${QR_API_BASE}/create-qr-code/?size=300x300&data=${encodeURIComponent(text)}`;
|
|
10
9
|
logger.debug(formatCompact({ op: 'generate', len: text.length }));
|
|
11
|
-
return
|
|
10
|
+
return qrImageSegment(text);
|
|
12
11
|
}));
|
|
13
|
-
// ====== 命令:扫码 <url> ======
|
|
14
12
|
addCommand(new MessageCommand('扫码 <url:text>')
|
|
15
13
|
.desc('识别图片中的二维码内容')
|
|
16
14
|
.action(async (_message, result) => {
|
|
@@ -33,15 +31,4 @@ addCommand(new MessageCommand('扫码 <url:text>')
|
|
|
33
31
|
return '二维码识别失败,请检查图片链接是否有效';
|
|
34
32
|
}
|
|
35
33
|
}));
|
|
36
|
-
// ====== AI 工具:qrcode_generate ======
|
|
37
|
-
addTool(new ZhinTool('qrcode_generate')
|
|
38
|
-
.desc('根据文本或 URL 生成二维码图片')
|
|
39
|
-
.keyword('二维码', 'QR', 'qrcode')
|
|
40
|
-
.tag('qrcode', 'image')
|
|
41
|
-
.param('text', { type: 'string', description: '要编码到二维码中的文本或 URL' }, true)
|
|
42
|
-
.execute(async (args) => {
|
|
43
|
-
const qrUrl = `${QR_API_BASE}/create-qr-code/?size=300x300&data=${encodeURIComponent(args.text)}`;
|
|
44
|
-
return JSON.stringify([{ type: 'image', data: { url: qrUrl } }]);
|
|
45
|
-
})
|
|
46
|
-
.toTool());
|
|
47
34
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;AAE3C,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,UAAU,CACR,IAAI,cAAc,CAAC,iBAAiB,CAAC;KAClC,IAAI,CAAC,gBAAgB,CAAC;KACtB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAChC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAClE,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC,CAAC,CACL,CAAC;AAEF,UAAU,CACR,IAAI,cAAc,CAAC,eAAe,CAAC;KAChC,IAAI,CAAC,aAAa,CAAC;KACnB,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE;IACjC,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IACnC,MAAM,MAAM,GAAG,GAAG,WAAW,0BAA0B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CAAC;IACtF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAEjC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,OAAO,YAAY,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/D,CAAC;QACD,OAAO,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzG,OAAO,qBAAqB,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC,CACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const QR_API_BASE = 'https://api.qrserver.com/v1';
|
|
2
|
+
export function buildQrImageUrl(text) {
|
|
3
|
+
return `${QR_API_BASE}/create-qr-code/?size=300x300&data=${encodeURIComponent(text)}`;
|
|
4
|
+
}
|
|
5
|
+
export function qrImageSegment(text) {
|
|
6
|
+
const qrUrl = buildQrImageUrl(text);
|
|
7
|
+
return [{ type: 'image', data: { url: qrUrl } }];
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=qrcode-lib.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode-lib.js","sourceRoot":"","sources":["../../src/qrcode-lib.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,GAAG,6BAA6B,CAAC;AAElD,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,GAAG,WAAW,sCAAsC,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;AAC5D,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zhin.js/plugin-qrcode",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.2",
|
|
4
4
|
"description": "QR code generator & reader plugin for Zhin.js",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./lib/index.js",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"src",
|
|
18
18
|
"lib",
|
|
19
|
+
"agent",
|
|
19
20
|
"README.md"
|
|
20
21
|
],
|
|
21
22
|
"keywords": [
|
|
@@ -32,13 +33,16 @@
|
|
|
32
33
|
"url": "https://github.com/lc-cn"
|
|
33
34
|
},
|
|
34
35
|
"license": "MIT",
|
|
35
|
-
"dependencies": {},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"typescript": "^6.0.3",
|
|
38
|
-
"
|
|
38
|
+
"zod": "^4.4.3",
|
|
39
|
+
"zhin.js": "4.1.2",
|
|
40
|
+
"@zhin.js/agent": "1.0.3"
|
|
39
41
|
},
|
|
40
42
|
"peerDependencies": {
|
|
41
|
-
"
|
|
43
|
+
"zod": "^4.0.0",
|
|
44
|
+
"zhin.js": "4.1.2",
|
|
45
|
+
"@zhin.js/agent": "1.0.3"
|
|
42
46
|
},
|
|
43
47
|
"repository": {
|
|
44
48
|
"type": "git",
|
|
@@ -49,8 +53,17 @@
|
|
|
49
53
|
"access": "public",
|
|
50
54
|
"registry": "https://registry.npmjs.org"
|
|
51
55
|
},
|
|
56
|
+
"peerDependenciesMeta": {
|
|
57
|
+
"@zhin.js/agent": {
|
|
58
|
+
"optional": true
|
|
59
|
+
},
|
|
60
|
+
"zod": {
|
|
61
|
+
"optional": true
|
|
62
|
+
}
|
|
63
|
+
},
|
|
52
64
|
"scripts": {
|
|
53
|
-
"build": "tsc
|
|
54
|
-
"clean": "rimraf lib"
|
|
65
|
+
"build": "tsc",
|
|
66
|
+
"clean": "rimraf lib",
|
|
67
|
+
"test": "sh -c 'cd ../../.. && vitest run plugins/utils/qrcode/tests'"
|
|
55
68
|
}
|
|
56
69
|
}
|
package/src/index.ts
CHANGED
|
@@ -1,58 +1,42 @@
|
|
|
1
|
-
import { formatCompact, MessageCommand, usePlugin
|
|
1
|
+
import { formatCompact, MessageCommand, usePlugin } from 'zhin.js';
|
|
2
|
+
import { qrImageSegment } from './qrcode-lib.js';
|
|
2
3
|
|
|
3
|
-
const { addCommand,
|
|
4
|
+
const { addCommand, logger } = usePlugin();
|
|
4
5
|
|
|
5
|
-
const QR_API_BASE = 'https://api.qrserver.com/v1'
|
|
6
|
+
const QR_API_BASE = 'https://api.qrserver.com/v1';
|
|
6
7
|
|
|
7
|
-
// ====== 命令:二维码 <text> ======
|
|
8
8
|
addCommand(
|
|
9
9
|
new MessageCommand('二维码 <text:text>')
|
|
10
10
|
.desc('根据文本或链接生成二维码图片')
|
|
11
11
|
.action(async (_message, result) => {
|
|
12
|
-
const text = result.params.text
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
return [{ type: 'image' as const, data: { url: qrUrl } }]
|
|
12
|
+
const text = result.params.text;
|
|
13
|
+
logger.debug(formatCompact({ op: 'generate', len: text.length }));
|
|
14
|
+
return qrImageSegment(text);
|
|
16
15
|
}),
|
|
17
|
-
)
|
|
16
|
+
);
|
|
18
17
|
|
|
19
|
-
// ====== 命令:扫码 <url> ======
|
|
20
18
|
addCommand(
|
|
21
19
|
new MessageCommand('扫码 <url:text>')
|
|
22
20
|
.desc('识别图片中的二维码内容')
|
|
23
21
|
.action(async (_message, result) => {
|
|
24
|
-
const imageUrl = result.params.url
|
|
25
|
-
const apiUrl = `${QR_API_BASE}/read-qr-code/?fileurl=${encodeURIComponent(imageUrl)}
|
|
22
|
+
const imageUrl = result.params.url;
|
|
23
|
+
const apiUrl = `${QR_API_BASE}/read-qr-code/?fileurl=${encodeURIComponent(imageUrl)}`;
|
|
26
24
|
try {
|
|
27
|
-
const response = await fetch(apiUrl)
|
|
25
|
+
const response = await fetch(apiUrl);
|
|
28
26
|
if (!response.ok) {
|
|
29
|
-
return '二维码识别服务请求失败'
|
|
27
|
+
return '二维码识别服务请求失败';
|
|
30
28
|
}
|
|
31
29
|
const data = (await response.json()) as Array<{
|
|
32
|
-
symbol: Array<{ data: string | null; error: string | null }
|
|
33
|
-
}
|
|
34
|
-
const symbol = data?.[0]?.symbol?.[0]
|
|
30
|
+
symbol: Array<{ data: string | null; error: string | null }>;
|
|
31
|
+
}>;
|
|
32
|
+
const symbol = data?.[0]?.symbol?.[0];
|
|
35
33
|
if (!symbol || symbol.error || !symbol.data) {
|
|
36
|
-
return `未能识别二维码内容${symbol?.error ? `:${symbol.error}` : ''}
|
|
34
|
+
return `未能识别二维码内容${symbol?.error ? `:${symbol.error}` : ''}`;
|
|
37
35
|
}
|
|
38
|
-
return `识别结果:${symbol.data}
|
|
36
|
+
return `识别结果:${symbol.data}`;
|
|
39
37
|
} catch (e) {
|
|
40
|
-
logger.warn(formatCompact(
|
|
41
|
-
return '二维码识别失败,请检查图片链接是否有效'
|
|
38
|
+
logger.warn(formatCompact({ op: 'scan', ok: false, error: e instanceof Error ? e.message : String(e) }));
|
|
39
|
+
return '二维码识别失败,请检查图片链接是否有效';
|
|
42
40
|
}
|
|
43
41
|
}),
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
// ====== AI 工具:qrcode_generate ======
|
|
47
|
-
addTool(
|
|
48
|
-
new ZhinTool('qrcode_generate')
|
|
49
|
-
.desc('根据文本或 URL 生成二维码图片')
|
|
50
|
-
.keyword('二维码', 'QR', 'qrcode')
|
|
51
|
-
.tag('qrcode', 'image')
|
|
52
|
-
.param('text', { type: 'string', description: '要编码到二维码中的文本或 URL' }, true)
|
|
53
|
-
.execute(async (args) => {
|
|
54
|
-
const qrUrl = `${QR_API_BASE}/create-qr-code/?size=300x300&data=${encodeURIComponent(args.text)}`
|
|
55
|
-
return JSON.stringify([{ type: 'image', data: { url: qrUrl } }])
|
|
56
|
-
})
|
|
57
|
-
.toTool(),
|
|
58
|
-
)
|
|
42
|
+
);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
const QR_API_BASE = 'https://api.qrserver.com/v1';
|
|
2
|
+
|
|
3
|
+
export function buildQrImageUrl(text: string): string {
|
|
4
|
+
return `${QR_API_BASE}/create-qr-code/?size=300x300&data=${encodeURIComponent(text)}`;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function qrImageSegment(text: string) {
|
|
8
|
+
const qrUrl = buildQrImageUrl(text);
|
|
9
|
+
return [{ type: 'image' as const, data: { url: qrUrl } }];
|
|
10
|
+
}
|
package/lib/index.d.ts
DELETED
package/lib/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/lib/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|