volcengine-api-mcp 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/README.md +93 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +44 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/ark.d.ts +28 -0
- package/dist/lib/ark.js +105 -0
- package/dist/lib/ark.js.map +1 -0
- package/dist/lib/auc.d.ts +67 -0
- package/dist/lib/auc.js +160 -0
- package/dist/lib/auc.js.map +1 -0
- package/dist/lib/client.d.ts +18 -0
- package/dist/lib/client.js +117 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/index.d.ts +8 -0
- package/dist/lib/index.js +9 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/search.d.ts +41 -0
- package/dist/lib/search.js +160 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/signer.d.ts +17 -0
- package/dist/lib/signer.js +58 -0
- package/dist/lib/signer.js.map +1 -0
- package/dist/lib/tos.d.ts +29 -0
- package/dist/lib/tos.js +93 -0
- package/dist/lib/tos.js.map +1 -0
- package/dist/lib/tts.d.ts +59 -0
- package/dist/lib/tts.js +126 -0
- package/dist/lib/tts.js.map +1 -0
- package/dist/lib/types.d.ts +34 -0
- package/dist/lib/types.js +15 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/tools/auc.d.ts +34 -0
- package/dist/tools/auc.js +76 -0
- package/dist/tools/auc.js.map +1 -0
- package/dist/tools/image.d.ts +37 -0
- package/dist/tools/image.js +58 -0
- package/dist/tools/image.js.map +1 -0
- package/dist/tools/search.d.ts +38 -0
- package/dist/tools/search.js +56 -0
- package/dist/tools/search.js.map +1 -0
- package/dist/tools/tos.d.ts +30 -0
- package/dist/tools/tos.js +38 -0
- package/dist/tools/tos.js.map +1 -0
- package/dist/tools/tts.d.ts +43 -0
- package/dist/tools/tts.js +80 -0
- package/dist/tools/tts.js.map +1 -0
- package/package.json +48 -3
package/dist/lib/tts.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 豆包语音合成大模型 - 单向流式 HTTP 接口(HTTP Chunked)。
|
|
3
|
+
* 文档: https://www.volcengine.com/docs/6561/1327536 (单向流式语音合成 HTTP)
|
|
4
|
+
* - Agent Plan 网关: POST https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional(ark- 密钥)
|
|
5
|
+
* - 语音控制台: POST https://openspeech.bytedance.com/api/v3/tts/unidirectional(X-Api-Key)
|
|
6
|
+
* 响应为流式 JSON 分片,每片 {code, message, data: base64音频, sentence?, usage?},拼接 data 直到流结束。
|
|
7
|
+
*/
|
|
8
|
+
const PLAN_TTS_URL = 'https://openspeech.bytedance.com/api/v3/plan/tts/unidirectional';
|
|
9
|
+
/** 语音控制台密钥使用的官方端点(Agent Plan 之外的接入方式,暂未暴露为工具参数) */
|
|
10
|
+
export const CONSOLE_TTS_URL = 'https://openspeech.bytedance.com/api/v3/tts/unidirectional';
|
|
11
|
+
export const TTS_DEFAULT_SPEAKER = 'zh_female_vv_uranus_bigtts'; // 豆包 2.0 通用女声
|
|
12
|
+
export const TTS_DEFAULT_RESOURCE_ID = 'seed-tts-2.0';
|
|
13
|
+
export const TTS_DEFAULT_SAMPLE_RATE = 24_000;
|
|
14
|
+
/** 从流式 buffer 中提取顶层 JSON 对象(兼容换行分隔与直接拼接两种分片方式) */
|
|
15
|
+
export function extractJsonObjects(buffer) {
|
|
16
|
+
const objects = [];
|
|
17
|
+
let depth = 0;
|
|
18
|
+
let start = -1;
|
|
19
|
+
let inString = false;
|
|
20
|
+
let escaped = false;
|
|
21
|
+
for (let i = 0; i < buffer.length; i++) {
|
|
22
|
+
const ch = buffer[i];
|
|
23
|
+
if (inString) {
|
|
24
|
+
if (escaped)
|
|
25
|
+
escaped = false;
|
|
26
|
+
else if (ch === '\\')
|
|
27
|
+
escaped = true;
|
|
28
|
+
else if (ch === '"')
|
|
29
|
+
inString = false;
|
|
30
|
+
continue;
|
|
31
|
+
}
|
|
32
|
+
if (ch === '"')
|
|
33
|
+
inString = true;
|
|
34
|
+
else if (ch === '{') {
|
|
35
|
+
if (depth === 0)
|
|
36
|
+
start = i;
|
|
37
|
+
depth++;
|
|
38
|
+
}
|
|
39
|
+
else if (ch === '}') {
|
|
40
|
+
depth--;
|
|
41
|
+
if (depth === 0 && start >= 0) {
|
|
42
|
+
objects.push(JSON.parse(buffer.slice(start, i + 1)));
|
|
43
|
+
start = -1;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// 字符串未闭合/对象未闭合的部分留给下一次
|
|
48
|
+
const rest = depth > 0 || inString ? buffer.slice(Math.max(start, 0)) : buffer.slice(buffer.length);
|
|
49
|
+
return { objects, rest };
|
|
50
|
+
}
|
|
51
|
+
/** 提交单向流式合成并收集完整音频。 */
|
|
52
|
+
export async function unidirectionalTts(opts) {
|
|
53
|
+
if (!opts.apiKey?.trim()) {
|
|
54
|
+
throw new Error('缺少 API Key,请配置环境变量 ARK_API_KEY');
|
|
55
|
+
}
|
|
56
|
+
if (!opts.text?.trim()) {
|
|
57
|
+
throw new Error('缺少待合成文本 text');
|
|
58
|
+
}
|
|
59
|
+
const format = opts.format ?? 'mp3';
|
|
60
|
+
const sampleRate = opts.sampleRate ?? TTS_DEFAULT_SAMPLE_RATE;
|
|
61
|
+
const endpoint = opts.endpoint ?? PLAN_TTS_URL;
|
|
62
|
+
const reqParams = {
|
|
63
|
+
text: opts.text,
|
|
64
|
+
speaker: opts.speaker ?? TTS_DEFAULT_SPEAKER,
|
|
65
|
+
audio_params: {
|
|
66
|
+
format,
|
|
67
|
+
sample_rate: sampleRate,
|
|
68
|
+
...(opts.speechRate !== undefined ? { speech_rate: opts.speechRate } : {}),
|
|
69
|
+
...(opts.loudnessRate !== undefined ? { loudness_rate: opts.loudnessRate } : {}),
|
|
70
|
+
},
|
|
71
|
+
...(opts.model !== undefined ? { model: opts.model } : {}),
|
|
72
|
+
...(opts.enableSubtitle !== undefined ? { enable_subtitle: opts.enableSubtitle } : {}),
|
|
73
|
+
...(opts.explicitLanguage !== undefined ? { explicit_language: opts.explicitLanguage } : {}),
|
|
74
|
+
};
|
|
75
|
+
const res = await fetch(endpoint, {
|
|
76
|
+
method: 'POST',
|
|
77
|
+
headers: {
|
|
78
|
+
'Content-Type': 'application/json',
|
|
79
|
+
Connection: 'keep-alive',
|
|
80
|
+
'X-Api-Key': opts.apiKey.trim(),
|
|
81
|
+
'X-Api-Resource-Id': opts.resourceId ?? TTS_DEFAULT_RESOURCE_ID,
|
|
82
|
+
'X-Api-Request-Id': crypto.randomUUID(),
|
|
83
|
+
},
|
|
84
|
+
body: JSON.stringify({ req_params: reqParams }),
|
|
85
|
+
signal: AbortSignal.timeout(opts.timeoutMs ?? 300_000),
|
|
86
|
+
});
|
|
87
|
+
if (!res.ok || !res.body) {
|
|
88
|
+
const text = await res.text().catch(() => '');
|
|
89
|
+
throw new Error(`TTS 接口返回 ${res.status}:${text.slice(0, 300) || res.statusText}`);
|
|
90
|
+
}
|
|
91
|
+
const chunks = [];
|
|
92
|
+
let total = 0;
|
|
93
|
+
let sentence;
|
|
94
|
+
let usage;
|
|
95
|
+
let pending = '';
|
|
96
|
+
const decoder = new TextDecoder();
|
|
97
|
+
for await (const chunk of res.body) {
|
|
98
|
+
pending += decoder.decode(chunk, { stream: true });
|
|
99
|
+
const { objects, rest } = extractJsonObjects(pending);
|
|
100
|
+
pending = rest;
|
|
101
|
+
for (const obj of objects) {
|
|
102
|
+
const msg = obj;
|
|
103
|
+
// 成功码:0 或 20000000(openspeech 通用成功状态,与语音识别一致;实测 plan 网关返回后者)
|
|
104
|
+
if (typeof msg.code === 'number' && msg.code !== 0 && msg.code !== 20_000_000) {
|
|
105
|
+
throw new Error(`TTS 合成失败:code=${msg.code},message=${msg.message ?? '无'}`);
|
|
106
|
+
}
|
|
107
|
+
if (msg.sentence?.text)
|
|
108
|
+
sentence = msg.sentence;
|
|
109
|
+
if (msg.usage)
|
|
110
|
+
usage = msg.usage;
|
|
111
|
+
if (msg.data) {
|
|
112
|
+
const audio = Buffer.from(msg.data, 'base64');
|
|
113
|
+
chunks.push(audio);
|
|
114
|
+
total += audio.length;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (pending.trim()) {
|
|
119
|
+
throw new Error(`TTS 响应存在未完成的 JSON 分片,疑似响应中断:${pending.slice(0, 120)}`);
|
|
120
|
+
}
|
|
121
|
+
if (total === 0) {
|
|
122
|
+
throw new Error('TTS 响应中没有音频数据');
|
|
123
|
+
}
|
|
124
|
+
return { audio: Buffer.concat(chunks, total), format, sampleRate, sentence, usage };
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=tts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tts.js","sourceRoot":"","sources":["../../src/lib/tts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface VolcengineCredentials {
|
|
2
|
+
accessKeyId: string;
|
|
3
|
+
secretAccessKey: string;
|
|
4
|
+
}
|
|
5
|
+
export interface VolcengineApiRequest {
|
|
6
|
+
/** 请求方法,默认 GET */
|
|
7
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
8
|
+
/** API Action,如 DescribeInstances */
|
|
9
|
+
action: string;
|
|
10
|
+
/** API Version,如 2020-04-01 */
|
|
11
|
+
version: string;
|
|
12
|
+
/** 服务名(签名用),如 ecs / vpc / iam / vod */
|
|
13
|
+
service: string;
|
|
14
|
+
/** 服务 Host,如 ecs.cn-north-1.volcengineapi.com;缺省时由客户端按 service/region 推导 */
|
|
15
|
+
host?: string;
|
|
16
|
+
/** 区域,默认 cn-north-1 */
|
|
17
|
+
region?: string;
|
|
18
|
+
/** 业务参数;GET 时拼接为 query,POST 时作为 JSON body */
|
|
19
|
+
params?: Record<string, unknown>;
|
|
20
|
+
/** 额外 HTTP header(不要带签名相关 header) */
|
|
21
|
+
headers?: Record<string, string>;
|
|
22
|
+
}
|
|
23
|
+
export interface VolcengineApiResponse<T = unknown> {
|
|
24
|
+
status: number;
|
|
25
|
+
headers: Record<string, string>;
|
|
26
|
+
body: T;
|
|
27
|
+
}
|
|
28
|
+
export declare class VolcengineApiError extends Error {
|
|
29
|
+
readonly status: number;
|
|
30
|
+
readonly code: string | undefined;
|
|
31
|
+
readonly requestId: string | undefined;
|
|
32
|
+
readonly body?: unknown | undefined;
|
|
33
|
+
constructor(message: string, status: number, code: string | undefined, requestId: string | undefined, body?: unknown | undefined);
|
|
34
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class VolcengineApiError extends Error {
|
|
2
|
+
status;
|
|
3
|
+
code;
|
|
4
|
+
requestId;
|
|
5
|
+
body;
|
|
6
|
+
constructor(message, status, code, requestId, body) {
|
|
7
|
+
super(message);
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.requestId = requestId;
|
|
11
|
+
this.body = body;
|
|
12
|
+
this.name = 'VolcengineApiError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AA8BA,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGzB;IACA;IACA;IACA;IALlB,YACE,OAAe,EACC,MAAc,EACd,IAAwB,EACxB,SAA6B,EAC7B,IAAc;QAE9B,KAAK,CAAC,OAAO,CAAC,CAAC;QALC,WAAM,GAAN,MAAM,CAAQ;QACd,SAAI,GAAJ,IAAI,CAAoB;QACxB,cAAS,GAAT,SAAS,CAAoB;QAC7B,SAAI,GAAJ,IAAI,CAAU;QAG9B,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const asrTranscribeTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
url: z.ZodOptional<z.ZodString>;
|
|
7
|
+
file_path: z.ZodOptional<z.ZodString>;
|
|
8
|
+
format: z.ZodOptional<z.ZodString>;
|
|
9
|
+
language: z.ZodOptional<z.ZodString>;
|
|
10
|
+
model: z.ZodOptional<z.ZodEnum<["2.0", "1.0"]>>;
|
|
11
|
+
enable_speaker_info: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
enable_punc: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
enable_itn: z.ZodOptional<z.ZodBoolean>;
|
|
14
|
+
ssd_version: z.ZodOptional<z.ZodEnum<["200", "300"]>>;
|
|
15
|
+
timeout_seconds: z.ZodOptional<z.ZodNumber>;
|
|
16
|
+
};
|
|
17
|
+
handler: (args: {
|
|
18
|
+
url?: string;
|
|
19
|
+
file_path?: string;
|
|
20
|
+
format?: string;
|
|
21
|
+
language?: string;
|
|
22
|
+
model?: "2.0" | "1.0";
|
|
23
|
+
enable_speaker_info?: boolean;
|
|
24
|
+
enable_punc?: boolean;
|
|
25
|
+
enable_itn?: boolean;
|
|
26
|
+
ssd_version?: "200" | "300";
|
|
27
|
+
timeout_seconds?: number;
|
|
28
|
+
}) => Promise<{
|
|
29
|
+
content: {
|
|
30
|
+
type: "text";
|
|
31
|
+
text: string;
|
|
32
|
+
}[];
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { buildObjectKey, detectFormat, renderTranscriptMd, resolveTosOptions, transcribeAudio, uploadToTos, } from '../lib/index.js';
|
|
3
|
+
export const asrTranscribeTool = {
|
|
4
|
+
name: 'auc_bigmodel_transcribe',
|
|
5
|
+
description: '火山引擎语音技术-大模型录音文件识别(端点 openspeech.bytedance.com/api/v3/auc/bigmodel/submit + query)。' +
|
|
6
|
+
'提交音频并轮询直到完成,返回全文、分句时间戳与说话人。音频源二选一:url(公网可访问)或 file_path(本地文件,自动上传 TOS 换取预签名地址,需 VOLC_TOS_* 配置)。需要环境变量 VOLC_ASR_API_KEY。',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
url: z.string().optional().describe('音频公网 URL(与 file_path 二选一)'),
|
|
9
|
+
file_path: z.string().optional().describe('本地音频文件路径(与 url 二选一;自动上传 TOS 生成预签名 URL)'),
|
|
10
|
+
format: z
|
|
11
|
+
.string()
|
|
12
|
+
.optional()
|
|
13
|
+
.describe('音频格式(wav/mp3/ogg/spx/amr/aac/m4a);不传时从 url/file_path 扩展名推断'),
|
|
14
|
+
language: z.string().optional().describe('语言,如 zh / en;不传自动检测'),
|
|
15
|
+
model: z.enum(['2.0', '1.0']).optional().describe('模型版本,默认 2.0(1.0 为旧版)'),
|
|
16
|
+
enable_speaker_info: z.boolean().optional().describe('是否区分说话人(说话人分离)'),
|
|
17
|
+
enable_punc: z.boolean().optional().describe('是否加标点'),
|
|
18
|
+
enable_itn: z.boolean().optional().describe('是否做数字规整(ITN)'),
|
|
19
|
+
ssd_version: z.enum(['200', '300']).optional().describe('说话人分离模型:200 非会议(≤5人) / 300 长会议声纹'),
|
|
20
|
+
timeout_seconds: z.number().int().positive().optional().describe('轮询超时(秒),默认 600'),
|
|
21
|
+
},
|
|
22
|
+
handler: async (args) => {
|
|
23
|
+
if (!args.url && !args.file_path) {
|
|
24
|
+
throw new Error('url 与 file_path 至少提供一个');
|
|
25
|
+
}
|
|
26
|
+
let audioUrl = args.url;
|
|
27
|
+
let source = audioUrl ?? args.file_path;
|
|
28
|
+
if (args.file_path) {
|
|
29
|
+
const tos = resolveTosOptions({ prefix: 'asr' });
|
|
30
|
+
const key = buildObjectKey(tos.prefix, new Date().toISOString().slice(0, 10), args.file_path);
|
|
31
|
+
const uploaded = await uploadToTos(tos, args.file_path, key);
|
|
32
|
+
audioUrl = uploaded.url;
|
|
33
|
+
source = args.file_path;
|
|
34
|
+
}
|
|
35
|
+
const format = args.format ?? detectFormat(source);
|
|
36
|
+
if (!format) {
|
|
37
|
+
throw new Error('无法从扩展名推断音频格式,请显式传 format(wav/mp3/ogg/spx/amr/aac/m4a)');
|
|
38
|
+
}
|
|
39
|
+
const apiKey = process.env.VOLC_ASR_API_KEY;
|
|
40
|
+
if (!apiKey?.trim()) {
|
|
41
|
+
throw new Error('缺少环境变量 VOLC_ASR_API_KEY(火山语音控制台的 X-Api-Key)');
|
|
42
|
+
}
|
|
43
|
+
const result = await transcribeAudio({
|
|
44
|
+
apiKey: apiKey.trim(),
|
|
45
|
+
url: audioUrl,
|
|
46
|
+
format,
|
|
47
|
+
language: args.language,
|
|
48
|
+
model: args.model,
|
|
49
|
+
enableSpeakerInfo: args.enable_speaker_info,
|
|
50
|
+
enablePunc: args.enable_punc,
|
|
51
|
+
enableItn: args.enable_itn,
|
|
52
|
+
ssdVersion: args.ssd_version,
|
|
53
|
+
timeoutMs: args.timeout_seconds ? args.timeout_seconds * 1000 : undefined,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
content: [
|
|
57
|
+
{
|
|
58
|
+
type: 'text',
|
|
59
|
+
text: JSON.stringify({
|
|
60
|
+
ok: true,
|
|
61
|
+
task_id: result.taskId,
|
|
62
|
+
audio_url: audioUrl,
|
|
63
|
+
format,
|
|
64
|
+
text: result.text,
|
|
65
|
+
utterances_count: result.utterances.length,
|
|
66
|
+
}, null, 2),
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
type: 'text',
|
|
70
|
+
text: renderTranscriptMd(result.utterances),
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
};
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=auc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auc.js","sourceRoot":"","sources":["../../src/tools/auc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/** 方舟密钥必须显式配置 ARK_API_KEY;ANTHROPIC_* 等环境变量不一定是火山的,不做回退 */
|
|
3
|
+
export declare function resolveArkApiKey(): string;
|
|
4
|
+
export declare const generateImageTool: {
|
|
5
|
+
name: string;
|
|
6
|
+
description: string;
|
|
7
|
+
inputSchema: {
|
|
8
|
+
prompt: z.ZodString;
|
|
9
|
+
output_path: z.ZodString;
|
|
10
|
+
model: z.ZodOptional<z.ZodString>;
|
|
11
|
+
size: z.ZodOptional<z.ZodString>;
|
|
12
|
+
watermark: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
seed: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
format: z.ZodOptional<z.ZodEnum<["png", "jpeg"]>>;
|
|
15
|
+
};
|
|
16
|
+
handler: (args: {
|
|
17
|
+
prompt: string;
|
|
18
|
+
output_path: string;
|
|
19
|
+
model?: string;
|
|
20
|
+
size?: string;
|
|
21
|
+
watermark?: boolean;
|
|
22
|
+
seed?: number;
|
|
23
|
+
format?: "png" | "jpeg";
|
|
24
|
+
}) => Promise<{
|
|
25
|
+
content: ({
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
data?: undefined;
|
|
29
|
+
mimeType?: undefined;
|
|
30
|
+
} | {
|
|
31
|
+
type: "image";
|
|
32
|
+
data: string;
|
|
33
|
+
mimeType: string;
|
|
34
|
+
text?: undefined;
|
|
35
|
+
})[];
|
|
36
|
+
}>;
|
|
37
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { ARK_DEFAULT_IMAGE_MODEL, ARK_DEFAULT_SIZE, arkDownloadImage, arkGenerateImage, } from '../lib/index.js';
|
|
3
|
+
const ARK_DEFAULT_MODEL_HINT = ARK_DEFAULT_IMAGE_MODEL;
|
|
4
|
+
/** 方舟密钥必须显式配置 ARK_API_KEY;ANTHROPIC_* 等环境变量不一定是火山的,不做回退 */
|
|
5
|
+
export function resolveArkApiKey() {
|
|
6
|
+
const key = process.env.ARK_API_KEY;
|
|
7
|
+
if (!key?.trim() || !/^ark-[A-Za-z0-9-]+$/.test(key.trim())) {
|
|
8
|
+
throw new Error('缺少有效的方舟 API Key(ark- 开头),请配置环境变量 ARK_API_KEY');
|
|
9
|
+
}
|
|
10
|
+
return key.trim();
|
|
11
|
+
}
|
|
12
|
+
/** 输出格式跟随落盘扩展名(.png→png、.jpg/.jpeg→jpeg),未识别时默认 png;可用 format 参数覆盖 */
|
|
13
|
+
function deriveFormat(outputPath, format) {
|
|
14
|
+
if (format)
|
|
15
|
+
return format;
|
|
16
|
+
const ext = (outputPath.match(/\.([a-z0-9]+)$/i)?.[1] ?? '').toLowerCase();
|
|
17
|
+
return ext === 'jpg' || ext === 'jpeg' ? 'jpeg' : 'png';
|
|
18
|
+
}
|
|
19
|
+
export const generateImageTool = {
|
|
20
|
+
name: 'plan_images_generations',
|
|
21
|
+
description: '火山方舟图片生成(端点 /api/plan/v3/images/generations,Seedream 文生图)。输入 prompt 与保存路径,生成图片并落盘,同时把图片直接返回给 Agent 查看。' +
|
|
22
|
+
`默认模型 ${ARK_DEFAULT_MODEL_HINT},默认尺寸 ${ARK_DEFAULT_SIZE}(宽x高,或 1K/2K/4K)。`,
|
|
23
|
+
inputSchema: {
|
|
24
|
+
prompt: z.string().min(1).describe('生图提示词。图上要出现的文字用「」原样写进 prompt'),
|
|
25
|
+
output_path: z.string().min(1).describe('图片保存的绝对路径(.png 或 .jpg,格式跟随扩展名)'),
|
|
26
|
+
model: z.string().optional().describe(`模型 ID,默认 ${ARK_DEFAULT_MODEL_HINT}`),
|
|
27
|
+
size: z.string().optional().describe('图片尺寸,宽x高如 2048x1152,或 1K/2K/4K,默认 1728x2304'),
|
|
28
|
+
watermark: z.boolean().optional().describe('是否加水印,默认 false'),
|
|
29
|
+
seed: z.number().int().optional().describe('随机种子,固定 seed 可复现同一张图'),
|
|
30
|
+
format: z.enum(['png', 'jpeg']).optional().describe('覆盖输出格式(默认跟随 output_path 扩展名)'),
|
|
31
|
+
},
|
|
32
|
+
handler: async (args) => {
|
|
33
|
+
const apiKey = resolveArkApiKey();
|
|
34
|
+
const outputFormat = deriveFormat(args.output_path, args.format);
|
|
35
|
+
const result = await arkGenerateImage({
|
|
36
|
+
apiKey,
|
|
37
|
+
prompt: args.prompt,
|
|
38
|
+
model: args.model,
|
|
39
|
+
size: args.size,
|
|
40
|
+
watermark: args.watermark,
|
|
41
|
+
seed: args.seed,
|
|
42
|
+
outputFormat,
|
|
43
|
+
});
|
|
44
|
+
const { path, bytes } = await arkDownloadImage(result.url, args.output_path);
|
|
45
|
+
const mimeType = result.outputFormat === 'jpeg' ? 'image/jpeg' : 'image/png';
|
|
46
|
+
const base64 = (await import('node:fs')).readFileSync(path).toString('base64');
|
|
47
|
+
return {
|
|
48
|
+
content: [
|
|
49
|
+
{
|
|
50
|
+
type: 'text',
|
|
51
|
+
text: JSON.stringify({ ok: true, model: result.model, output: path, size: result.size, format: result.outputFormat, bytes }, null, 2),
|
|
52
|
+
},
|
|
53
|
+
{ type: 'image', data: base64, mimeType },
|
|
54
|
+
],
|
|
55
|
+
};
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/tools/image.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const webSearchTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
query: z.ZodString;
|
|
7
|
+
count: z.ZodOptional<z.ZodNumber>;
|
|
8
|
+
search_type: z.ZodOptional<z.ZodEnum<["web", "image"]>>;
|
|
9
|
+
time_range: z.ZodOptional<z.ZodString>;
|
|
10
|
+
auth_level: z.ZodOptional<z.ZodUnion<[z.ZodLiteral<0>, z.ZodLiteral<1>]>>;
|
|
11
|
+
need_content: z.ZodOptional<z.ZodBoolean>;
|
|
12
|
+
need_url: z.ZodOptional<z.ZodBoolean>;
|
|
13
|
+
sites: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
14
|
+
block_hosts: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
15
|
+
industry: z.ZodOptional<z.ZodEnum<["finance", "game", "gov"]>>;
|
|
16
|
+
query_rewrite: z.ZodOptional<z.ZodBoolean>;
|
|
17
|
+
content_formats: z.ZodOptional<z.ZodEnum<["text", "markdown"]>>;
|
|
18
|
+
};
|
|
19
|
+
handler: (args: {
|
|
20
|
+
query: string;
|
|
21
|
+
count?: number;
|
|
22
|
+
search_type?: "web" | "image";
|
|
23
|
+
time_range?: string;
|
|
24
|
+
auth_level?: 0 | 1;
|
|
25
|
+
need_content?: boolean;
|
|
26
|
+
need_url?: boolean;
|
|
27
|
+
sites?: string[];
|
|
28
|
+
block_hosts?: string[];
|
|
29
|
+
industry?: "finance" | "game" | "gov";
|
|
30
|
+
query_rewrite?: boolean;
|
|
31
|
+
content_formats?: "text" | "markdown";
|
|
32
|
+
}) => Promise<{
|
|
33
|
+
content: {
|
|
34
|
+
type: "text";
|
|
35
|
+
text: string;
|
|
36
|
+
}[];
|
|
37
|
+
}>;
|
|
38
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { buildWebSearchPayload, webSearchByAkSk, webSearchByApiKey } from '../lib/index.js';
|
|
3
|
+
/** 鉴权二选一:搜索 API Key(feedcoopapi 网关)或火山 AK/SK(V4 签名 mercury 网关) */
|
|
4
|
+
function resolveSearchAuth() {
|
|
5
|
+
const apiKey = process.env.ASK_ECHO_SEARCH_INFINITY_API_KEY;
|
|
6
|
+
if (apiKey?.trim())
|
|
7
|
+
return { mode: 'api-key', apiKey: apiKey.trim() };
|
|
8
|
+
const ak = process.env.VOLCENGINE_ACCESS_KEY;
|
|
9
|
+
const sk = process.env.VOLCENGINE_SECRET_KEY;
|
|
10
|
+
if (ak?.trim() && sk?.trim())
|
|
11
|
+
return { mode: 'ak-sk', ak: ak.trim(), sk: sk.trim() };
|
|
12
|
+
throw new Error('缺少搜索鉴权配置,请设置环境变量 ASK_ECHO_SEARCH_INFINITY_API_KEY,或同时设置 VOLCENGINE_ACCESS_KEY / VOLCENGINE_SECRET_KEY');
|
|
13
|
+
}
|
|
14
|
+
export const webSearchTool = {
|
|
15
|
+
name: 'askecho_web_search',
|
|
16
|
+
description: '火山引擎联网搜索(豆包搜索,服务 volc_torchlight_api,Action WebSearch)。支持网页与图片搜索,可按时间/站点/行业过滤、返回正文。' +
|
|
17
|
+
'鉴权二选一:ASK_ECHO_SEARCH_INFINITY_API_KEY 或 VOLCENGINE_ACCESS_KEY + VOLCENGINE_SECRET_KEY。',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
query: z.string().min(1).max(100).describe('搜索 query,1~100 个字符'),
|
|
20
|
+
count: z.number().int().optional().describe('返回条数,web 默认 10(最多 50),image 默认 5(最多 5)'),
|
|
21
|
+
search_type: z.enum(['web', 'image']).optional().describe('搜索类型,默认 web'),
|
|
22
|
+
time_range: z.string().optional().describe('时间范围,OneDay/OneWeek/OneMonth/OneYear 或 YYYY-MM-DD..YYYY-MM-DD,仅 web'),
|
|
23
|
+
auth_level: z.union([z.literal(0), z.literal(1)]).optional().describe('权威等级过滤,1 = 非常权威,仅 web'),
|
|
24
|
+
need_content: z.boolean().optional().describe('是否返回网页正文,仅 web'),
|
|
25
|
+
need_url: z.boolean().optional().describe('是否返回网页 URL,仅 web'),
|
|
26
|
+
sites: z.array(z.string()).optional().describe('仅搜索指定站点,最多 20 个,仅 web'),
|
|
27
|
+
block_hosts: z.array(z.string()).optional().describe('排除指定站点,最多 5 个,仅 web'),
|
|
28
|
+
industry: z.enum(['finance', 'game', 'gov']).optional().describe('行业搜索,仅 web'),
|
|
29
|
+
query_rewrite: z.boolean().optional().describe('是否启用查询改写'),
|
|
30
|
+
content_formats: z.enum(['text', 'markdown']).optional().describe('网页正文格式,仅 web'),
|
|
31
|
+
},
|
|
32
|
+
handler: async (args) => {
|
|
33
|
+
const payload = buildWebSearchPayload({
|
|
34
|
+
query: args.query,
|
|
35
|
+
count: args.count,
|
|
36
|
+
searchType: args.search_type,
|
|
37
|
+
timeRange: args.time_range,
|
|
38
|
+
authLevel: args.auth_level,
|
|
39
|
+
needContent: args.need_content,
|
|
40
|
+
needUrl: args.need_url,
|
|
41
|
+
sites: args.sites,
|
|
42
|
+
blockHosts: args.block_hosts,
|
|
43
|
+
industry: args.industry,
|
|
44
|
+
queryRewrite: args.query_rewrite,
|
|
45
|
+
contentFormats: args.content_formats,
|
|
46
|
+
});
|
|
47
|
+
const auth = resolveSearchAuth();
|
|
48
|
+
const body = auth.mode === 'api-key'
|
|
49
|
+
? await webSearchByApiKey(auth.apiKey, payload)
|
|
50
|
+
: await webSearchByAkSk({ accessKeyId: auth.ak, secretAccessKey: auth.sk }, payload);
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: 'text', text: JSON.stringify(body, null, 2) }],
|
|
53
|
+
};
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/tools/search.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const tosPutObjectTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
file_path: z.ZodString;
|
|
7
|
+
key: z.ZodOptional<z.ZodString>;
|
|
8
|
+
prefix: z.ZodOptional<z.ZodString>;
|
|
9
|
+
expires: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
content_type: z.ZodOptional<z.ZodString>;
|
|
11
|
+
bucket: z.ZodOptional<z.ZodString>;
|
|
12
|
+
region: z.ZodOptional<z.ZodString>;
|
|
13
|
+
endpoint: z.ZodOptional<z.ZodString>;
|
|
14
|
+
};
|
|
15
|
+
handler: (args: {
|
|
16
|
+
file_path: string;
|
|
17
|
+
key?: string;
|
|
18
|
+
prefix?: string;
|
|
19
|
+
expires?: number;
|
|
20
|
+
content_type?: string;
|
|
21
|
+
bucket?: string;
|
|
22
|
+
region?: string;
|
|
23
|
+
endpoint?: string;
|
|
24
|
+
}) => Promise<{
|
|
25
|
+
content: {
|
|
26
|
+
type: "text";
|
|
27
|
+
text: string;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
30
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { buildObjectKey, resolveTosOptions, uploadToTos } from '../lib/index.js';
|
|
3
|
+
export const tosPutObjectTool = {
|
|
4
|
+
name: 'tos_object_put',
|
|
5
|
+
description: '上传本地文件到火山引擎 TOS(API Action: PutObject,对应工具名 tos_object_put = 服务_资源_动作),bucket 保持私有,返回预签名下载 URL(默认 24h 有效)。' +
|
|
6
|
+
'对象 key 默认为 <prefix>/<YYYY-MM-DD>/<文件名>。需要环境变量 VOLC_TOS_ACCESS_KEY / VOLC_TOS_SECRET_KEY / VOLC_TOS_BUCKET / VOLC_TOS_REGION。',
|
|
7
|
+
inputSchema: {
|
|
8
|
+
file_path: z.string().min(1).describe('要上传的本地文件路径(绝对路径)'),
|
|
9
|
+
key: z.string().optional().describe('完整对象 key;不传则自动生成 <prefix>/<日期>/<文件名>'),
|
|
10
|
+
prefix: z.string().optional().describe('key 前缀,默认取 VOLC_TOS_PREFIX,再默认 volcengine-api-mcp'),
|
|
11
|
+
expires: z.number().int().positive().optional().describe('预签名 URL 有效期(秒),默认 86400(24h)'),
|
|
12
|
+
content_type: z.string().optional().describe('覆盖 Content-Type(默认按扩展名推导,未知类型为 application/octet-stream)'),
|
|
13
|
+
bucket: z.string().optional().describe('覆盖默认 bucket'),
|
|
14
|
+
region: z.string().optional().describe('覆盖默认 region'),
|
|
15
|
+
endpoint: z.string().optional().describe('覆盖默认 endpoint'),
|
|
16
|
+
},
|
|
17
|
+
handler: async (args) => {
|
|
18
|
+
const opts = resolveTosOptions({ bucket: args.bucket, region: args.region, endpoint: args.endpoint, prefix: args.prefix });
|
|
19
|
+
const key = args.key ?? buildObjectKey(opts.prefix, new Date().toISOString().slice(0, 10), args.file_path);
|
|
20
|
+
const result = await uploadToTos(opts, args.file_path, key, args.expires, args.content_type);
|
|
21
|
+
return {
|
|
22
|
+
content: [
|
|
23
|
+
{
|
|
24
|
+
type: 'text',
|
|
25
|
+
text: JSON.stringify({
|
|
26
|
+
ok: true,
|
|
27
|
+
bucket: result.bucket,
|
|
28
|
+
key: result.key,
|
|
29
|
+
bytes: result.bytes,
|
|
30
|
+
url: result.url,
|
|
31
|
+
url_expires_seconds: args.expires ?? 86_400,
|
|
32
|
+
}, null, 2),
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
};
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=tos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tos.js","sourceRoot":"","sources":["../../src/tools/tos.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,IAAI,EAAE,gBAAgB;IACtB,WAAW,EACT,4GAA4G;QAC5G,8HAA8H;IAChI,WAAW,EAAE;QACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACzD,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,sCAAsC,CAAC;QAC3E,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;QAC3F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACxF,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0DAA0D,CAAC;QACxG,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;KAC1D;IACD,OAAO,EAAE,KAAK,EAAE,IASf,EAAE,EAAE;QACH,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3H,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAE3G,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAE7F,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;wBACE,EAAE,EAAE,IAAI;wBACR,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,mBAAmB,EAAE,IAAI,CAAC,OAAO,IAAI,MAAM;qBAC5C,EACD,IAAI,EACJ,CAAC,CACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ttsUnidirectionalTool: {
|
|
3
|
+
name: string;
|
|
4
|
+
description: string;
|
|
5
|
+
inputSchema: {
|
|
6
|
+
text: z.ZodString;
|
|
7
|
+
output_path: z.ZodString;
|
|
8
|
+
speaker: z.ZodOptional<z.ZodString>;
|
|
9
|
+
resource_id: z.ZodOptional<z.ZodString>;
|
|
10
|
+
model: z.ZodOptional<z.ZodString>;
|
|
11
|
+
format: z.ZodOptional<z.ZodEnum<["mp3", "pcm", "ogg_opus", "wav"]>>;
|
|
12
|
+
sample_rate: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
speech_rate: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
loudness_rate: z.ZodOptional<z.ZodNumber>;
|
|
15
|
+
enable_subtitle: z.ZodOptional<z.ZodBoolean>;
|
|
16
|
+
explicit_language: z.ZodOptional<z.ZodString>;
|
|
17
|
+
};
|
|
18
|
+
handler: (args: {
|
|
19
|
+
text: string;
|
|
20
|
+
output_path: string;
|
|
21
|
+
speaker?: string;
|
|
22
|
+
resource_id?: string;
|
|
23
|
+
model?: string;
|
|
24
|
+
format?: "mp3" | "pcm" | "ogg_opus" | "wav";
|
|
25
|
+
sample_rate?: number;
|
|
26
|
+
speech_rate?: number;
|
|
27
|
+
loudness_rate?: number;
|
|
28
|
+
enable_subtitle?: boolean;
|
|
29
|
+
explicit_language?: string;
|
|
30
|
+
}) => Promise<{
|
|
31
|
+
content: ({
|
|
32
|
+
type: "text";
|
|
33
|
+
text: string;
|
|
34
|
+
data?: undefined;
|
|
35
|
+
mimeType?: undefined;
|
|
36
|
+
} | {
|
|
37
|
+
type: "audio";
|
|
38
|
+
data: string;
|
|
39
|
+
mimeType: string;
|
|
40
|
+
text?: undefined;
|
|
41
|
+
})[];
|
|
42
|
+
}>;
|
|
43
|
+
};
|