dsh-kenari-plugin 0.1.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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +281 -0
  3. package/README.md +283 -0
  4. package/assets/kenari-favicon-128.png +0 -0
  5. package/assets/kenari-favicon-256.png +0 -0
  6. package/client/index.js +1998 -0
  7. package/cordis.patch.yml +137 -0
  8. package/lib/billing.d.ts +120 -0
  9. package/lib/billing.d.ts.map +1 -0
  10. package/lib/billing.js +209 -0
  11. package/lib/billing.js.map +1 -0
  12. package/lib/catalog-view.d.ts +78 -0
  13. package/lib/catalog-view.d.ts.map +1 -0
  14. package/lib/catalog-view.js +113 -0
  15. package/lib/catalog-view.js.map +1 -0
  16. package/lib/catalog.d.ts +239 -0
  17. package/lib/catalog.d.ts.map +1 -0
  18. package/lib/catalog.js +445 -0
  19. package/lib/catalog.js.map +1 -0
  20. package/lib/default-route.d.ts +35 -0
  21. package/lib/default-route.d.ts.map +1 -0
  22. package/lib/default-route.js +111 -0
  23. package/lib/default-route.js.map +1 -0
  24. package/lib/errors.d.ts +29 -0
  25. package/lib/errors.d.ts.map +1 -0
  26. package/lib/errors.js +74 -0
  27. package/lib/errors.js.map +1 -0
  28. package/lib/favicon.d.ts +24 -0
  29. package/lib/favicon.d.ts.map +1 -0
  30. package/lib/favicon.js +68 -0
  31. package/lib/favicon.js.map +1 -0
  32. package/lib/http.d.ts +104 -0
  33. package/lib/http.d.ts.map +1 -0
  34. package/lib/http.js +247 -0
  35. package/lib/http.js.map +1 -0
  36. package/lib/index.d.ts +83 -0
  37. package/lib/index.d.ts.map +1 -0
  38. package/lib/index.js +285 -0
  39. package/lib/index.js.map +1 -0
  40. package/lib/llm/adapter.d.ts +78 -0
  41. package/lib/llm/adapter.d.ts.map +1 -0
  42. package/lib/llm/adapter.js +429 -0
  43. package/lib/llm/adapter.js.map +1 -0
  44. package/lib/llm/candidates.d.ts +57 -0
  45. package/lib/llm/candidates.d.ts.map +1 -0
  46. package/lib/llm/candidates.js +86 -0
  47. package/lib/llm/candidates.js.map +1 -0
  48. package/lib/llm/recovery.d.ts +48 -0
  49. package/lib/llm/recovery.d.ts.map +1 -0
  50. package/lib/llm/recovery.js +118 -0
  51. package/lib/llm/recovery.js.map +1 -0
  52. package/lib/llm/retry.d.ts +35 -0
  53. package/lib/llm/retry.d.ts.map +1 -0
  54. package/lib/llm/retry.js +53 -0
  55. package/lib/llm/retry.js.map +1 -0
  56. package/lib/plans.d.ts +59 -0
  57. package/lib/plans.d.ts.map +1 -0
  58. package/lib/plans.js +118 -0
  59. package/lib/plans.js.map +1 -0
  60. package/lib/session-title.d.ts +63 -0
  61. package/lib/session-title.d.ts.map +1 -0
  62. package/lib/session-title.js +280 -0
  63. package/lib/session-title.js.map +1 -0
  64. package/lib/settings.d.ts +35 -0
  65. package/lib/settings.d.ts.map +1 -0
  66. package/lib/settings.js +78 -0
  67. package/lib/settings.js.map +1 -0
  68. package/lib/tools/account.d.ts +11 -0
  69. package/lib/tools/account.d.ts.map +1 -0
  70. package/lib/tools/account.js +132 -0
  71. package/lib/tools/account.js.map +1 -0
  72. package/lib/tools/billing.d.ts +10 -0
  73. package/lib/tools/billing.d.ts.map +1 -0
  74. package/lib/tools/billing.js +100 -0
  75. package/lib/tools/billing.js.map +1 -0
  76. package/lib/tools/count-tokens.d.ts +11 -0
  77. package/lib/tools/count-tokens.d.ts.map +1 -0
  78. package/lib/tools/count-tokens.js +84 -0
  79. package/lib/tools/count-tokens.js.map +1 -0
  80. package/lib/tools/data.d.ts +12 -0
  81. package/lib/tools/data.d.ts.map +1 -0
  82. package/lib/tools/data.js +205 -0
  83. package/lib/tools/data.js.map +1 -0
  84. package/lib/tools/docs.d.ts +13 -0
  85. package/lib/tools/docs.d.ts.map +1 -0
  86. package/lib/tools/docs.js +209 -0
  87. package/lib/tools/docs.js.map +1 -0
  88. package/lib/tools/documents.d.ts +10 -0
  89. package/lib/tools/documents.d.ts.map +1 -0
  90. package/lib/tools/documents.js +118 -0
  91. package/lib/tools/documents.js.map +1 -0
  92. package/lib/tools/media.d.ts +28 -0
  93. package/lib/tools/media.d.ts.map +1 -0
  94. package/lib/tools/media.js +599 -0
  95. package/lib/tools/media.js.map +1 -0
  96. package/lib/tools/shared.d.ts +89 -0
  97. package/lib/tools/shared.d.ts.map +1 -0
  98. package/lib/tools/shared.js +128 -0
  99. package/lib/tools/shared.js.map +1 -0
  100. package/lib/tools/x-search.d.ts +11 -0
  101. package/lib/tools/x-search.d.ts.map +1 -0
  102. package/lib/tools/x-search.js +129 -0
  103. package/lib/tools/x-search.js.map +1 -0
  104. package/lib/web/fallback.d.ts +39 -0
  105. package/lib/web/fallback.d.ts.map +1 -0
  106. package/lib/web/fallback.js +79 -0
  107. package/lib/web/fallback.js.map +1 -0
  108. package/lib/web/fetch.d.ts +19 -0
  109. package/lib/web/fetch.d.ts.map +1 -0
  110. package/lib/web/fetch.js +41 -0
  111. package/lib/web/fetch.js.map +1 -0
  112. package/lib/web/search.d.ts +21 -0
  113. package/lib/web/search.d.ts.map +1 -0
  114. package/lib/web/search.js +47 -0
  115. package/lib/web/search.js.map +1 -0
  116. package/package.json +84 -0
