@spinabot/brigade 1.11.2 → 1.13.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/README.md +56 -0
- package/dist/agents/tools/edge-tts.d.ts +44 -0
- package/dist/agents/tools/edge-tts.d.ts.map +1 -0
- package/dist/agents/tools/edge-tts.js +142 -0
- package/dist/agents/tools/edge-tts.js.map +1 -0
- package/dist/agents/tools/generate-music-tool.d.ts +61 -0
- package/dist/agents/tools/generate-music-tool.d.ts.map +1 -0
- package/dist/agents/tools/generate-music-tool.js +286 -0
- package/dist/agents/tools/generate-music-tool.js.map +1 -0
- package/dist/agents/tools/generate-speech-tool.d.ts +69 -0
- package/dist/agents/tools/generate-speech-tool.d.ts.map +1 -0
- package/dist/agents/tools/generate-speech-tool.js +331 -0
- package/dist/agents/tools/generate-speech-tool.js.map +1 -0
- package/dist/agents/tools/generate-video-tool.d.ts +111 -0
- package/dist/agents/tools/generate-video-tool.d.ts.map +1 -0
- package/dist/agents/tools/generate-video-tool.js +1028 -0
- package/dist/agents/tools/generate-video-tool.js.map +1 -0
- package/dist/agents/tools/media-command.d.ts +47 -0
- package/dist/agents/tools/media-command.d.ts.map +1 -0
- package/dist/agents/tools/media-command.js +93 -0
- package/dist/agents/tools/media-command.js.map +1 -0
- package/dist/agents/tools/registry.d.ts.map +1 -1
- package/dist/agents/tools/registry.js +27 -0
- package/dist/agents/tools/registry.js.map +1 -1
- package/dist/agents/tools/transcribe-audio-tool.d.ts +96 -0
- package/dist/agents/tools/transcribe-audio-tool.d.ts.map +1 -0
- package/dist/agents/tools/transcribe-audio-tool.js +577 -0
- package/dist/agents/tools/transcribe-audio-tool.js.map +1 -0
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/connect.d.ts +6 -0
- package/dist/cli/commands/connect.d.ts.map +1 -1
- package/dist/cli/commands/connect.js +7 -0
- package/dist/cli/commands/connect.js.map +1 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/doctor.js +2 -1
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/expose.d.ts.map +1 -1
- package/dist/cli/commands/expose.js +22 -3
- package/dist/cli/commands/expose.js.map +1 -1
- package/dist/cli/commands/gateway.d.ts +12 -0
- package/dist/cli/commands/gateway.d.ts.map +1 -1
- package/dist/cli/commands/gateway.js +114 -2
- package/dist/cli/commands/gateway.js.map +1 -1
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +2 -1
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/program/build-program.d.ts.map +1 -1
- package/dist/cli/program/build-program.js +36 -0
- package/dist/cli/program/build-program.js.map +1 -1
- package/dist/config/io.d.ts +13 -0
- package/dist/config/io.d.ts.map +1 -1
- package/dist/config/io.js.map +1 -1
- package/dist/core/gateway-auth.d.ts +86 -0
- package/dist/core/gateway-auth.d.ts.map +1 -0
- package/dist/core/gateway-auth.js +156 -0
- package/dist/core/gateway-auth.js.map +1 -0
- package/dist/core/gateway-probe.d.ts +5 -0
- package/dist/core/gateway-probe.d.ts.map +1 -1
- package/dist/core/gateway-probe.js +2 -1
- package/dist/core/gateway-probe.js.map +1 -1
- package/dist/core/gateway-spawn.d.ts.map +1 -1
- package/dist/core/gateway-spawn.js +5 -2
- package/dist/core/gateway-spawn.js.map +1 -1
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +21 -1
- package/dist/core/server.js.map +1 -1
- package/dist/core/tunnel/auth-proxy.d.ts +3 -2
- package/dist/core/tunnel/auth-proxy.d.ts.map +1 -1
- package/dist/core/tunnel/auth-proxy.js +8 -34
- package/dist/core/tunnel/auth-proxy.js.map +1 -1
- package/dist/core/tunnel/manager.d.ts +4 -2
- package/dist/core/tunnel/manager.d.ts.map +1 -1
- package/dist/core/tunnel/manager.js +3 -2
- package/dist/core/tunnel/manager.js.map +1 -1
- package/dist/tui/client.d.ts +8 -0
- package/dist/tui/client.d.ts.map +1 -1
- package/dist/tui/client.js +5 -1
- package/dist/tui/client.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `generate_music` tool — text-to-music generation, modeled on the proven
|
|
3
|
+
* `generate_speech` self-contained pattern.
|
|
4
|
+
*
|
|
5
|
+
* Why this tool exists
|
|
6
|
+
* --------------------
|
|
7
|
+
* Same reasoning as `generate_speech`/`generate_image`: without a first-class
|
|
8
|
+
* tool, "make a song" / "compose background music" sends the model to raw
|
|
9
|
+
* `curl` against a music API — the key flows through a shell, the (binary or
|
|
10
|
+
* base64) audio response gets mangled by a text-only parser, and a billed
|
|
11
|
+
* generation is dropped. This tool owns the call in-process: stored auth,
|
|
12
|
+
* validated params, a parser that understands each provider's audio shape, and
|
|
13
|
+
* a saved file the model hands to `send_media`.
|
|
14
|
+
*
|
|
15
|
+
* Providers (auto-selected by which key is configured, preference order):
|
|
16
|
+
* • google — Lyria via Gemini generateContent (AUDIO modality) → base64
|
|
17
|
+
* audio (mp3). Single POST, no poll.
|
|
18
|
+
* • minimax — Music generation → URL or inline (hex/base64) audio (mp3).
|
|
19
|
+
* • elevenlabs — Music endpoint → raw mp3 bytes.
|
|
20
|
+
* Keys resolve through `resolveMediaProviderKey` (the same credential-store +
|
|
21
|
+
* env path the media-understanding subsystem uses), so music generation works
|
|
22
|
+
* for whichever provider the operator already configured — no bespoke auth.
|
|
23
|
+
*
|
|
24
|
+
* Flow: generate → bytes saved under `<cache>/audio/` → result text carries a
|
|
25
|
+
* `MEDIA:<saved-path>` line → the model delivers with `send_media({path})`.
|
|
26
|
+
*/
|
|
27
|
+
import fs from "node:fs";
|
|
28
|
+
import path from "node:path";
|
|
29
|
+
import { Type } from "typebox";
|
|
30
|
+
import { resolveCacheDir, DEFAULT_AGENT_ID } from "../../config/paths.js";
|
|
31
|
+
import { loadConfig } from "../../core/config.js";
|
|
32
|
+
import { resolveMediaProviderKey } from "../media-understanding/config.js";
|
|
33
|
+
import { jsonResult } from "./common.js";
|
|
34
|
+
/** Music generation can take a while; bound each HTTP call generously. */
|
|
35
|
+
const REQUEST_TIMEOUT_MS = 180_000;
|
|
36
|
+
/** Hard cap on prompt length — providers reject very long prompts; fail clearly. */
|
|
37
|
+
const MAX_PROMPT_CHARS = 8_000;
|
|
38
|
+
/** Preference order when no provider is pinned: first keyed one wins. */
|
|
39
|
+
const PROVIDER_PREFERENCE = ["google", "minimax", "elevenlabs"];
|
|
40
|
+
const DEFAULTS = {
|
|
41
|
+
google: { model: "lyria-3-clip-preview" },
|
|
42
|
+
minimax: { model: "music-2.5+" },
|
|
43
|
+
elevenlabs: { model: "" },
|
|
44
|
+
};
|
|
45
|
+
const GenerateMusicParams = Type.Object({
|
|
46
|
+
action: Type.Optional(Type.Union([Type.Literal("generate"), Type.Literal("list")], {
|
|
47
|
+
description: 'Optional: "generate" (default) or "list" to see which music providers are configured.',
|
|
48
|
+
})),
|
|
49
|
+
prompt: Type.Optional(Type.String({ description: "The style/description of the music to generate (e.g. 'upbeat lo-fi hip hop with mellow piano')." })),
|
|
50
|
+
lyrics: Type.Optional(Type.String({ description: "Optional lyrics for vocal tracks (ignored when instrumental)." })),
|
|
51
|
+
instrumental: Type.Optional(Type.Boolean({ description: "Optional: when true, generate instrumental-only (no vocals)." })),
|
|
52
|
+
provider: Type.Optional(Type.Union([Type.Literal("google"), Type.Literal("minimax"), Type.Literal("elevenlabs")], { description: "Optional music provider override. Default: the first one with a configured key." })),
|
|
53
|
+
model: Type.Optional(Type.String({ description: "Optional model override for the chosen provider." })),
|
|
54
|
+
durationSeconds: Type.Optional(Type.Integer({ description: "Optional target length in seconds (where the provider supports it, e.g. ElevenLabs)." })),
|
|
55
|
+
filename: Type.Optional(Type.String({ description: "Optional output filename hint (basename preserved, saved under the managed audio dir)." })),
|
|
56
|
+
});
|
|
57
|
+
export function makeGenerateMusicTool(opts = {}) {
|
|
58
|
+
const agentId = opts.agentId ?? DEFAULT_AGENT_ID;
|
|
59
|
+
const fetchFn = opts.fetchFn ?? fetch;
|
|
60
|
+
const resolveKey = opts.resolveKey ?? ((p) => resolveMediaProviderKey(p, agentId));
|
|
61
|
+
return {
|
|
62
|
+
name: "generate_music",
|
|
63
|
+
label: "Generate Music",
|
|
64
|
+
displaySummary: "generating music",
|
|
65
|
+
// Billed per call (cloud music generation) — owner-gated like generate_speech.
|
|
66
|
+
ownerOnly: true,
|
|
67
|
+
description: [
|
|
68
|
+
"Generate music from a text description (text-to-music). USE THIS — never call a music API with bash/curl: the key must not flow through a shell, and the binary/base64 audio response is parsed here.",
|
|
69
|
+
'action="generate" (default): requires `prompt` (the style/description). Saves an audio file and returns its REAL path as a `MEDIA:<path>` line — reference that path exactly; never invent one.',
|
|
70
|
+
"Optional `lyrics`, `instrumental`, `durationSeconds`. Auto-selects the first configured provider (Google → MiniMax → ElevenLabs); override with `provider`/`model`.",
|
|
71
|
+
"To play it for the operator on a chat surface, follow up with `send_media({path})` — generation does NOT auto-send.",
|
|
72
|
+
'action="list": show which music providers have a configured key.',
|
|
73
|
+
].join(" "),
|
|
74
|
+
parameters: GenerateMusicParams,
|
|
75
|
+
execute: async (_id, args, signal) => {
|
|
76
|
+
const action = args.action ?? "generate";
|
|
77
|
+
if (action === "list") {
|
|
78
|
+
const providers = PROVIDER_PREFERENCE.filter((p) => resolveKey(p).length > 0);
|
|
79
|
+
return jsonResult({
|
|
80
|
+
action,
|
|
81
|
+
providers,
|
|
82
|
+
ok: true,
|
|
83
|
+
message: providers.length > 0
|
|
84
|
+
? `${providers.length} music provider(s) configured: ${providers.join(", ")}.`
|
|
85
|
+
: "No music provider configured. Add a Google, MiniMax, or ElevenLabs key with `brigade onboard`.",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const prompt = (args.prompt ?? "").trim();
|
|
89
|
+
if (!prompt) {
|
|
90
|
+
return fail(action, "`prompt` is required for action=generate.");
|
|
91
|
+
}
|
|
92
|
+
if (prompt.length > MAX_PROMPT_CHARS) {
|
|
93
|
+
return fail(action, `\`prompt\` is too long (${prompt.length} chars; max ${MAX_PROMPT_CHARS}). Shorten it.`);
|
|
94
|
+
}
|
|
95
|
+
const instrumental = args.instrumental === true;
|
|
96
|
+
const lyrics = args.lyrics?.trim() || undefined;
|
|
97
|
+
// Instrumental + lyrics is contradictory — refuse rather than silently drop one.
|
|
98
|
+
if (instrumental && lyrics) {
|
|
99
|
+
return fail(action, "`instrumental` and `lyrics` cannot both be set — pick one (instrumental = no vocals).");
|
|
100
|
+
}
|
|
101
|
+
// Resolve the provider: explicit override (must be keyed) else first keyed.
|
|
102
|
+
let provider;
|
|
103
|
+
if (args.provider) {
|
|
104
|
+
if (resolveKey(args.provider).length === 0) {
|
|
105
|
+
return fail(action, `Provider "${args.provider}" has no configured key. Add one with \`brigade onboard\`, or omit \`provider\` to auto-select.`);
|
|
106
|
+
}
|
|
107
|
+
provider = args.provider;
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
provider = PROVIDER_PREFERENCE.find((p) => resolveKey(p).length > 0);
|
|
111
|
+
}
|
|
112
|
+
if (!provider) {
|
|
113
|
+
return fail(action, "No music provider is configured. Add a Google, MiniMax, or ElevenLabs API key with `brigade onboard` (then this tool auto-selects it).");
|
|
114
|
+
}
|
|
115
|
+
const apiKey = resolveKey(provider);
|
|
116
|
+
const model = args.model?.trim() || resolveConfiguredModel(provider) || DEFAULTS[provider].model;
|
|
117
|
+
const durationSeconds = typeof args.durationSeconds === "number" && Number.isFinite(args.durationSeconds) && args.durationSeconds > 0
|
|
118
|
+
? Math.trunc(args.durationSeconds)
|
|
119
|
+
: undefined;
|
|
120
|
+
let audio;
|
|
121
|
+
try {
|
|
122
|
+
audio = await generate({ provider, fetchFn, apiKey, model, prompt, lyrics, instrumental, durationSeconds, signal });
|
|
123
|
+
}
|
|
124
|
+
catch (err) {
|
|
125
|
+
return fail(action, `Music generation via ${provider} failed: ${err instanceof Error ? err.message : String(err)}`, {
|
|
126
|
+
provider,
|
|
127
|
+
model,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
const outDir = opts.outDirOverride ?? path.join(resolveCacheDir(), "audio");
|
|
131
|
+
fs.mkdirSync(outDir, { recursive: true });
|
|
132
|
+
const outPath = path.join(outDir, buildFileName(args.filename, audio.extension));
|
|
133
|
+
fs.writeFileSync(outPath, audio.bytes);
|
|
134
|
+
return {
|
|
135
|
+
content: [
|
|
136
|
+
{
|
|
137
|
+
type: "text",
|
|
138
|
+
text: [
|
|
139
|
+
`Generated music with ${model ? `${provider}/${model}` : provider}.`,
|
|
140
|
+
`MEDIA:${outPath}`,
|
|
141
|
+
"Deliver with send_media({path}) — generation does not auto-send.",
|
|
142
|
+
].join("\n"),
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
details: { action, provider, model, path: outPath, ok: true },
|
|
146
|
+
};
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
async function generate(params) {
|
|
151
|
+
switch (params.provider) {
|
|
152
|
+
case "google":
|
|
153
|
+
return generateGoogle(params);
|
|
154
|
+
case "minimax":
|
|
155
|
+
return generateMiniMax(params);
|
|
156
|
+
case "elevenlabs":
|
|
157
|
+
return generateElevenLabs(params);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
async function generateGoogle(p) {
|
|
161
|
+
// Lyria via Gemini generateContent. Assemble the textual prompt with the
|
|
162
|
+
// instrumental hint and lyrics folded in (the API takes a single text part).
|
|
163
|
+
let text = p.prompt;
|
|
164
|
+
if (p.instrumental)
|
|
165
|
+
text += "\n\nInstrumental only. No vocals.";
|
|
166
|
+
if (p.lyrics)
|
|
167
|
+
text += `\n\nLyrics:\n${p.lyrics}`;
|
|
168
|
+
const url = `https://generativelanguage.googleapis.com/v1beta/models/${encodeURIComponent(p.model)}:generateContent?key=${encodeURIComponent(p.apiKey)}`;
|
|
169
|
+
const res = await p.fetchFn(url, {
|
|
170
|
+
method: "POST",
|
|
171
|
+
headers: { "Content-Type": "application/json" },
|
|
172
|
+
body: JSON.stringify({
|
|
173
|
+
contents: [{ parts: [{ text }] }],
|
|
174
|
+
generationConfig: { responseModalities: ["AUDIO", "TEXT"] },
|
|
175
|
+
}),
|
|
176
|
+
signal: withTimeout(p.signal, REQUEST_TIMEOUT_MS),
|
|
177
|
+
});
|
|
178
|
+
if (!res.ok)
|
|
179
|
+
throw new Error(`HTTP ${res.status} ${(await safeText(res)).slice(0, 200)}`);
|
|
180
|
+
const body = (await res.json());
|
|
181
|
+
const part = body.candidates?.[0]?.content?.parts?.find((x) => x.inlineData?.data);
|
|
182
|
+
const data = part?.inlineData?.data;
|
|
183
|
+
if (!data)
|
|
184
|
+
throw new Error("Lyria returned no audio data.");
|
|
185
|
+
const bytes = Buffer.from(data, "base64");
|
|
186
|
+
// Lyria returns mp3 by default. (If the mimeType ever reports raw PCM/L16 the
|
|
187
|
+
// bytes won't be playable as-is, but the documented default is mp3.)
|
|
188
|
+
return { bytes, extension: "mp3" };
|
|
189
|
+
}
|
|
190
|
+
async function generateMiniMax(p) {
|
|
191
|
+
const reqBody = {
|
|
192
|
+
model: p.model || "music-2.5+",
|
|
193
|
+
prompt: p.prompt,
|
|
194
|
+
output_format: "url",
|
|
195
|
+
audio_setting: { sample_rate: 44100, bitrate: 256000, format: "mp3" },
|
|
196
|
+
};
|
|
197
|
+
if (p.instrumental)
|
|
198
|
+
reqBody.is_instrumental = true;
|
|
199
|
+
if (p.lyrics)
|
|
200
|
+
reqBody.lyrics = p.lyrics;
|
|
201
|
+
const res = await p.fetchFn("https://api.minimax.io/v1/music_generation", {
|
|
202
|
+
method: "POST",
|
|
203
|
+
headers: { Authorization: `Bearer ${p.apiKey}`, "Content-Type": "application/json" },
|
|
204
|
+
body: JSON.stringify(reqBody),
|
|
205
|
+
signal: withTimeout(p.signal, REQUEST_TIMEOUT_MS),
|
|
206
|
+
});
|
|
207
|
+
if (!res.ok)
|
|
208
|
+
throw new Error(`HTTP ${res.status} ${(await safeText(res)).slice(0, 200)}`);
|
|
209
|
+
const body = (await res.json());
|
|
210
|
+
if (body.base_resp && body.base_resp.status_code !== 0) {
|
|
211
|
+
throw new Error(`MiniMax error ${body.base_resp.status_code}: ${body.base_resp.status_msg ?? ""}`);
|
|
212
|
+
}
|
|
213
|
+
// Prefer an explicit URL field; otherwise the audio field may be a URL or inline.
|
|
214
|
+
const urlValue = body.data?.audio_url ?? body.audio_url;
|
|
215
|
+
const audioValue = body.data?.audio ?? body.audio;
|
|
216
|
+
const candidate = urlValue ?? audioValue;
|
|
217
|
+
if (!candidate)
|
|
218
|
+
throw new Error("MiniMax returned no audio.");
|
|
219
|
+
if (/^https?:\/\//.test(candidate)) {
|
|
220
|
+
const bytes = await downloadBytes(p.fetchFn, candidate, p.signal);
|
|
221
|
+
return { bytes, extension: "mp3" };
|
|
222
|
+
}
|
|
223
|
+
// Inline: hex (only [0-9a-f], even length) → hex; else base64.
|
|
224
|
+
const isHex = candidate.length % 2 === 0 && /^[0-9a-f]+$/.test(candidate);
|
|
225
|
+
const bytes = Buffer.from(candidate, isHex ? "hex" : "base64");
|
|
226
|
+
return { bytes, extension: "mp3" };
|
|
227
|
+
}
|
|
228
|
+
async function generateElevenLabs(p) {
|
|
229
|
+
const reqBody = { prompt: p.prompt };
|
|
230
|
+
if (p.durationSeconds)
|
|
231
|
+
reqBody.music_length_ms = p.durationSeconds * 1000;
|
|
232
|
+
const res = await p.fetchFn("https://api.elevenlabs.io/v1/music", {
|
|
233
|
+
method: "POST",
|
|
234
|
+
headers: { "xi-api-key": p.apiKey, "Content-Type": "application/json", Accept: "audio/mpeg" },
|
|
235
|
+
body: JSON.stringify(reqBody),
|
|
236
|
+
signal: withTimeout(p.signal, REQUEST_TIMEOUT_MS),
|
|
237
|
+
});
|
|
238
|
+
if (!res.ok)
|
|
239
|
+
throw new Error(`HTTP ${res.status} ${(await safeText(res)).slice(0, 200)}`);
|
|
240
|
+
return { bytes: Buffer.from(await res.arrayBuffer()), extension: "mp3" };
|
|
241
|
+
}
|
|
242
|
+
/* ───────────────────────── helpers ───────────────────────── */
|
|
243
|
+
async function downloadBytes(fetchFn, url, signal) {
|
|
244
|
+
const res = await fetchFn(url, { method: "GET", signal: withTimeout(signal, REQUEST_TIMEOUT_MS) });
|
|
245
|
+
if (!res.ok)
|
|
246
|
+
throw new Error(`download HTTP ${res.status} ${(await safeText(res)).slice(0, 200)}`);
|
|
247
|
+
return Buffer.from(await res.arrayBuffer());
|
|
248
|
+
}
|
|
249
|
+
function resolveConfiguredModel(provider) {
|
|
250
|
+
try {
|
|
251
|
+
const cfg = loadConfig();
|
|
252
|
+
const m = cfg.tools?.music?.models?.[provider];
|
|
253
|
+
if (typeof m === "string" && m.trim())
|
|
254
|
+
return m.trim();
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
/* default below */
|
|
258
|
+
}
|
|
259
|
+
return undefined;
|
|
260
|
+
}
|
|
261
|
+
function buildFileName(hint, extension) {
|
|
262
|
+
const stamp = Date.now().toString(36);
|
|
263
|
+
const base = hint
|
|
264
|
+
? path.basename(hint).replace(/\.[a-z0-9]+$/i, "").replace(/[^a-zA-Z0-9._-]/g, "_").slice(0, 48)
|
|
265
|
+
: `music-${stamp}`;
|
|
266
|
+
return `${base}.${extension}`;
|
|
267
|
+
}
|
|
268
|
+
function fail(action, message, extra = {}) {
|
|
269
|
+
return jsonResult({ action, ok: false, message, ...extra });
|
|
270
|
+
}
|
|
271
|
+
async function safeText(res) {
|
|
272
|
+
try {
|
|
273
|
+
return await res.text();
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return "";
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/** Compose the caller's signal with a hard per-request timeout. */
|
|
280
|
+
function withTimeout(signal, ms) {
|
|
281
|
+
const timeoutSignal = AbortSignal.timeout(ms);
|
|
282
|
+
if (!signal)
|
|
283
|
+
return timeoutSignal;
|
|
284
|
+
return AbortSignal.any([signal, timeoutSignal]);
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=generate-music-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-music-tool.js","sourceRoot":"","sources":["../../../src/agents/tools/generate-music-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `generate_speech` tool — text-to-speech (TTS), modeled on the proven
|
|
3
|
+
* `generate_image` self-contained pattern.
|
|
4
|
+
*
|
|
5
|
+
* Why this tool exists
|
|
6
|
+
* --------------------
|
|
7
|
+
* Same reasoning as `generate_image`: without a first-class tool, "read this
|
|
8
|
+
* out loud" / "make a voiceover" sends the model to raw `curl` against a TTS
|
|
9
|
+
* API — the key flows through a shell, the (binary) audio response gets
|
|
10
|
+
* mangled by a text-only parser, and a billed synthesis is dropped. This tool
|
|
11
|
+
* owns the call in-process: stored auth, validated params, a parser that
|
|
12
|
+
* understands each provider's audio shape, and a saved file the model hands to
|
|
13
|
+
* `send_media`.
|
|
14
|
+
*
|
|
15
|
+
* Providers (auto-selected by which key is configured, preference order):
|
|
16
|
+
* • openai — POST /v1/audio/speech → mp3 bytes (gpt-4o-mini-tts / tts-1)
|
|
17
|
+
* • elevenlabs — POST /v1/text-to-speech/{voice} → mp3 bytes
|
|
18
|
+
* • google — Gemini TTS generateContent (AUDIO modality) → base64 PCM,
|
|
19
|
+
* wrapped into a WAV container here.
|
|
20
|
+
* Keys resolve through `resolveMediaProviderKey` (the same credential-store +
|
|
21
|
+
* env path the media-understanding subsystem uses), so TTS works for whichever
|
|
22
|
+
* provider the operator already configured — no bespoke auth.
|
|
23
|
+
*
|
|
24
|
+
* Flow: synthesize → bytes saved under `<cache>/audio/` → result text carries a
|
|
25
|
+
* `MEDIA:<saved-path>` line → the model delivers with `send_media({path})`.
|
|
26
|
+
*/
|
|
27
|
+
import { Type } from "typebox";
|
|
28
|
+
import { type CommandRunner } from "./media-command.js";
|
|
29
|
+
import type { BrigadeTool } from "./types.js";
|
|
30
|
+
type SpeechProviderId = "openai" | "elevenlabs" | "google" | "minimax" | "xai" | "command" | "edge";
|
|
31
|
+
declare const GenerateSpeechParams: Type.TObject<{
|
|
32
|
+
action: Type.TOptional<Type.TUnion<[Type.TLiteral<"generate">, Type.TLiteral<"list">]>>;
|
|
33
|
+
text: Type.TOptional<Type.TString>;
|
|
34
|
+
provider: Type.TOptional<Type.TUnion<[Type.TLiteral<"openai">, Type.TLiteral<"elevenlabs">, Type.TLiteral<"google">, Type.TLiteral<"minimax">, Type.TLiteral<"xai">, Type.TLiteral<"command">, Type.TLiteral<"edge">]>>;
|
|
35
|
+
voice: Type.TOptional<Type.TString>;
|
|
36
|
+
model: Type.TOptional<Type.TString>;
|
|
37
|
+
filename: Type.TOptional<Type.TString>;
|
|
38
|
+
}>;
|
|
39
|
+
interface GenerateSpeechDetails {
|
|
40
|
+
action: "generate" | "list";
|
|
41
|
+
provider?: string;
|
|
42
|
+
model?: string;
|
|
43
|
+
voice?: string;
|
|
44
|
+
path?: string;
|
|
45
|
+
providers?: string[];
|
|
46
|
+
ok: boolean;
|
|
47
|
+
message?: string;
|
|
48
|
+
}
|
|
49
|
+
export interface MakeGenerateSpeechToolOptions {
|
|
50
|
+
/** Caller's agent id — drives which credential store backs the key. */
|
|
51
|
+
agentId?: string;
|
|
52
|
+
/** Test seam: replaces global fetch. */
|
|
53
|
+
fetchFn?: typeof fetch;
|
|
54
|
+
/** Test seam: output directory override. Default `<cache>/audio`. */
|
|
55
|
+
outDirOverride?: string;
|
|
56
|
+
/** Test seam: per-provider API-key resolver override. */
|
|
57
|
+
resolveKey?: (provider: SpeechProviderId) => string;
|
|
58
|
+
/** Test seam: replace the free Edge WebSocket synth (the `edge` provider has no key). */
|
|
59
|
+
edgeSynth?: (text: string, voice: string, signal?: AbortSignal) => Promise<Buffer>;
|
|
60
|
+
/** Test seam: the local-TTS command template (else resolved from env/config). */
|
|
61
|
+
ttsCommand?: string;
|
|
62
|
+
/** Test seam: the local-command runner (else a real spawn). */
|
|
63
|
+
commandRunner?: CommandRunner;
|
|
64
|
+
}
|
|
65
|
+
export declare function makeGenerateSpeechTool(opts?: MakeGenerateSpeechToolOptions): BrigadeTool<typeof GenerateSpeechParams, GenerateSpeechDetails>;
|
|
66
|
+
/** Wrap raw 16-bit mono little-endian PCM in a minimal WAV (RIFF) container. */
|
|
67
|
+
export declare function wrapPcmAsWav(pcm: Buffer, sampleRate: number, channels?: number, bitsPerSample?: number): Buffer;
|
|
68
|
+
export {};
|
|
69
|
+
//# sourceMappingURL=generate-speech-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-speech-tool.d.ts","sourceRoot":"","sources":["../../../src/agents/tools/generate-speech-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAKH,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM/B,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEvE,OAAO,KAAK,EAAmB,WAAW,EAAE,MAAM,YAAY,CAAC;AAO/D,KAAK,gBAAgB,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,CAAC;AAkBpG,QAAA,MAAM,oBAAoB;;;;;;;EAuBxB,CAAC;AAEH,UAAU,qBAAqB;IAC9B,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,6BAA6B;IAC7C,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,yDAAyD;IACzD,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,MAAM,CAAC;IACpD,yFAAyF;IACzF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnF,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,+DAA+D;IAC/D,aAAa,CAAC,EAAE,aAAa,CAAC;CAC9B;AAED,wBAAgB,sBAAsB,CACrC,IAAI,GAAE,6BAAkC,GACtC,WAAW,CAAC,OAAO,oBAAoB,EAAE,qBAAqB,CAAC,CAyGjE;AAqJD,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,SAAI,EAAE,aAAa,SAAK,GAAG,MAAM,CAkBtG"}
|