@downcity/plugins 1.0.173 → 1.0.193
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/bin/BuiltinPlugins.d.ts +4 -9
- package/bin/BuiltinPlugins.d.ts.map +1 -1
- package/bin/BuiltinPlugins.js +4 -8
- package/bin/BuiltinPlugins.js.map +1 -1
- package/bin/chat/Action.d.ts +8 -2
- package/bin/chat/Action.d.ts.map +1 -1
- package/bin/chat/Action.js +9 -5
- package/bin/chat/Action.js.map +1 -1
- package/bin/chat/ChatPlugin.d.ts +2 -22
- package/bin/chat/ChatPlugin.d.ts.map +1 -1
- package/bin/chat/ChatPlugin.js +2 -21
- package/bin/chat/ChatPlugin.js.map +1 -1
- package/bin/chat/Index.d.ts +1 -1
- package/bin/chat/Index.d.ts.map +1 -1
- package/bin/chat/channels/BaseChatChannel.js +1 -1
- package/bin/chat/channels/BaseChatChannel.js.map +1 -1
- package/bin/chat/channels/Configuration.d.ts +1 -1
- package/bin/chat/channels/Configuration.js +1 -1
- package/bin/chat/channels/RuntimeChannel.d.ts +2 -3
- package/bin/chat/channels/RuntimeChannel.d.ts.map +1 -1
- package/bin/chat/channels/RuntimeChannel.js +0 -8
- package/bin/chat/channels/RuntimeChannel.js.map +1 -1
- package/bin/chat/channels/feishu/Feishu.d.ts.map +1 -1
- package/bin/chat/channels/feishu/Feishu.js +2 -1
- package/bin/chat/channels/feishu/Feishu.js.map +1 -1
- package/bin/chat/runtime/ChannelContextStore.d.ts.map +1 -1
- package/bin/chat/runtime/ChannelContextStore.js +13 -12
- package/bin/chat/runtime/ChannelContextStore.js.map +1 -1
- package/bin/chat/runtime/ChatActionExecution.d.ts +26 -1
- package/bin/chat/runtime/ChatActionExecution.d.ts.map +1 -1
- package/bin/chat/runtime/ChatActionExecution.js +31 -3
- package/bin/chat/runtime/ChatActionExecution.js.map +1 -1
- package/bin/chat/runtime/ChatActionInput.d.ts +1 -2
- package/bin/chat/runtime/ChatActionInput.d.ts.map +1 -1
- package/bin/chat/runtime/ChatActionInput.js +1 -27
- package/bin/chat/runtime/ChatActionInput.js.map +1 -1
- package/bin/chat/runtime/ChatChannelActions.d.ts +2 -66
- package/bin/chat/runtime/ChatChannelActions.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelActions.js +3 -195
- package/bin/chat/runtime/ChatChannelActions.js.map +1 -1
- package/bin/chat/runtime/ChatChannelConfig.d.ts +2 -23
- package/bin/chat/runtime/ChatChannelConfig.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelConfig.js +3 -116
- package/bin/chat/runtime/ChatChannelConfig.js.map +1 -1
- package/bin/chat/runtime/ChatChannelCore.d.ts +0 -14
- package/bin/chat/runtime/ChatChannelCore.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelCore.js +1 -1
- package/bin/chat/runtime/ChatChannelCore.js.map +1 -1
- package/bin/chat/runtime/ChatChannelFacade.d.ts +1 -1
- package/bin/chat/runtime/ChatChannelFacade.d.ts.map +1 -1
- package/bin/chat/runtime/ChatChannelFacade.js +1 -1
- package/bin/chat/runtime/ChatChannelFacade.js.map +1 -1
- package/bin/chat/runtime/ChatHistoryStore.d.ts.map +1 -1
- package/bin/chat/runtime/ChatHistoryStore.js +4 -3
- package/bin/chat/runtime/ChatHistoryStore.js.map +1 -1
- package/bin/chat/runtime/ChatPluginActionRegistry.d.ts.map +1 -1
- package/bin/chat/runtime/ChatPluginActionRegistry.js +27 -89
- package/bin/chat/runtime/ChatPluginActionRegistry.js.map +1 -1
- package/bin/chat/runtime/ChatPluginSystem.d.ts +3 -2
- package/bin/chat/runtime/ChatPluginSystem.d.ts.map +1 -1
- package/bin/chat/runtime/ChatPluginSystem.js +5 -5
- package/bin/chat/runtime/ChatPluginSystem.js.map +1 -1
- package/bin/chat/runtime/ChatQueueStore.d.ts +1 -1
- package/bin/chat/runtime/ChatQueueStore.js +2 -2
- package/bin/chat/runtime/ChatQueueStore.js.map +1 -1
- package/bin/chat/runtime/ChatQueueWorker.js +1 -1
- package/bin/chat/runtime/ChatQueueWorker.js.map +1 -1
- package/bin/chat/runtime/ChatSessionDelete.d.ts.map +1 -1
- package/bin/chat/runtime/ChatSessionDelete.js +11 -20
- package/bin/chat/runtime/ChatSessionDelete.js.map +1 -1
- package/bin/chat/runtime/ChatStorage.d.ts +32 -0
- package/bin/chat/runtime/ChatStorage.d.ts.map +1 -0
- package/bin/chat/runtime/ChatStorage.js +158 -0
- package/bin/chat/runtime/ChatStorage.js.map +1 -0
- package/bin/chat/runtime/SystemPrompt.d.ts +3 -2
- package/bin/chat/runtime/SystemPrompt.d.ts.map +1 -1
- package/bin/chat/runtime/SystemPrompt.js +4 -5
- package/bin/chat/runtime/SystemPrompt.js.map +1 -1
- package/bin/chat/types/ChannelConfiguration.d.ts +2 -2
- package/bin/chat/types/ChatPluginActionPayload.d.ts +7 -45
- package/bin/chat/types/ChatPluginActionPayload.d.ts.map +1 -1
- package/bin/chat/types/ChatPluginOptions.d.ts +0 -21
- package/bin/chat/types/ChatPluginOptions.d.ts.map +1 -1
- package/bin/chat/types/ChatStorage.d.ts +36 -0
- package/bin/chat/types/ChatStorage.d.ts.map +1 -0
- package/bin/chat/types/ChatStorage.js +9 -0
- package/bin/chat/types/ChatStorage.js.map +1 -0
- package/bin/contact/Action.d.ts +3 -2
- package/bin/contact/Action.d.ts.map +1 -1
- package/bin/contact/Action.js +2 -2
- package/bin/contact/Action.js.map +1 -1
- package/bin/contact/ContactPlugin.d.ts.map +1 -1
- package/bin/contact/ContactPlugin.js +17 -14
- package/bin/contact/ContactPlugin.js.map +1 -1
- package/bin/contact/runtime/ChatRuntime.js +1 -1
- package/bin/contact/runtime/ChatRuntime.js.map +1 -1
- package/bin/contact/types/ContactPluginOptions.d.ts +4 -0
- package/bin/contact/types/ContactPluginOptions.d.ts.map +1 -1
- package/bin/index.d.ts +5 -5
- package/bin/index.d.ts.map +1 -1
- package/bin/index.js +2 -2
- package/bin/index.js.map +1 -1
- package/bin/memory/Action.d.ts.map +1 -1
- package/bin/memory/Action.js +16 -4
- package/bin/memory/Action.js.map +1 -1
- package/bin/memory/runtime/Store.d.ts.map +1 -1
- package/bin/memory/runtime/Store.js +0 -22
- package/bin/memory/runtime/Store.js.map +1 -1
- package/bin/memory/runtime/Writer.d.ts +1 -1
- package/bin/memory/runtime/Writer.d.ts.map +1 -1
- package/bin/memory/runtime/Writer.js +2 -4
- package/bin/memory/runtime/Writer.js.map +1 -1
- package/bin/skill/Command.d.ts +3 -11
- package/bin/skill/Command.d.ts.map +1 -1
- package/bin/skill/Command.js +3 -31
- package/bin/skill/Command.js.map +1 -1
- package/bin/skill/PROMPT.d.ts +1 -1
- package/bin/skill/PROMPT.d.ts.map +1 -1
- package/bin/skill/PROMPT.js +1 -1
- package/bin/skill/PROMPT.js.map +1 -1
- package/bin/skill/Plugin.d.ts +3 -2
- package/bin/skill/Plugin.d.ts.map +1 -1
- package/bin/skill/Plugin.js +37 -129
- package/bin/skill/Plugin.js.map +1 -1
- package/bin/skill/runtime/Prompt.d.ts +11 -2
- package/bin/skill/runtime/Prompt.d.ts.map +1 -1
- package/bin/skill/runtime/Prompt.js +93 -8
- package/bin/skill/runtime/Prompt.js.map +1 -1
- package/bin/skill/runtime/SystemProvider.d.ts +2 -1
- package/bin/skill/runtime/SystemProvider.d.ts.map +1 -1
- package/bin/skill/runtime/SystemProvider.js +4 -9
- package/bin/skill/runtime/SystemProvider.js.map +1 -1
- package/bin/skill/types/SkillPlugin.d.ts +6 -18
- package/bin/skill/types/SkillPlugin.d.ts.map +1 -1
- package/bin/skill/types/SkillPlugin.js +2 -2
- package/bin/sound/Plugin.d.ts +69 -0
- package/bin/sound/Plugin.d.ts.map +1 -0
- package/bin/sound/Plugin.js +623 -0
- package/bin/sound/Plugin.js.map +1 -0
- package/bin/sound/types/SoundPlugin.d.ts +150 -0
- package/bin/sound/types/SoundPlugin.d.ts.map +1 -0
- package/bin/sound/types/SoundPlugin.js +10 -0
- package/bin/sound/types/SoundPlugin.js.map +1 -0
- package/bin/task/Action.d.ts +2 -0
- package/bin/task/Action.d.ts.map +1 -1
- package/bin/task/Action.js +6 -0
- package/bin/task/Action.js.map +1 -1
- package/bin/task/runtime/Runner.d.ts +4 -0
- package/bin/task/runtime/Runner.d.ts.map +1 -1
- package/bin/task/runtime/Runner.js +15 -11
- package/bin/task/runtime/Runner.js.map +1 -1
- package/bin/task/runtime/TaskActionExecution.d.ts +2 -0
- package/bin/task/runtime/TaskActionExecution.d.ts.map +1 -1
- package/bin/task/runtime/TaskActionExecution.js +1 -0
- package/bin/task/runtime/TaskActionExecution.js.map +1 -1
- package/bin/task/runtime/TaskPluginActionRegistry.d.ts.map +1 -1
- package/bin/task/runtime/TaskPluginActionRegistry.js +1 -0
- package/bin/task/runtime/TaskPluginActionRegistry.js.map +1 -1
- package/bin/task/runtime/TaskRunChatDispatch.js +1 -1
- package/bin/task/runtime/TaskRunChatDispatch.js.map +1 -1
- package/bin/task/runtime/TaskRunnerRound.d.ts.map +1 -1
- package/bin/task/runtime/TaskRunnerRound.js +19 -26
- package/bin/task/runtime/TaskRunnerRound.js.map +1 -1
- package/bin/task/runtime/TaskRunnerSession.d.ts +6 -2
- package/bin/task/runtime/TaskRunnerSession.d.ts.map +1 -1
- package/bin/task/runtime/TaskRunnerSession.js +93 -72
- package/bin/task/runtime/TaskRunnerSession.js.map +1 -1
- package/bin/task/runtime/TaskRunnerTypes.d.ts +4 -4
- package/bin/task/runtime/TaskRunnerTypes.d.ts.map +1 -1
- package/bin/task/types/TaskPluginOptions.d.ts.map +1 -1
- package/bin/web/PROMPT.d.ts +1 -1
- package/bin/web/PROMPT.d.ts.map +1 -1
- package/bin/web/PROMPT.js +2 -2
- package/bin/web/PROMPT.js.map +1 -1
- package/bin/web/Plugin.d.ts +1 -21
- package/bin/web/Plugin.d.ts.map +1 -1
- package/bin/web/Plugin.js +14 -79
- package/bin/web/Plugin.js.map +1 -1
- package/bin/web/runtime/Prompt.d.ts +14 -0
- package/bin/web/runtime/Prompt.d.ts.map +1 -0
- package/bin/web/runtime/Prompt.js +77 -0
- package/bin/web/runtime/Prompt.js.map +1 -0
- package/bin/web/types/WebPlugin.d.ts +40 -29
- package/bin/web/types/WebPlugin.d.ts.map +1 -1
- package/bin/web/types/WebPlugin.js +11 -3
- package/bin/web/types/WebPlugin.js.map +1 -1
- package/bin/workboard/runtime/Collector.js +1 -1
- package/bin/workboard/runtime/Collector.js.map +1 -1
- package/bin/workboard/runtime/Normalizer.js +1 -1
- package/bin/workboard/runtime/Normalizer.js.map +1 -1
- package/bin/workboard/runtime/SessionSummary.d.ts.map +1 -1
- package/bin/workboard/runtime/SessionSummary.js +11 -38
- package/bin/workboard/runtime/SessionSummary.js.map +1 -1
- package/package.json +8 -4
- package/scripts/chat-access.test.mjs +1 -1
- package/scripts/chat-channel-config.test.mjs +15 -64
- package/scripts/chat-storage.test.mjs +92 -0
- package/scripts/skill-plugin.test.mjs +93 -0
- package/scripts/sound-plugin.test.mjs +250 -0
- package/scripts/web-plugin.test.mjs +85 -0
- package/src/BuiltinPlugins.ts +7 -17
- package/src/chat/Action.ts +16 -5
- package/src/chat/ChatPlugin.ts +6 -35
- package/src/chat/Index.ts +0 -1
- package/src/chat/channels/BaseChatChannel.ts +1 -1
- package/src/chat/channels/Configuration.ts +1 -1
- package/src/chat/channels/RuntimeChannel.ts +2 -14
- package/src/chat/channels/feishu/Feishu.ts +2 -1
- package/src/chat/runtime/ChannelContextStore.ts +16 -12
- package/src/chat/runtime/ChatActionExecution.ts +48 -3
- package/src/chat/runtime/ChatActionInput.ts +0 -31
- package/src/chat/runtime/ChatChannelActions.ts +3 -254
- package/src/chat/runtime/ChatChannelConfig.ts +4 -133
- package/src/chat/runtime/ChatChannelCore.ts +1 -15
- package/src/chat/runtime/ChatChannelFacade.ts +0 -4
- package/src/chat/runtime/ChatHistoryStore.ts +4 -3
- package/src/chat/runtime/ChatPluginActionRegistry.ts +26 -98
- package/src/chat/runtime/ChatPluginSystem.ts +9 -3
- package/src/chat/runtime/ChatQueueStore.ts +2 -2
- package/src/chat/runtime/ChatQueueWorker.ts +1 -1
- package/src/chat/runtime/ChatSessionDelete.ts +11 -21
- package/src/chat/runtime/ChatStorage.ts +203 -0
- package/src/chat/runtime/SystemPrompt.ts +8 -3
- package/src/chat/types/ChannelConfiguration.ts +2 -2
- package/src/chat/types/ChatPluginActionPayload.ts +8 -49
- package/src/chat/types/ChatPluginOptions.ts +0 -22
- package/src/chat/types/ChatStorage.ts +37 -0
- package/src/contact/Action.ts +9 -1
- package/src/contact/ContactPlugin.ts +38 -14
- package/src/contact/runtime/ChatRuntime.ts +1 -1
- package/src/contact/types/ContactPluginOptions.ts +6 -0
- package/src/index.ts +16 -14
- package/src/memory/Action.ts +19 -4
- package/src/memory/runtime/Store.ts +0 -27
- package/src/memory/runtime/Writer.ts +2 -5
- package/src/skill/Command.ts +3 -33
- package/src/skill/PROMPT.ts +1 -1
- package/src/skill/PROMPT.ts.txt +5 -1
- package/src/skill/Plugin.ts +49 -156
- package/src/skill/runtime/Prompt.ts +109 -9
- package/src/skill/runtime/SystemProvider.ts +5 -9
- package/src/skill/types/SkillPlugin.ts +6 -18
- package/src/sound/Plugin.ts +699 -0
- package/src/sound/types/SoundPlugin.ts +163 -0
- package/src/task/Action.ts +8 -0
- package/src/task/runtime/Runner.ts +19 -13
- package/src/task/runtime/TaskActionExecution.ts +3 -0
- package/src/task/runtime/TaskPluginActionRegistry.ts +1 -0
- package/src/task/runtime/TaskRunChatDispatch.ts +1 -1
- package/src/task/runtime/TaskRunnerRound.ts +20 -38
- package/src/task/runtime/TaskRunnerSession.ts +108 -72
- package/src/task/runtime/TaskRunnerTypes.ts +4 -4
- package/src/task/types/TaskPluginOptions.ts +1 -0
- package/src/web/PROMPT.ts +2 -2
- package/src/web/PROMPT.ts.txt +4 -2
- package/src/web/Plugin.ts +20 -90
- package/src/web/runtime/Prompt.ts +99 -0
- package/src/web/types/WebPlugin.ts +42 -29
- package/src/workboard/runtime/Collector.ts +1 -1
- package/src/workboard/runtime/Normalizer.ts +1 -1
- package/src/workboard/runtime/SessionSummary.ts +11 -42
- package/bin/asr/Plugin.d.ts +0 -63
- package/bin/asr/Plugin.d.ts.map +0 -1
- package/bin/asr/Plugin.js +0 -280
- package/bin/asr/Plugin.js.map +0 -1
- package/bin/asr/types/AsrPlugin.d.ts +0 -114
- package/bin/asr/types/AsrPlugin.d.ts.map +0 -1
- package/bin/asr/types/AsrPlugin.js +0 -10
- package/bin/asr/types/AsrPlugin.js.map +0 -1
- package/bin/chat/runtime/ChatSession.d.ts +0 -97
- package/bin/chat/runtime/ChatSession.d.ts.map +0 -1
- package/bin/chat/runtime/ChatSession.js +0 -91
- package/bin/chat/runtime/ChatSession.js.map +0 -1
- package/bin/chat/runtime/ChatSessionContextComposer.d.ts +0 -45
- package/bin/chat/runtime/ChatSessionContextComposer.d.ts.map +0 -1
- package/bin/chat/runtime/ChatSessionContextComposer.js +0 -60
- package/bin/chat/runtime/ChatSessionContextComposer.js.map +0 -1
- package/bin/chat/runtime/ChatSessionTypes.d.ts +0 -30
- package/bin/chat/runtime/ChatSessionTypes.d.ts.map +0 -1
- package/bin/chat/runtime/ChatSessionTypes.js +0 -9
- package/bin/chat/runtime/ChatSessionTypes.js.map +0 -1
- package/bin/tts/Plugin.d.ts +0 -49
- package/bin/tts/Plugin.d.ts.map +0 -1
- package/bin/tts/Plugin.js +0 -247
- package/bin/tts/Plugin.js.map +0 -1
- package/bin/tts/types/TtsPlugin.d.ts +0 -122
- package/bin/tts/types/TtsPlugin.d.ts.map +0 -1
- package/bin/tts/types/TtsPlugin.js +0 -10
- package/bin/tts/types/TtsPlugin.js.map +0 -1
- package/bin/web/runtime/Install.d.ts +0 -19
- package/bin/web/runtime/Install.d.ts.map +0 -1
- package/bin/web/runtime/Install.js +0 -178
- package/bin/web/runtime/Install.js.map +0 -1
- package/src/asr/Plugin.ts +0 -322
- package/src/asr/types/AsrPlugin.ts +0 -118
- package/src/chat/runtime/ChatSession.ts +0 -168
- package/src/chat/runtime/ChatSessionContextComposer.ts +0 -106
- package/src/chat/runtime/ChatSessionTypes.ts +0 -32
- package/src/tts/Plugin.ts +0 -284
- package/src/tts/types/TtsPlugin.ts +0 -129
- package/src/web/runtime/Install.ts +0 -241
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SoundPlugin:统一的语音识别与语音合成插件。
|
|
3
|
+
*
|
|
4
|
+
* 关键点(中文)
|
|
5
|
+
* - 对 Agent 暴露 `models`、`asr`、`tts` 三个 action。
|
|
6
|
+
* - 模型目录与真实 ASR/TTS 能力全部由 FED/City constructor 回调注入。
|
|
7
|
+
* - 本地音频只负责读取并转换为 data URL,不加载或运行任何本地语音模型。
|
|
8
|
+
* - TTS 返回 AI SDK UIMessage,音频 file part 由 agent 统一落盘。
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs/promises";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { BasePlugin, createAction } from "@downcity/agent";
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
import { CHAT_PLUGIN_POINTS } from "../chat/runtime/PluginPoints.js";
|
|
15
|
+
const DEFAULT_SOUND_PLUGIN_NAME = "sound";
|
|
16
|
+
const DEFAULT_SOUND_PLUGIN_TITLE = "Sound";
|
|
17
|
+
const DEFAULT_SOUND_PLUGIN_DESCRIPTION = "Transcribe audio and synthesize speech through FED-provided models.";
|
|
18
|
+
const DEFAULT_AUDIO_MEDIA_TYPE = "audio/mpeg";
|
|
19
|
+
const AUDIO_MEDIA_TYPES = {
|
|
20
|
+
".aac": "audio/aac",
|
|
21
|
+
".flac": "audio/flac",
|
|
22
|
+
".m4a": "audio/mp4",
|
|
23
|
+
".mp3": "audio/mpeg",
|
|
24
|
+
".oga": "audio/ogg",
|
|
25
|
+
".ogg": "audio/ogg",
|
|
26
|
+
".opus": "audio/opus",
|
|
27
|
+
".wav": "audio/wav",
|
|
28
|
+
".webm": "audio/webm",
|
|
29
|
+
};
|
|
30
|
+
const SOUND_MODELS_INPUT_SCHEMA = z.object({
|
|
31
|
+
capability: z.enum(["asr", "tts"]).optional(),
|
|
32
|
+
}).passthrough();
|
|
33
|
+
const SOUND_ASR_INPUT_SCHEMA = z.object({
|
|
34
|
+
model: z.string().optional(),
|
|
35
|
+
audio_path: z.string().optional(),
|
|
36
|
+
url: z.string().optional(),
|
|
37
|
+
data_url: z.string().optional(),
|
|
38
|
+
language: z.string().optional(),
|
|
39
|
+
media_type: z.string().optional(),
|
|
40
|
+
filename: z.string().optional(),
|
|
41
|
+
provider_options: z.record(z.string(), z.unknown()).optional(),
|
|
42
|
+
}).passthrough();
|
|
43
|
+
const SOUND_TTS_INPUT_SCHEMA = z.object({
|
|
44
|
+
model: z.string().optional(),
|
|
45
|
+
text: z.string(),
|
|
46
|
+
language: z.string().optional(),
|
|
47
|
+
voice: z.string().optional(),
|
|
48
|
+
format: z.string().optional(),
|
|
49
|
+
speed: z.number().optional(),
|
|
50
|
+
instructions: z.string().optional(),
|
|
51
|
+
provider_options: z.record(z.string(), z.unknown()).optional(),
|
|
52
|
+
}).passthrough();
|
|
53
|
+
/**
|
|
54
|
+
* 判断值是否为普通对象。
|
|
55
|
+
*/
|
|
56
|
+
function to_record(value) {
|
|
57
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
58
|
+
return null;
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 把异常及 cause 链整理为可读文本。
|
|
63
|
+
*/
|
|
64
|
+
function describe_error(error) {
|
|
65
|
+
if (!(error instanceof Error))
|
|
66
|
+
return String(error);
|
|
67
|
+
const parts = [error.message || error.name || "Error"];
|
|
68
|
+
let current = error.cause;
|
|
69
|
+
let depth = 0;
|
|
70
|
+
while (current && depth < 3) {
|
|
71
|
+
if (!(current instanceof Error)) {
|
|
72
|
+
parts.push(String(current));
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
const code = current.code;
|
|
76
|
+
const code_text = typeof code === "string" && code ? `[${code}] ` : "";
|
|
77
|
+
parts.push(`${code_text}${current.message || current.name}`.trim());
|
|
78
|
+
current = current.cause;
|
|
79
|
+
depth += 1;
|
|
80
|
+
}
|
|
81
|
+
return parts.filter(Boolean).join(" :: ");
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 归一化可选字符串。
|
|
85
|
+
*/
|
|
86
|
+
function normalize_optional_string(value) {
|
|
87
|
+
const normalized = typeof value === "string" ? value.trim() : "";
|
|
88
|
+
return normalized || undefined;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* XML 文本转义。
|
|
92
|
+
*/
|
|
93
|
+
function escape_xml_text(value) {
|
|
94
|
+
return value
|
|
95
|
+
.replace(/&/g, "&")
|
|
96
|
+
.replace(/</g, "<")
|
|
97
|
+
.replace(/>/g, ">");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* XML 属性转义。
|
|
101
|
+
*/
|
|
102
|
+
function escape_xml_attr(value) {
|
|
103
|
+
return escape_xml_text(value).replace(/"/g, """);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* 归一化模型筛选 action 的 payload。
|
|
107
|
+
*/
|
|
108
|
+
function normalize_models_capability(payload) {
|
|
109
|
+
const record = to_record(payload ?? {});
|
|
110
|
+
if (!record) {
|
|
111
|
+
throw new TypeError("SoundPlugin.models payload must be an object");
|
|
112
|
+
}
|
|
113
|
+
const capability = normalize_optional_string(record.capability);
|
|
114
|
+
if (!capability)
|
|
115
|
+
return undefined;
|
|
116
|
+
if (capability !== "asr" && capability !== "tts") {
|
|
117
|
+
throw new TypeError("SoundPlugin.models capability must be asr or tts");
|
|
118
|
+
}
|
|
119
|
+
return capability;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 归一化 ASR action payload。
|
|
123
|
+
*/
|
|
124
|
+
function normalize_asr_payload(payload) {
|
|
125
|
+
const record = to_record(payload ?? {});
|
|
126
|
+
if (!record) {
|
|
127
|
+
throw new TypeError("SoundPlugin.asr payload must be an object");
|
|
128
|
+
}
|
|
129
|
+
const audio_path = normalize_optional_string(record.audio_path);
|
|
130
|
+
const url = normalize_optional_string(record.url);
|
|
131
|
+
const data_url = normalize_optional_string(record.data_url);
|
|
132
|
+
const source_count = [audio_path, url, data_url].filter(Boolean).length;
|
|
133
|
+
if (source_count !== 1) {
|
|
134
|
+
throw new TypeError("SoundPlugin.asr requires exactly one of audio_path, url, or data_url");
|
|
135
|
+
}
|
|
136
|
+
return {
|
|
137
|
+
...record,
|
|
138
|
+
...(audio_path ? { audio_path } : {}),
|
|
139
|
+
...(url ? { url } : {}),
|
|
140
|
+
...(data_url ? { data_url } : {}),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* 归一化 TTS action payload。
|
|
145
|
+
*/
|
|
146
|
+
function normalize_tts_payload(payload) {
|
|
147
|
+
const record = to_record(payload ?? {});
|
|
148
|
+
if (!record) {
|
|
149
|
+
throw new TypeError("SoundPlugin.tts payload must be an object");
|
|
150
|
+
}
|
|
151
|
+
const text = normalize_optional_string(record.text);
|
|
152
|
+
if (!text) {
|
|
153
|
+
throw new TypeError("SoundPlugin.tts requires text");
|
|
154
|
+
}
|
|
155
|
+
return {
|
|
156
|
+
...record,
|
|
157
|
+
text,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* 推断本地音频 MIME 类型。
|
|
162
|
+
*/
|
|
163
|
+
function infer_audio_media_type(file_path, fallback) {
|
|
164
|
+
const normalized_fallback = normalize_optional_string(fallback);
|
|
165
|
+
if (normalized_fallback)
|
|
166
|
+
return normalized_fallback;
|
|
167
|
+
return AUDIO_MEDIA_TYPES[path.extname(file_path).toLowerCase()] ?? DEFAULT_AUDIO_MEDIA_TYPE;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* 把本地音频读取为 FED 可直接接收的 data URL。
|
|
171
|
+
*/
|
|
172
|
+
async function local_audio_to_data_url(input) {
|
|
173
|
+
const file_path = path.isAbsolute(input.audio_path)
|
|
174
|
+
? path.resolve(input.audio_path)
|
|
175
|
+
: path.resolve(input.root_path, input.audio_path);
|
|
176
|
+
const media_type = infer_audio_media_type(file_path, input.media_type);
|
|
177
|
+
const bytes = await fs.readFile(file_path);
|
|
178
|
+
return {
|
|
179
|
+
data_url: `data:${media_type};base64,${bytes.toString("base64")}`,
|
|
180
|
+
media_type,
|
|
181
|
+
filename: path.basename(file_path),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* 把 Agent 公开 ASR 输入解析为可直接发送给 FED 的输入。
|
|
186
|
+
*/
|
|
187
|
+
async function resolve_asr_input(context, input) {
|
|
188
|
+
if (!input.audio_path)
|
|
189
|
+
return input;
|
|
190
|
+
const local = await local_audio_to_data_url({
|
|
191
|
+
root_path: context.rootPath,
|
|
192
|
+
audio_path: input.audio_path,
|
|
193
|
+
media_type: input.media_type,
|
|
194
|
+
});
|
|
195
|
+
const { audio_path: _audio_path, ...rest } = input;
|
|
196
|
+
return {
|
|
197
|
+
...rest,
|
|
198
|
+
data_url: local.data_url,
|
|
199
|
+
media_type: local.media_type,
|
|
200
|
+
filename: normalize_optional_string(input.filename) ?? local.filename,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* 为指定能力解析模型 ID。
|
|
205
|
+
*/
|
|
206
|
+
function resolve_model_id(capability, input_model, default_model) {
|
|
207
|
+
const model = normalize_optional_string(input_model) ?? default_model;
|
|
208
|
+
if (model)
|
|
209
|
+
return model;
|
|
210
|
+
throw new TypeError(`SoundPlugin.${capability} requires a model id; call sound.models first or configure default_${capability}_model`);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* 归一化 JSON 对象。
|
|
214
|
+
*/
|
|
215
|
+
function normalize_json_object(value) {
|
|
216
|
+
const record = to_record(value);
|
|
217
|
+
return record ? record : undefined;
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* 归一化单个 FED 语音模型。
|
|
221
|
+
*/
|
|
222
|
+
function normalize_sound_model(value) {
|
|
223
|
+
const record = to_record(value);
|
|
224
|
+
if (!record)
|
|
225
|
+
return null;
|
|
226
|
+
const id = normalize_optional_string(record.id);
|
|
227
|
+
if (!id)
|
|
228
|
+
return null;
|
|
229
|
+
const modalities = Array.isArray(record.modalities)
|
|
230
|
+
? record.modalities
|
|
231
|
+
.map((item) => normalize_optional_string(item))
|
|
232
|
+
.filter((item) => Boolean(item))
|
|
233
|
+
: [];
|
|
234
|
+
if (!modalities.includes("asr") && !modalities.includes("tts"))
|
|
235
|
+
return null;
|
|
236
|
+
const tags = Array.isArray(record.tags)
|
|
237
|
+
? record.tags
|
|
238
|
+
.map((item) => normalize_optional_string(item))
|
|
239
|
+
.filter((item) => Boolean(item))
|
|
240
|
+
: undefined;
|
|
241
|
+
const meta = normalize_json_object(record.meta);
|
|
242
|
+
return {
|
|
243
|
+
id,
|
|
244
|
+
name: normalize_optional_string(record.name) ?? id,
|
|
245
|
+
...(typeof record.description === "string"
|
|
246
|
+
? { description: record.description.trim() }
|
|
247
|
+
: {}),
|
|
248
|
+
modalities,
|
|
249
|
+
...(tags?.length ? { tags } : {}),
|
|
250
|
+
...(meta ? { meta } : {}),
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* 归一化并筛选 FED 语音模型列表。
|
|
255
|
+
*/
|
|
256
|
+
function normalize_sound_models(values, capability) {
|
|
257
|
+
const items = values
|
|
258
|
+
.map((item) => normalize_sound_model(item))
|
|
259
|
+
.filter((item) => item !== null)
|
|
260
|
+
.filter((item) => !capability || item.modalities.includes(capability));
|
|
261
|
+
return { items };
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* 校验并归一化单个 ASR 分段。
|
|
265
|
+
*/
|
|
266
|
+
function normalize_asr_segment(value) {
|
|
267
|
+
const record = to_record(value);
|
|
268
|
+
if (!record)
|
|
269
|
+
return null;
|
|
270
|
+
const text = normalize_optional_string(record.text);
|
|
271
|
+
if (!text)
|
|
272
|
+
return null;
|
|
273
|
+
const start_second = Number(record.startSecond);
|
|
274
|
+
const end_second = Number(record.endSecond);
|
|
275
|
+
if (!Number.isFinite(start_second) || !Number.isFinite(end_second))
|
|
276
|
+
return null;
|
|
277
|
+
return {
|
|
278
|
+
text,
|
|
279
|
+
startSecond: start_second,
|
|
280
|
+
endSecond: end_second,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* 校验并归一化 ASR 返回结果。
|
|
285
|
+
*/
|
|
286
|
+
function normalize_asr_result(result) {
|
|
287
|
+
const record = to_record(result);
|
|
288
|
+
const text = normalize_optional_string(record?.text);
|
|
289
|
+
if (!record || !text) {
|
|
290
|
+
throw new TypeError("SoundPlugin asr function must return transcription text");
|
|
291
|
+
}
|
|
292
|
+
const segments = Array.isArray(record.segments)
|
|
293
|
+
? record.segments
|
|
294
|
+
.map((item) => normalize_asr_segment(item))
|
|
295
|
+
.filter((item) => item !== null)
|
|
296
|
+
: undefined;
|
|
297
|
+
const language = normalize_optional_string(record.language);
|
|
298
|
+
const duration_in_seconds = Number(record.durationInSeconds);
|
|
299
|
+
return {
|
|
300
|
+
text,
|
|
301
|
+
...(segments ? { segments } : {}),
|
|
302
|
+
...(language ? { language } : {}),
|
|
303
|
+
...(Number.isFinite(duration_in_seconds) && duration_in_seconds >= 0
|
|
304
|
+
? { durationInSeconds: duration_in_seconds }
|
|
305
|
+
: {}),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* 校验 TTS 返回的 AI SDK UIMessage。
|
|
310
|
+
*/
|
|
311
|
+
function normalize_tts_result(result) {
|
|
312
|
+
const record = to_record(result);
|
|
313
|
+
if (!record || !Array.isArray(record.parts)) {
|
|
314
|
+
throw new TypeError("SoundPlugin tts function must return an AI SDK UIMessage");
|
|
315
|
+
}
|
|
316
|
+
const has_audio_file = record.parts.some((part) => {
|
|
317
|
+
const part_record = to_record(part);
|
|
318
|
+
return part_record?.type === "file"
|
|
319
|
+
&& typeof part_record.mediaType === "string"
|
|
320
|
+
&& part_record.mediaType.startsWith("audio/");
|
|
321
|
+
});
|
|
322
|
+
if (!has_audio_file) {
|
|
323
|
+
throw new TypeError("SoundPlugin tts UIMessage must contain an audio file part");
|
|
324
|
+
}
|
|
325
|
+
return result;
|
|
326
|
+
}
|
|
327
|
+
/**
|
|
328
|
+
* 生成 chat 入站附件的展示路径。
|
|
329
|
+
*/
|
|
330
|
+
function to_display_src(root_path, attachment) {
|
|
331
|
+
const raw = normalize_optional_string(attachment.path)
|
|
332
|
+
?? attachment.fileName
|
|
333
|
+
?? attachment.attachmentId
|
|
334
|
+
?? attachment.kind;
|
|
335
|
+
const normalized_root = path.resolve(root_path);
|
|
336
|
+
const normalized_raw = path.isAbsolute(raw) ? path.resolve(raw) : raw;
|
|
337
|
+
if (path.isAbsolute(normalized_raw)
|
|
338
|
+
&& normalized_raw.startsWith(`${normalized_root}${path.sep}`)) {
|
|
339
|
+
return normalized_raw.slice(normalized_root.length + 1);
|
|
340
|
+
}
|
|
341
|
+
return raw;
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* 把自动转写结果追加到 chat 正文。
|
|
345
|
+
*/
|
|
346
|
+
function append_voice_text(input, voice_blocks) {
|
|
347
|
+
const current = String(input.bodyText || "").trim();
|
|
348
|
+
const addition = voice_blocks.map((item) => item.trim()).filter(Boolean).join("\n\n");
|
|
349
|
+
if (!addition)
|
|
350
|
+
return input;
|
|
351
|
+
return {
|
|
352
|
+
...input,
|
|
353
|
+
bodyText: [current, addition].filter(Boolean).join("\n\n"),
|
|
354
|
+
};
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Agent 统一语音插件。
|
|
358
|
+
*/
|
|
359
|
+
export class SoundPlugin extends BasePlugin {
|
|
360
|
+
/** 当前 plugin 稳定名称。 */
|
|
361
|
+
name;
|
|
362
|
+
/** Plugin 展示标题。 */
|
|
363
|
+
title;
|
|
364
|
+
/** Plugin 用途说明。 */
|
|
365
|
+
description;
|
|
366
|
+
asr_handler;
|
|
367
|
+
tts_handler;
|
|
368
|
+
list_models;
|
|
369
|
+
default_asr_model;
|
|
370
|
+
default_tts_model;
|
|
371
|
+
auto_asr;
|
|
372
|
+
language;
|
|
373
|
+
voice;
|
|
374
|
+
format;
|
|
375
|
+
constructor(options) {
|
|
376
|
+
super();
|
|
377
|
+
const name = normalize_optional_string(options.name) ?? DEFAULT_SOUND_PLUGIN_NAME;
|
|
378
|
+
if (typeof options.asr !== "function") {
|
|
379
|
+
throw new TypeError("SoundPlugin requires an asr function");
|
|
380
|
+
}
|
|
381
|
+
if (typeof options.tts !== "function") {
|
|
382
|
+
throw new TypeError("SoundPlugin requires a tts function");
|
|
383
|
+
}
|
|
384
|
+
const default_asr_model = normalize_optional_string(options.default_asr_model);
|
|
385
|
+
if (options.auto_asr === true && !default_asr_model) {
|
|
386
|
+
throw new TypeError("SoundPlugin auto_asr requires default_asr_model");
|
|
387
|
+
}
|
|
388
|
+
this.name = name;
|
|
389
|
+
this.title = normalize_optional_string(options.title) ?? DEFAULT_SOUND_PLUGIN_TITLE;
|
|
390
|
+
this.description = normalize_optional_string(options.description)
|
|
391
|
+
?? DEFAULT_SOUND_PLUGIN_DESCRIPTION;
|
|
392
|
+
this.asr_handler = options.asr;
|
|
393
|
+
this.tts_handler = options.tts;
|
|
394
|
+
this.list_models = options.list_models;
|
|
395
|
+
this.default_asr_model = default_asr_model;
|
|
396
|
+
this.default_tts_model = normalize_optional_string(options.default_tts_model);
|
|
397
|
+
this.auto_asr = options.auto_asr === true;
|
|
398
|
+
this.language = normalize_optional_string(options.language);
|
|
399
|
+
this.voice = normalize_optional_string(options.voice);
|
|
400
|
+
this.format = normalize_optional_string(options.format);
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* SoundPlugin 给 Agent 的使用说明。
|
|
404
|
+
*/
|
|
405
|
+
system(_context) {
|
|
406
|
+
return [
|
|
407
|
+
"# Sound Plugin",
|
|
408
|
+
"",
|
|
409
|
+
"Use this plugin for speech recognition (ASR) and text-to-speech (TTS).",
|
|
410
|
+
"Do not call TTS for ordinary text replies unless the user explicitly requests audio.",
|
|
411
|
+
this.auto_asr
|
|
412
|
+
? "Inbound voice/audio chat attachments are automatically transcribed into `<voice src=\"...\">...</voice>` blocks."
|
|
413
|
+
: "Automatic inbound transcription is disabled; call `asr` explicitly when needed.",
|
|
414
|
+
"",
|
|
415
|
+
"## Actions",
|
|
416
|
+
"",
|
|
417
|
+
"- `models`: list FED models whose modalities include `asr` or `tts`. Pass `capability` to filter the list.",
|
|
418
|
+
"- `asr`: transcribe audio. Provide one of `audio_path`, `url`, or `data_url`.",
|
|
419
|
+
"- `tts`: synthesize speech from required `text` and return an audio file part.",
|
|
420
|
+
"",
|
|
421
|
+
"## Model selection",
|
|
422
|
+
"",
|
|
423
|
+
"Pass the selected FED model ID in `model`. When no plugin default is configured, call `models` first with the required capability.",
|
|
424
|
+
"Never use an ASR-only model for TTS or a TTS-only model for ASR.",
|
|
425
|
+
"",
|
|
426
|
+
"## Results",
|
|
427
|
+
"",
|
|
428
|
+
"ASR returns transcript text and may include timed segments, language, and duration.",
|
|
429
|
+
"TTS returns an AI SDK UIMessage. Its audio file part is saved under project resources and attached to the assistant response automatically.",
|
|
430
|
+
"Do not invent a transcript or audio result when a FED call fails.",
|
|
431
|
+
"",
|
|
432
|
+
`When unsure, use \`plugin_read { plugin: \"${this.name}\", action: \"...\" }\` to inspect the complete schema.`,
|
|
433
|
+
].join("\n");
|
|
434
|
+
}
|
|
435
|
+
/**
|
|
436
|
+
* 执行一次 ASR 转写。
|
|
437
|
+
*/
|
|
438
|
+
async transcribe(context, input) {
|
|
439
|
+
const model = resolve_model_id("asr", input.model, this.default_asr_model);
|
|
440
|
+
const resolved_input = await resolve_asr_input(context, {
|
|
441
|
+
...(this.language ? { language: this.language } : {}),
|
|
442
|
+
...input,
|
|
443
|
+
model,
|
|
444
|
+
});
|
|
445
|
+
return normalize_asr_result(await this.asr_handler(resolved_input));
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* 执行一次 TTS 合成。
|
|
449
|
+
*/
|
|
450
|
+
async synthesize(input) {
|
|
451
|
+
const model = resolve_model_id("tts", input.model, this.default_tts_model);
|
|
452
|
+
const result = await this.tts_handler({
|
|
453
|
+
...(this.language ? { language: this.language } : {}),
|
|
454
|
+
...(this.voice ? { voice: this.voice } : {}),
|
|
455
|
+
...(this.format ? { format: this.format } : {}),
|
|
456
|
+
...input,
|
|
457
|
+
model,
|
|
458
|
+
});
|
|
459
|
+
return normalize_tts_result(result);
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* 自动转写 chat 入站语音附件。
|
|
463
|
+
*/
|
|
464
|
+
async auto_transcribe_inbound(input) {
|
|
465
|
+
if (!this.auto_asr)
|
|
466
|
+
return input.value;
|
|
467
|
+
const inbound = input.value;
|
|
468
|
+
const voice_attachments = (Array.isArray(inbound.attachments) ? inbound.attachments : [])
|
|
469
|
+
.filter((item) => (item.kind === "voice" || item.kind === "audio")
|
|
470
|
+
&& Boolean(normalize_optional_string(item.path)));
|
|
471
|
+
if (voice_attachments.length === 0)
|
|
472
|
+
return input.value;
|
|
473
|
+
const voice_blocks = [];
|
|
474
|
+
for (const attachment of voice_attachments) {
|
|
475
|
+
try {
|
|
476
|
+
const result = await this.transcribe(input.context, {
|
|
477
|
+
audio_path: String(attachment.path || "").trim(),
|
|
478
|
+
...(attachment.contentType ? { media_type: attachment.contentType } : {}),
|
|
479
|
+
...(attachment.fileName ? { filename: attachment.fileName } : {}),
|
|
480
|
+
});
|
|
481
|
+
const src = to_display_src(input.context.rootPath, attachment);
|
|
482
|
+
voice_blocks.push(`<voice src="${escape_xml_attr(src)}">${escape_xml_text(result.text)}</voice>`);
|
|
483
|
+
}
|
|
484
|
+
catch {
|
|
485
|
+
// 关键点(中文):自动转写失败不阻塞 chat 主消息链路。
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
return append_voice_text(inbound, voice_blocks);
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* chat pipeline 扩展点。
|
|
492
|
+
*/
|
|
493
|
+
hooks = {
|
|
494
|
+
pipeline: {
|
|
495
|
+
[CHAT_PLUGIN_POINTS.augmentInbound]: [
|
|
496
|
+
async ({ context, value }) => await this.auto_transcribe_inbound({ context, value }),
|
|
497
|
+
],
|
|
498
|
+
},
|
|
499
|
+
};
|
|
500
|
+
/**
|
|
501
|
+
* 显式 action 集合。
|
|
502
|
+
*/
|
|
503
|
+
actions = {
|
|
504
|
+
models: createAction({
|
|
505
|
+
description: "List FED models that support ASR or TTS.",
|
|
506
|
+
input_schema: {
|
|
507
|
+
zod: SOUND_MODELS_INPUT_SCHEMA,
|
|
508
|
+
json_schema: {
|
|
509
|
+
type: "object",
|
|
510
|
+
properties: {
|
|
511
|
+
capability: {
|
|
512
|
+
type: "string",
|
|
513
|
+
enum: ["asr", "tts"],
|
|
514
|
+
description: "Optional sound capability filter.",
|
|
515
|
+
},
|
|
516
|
+
},
|
|
517
|
+
},
|
|
518
|
+
},
|
|
519
|
+
examples: [
|
|
520
|
+
{ title: "All sound models", payload: {} },
|
|
521
|
+
{ title: "ASR models", payload: { capability: "asr" } },
|
|
522
|
+
{ title: "TTS models", payload: { capability: "tts" } },
|
|
523
|
+
],
|
|
524
|
+
execute: async ({ input }) => {
|
|
525
|
+
try {
|
|
526
|
+
if (!this.list_models) {
|
|
527
|
+
throw new TypeError("SoundPlugin list_models is not configured");
|
|
528
|
+
}
|
|
529
|
+
const capability = normalize_models_capability(input);
|
|
530
|
+
const result = normalize_sound_models(await this.list_models(), capability);
|
|
531
|
+
return {
|
|
532
|
+
success: true,
|
|
533
|
+
data: result,
|
|
534
|
+
message: "sound models listed",
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
catch (error) {
|
|
538
|
+
const message = describe_error(error);
|
|
539
|
+
return { success: false, error: message, message };
|
|
540
|
+
}
|
|
541
|
+
},
|
|
542
|
+
}),
|
|
543
|
+
asr: createAction({
|
|
544
|
+
description: "Transcribe audio with a FED ASR model. Local audio paths are converted to data URLs before the FED call.",
|
|
545
|
+
input_schema: {
|
|
546
|
+
zod: SOUND_ASR_INPUT_SCHEMA,
|
|
547
|
+
json_schema: {
|
|
548
|
+
type: "object",
|
|
549
|
+
additionalProperties: true,
|
|
550
|
+
properties: {
|
|
551
|
+
model: { type: "string", description: "FED model ID supporting ASR." },
|
|
552
|
+
audio_path: { type: "string", description: "Absolute or project-relative local audio path." },
|
|
553
|
+
url: { type: "string", description: "Remote audio URL." },
|
|
554
|
+
data_url: { type: "string", description: "Audio data URL." },
|
|
555
|
+
language: { type: "string", description: "Optional language hint." },
|
|
556
|
+
media_type: { type: "string", description: "Optional audio MIME type." },
|
|
557
|
+
filename: { type: "string", description: "Optional original file name." },
|
|
558
|
+
},
|
|
559
|
+
},
|
|
560
|
+
},
|
|
561
|
+
examples: [
|
|
562
|
+
{ title: "Local audio", payload: { model: "asr-model-id", audio_path: "./input.wav" } },
|
|
563
|
+
{ title: "Remote audio", payload: { model: "asr-model-id", url: "https://example.com/audio.mp3" } },
|
|
564
|
+
],
|
|
565
|
+
execute: async ({ context, input }) => {
|
|
566
|
+
try {
|
|
567
|
+
const result = await this.transcribe(context, normalize_asr_payload(input));
|
|
568
|
+
return {
|
|
569
|
+
success: true,
|
|
570
|
+
data: result,
|
|
571
|
+
message: "audio transcribed",
|
|
572
|
+
};
|
|
573
|
+
}
|
|
574
|
+
catch (error) {
|
|
575
|
+
const message = describe_error(error);
|
|
576
|
+
return { success: false, error: message, message };
|
|
577
|
+
}
|
|
578
|
+
},
|
|
579
|
+
}),
|
|
580
|
+
tts: createAction({
|
|
581
|
+
description: "Synthesize speech with a FED TTS model and return an AI SDK UIMessage containing audio.",
|
|
582
|
+
input_schema: {
|
|
583
|
+
zod: SOUND_TTS_INPUT_SCHEMA,
|
|
584
|
+
json_schema: {
|
|
585
|
+
type: "object",
|
|
586
|
+
additionalProperties: true,
|
|
587
|
+
required: ["text"],
|
|
588
|
+
properties: {
|
|
589
|
+
model: { type: "string", description: "FED model ID supporting TTS." },
|
|
590
|
+
text: { type: "string", description: "Text to synthesize." },
|
|
591
|
+
language: { type: "string", description: "Optional language hint." },
|
|
592
|
+
voice: { type: "string", description: "Optional voice ID." },
|
|
593
|
+
format: { type: "string", description: "Optional audio format." },
|
|
594
|
+
speed: { type: "number", description: "Optional speech speed." },
|
|
595
|
+
instructions: { type: "string", description: "Optional voice style instructions." },
|
|
596
|
+
},
|
|
597
|
+
},
|
|
598
|
+
},
|
|
599
|
+
examples: [
|
|
600
|
+
{ title: "Default voice", payload: { model: "tts-model-id", text: "Hello, world" } },
|
|
601
|
+
{
|
|
602
|
+
title: "Specific voice",
|
|
603
|
+
payload: { model: "tts-model-id", text: "Welcome back", voice: "alloy", format: "mp3" },
|
|
604
|
+
},
|
|
605
|
+
],
|
|
606
|
+
execute: async ({ input }) => {
|
|
607
|
+
try {
|
|
608
|
+
const result = await this.synthesize(normalize_tts_payload(input));
|
|
609
|
+
return {
|
|
610
|
+
success: true,
|
|
611
|
+
data: result,
|
|
612
|
+
message: "speech synthesized",
|
|
613
|
+
};
|
|
614
|
+
}
|
|
615
|
+
catch (error) {
|
|
616
|
+
const message = describe_error(error);
|
|
617
|
+
return { success: false, error: message, message };
|
|
618
|
+
}
|
|
619
|
+
},
|
|
620
|
+
}),
|
|
621
|
+
};
|
|
622
|
+
}
|
|
623
|
+
//# sourceMappingURL=Plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Plugin.js","sourceRoot":"","sources":["../../src/sound/Plugin.ts"],"names":[],"mappings":"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"}
|