@@ -0,0 +1,599 @@
1
+ /**
2
+ * 媒体工具族:图像生成/编辑、语音合成/转写、音乐生成、视频生成/续写/状态/下载。
3
+ * 二进制产物(图像、音频、视频)经 ctx.attachments 落盘;attachment ref 是纯 JSON,
4
+ * 放进规范 value 由 render 重建 image/file block,模型与 UI 都能看到产物。
5
+ * @module dsh-kenari-plugin/tools/media
6
+ */
7
+ import { defineTool } from '@deepseek-ai/dsh-tools';
8
+ import { billSpend, estimateByUnit, spendGuard } from './shared.js';
9
+ import { kenariPost, kenariPostBinary, kenariPostMultipart, kenariGet, kenariGetBinary } from '../http.js';
10
+ /** 解析 base64 data URI → 原始字节(图像响应的 url 字段恒为 data URI)。 */
11
+ function decodeDataUri(dataUri, field) {
12
+ const match = /^data:([!#$%&'*+.^_`|~a-zA-Z0-9/-]+);base64,([A-Za-z0-9+/]+={0,2})$/.exec(dataUri);
13
+ if (match === null)
14
+ throw new Error(`${field} 不是合法的 base64 data URI`);
15
+ return { mediaType: match[1], bytes: Uint8Array.from(Buffer.from(match[2], 'base64')) };
16
+ }
17
+ /** attachment 存储支持的图像类型。 */
18
+ function imageMediaType(mediaType) {
19
+ if (mediaType === 'image/png' || mediaType === 'image/jpeg' || mediaType === 'image/webp' || mediaType === 'image/gif') {
20
+ return mediaType;
21
+ }
22
+ return undefined;
23
+ }
24
+ /** 落盘图像并产出规范 value 的 attachments 数组;存储未挂载时返回空数组。 */
25
+ async function saveImages(deps, images, name) {
26
+ const attachments = deps.ctx.get('attachments');
27
+ // 没有存储就展示不了图:显式告知调用方,避免模型以为产物已在上下文里
28
+ if (attachments === undefined)
29
+ return { attachments: [], storeMissing: true };
30
+ const refs = await attachments.saveImages(images.map((img) => {
31
+ const mediaType = imageMediaType(img.mediaType);
32
+ if (mediaType === undefined)
33
+ throw new Error(`图像媒体类型 ${img.mediaType} 不受 attachment 存储支持`);
34
+ return { data: img.bytes, mediaType, name };
35
+ }));
36
+ return {
37
+ storeMissing: false,
38
+ attachments: refs.map((ref) => ({
39
+ kind: 'image',
40
+ attachmentId: ref.attachmentId,
41
+ mediaType: ref.mediaType,
42
+ width: ref.width,
43
+ height: ref.height,
44
+ name: ref.name,
45
+ bytes: ref.bytes,
46
+ })),
47
+ };
48
+ }
49
+ /** 落盘任意文件并产出单元素 attachments 数组;存储未挂载时抛可读错误。 */
50
+ async function saveFile(deps, bytes, name) {
51
+ const attachments = deps.ctx.get('attachments');
52
+ if (attachments === undefined) {
53
+ throw new Error('本部署没有挂载 attachment 存储,无法保存音频/视频文件');
54
+ }
55
+ const ref = await attachments.saveFile({ data: bytes, name });
56
+ return [{ kind: 'file', attachmentId: ref.attachmentId, name: ref.name, bytes: ref.bytes }];
57
+ }
58
+ /** 规范 value 的 attachments → ContentBlock(render 用;损坏的 ref 退化为文本)。 */
59
+ export function renderAttachments(value) {
60
+ const blocks = [];
61
+ for (const item of value.attachments ?? []) {
62
+ if (item.kind === 'image' && item.mediaType !== undefined && item.width !== undefined && item.height !== undefined) {
63
+ blocks.push({
64
+ type: 'image',
65
+ attachment: {
66
+ attachmentId: item.attachmentId,
67
+ mediaType: item.mediaType,
68
+ bytes: item.bytes,
69
+ width: item.width,
70
+ height: item.height,
71
+ ...(item.name !== undefined ? { name: item.name } : {}),
72
+ },
73
+ });
74
+ }
75
+ else if (item.kind === 'file' && item.name !== undefined) {
76
+ blocks.push({
77
+ type: 'file',
78
+ attachment: { attachmentId: item.attachmentId, name: item.name, bytes: item.bytes },
79
+ });
80
+ }
81
+ }
82
+ return blocks;
83
+ }
84
+ /**
85
+ * 生成类调用的传输选项:长超时 + 超时不重试(服务端可能已完成并计费,
86
+ * 重试有重复扣费风险);5xx/429 仍允许重试一次。
87
+ */
88
+ function generationOptions(deps) {
89
+ return {
90
+ timeoutMs: deps.http.config.generationTimeoutMs ?? 180_000,
91
+ retries: 1,
92
+ retryTimeouts: false,
93
+ };
94
+ }
95
+ /** 从 content-type 推断扩展名(仅用于文件命名)。 */
96
+ function extensionFor(contentType) {
97
+ if (contentType.includes('mpeg'))
98
+ return '.mp3';
99
+ if (contentType.includes('wav'))
100
+ return '.wav';
101
+ if (contentType.includes('pcm'))
102
+ return '.pcm';
103
+ if (contentType.includes('ogg'))
104
+ return '.ogg';
105
+ if (contentType.includes('aac'))
106
+ return '.aac';
107
+ if (contentType.includes('flac'))
108
+ return '.flac';
109
+ if (contentType.includes('mp4'))
110
+ return '.mp4';
111
+ if (contentType.includes('webm'))
112
+ return '.webm';
113
+ if (contentType.includes('quicktime'))
114
+ return '.mov';
115
+ return '.bin';
116
+ }
117
+ /** value 的 attachments 字段 schema(各产物工具共用)。 */
118
+ const attachmentsSchema = {
119
+ type: 'array',
120
+ items: {
121
+ type: 'object',
122
+ additionalProperties: false,
123
+ properties: {
124
+ kind: { type: 'string' },
125
+ attachmentId: { type: 'string' },
126
+ mediaType: { type: 'string' },
127
+ width: { type: 'integer' },
128
+ height: { type: 'integer' },
129
+ name: { type: 'string' },
130
+ bytes: { type: 'integer' },
131
+ },
132
+ },
133
+ };
134
+ /** 带产物 render 的 output(text + attachments,render 重建 image/file block)。 */
135
+ function outputWithMedia() {
136
+ return {
137
+ schema: {
138
+ type: 'object',
139
+ additionalProperties: false,
140
+ properties: {
141
+ text: { type: 'string', required: true },
142
+ attachments: attachmentsSchema,
143
+ },
144
+ },
145
+ render: (_args, value) => {
146
+ const blocks = [{ type: 'text', text: value.text }];
147
+ blocks.push(...renderAttachments(value));
148
+ return blocks;
149
+ },
150
+ };
151
+ }
152
+ /** 注册媒体工具族。 */
153
+ export function registerMediaTools(deps, register) {
154
+ register(defineTool({
155
+ name: 'kenari_image_generate',
156
+ description: 'Generate images with a Kenari image model (e.g. gpt-image-2). Returns inline images. Billed per image from your Kenari balance.',
157
+ parameters: {
158
+ model: { type: 'string', required: true, description: 'Image model id from the catalog, e.g. gpt-image-2.' },
159
+ prompt: { type: 'string', required: true, description: 'What to draw.' },
160
+ n: { type: 'integer', description: 'Number of images (default 1). Each image is billed.' },
161
+ size: { type: 'string', description: 'Image size, e.g. "1024x1024".' },
162
+ },
163
+ output: {
164
+ schema: {
165
+ type: 'object',
166
+ additionalProperties: false,
167
+ properties: {
168
+ count: { type: 'integer', required: true },
169
+ revised_prompts: { type: 'array', items: { type: 'string' } },
170
+ text: { type: 'string', required: true },
171
+ attachments: attachmentsSchema,
172
+ },
173
+ },
174
+ render: (_args, value) => {
175
+ const blocks = [{ type: 'text', text: value.text }];
176
+ blocks.push(...renderAttachments(value));
177
+ return blocks;
178
+ },
179
+ },
180
+ timeoutMs: 400000,
181
+ isConcurrencySafe: () => true,
182
+ async execute(args, exec) {
183
+ spendGuard(deps, exec, 'kenari_image_generate');
184
+ const body = { model: args.model, prompt: args.prompt };
185
+ if (args.n !== undefined)
186
+ body.n = args.n;
187
+ if (args.size !== undefined)
188
+ body.size = args.size;
189
+ const result = await kenariPost(deps.http, '/images/generations', body, undefined, generationOptions(deps));
190
+ const items = result.data ?? [];
191
+ const images = [];
192
+ const revised = [];
193
+ for (const item of items) {
194
+ const raw = item.b64_json !== undefined
195
+ ? { mediaType: 'image/png', bytes: Uint8Array.from(Buffer.from(item.b64_json, 'base64')) }
196
+ : item.url !== undefined
197
+ ? decodeDataUri(item.url, '图像响应 url')
198
+ : undefined;
199
+ if (raw !== undefined)
200
+ images.push(raw);
201
+ if (item.revised_prompt !== undefined)
202
+ revised.push(item.revised_prompt);
203
+ }
204
+ const saved = await saveImages(deps, images, `kenari-${args.model}.png`);
205
+ const notes = revised.length > 0 ? `\n修订提示词:${revised.join(';')}` : '';
206
+ const storeNote = saved.storeMissing ? '\n(本部署没有挂载 attachment 存储,图像已生成但无法内联展示)' : '';
207
+ // 图像按张计费:以实际产出张数记账(生成失败时张数为 0,不产生费用)
208
+ const estimate = await estimateByUnit(deps, args.model, 'images', images.length);
209
+ const billed = await billSpend(deps, exec, {
210
+ tool: 'kenari_image_generate',
211
+ model: args.model,
212
+ estimateMicroIdr: images.length > 0 ? estimate.microIdr : undefined,
213
+ estimateNote: estimate.note,
214
+ note: '按张计费',
215
+ });
216
+ return {
217
+ count: images.length,
218
+ revised_prompts: revised,
219
+ text: `已生成 ${images.length} 张图像。${notes}${storeNote}${billed}`,
220
+ attachments: saved.attachments,
221
+ };
222
+ },
223
+ }));
224
+ register(defineTool({
225
+ name: 'kenari_image_edit',
226
+ description: 'Edit a PNG image with a Kenari image model. Provide image as a data URL; optional mask marks editable regions. Billed per image.',
227
+ parameters: {
228
+ model: { type: 'string', required: true, description: 'Image model id, e.g. gpt-image-2.' },
229
+ prompt: { type: 'string', required: true, description: 'Description of the desired edit.' },
230
+ image_data_url: { type: 'string', required: true, description: 'Source PNG as a data URL (data:image/png;base64,...).' },
231
+ mask_data_url: { type: 'string', description: 'Optional PNG mask; transparent regions mark where the edit applies.' },
232
+ n: { type: 'integer', description: 'Number of images (default 1).' },
233
+ size: { type: 'string', description: 'Image size, e.g. "1024x1024".' },
234
+ },
235
+ output: {
236
+ schema: {
237
+ type: 'object',
238
+ additionalProperties: false,
239
+ properties: {
240
+ count: { type: 'integer', required: true },
241
+ text: { type: 'string', required: true },
242
+ attachments: attachmentsSchema,
243
+ },
244
+ },
245
+ render: (_args, value) => {
246
+ const blocks = [{ type: 'text', text: value.text }];
247
+ blocks.push(...renderAttachments(value));
248
+ return blocks;
249
+ },
250
+ },
251
+ timeoutMs: 400000,
252
+ isConcurrencySafe: () => true,
253
+ async execute(args, exec) {
254
+ spendGuard(deps, exec, 'kenari_image_edit');
255
+ const image = decodeDataUri(args.image_data_url, 'image_data_url');
256
+ const fields = {
257
+ model: args.model,
258
+ prompt: args.prompt,
259
+ image: image.bytes,
260
+ };
261
+ if (args.mask_data_url !== undefined) {
262
+ fields.mask = decodeDataUri(args.mask_data_url, 'mask_data_url').bytes;
263
+ }
264
+ if (args.n !== undefined)
265
+ fields.n = String(args.n);
266
+ if (args.size !== undefined)
267
+ fields.size = args.size;
268
+ const result = await kenariPostMultipart(deps.http, '/images/edits', fields, undefined, generationOptions(deps));
269
+ const items = result.data ?? [];
270
+ const images = [];
271
+ for (const item of items) {
272
+ const raw = item.b64_json !== undefined
273
+ ? { mediaType: 'image/png', bytes: Uint8Array.from(Buffer.from(item.b64_json, 'base64')) }
274
+ : item.url !== undefined
275
+ ? decodeDataUri(item.url, '图像响应 url')
276
+ : undefined;
277
+ if (raw !== undefined)
278
+ images.push(raw);
279
+ }
280
+ const saved = await saveImages(deps, images, `kenari-edit-${args.model}.png`);
281
+ const storeNote = saved.storeMissing ? '\n(本部署没有挂载 attachment 存储,图像已生成但无法内联展示)' : '';
282
+ const estimate = await estimateByUnit(deps, args.model, 'images', images.length);
283
+ const billed = await billSpend(deps, exec, {
284
+ tool: 'kenari_image_edit',
285
+ model: args.model,
286
+ estimateMicroIdr: images.length > 0 ? estimate.microIdr : undefined,
287
+ estimateNote: estimate.note,
288
+ note: '按张计费',
289
+ });
290
+ return {
291
+ count: images.length,
292
+ text: `编辑完成,产出 ${images.length} 张图像。${storeNote}${billed}`,
293
+ attachments: saved.attachments,
294
+ };
295
+ },
296
+ }));
297
+ register(defineTool({
298
+ name: 'kenari_speech',
299
+ description: 'Synthesize speech from text with a Kenari TTS model. Voice and format names are model-specific (read the model entry in kenari_list_models). Returns an audio file.',
300
+ parameters: {
301
+ model: { type: 'string', required: true, description: 'TTS model id from the catalog.' },
302
+ input: { type: 'string', required: true, description: 'Text to synthesize.' },
303
+ voice: { type: 'string', description: 'Voice id (model-specific; omit for the model default).' },
304
+ response_format: { type: 'string', description: 'Audio format: mp3, wav, pcm, opus, aac or flac.', enum: ['mp3', 'wav', 'pcm', 'opus', 'aac', 'flac'] },
305
+ speed: { type: 'number', description: 'Playback speed multiplier.' },
306
+ language: { type: 'string', description: 'Language hint (default auto).' },
307
+ },
308
+ output: outputWithMedia(),
309
+ timeoutMs: 400000,
310
+ isConcurrencySafe: () => true,
311
+ async execute(args, exec) {
312
+ spendGuard(deps, exec, 'kenari_speech');
313
+ const body = { model: args.model, input: args.input };
314
+ if (args.voice !== undefined)
315
+ body.voice = args.voice;
316
+ if (args.response_format !== undefined)
317
+ body.response_format = args.response_format;
318
+ if (args.speed !== undefined)
319
+ body.speed = args.speed;
320
+ if (args.language !== undefined)
321
+ body.language = args.language;
322
+ const audio = await kenariPostBinary(deps.http, '/audio/speech', body, undefined, generationOptions(deps));
323
+ const attachments = await saveFile(deps, audio.bytes, `kenari-speech${extensionFor(audio.contentType)}`);
324
+ // 语音按千字符计费:输入文本长度即计费量
325
+ const estimate = await estimateByUnit(deps, args.model, 'audio_speech', args.input.length / 1000);
326
+ const billed = await billSpend(deps, exec, {
327
+ tool: 'kenari_speech',
328
+ model: args.model,
329
+ estimateMicroIdr: estimate.microIdr,
330
+ estimateNote: estimate.note,
331
+ note: '按千字符计费',
332
+ });
333
+ return {
334
+ text: `语音合成完成:${audio.bytes.length} 字节(${audio.contentType}),文件已保存。${billed}`,
335
+ attachments,
336
+ };
337
+ },
338
+ }));
339
+ register(defineTool({
340
+ name: 'kenari_transcribe',
341
+ description: 'Transcribe an audio file with a Kenari STT model. Send the file as a data URL. verbose_json adds segments and duration.',
342
+ parameters: {
343
+ model: { type: 'string', required: true, description: 'STT model id from the catalog.' },
344
+ file_data_url: { type: 'string', required: true, description: 'Audio file as a data URL.' },
345
+ language: { type: 'string', description: 'ISO-639-1 language code, e.g. "en" or "id".' },
346
+ prompt: { type: 'string', description: 'Optional context hint to improve accuracy.' },
347
+ temperature: { type: 'number', description: 'Sampling temperature 0–1.' },
348
+ response_format: { type: 'string', description: 'json, text or verbose_json. Default json.', enum: ['json', 'text', 'verbose_json'] },
349
+ },
350
+ output: {
351
+ schema: {
352
+ type: 'object',
353
+ additionalProperties: false,
354
+ properties: {
355
+ text: { type: 'string', required: true },
356
+ },
357
+ },
358
+ render: (_args, value) => [{ type: 'text', text: value.text }],
359
+ },
360
+ timeoutMs: 400000,
361
+ isConcurrencySafe: () => true,
362
+ async execute(args, exec) {
363
+ spendGuard(deps, exec, 'kenari_transcribe');
364
+ const file = decodeDataUri(args.file_data_url, 'file_data_url');
365
+ const fields = {
366
+ model: args.model,
367
+ file: file.bytes,
368
+ response_format: args.response_format ?? 'json',
369
+ };
370
+ if (args.language !== undefined)
371
+ fields.language = args.language;
372
+ if (args.prompt !== undefined)
373
+ fields.prompt = args.prompt;
374
+ if (args.temperature !== undefined)
375
+ fields.temperature = String(args.temperature);
376
+ const result = await kenariPostMultipart(deps.http, '/audio/transcriptions', fields, undefined, generationOptions(deps));
377
+ // 转写按秒计费:时长只在 verbose_json 里回显,缺它就如实说明无法预估
378
+ const duration = result.duration;
379
+ const estimate = duration === undefined
380
+ ? {}
381
+ : await estimateByUnit(deps, args.model, 'audio_transcription', duration);
382
+ const billed = await billSpend(deps, exec, {
383
+ tool: 'kenari_transcribe',
384
+ model: args.model,
385
+ estimateMicroIdr: estimate.microIdr,
386
+ estimateNote: estimate.note,
387
+ note: duration === undefined ? '响应未回显时长,改用 response_format=verbose_json 可得到费用预估' : '按秒计费',
388
+ });
389
+ return { text: `${result.text ?? '(转写结果为空)'}${billed}` };
390
+ },
391
+ }));
392
+ register(defineTool({
393
+ name: 'kenari_music',
394
+ description: 'Generate a song or instrumental track with a Kenari music model. Lyrics required for songs; prompt required for instrumentals. Returns an mp3 file.',
395
+ parameters: {
396
+ model: { type: 'string', required: true, description: 'Music model id from the catalog.' },
397
+ prompt: { type: 'string', description: 'Style and mood. Required when instrumental is true.' },
398
+ lyrics: { type: 'string', description: 'The words of a sung track. Required when instrumental is false or absent.' },
399
+ instrumental: { type: 'boolean', description: 'Generate an instrumental track (default false).' },
400
+ },
401
+ output: outputWithMedia(),
402
+ timeoutMs: 500000,
403
+ isConcurrencySafe: () => true,
404
+ async execute(args, exec) {
405
+ spendGuard(deps, exec, 'kenari_music');
406
+ const body = { model: args.model };
407
+ if (args.prompt !== undefined)
408
+ body.prompt = args.prompt;
409
+ if (args.lyrics !== undefined)
410
+ body.lyrics = args.lyrics;
411
+ if (args.instrumental !== undefined)
412
+ body.instrumental = args.instrumental;
413
+ const result = await kenariPost(deps.http, '/music/generations', body, undefined, generationOptions(deps));
414
+ const item = (result.data ?? [])[0];
415
+ if (item?.b64_json === undefined)
416
+ throw new Error('kenari: 音乐响应缺少 b64_json');
417
+ const bytes = Uint8Array.from(Buffer.from(item.b64_json, 'base64'));
418
+ const attachments = await saveFile(deps, bytes, 'kenari-music.mp3');
419
+ // 音乐按首计费,但公开目录当前无 music 模型,故无单价可查(如实说明未计入)
420
+ const estimate = await estimateByUnit(deps, args.model, 'music_generations', 1);
421
+ const billed = await billSpend(deps, exec, {
422
+ tool: 'kenari_music',
423
+ model: args.model,
424
+ estimateMicroIdr: estimate.microIdr,
425
+ estimateNote: estimate.note,
426
+ });
427
+ return {
428
+ text: `音乐生成完成:mp3,${bytes.length} 字节,文件已保存。${billed}`,
429
+ attachments,
430
+ };
431
+ },
432
+ }));
433
+ register(defineTool({
434
+ name: 'kenari_video_generate',
435
+ description: 'Start a Kenari video generation job (text-to-video, image-to-video or reference-to-video). Returns a job id; poll with kenari_video_status, download with kenari_video_content. Billed per second of output.',
436
+ parameters: {
437
+ model: { type: 'string', required: true, description: 'Video model id from the catalog.' },
438
+ prompt: { type: 'string', required: true, description: 'Text description of the video.' },
439
+ duration: { type: 'integer', description: 'Seconds, 1–15 (default 6; model-specific lists may apply).' },
440
+ image_url: { type: 'string', description: 'Source image URL for image-to-video (must serve the image directly).' },
441
+ end_image_url: { type: 'string', description: 'Optional final frame, paired with image_url.' },
442
+ video_url: { type: 'string', description: 'Reference clip URL for reference-to-video (takes priority over image_url).' },
443
+ aspect_ratio: { type: 'string', description: 'e.g. "16:9" or "9:16".' },
444
+ resolution: { type: 'string', description: 'Resolution tier, e.g. "720p" or "1080p".' },
445
+ },
446
+ output: {
447
+ schema: {
448
+ type: 'object',
449
+ additionalProperties: false,
450
+ properties: {
451
+ job_id: { type: 'string', required: true },
452
+ status: { type: 'string', required: true },
453
+ text: { type: 'string', required: true },
454
+ },
455
+ },
456
+ render: (_args, value) => [{ type: 'text', text: value.text }],
457
+ },
458
+ timeoutMs: 60_000,
459
+ isConcurrencySafe: () => true,
460
+ async execute(args, exec) {
461
+ spendGuard(deps, exec, 'kenari_video_generate');
462
+ const body = { model: args.model, prompt: args.prompt };
463
+ if (args.duration !== undefined)
464
+ body.duration = args.duration;
465
+ if (args.image_url !== undefined)
466
+ body.image_url = args.image_url;
467
+ if (args.end_image_url !== undefined)
468
+ body.end_image_url = args.end_image_url;
469
+ if (args.video_url !== undefined)
470
+ body.video_url = args.video_url;
471
+ if (args.aspect_ratio !== undefined)
472
+ body.aspect_ratio = args.aspect_ratio;
473
+ if (args.resolution !== undefined)
474
+ body.resolution = args.resolution;
475
+ const result = await kenariPost(deps.http, '/videos/generations', body);
476
+ if (result.id === undefined)
477
+ throw new Error('kenari: 视频响应缺少任务 id');
478
+ // 视频按秒计费且分分辨率档:分辨率决定单价,时长决定数量
479
+ const seconds = args.duration ?? 6;
480
+ const estimate = await estimateByUnit(deps, args.model, 'videos', seconds, args.resolution);
481
+ const billed = await billSpend(deps, exec, {
482
+ tool: 'kenari_video_generate',
483
+ model: args.model,
484
+ estimateMicroIdr: estimate.microIdr,
485
+ estimateNote: estimate.note,
486
+ note: '按秒计费;任务失败不计费,实际扣费以成片为准',
487
+ });
488
+ return {
489
+ job_id: result.id,
490
+ status: result.status ?? 'rendering',
491
+ text: `视频任务已创建:id=${result.id},状态 ${result.status ?? 'rendering'}。用 kenari_video_status 轮询;完成后用 kenari_video_content 下载。${billed}`,
492
+ };
493
+ },
494
+ }));
495
+ register(defineTool({
496
+ name: 'kenari_video_extend',
497
+ description: 'Extend an existing Kenari video with a follow-up segment. Requires the source video URL. Returns a new job id.',
498
+ parameters: {
499
+ model: { type: 'string', required: true, description: 'Video model id from the catalog.' },
500
+ video_url: { type: 'string', required: true, description: 'URL of the source video to extend.' },
501
+ prompt: { type: 'string', description: 'Optional prompt for the extension.' },
502
+ duration: { type: 'integer', description: 'Extension length in seconds, 1–15 (default 6).' },
503
+ },
504
+ output: {
505
+ schema: {
506
+ type: 'object',
507
+ additionalProperties: false,
508
+ properties: {
509
+ job_id: { type: 'string', required: true },
510
+ status: { type: 'string', required: true },
511
+ text: { type: 'string', required: true },
512
+ },
513
+ },
514
+ render: (_args, value) => [{ type: 'text', text: value.text }],
515
+ },
516
+ timeoutMs: 60_000,
517
+ isConcurrencySafe: () => true,
518
+ async execute(args, exec) {
519
+ spendGuard(deps, exec, 'kenari_video_extend');
520
+ const body = { model: args.model, video: { url: args.video_url } };
521
+ if (args.prompt !== undefined)
522
+ body.prompt = args.prompt;
523
+ if (args.duration !== undefined)
524
+ body.duration = args.duration;
525
+ const result = await kenariPost(deps.http, '/videos/extensions', body);
526
+ if (result.id === undefined)
527
+ throw new Error('kenari: 视频续写响应缺少任务 id');
528
+ const seconds = args.duration ?? 6;
529
+ const estimate = await estimateByUnit(deps, args.model, 'videos', seconds);
530
+ const billed = await billSpend(deps, exec, {
531
+ tool: 'kenari_video_extend',
532
+ model: args.model,
533
+ estimateMicroIdr: estimate.microIdr,
534
+ estimateNote: estimate.note,
535
+ note: '按秒计费;失败不计费',
536
+ });
537
+ return {
538
+ job_id: result.id,
539
+ status: result.status ?? 'rendering',
540
+ text: `续写任务已创建:id=${result.id},状态 ${result.status ?? 'rendering'}。${billed}`,
541
+ };
542
+ },
543
+ }));
544
+ register(defineTool({
545
+ name: 'kenari_video_status',
546
+ description: 'Check a Kenari video job status (rendering / done / failed / expired). When done, the response includes a kenari-hosted download URL.',
547
+ parameters: {
548
+ job_id: { type: 'string', required: true, description: 'Job id from kenari_video_generate or kenari_video_extend.' },
549
+ },
550
+ output: {
551
+ schema: {
552
+ type: 'object',
553
+ additionalProperties: false,
554
+ properties: {
555
+ status: { type: 'string', required: true },
556
+ url: { type: 'string' },
557
+ text: { type: 'string', required: true },
558
+ },
559
+ },
560
+ render: (_args, value) => [{ type: 'text', text: value.text }],
561
+ },
562
+ timeoutMs: 30_000,
563
+ isConcurrencySafe: () => true,
564
+ async execute(args) {
565
+ const result = await kenariGet(deps.http, `/videos/${encodeURIComponent(args.job_id)}`);
566
+ const lines = [`视频任务 ${args.job_id}:${result.status ?? 'unknown'}`];
567
+ if (result.url !== null && result.url !== undefined)
568
+ lines.push(`下载地址:${result.url}`);
569
+ if (result.status === 'failed')
570
+ lines.push('生成失败:费用不扣除,可调整提示词重试。');
571
+ if (result.status === 'expired')
572
+ lines.push('成片已过期:kenari 只保留有限时间,请尽快下载。');
573
+ return {
574
+ status: result.status ?? 'unknown',
575
+ ...(result.url !== null && result.url !== undefined ? { url: result.url } : {}),
576
+ text: lines.join('\n'),
577
+ };
578
+ },
579
+ }));
580
+ register(defineTool({
581
+ name: 'kenari_video_content',
582
+ description: 'Download a finished Kenari video as a file. Requires the job status to be done.',
583
+ parameters: {
584
+ job_id: { type: 'string', required: true, description: 'Job id from kenari_video_generate or kenari_video_extend.' },
585
+ },
586
+ output: outputWithMedia(),
587
+ timeoutMs: 500000,
588
+ isConcurrencySafe: () => true,
589
+ async execute(args) {
590
+ const video = await kenariGetBinary(deps.http, `/videos/${encodeURIComponent(args.job_id)}/content`, undefined, generationOptions(deps));
591
+ const attachments = await saveFile(deps, video.bytes, `kenari-video-${args.job_id}${extensionFor(video.contentType)}`);
592
+ return {
593
+ text: `视频下载完成:${video.bytes.length} 字节(${video.contentType}),文件已保存。`,
594
+ attachments,
595
+ };
596
+ },
597
+ }));
598
+ }
599
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/tools/media.ts"],"names":[],"mappings":"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"}