@brotu/ai 0.1.0 → 0.2.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/CATALOG.md +154 -2
- package/LICENSE +1 -1
- package/README.md +202 -58
- package/dist/adapters/google.adapter.d.ts +4 -2
- package/dist/adapters/google.adapter.d.ts.map +1 -1
- package/dist/adapters/openai.adapter.d.ts +2 -1
- package/dist/adapters/openai.adapter.d.ts.map +1 -1
- package/dist/catalog.cjs +114 -17
- package/dist/catalog.js +1 -1
- package/dist/{chunk-GKLTQ55S.js → chunk-PL534BFN.js} +118 -17
- package/dist/index.cjs +356 -32
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +243 -16
- package/dist/providers/google.models.d.ts +23 -0
- package/dist/providers/google.models.d.ts.map +1 -1
- package/dist/providers/openai.models.d.ts +7 -0
- package/dist/providers/openai.models.d.ts.map +1 -1
- package/package.json +6 -2
package/dist/index.cjs
CHANGED
|
@@ -37,8 +37,11 @@ __export(index_exports, {
|
|
|
37
37
|
ELEVENLABS_MODELS: () => ELEVENLABS_MODELS,
|
|
38
38
|
ELEVENLABS_OUTPUT_FORMATS: () => ELEVENLABS_OUTPUT_FORMATS,
|
|
39
39
|
ElevenLabsAdapter: () => ElevenLabsAdapter,
|
|
40
|
+
GOOGLE_AUDIO_MODELS: () => GOOGLE_AUDIO_MODELS,
|
|
40
41
|
GOOGLE_CATALOG: () => GOOGLE_CATALOG,
|
|
41
42
|
GOOGLE_IMAGE_MODELS: () => GOOGLE_IMAGE_MODELS,
|
|
43
|
+
GOOGLE_TEXT_MODELS: () => GOOGLE_TEXT_MODELS,
|
|
44
|
+
GOOGLE_TTS_VOICES: () => GOOGLE_TTS_VOICES,
|
|
42
45
|
GOOGLE_VIDEO_MODELS: () => GOOGLE_VIDEO_MODELS,
|
|
43
46
|
GoogleAdapter: () => GoogleAdapter,
|
|
44
47
|
KLING_CAPABILITIES: () => KLING_CAPABILITIES,
|
|
@@ -47,6 +50,7 @@ __export(index_exports, {
|
|
|
47
50
|
KlingAdapter: () => KlingAdapter,
|
|
48
51
|
OPENAI_CATALOG: () => OPENAI_CATALOG,
|
|
49
52
|
OPENAI_IMAGE_MODELS: () => OPENAI_IMAGE_MODELS,
|
|
53
|
+
OPENAI_TEXT_MODELS: () => OPENAI_TEXT_MODELS,
|
|
50
54
|
OpenAIAdapter: () => OpenAIAdapter,
|
|
51
55
|
PendingJob: () => PendingJob,
|
|
52
56
|
QWEN_AUDIO_MODELS: () => QWEN_AUDIO_MODELS,
|
|
@@ -398,6 +402,55 @@ var GOOGLE_VIDEO_MODELS = {
|
|
|
398
402
|
conversationalEditing: true
|
|
399
403
|
}
|
|
400
404
|
};
|
|
405
|
+
var GOOGLE_TEXT_MODELS = {
|
|
406
|
+
"gemini-3.7-flash": { usdPerMillionOutput: 3.75 },
|
|
407
|
+
"gemini-3.6-flash": { usdPerMillionOutput: 3.75 },
|
|
408
|
+
"gemini-3.5-flash": { usdPerMillionOutput: 9 },
|
|
409
|
+
"gemini-3.5-flash-lite": {},
|
|
410
|
+
"gemini-3.1-flash-lite": {},
|
|
411
|
+
"gemini-3.1-pro-preview": { usdPerMillionOutput: 12 },
|
|
412
|
+
"gemini-3-flash-preview": {},
|
|
413
|
+
"gemini-2.5-pro": {},
|
|
414
|
+
"gemini-2.5-flash": {},
|
|
415
|
+
"gemini-2.5-flash-lite": {}
|
|
416
|
+
};
|
|
417
|
+
var GOOGLE_TTS_VOICES = [
|
|
418
|
+
"Zephyr",
|
|
419
|
+
"Puck",
|
|
420
|
+
"Charon",
|
|
421
|
+
"Kore",
|
|
422
|
+
"Fenrir",
|
|
423
|
+
"Leda",
|
|
424
|
+
"Orus",
|
|
425
|
+
"Aoede",
|
|
426
|
+
"Callirrhoe",
|
|
427
|
+
"Autonoe",
|
|
428
|
+
"Enceladus",
|
|
429
|
+
"Iapetus",
|
|
430
|
+
"Umbriel",
|
|
431
|
+
"Algieba",
|
|
432
|
+
"Despina",
|
|
433
|
+
"Erinome",
|
|
434
|
+
"Algenib",
|
|
435
|
+
"Rasalgethi",
|
|
436
|
+
"Laomedeia",
|
|
437
|
+
"Achernar",
|
|
438
|
+
"Alnilam",
|
|
439
|
+
"Schedar",
|
|
440
|
+
"Gacrux",
|
|
441
|
+
"Pulcherrima",
|
|
442
|
+
"Achird",
|
|
443
|
+
"Zubenelgenubi",
|
|
444
|
+
"Vindemiatrix",
|
|
445
|
+
"Sadachbia",
|
|
446
|
+
"Sadaltager",
|
|
447
|
+
"Sulafat"
|
|
448
|
+
];
|
|
449
|
+
var GOOGLE_AUDIO_MODELS = {
|
|
450
|
+
"gemini-3.1-flash-tts-preview": { voices: GOOGLE_TTS_VOICES },
|
|
451
|
+
"gemini-2.5-flash-preview-tts": { voices: GOOGLE_TTS_VOICES },
|
|
452
|
+
"gemini-2.5-pro-preview-tts": { voices: GOOGLE_TTS_VOICES }
|
|
453
|
+
};
|
|
401
454
|
var GOOGLE_CATALOG = [
|
|
402
455
|
...Object.entries(GOOGLE_IMAGE_MODELS).map(
|
|
403
456
|
([id, binding]) => ({
|
|
@@ -434,6 +487,35 @@ var GOOGLE_CATALOG = [
|
|
|
434
487
|
byResolution: binding.usdByResolution
|
|
435
488
|
}
|
|
436
489
|
})
|
|
490
|
+
),
|
|
491
|
+
...Object.entries(GOOGLE_TEXT_MODELS).map(
|
|
492
|
+
([id, binding]) => ({
|
|
493
|
+
id,
|
|
494
|
+
name: id,
|
|
495
|
+
category: "text",
|
|
496
|
+
inputType: "image_optional",
|
|
497
|
+
nodeTypes: ["text"],
|
|
498
|
+
creditsPerUnit: 0,
|
|
499
|
+
creditUnit: "token",
|
|
500
|
+
provider: "google",
|
|
501
|
+
pricing: binding.usdPerMillionOutput === void 0 ? void 0 : {
|
|
502
|
+
unit: "token",
|
|
503
|
+
usdPerUnit: binding.usdPerMillionOutput / 1e6
|
|
504
|
+
}
|
|
505
|
+
})
|
|
506
|
+
),
|
|
507
|
+
...Object.entries(GOOGLE_AUDIO_MODELS).map(
|
|
508
|
+
([id, binding]) => ({
|
|
509
|
+
id,
|
|
510
|
+
name: id,
|
|
511
|
+
category: "audio",
|
|
512
|
+
inputType: "text_only",
|
|
513
|
+
nodeTypes: ["text"],
|
|
514
|
+
creditsPerUnit: 0,
|
|
515
|
+
creditUnit: "character",
|
|
516
|
+
provider: "google",
|
|
517
|
+
description: `Voices: ${binding.voices.join(", ")}`
|
|
518
|
+
})
|
|
437
519
|
)
|
|
438
520
|
];
|
|
439
521
|
|
|
@@ -824,23 +906,42 @@ var OPENAI_IMAGE_MODELS = {
|
|
|
824
906
|
usd: { low: 0.011, medium: 0.042, high: 0.167 }
|
|
825
907
|
}
|
|
826
908
|
};
|
|
827
|
-
var
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
909
|
+
var OPENAI_TEXT_MODELS = {
|
|
910
|
+
"gpt-5.6-sol": { usdPerMillionOutput: 30 },
|
|
911
|
+
"gpt-5.6-terra": { usdPerMillionOutput: 12 },
|
|
912
|
+
"gpt-5.6-luna": { usdPerMillionOutput: 1.2 }
|
|
913
|
+
};
|
|
914
|
+
var OPENAI_CATALOG = [
|
|
915
|
+
...Object.entries(OPENAI_IMAGE_MODELS).map(([id, binding]) => ({
|
|
916
|
+
id,
|
|
917
|
+
name: id,
|
|
918
|
+
category: "image",
|
|
919
|
+
inputType: "image_optional",
|
|
920
|
+
nodeTypes: ["image_gen"],
|
|
921
|
+
creditsPerUnit: 0,
|
|
922
|
+
creditUnit: "image",
|
|
923
|
+
supportedResolutions: binding.sizes === "any" ? void 0 : binding.sizes,
|
|
924
|
+
provider: "openai",
|
|
925
|
+
// Medium is the sane middle; `quality: auto` can silently pick high, which
|
|
926
|
+
// is 35x the low tier.
|
|
927
|
+
pricing: { usdPerUnit: binding.usd.medium, unit: "image" },
|
|
928
|
+
description: binding.shutdownOn ? `Deprecated \u2014 OpenAI shuts this down on ${binding.shutdownOn}.` : void 0
|
|
929
|
+
})),
|
|
930
|
+
...Object.entries(OPENAI_TEXT_MODELS).map(([id, binding]) => ({
|
|
931
|
+
id,
|
|
932
|
+
name: id,
|
|
933
|
+
category: "text",
|
|
934
|
+
inputType: "image_optional",
|
|
935
|
+
nodeTypes: ["text"],
|
|
936
|
+
creditsPerUnit: 0,
|
|
937
|
+
creditUnit: "token",
|
|
938
|
+
provider: "openai",
|
|
939
|
+
pricing: {
|
|
940
|
+
unit: "token",
|
|
941
|
+
usdPerUnit: binding.usdPerMillionOutput / 1e6
|
|
942
|
+
}
|
|
943
|
+
}))
|
|
944
|
+
];
|
|
844
945
|
|
|
845
946
|
// src/providers/qwen.models.ts
|
|
846
947
|
var VIDEO_PATH = "/api/v1/services/aigc/video-generation/video-synthesis";
|
|
@@ -1763,7 +1864,12 @@ var POLL_INTERVAL_MS2 = 1e4;
|
|
|
1763
1864
|
var DEFAULT_MAX_POLL_ATTEMPTS2 = 120;
|
|
1764
1865
|
var GoogleAdapter = class {
|
|
1765
1866
|
providerName = "google";
|
|
1766
|
-
supportedTypes = [
|
|
1867
|
+
supportedTypes = [
|
|
1868
|
+
"image",
|
|
1869
|
+
"video",
|
|
1870
|
+
"text",
|
|
1871
|
+
"audio"
|
|
1872
|
+
];
|
|
1767
1873
|
opts;
|
|
1768
1874
|
constructor(opts) {
|
|
1769
1875
|
this.opts = opts;
|
|
@@ -2085,17 +2191,143 @@ var GoogleAdapter = class {
|
|
|
2085
2191
|
generateVideo(params) {
|
|
2086
2192
|
return this.runVideo(params);
|
|
2087
2193
|
}
|
|
2088
|
-
|
|
2089
|
-
|
|
2194
|
+
textBody(modelId, params) {
|
|
2195
|
+
const input = [
|
|
2196
|
+
{ type: "text", text: params.prompt }
|
|
2197
|
+
];
|
|
2198
|
+
for (const image of params.referenceImages ?? []) {
|
|
2199
|
+
const [meta, data] = image.split(",");
|
|
2200
|
+
input.push({
|
|
2201
|
+
type: "image",
|
|
2202
|
+
mime_type: meta?.match(/data:([^;]+)/)?.[1] ?? "image/png",
|
|
2203
|
+
data: data ?? image
|
|
2204
|
+
});
|
|
2205
|
+
}
|
|
2206
|
+
return {
|
|
2207
|
+
model: modelId,
|
|
2208
|
+
input,
|
|
2209
|
+
...params.systemPrompt ? { instructions: params.systemPrompt } : {},
|
|
2210
|
+
generation_config: {
|
|
2211
|
+
...params.maxTokens ? { max_output_tokens: params.maxTokens } : {},
|
|
2212
|
+
...params.temperature !== void 0 ? { temperature: params.temperature } : {},
|
|
2213
|
+
...params.topP !== void 0 ? { top_p: params.topP } : {}
|
|
2214
|
+
},
|
|
2215
|
+
...params.providerOptions?.google ?? {}
|
|
2216
|
+
};
|
|
2090
2217
|
}
|
|
2091
|
-
|
|
2092
|
-
|
|
2218
|
+
speechBody(modelId, params, voice) {
|
|
2219
|
+
return {
|
|
2220
|
+
model: modelId,
|
|
2221
|
+
input: params.prompt,
|
|
2222
|
+
response_format: { type: "audio" },
|
|
2223
|
+
generation_config: {
|
|
2224
|
+
speech_config: [{ voice }]
|
|
2225
|
+
},
|
|
2226
|
+
...params.providerOptions?.google ?? {}
|
|
2227
|
+
};
|
|
2228
|
+
}
|
|
2229
|
+
async generateText(params) {
|
|
2230
|
+
const startedAt = Date.now();
|
|
2231
|
+
const modelId = params.model ?? "";
|
|
2232
|
+
const failure = (error) => ({
|
|
2233
|
+
success: false,
|
|
2234
|
+
outputs: [],
|
|
2235
|
+
creditsUsed: 0,
|
|
2236
|
+
provider: this.providerName,
|
|
2237
|
+
model: modelId,
|
|
2238
|
+
processingTimeMs: Date.now() - startedAt,
|
|
2239
|
+
error
|
|
2240
|
+
});
|
|
2241
|
+
if (!(modelId in GOOGLE_TEXT_MODELS)) {
|
|
2242
|
+
return failure(
|
|
2243
|
+
`"${modelId}" is not a Gemini text model. Known: ${Object.keys(GOOGLE_TEXT_MODELS).join(", ")}.`
|
|
2244
|
+
);
|
|
2245
|
+
}
|
|
2246
|
+
try {
|
|
2247
|
+
const payload = await this.request(
|
|
2248
|
+
INTERACTIONS_PATH,
|
|
2249
|
+
{
|
|
2250
|
+
method: "POST",
|
|
2251
|
+
body: this.textBody(modelId, params)
|
|
2252
|
+
}
|
|
2253
|
+
);
|
|
2254
|
+
const text = payload.output_text ?? payload.steps?.flatMap((step) => step.content ?? []).find((part) => part.type === "text" || part.text)?.text;
|
|
2255
|
+
if (!text) return failure("Google returned no text.");
|
|
2256
|
+
return {
|
|
2257
|
+
success: true,
|
|
2258
|
+
outputs: [
|
|
2259
|
+
{
|
|
2260
|
+
url: `data:text/plain;base64,${Buffer.from(text).toString("base64")}`,
|
|
2261
|
+
mimeType: "text/plain",
|
|
2262
|
+
raw: { text }
|
|
2263
|
+
}
|
|
2264
|
+
],
|
|
2265
|
+
creditsUsed: 0,
|
|
2266
|
+
provider: this.providerName,
|
|
2267
|
+
model: modelId,
|
|
2268
|
+
processingTimeMs: Date.now() - startedAt
|
|
2269
|
+
};
|
|
2270
|
+
} catch (error) {
|
|
2271
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
2272
|
+
}
|
|
2273
|
+
}
|
|
2274
|
+
async generateAudio(params) {
|
|
2275
|
+
const startedAt = Date.now();
|
|
2276
|
+
const modelId = params.model ?? "";
|
|
2277
|
+
const failure = (error) => ({
|
|
2278
|
+
success: false,
|
|
2279
|
+
outputs: [],
|
|
2280
|
+
creditsUsed: 0,
|
|
2281
|
+
provider: this.providerName,
|
|
2282
|
+
model: modelId,
|
|
2283
|
+
processingTimeMs: Date.now() - startedAt,
|
|
2284
|
+
error
|
|
2285
|
+
});
|
|
2286
|
+
const binding = GOOGLE_AUDIO_MODELS[modelId];
|
|
2287
|
+
if (!binding) {
|
|
2288
|
+
return failure(
|
|
2289
|
+
`"${modelId}" is not a Gemini speech model. Known: ${Object.keys(GOOGLE_AUDIO_MODELS).join(", ")}.`
|
|
2290
|
+
);
|
|
2291
|
+
}
|
|
2292
|
+
const voice = params.voice ?? "Kore";
|
|
2293
|
+
if (!binding.voices.includes(voice)) {
|
|
2294
|
+
return failure(
|
|
2295
|
+
`Gemini TTS offers ${GOOGLE_TTS_VOICES.join(", ")}, not "${voice}".`
|
|
2296
|
+
);
|
|
2297
|
+
}
|
|
2298
|
+
try {
|
|
2299
|
+
const payload = await this.request(
|
|
2300
|
+
INTERACTIONS_PATH,
|
|
2301
|
+
{
|
|
2302
|
+
method: "POST",
|
|
2303
|
+
body: this.speechBody(modelId, params, voice)
|
|
2304
|
+
}
|
|
2305
|
+
);
|
|
2306
|
+
const data = payload.output_audio?.data;
|
|
2307
|
+
if (!data) return failure("Google returned no audio.");
|
|
2308
|
+
return {
|
|
2309
|
+
success: true,
|
|
2310
|
+
outputs: [
|
|
2311
|
+
{
|
|
2312
|
+
url: `data:audio/wav;base64,${data}`,
|
|
2313
|
+
mimeType: "audio/wav",
|
|
2314
|
+
raw: { inline: true, voice }
|
|
2315
|
+
}
|
|
2316
|
+
],
|
|
2317
|
+
creditsUsed: 0,
|
|
2318
|
+
provider: this.providerName,
|
|
2319
|
+
model: modelId,
|
|
2320
|
+
processingTimeMs: Date.now() - startedAt
|
|
2321
|
+
};
|
|
2322
|
+
} catch (error) {
|
|
2323
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
2324
|
+
}
|
|
2093
2325
|
}
|
|
2094
2326
|
async estimateCost(type, params) {
|
|
2095
2327
|
return estimateFor(this.providerName, type, params);
|
|
2096
2328
|
}
|
|
2097
2329
|
supportsModel(model) {
|
|
2098
|
-
return model in GOOGLE_IMAGE_MODELS || model in GOOGLE_VIDEO_MODELS;
|
|
2330
|
+
return model in GOOGLE_IMAGE_MODELS || model in GOOGLE_VIDEO_MODELS || model in GOOGLE_TEXT_MODELS || model in GOOGLE_AUDIO_MODELS;
|
|
2099
2331
|
}
|
|
2100
2332
|
getAvailableModels() {
|
|
2101
2333
|
return [
|
|
@@ -2108,6 +2340,16 @@ var GoogleAdapter = class {
|
|
|
2108
2340
|
id,
|
|
2109
2341
|
name: id,
|
|
2110
2342
|
type: "video"
|
|
2343
|
+
})),
|
|
2344
|
+
...Object.keys(GOOGLE_TEXT_MODELS).map((id) => ({
|
|
2345
|
+
id,
|
|
2346
|
+
name: id,
|
|
2347
|
+
type: "text"
|
|
2348
|
+
})),
|
|
2349
|
+
...Object.keys(GOOGLE_AUDIO_MODELS).map((id) => ({
|
|
2350
|
+
id,
|
|
2351
|
+
name: id,
|
|
2352
|
+
type: "audio"
|
|
2111
2353
|
}))
|
|
2112
2354
|
];
|
|
2113
2355
|
}
|
|
@@ -2464,7 +2706,7 @@ var IMAGES_PATH2 = "/v1/images/generations";
|
|
|
2464
2706
|
var OpenAIAdapter = class {
|
|
2465
2707
|
providerName = "openai";
|
|
2466
2708
|
// No video: the Videos API shuts down on 24 September 2026.
|
|
2467
|
-
supportedTypes = ["image"];
|
|
2709
|
+
supportedTypes = ["image", "text"];
|
|
2468
2710
|
opts;
|
|
2469
2711
|
constructor(opts) {
|
|
2470
2712
|
this.opts = opts;
|
|
@@ -2579,8 +2821,79 @@ var OpenAIAdapter = class {
|
|
|
2579
2821
|
generateAudio(_params) {
|
|
2580
2822
|
throw new Error("OpenAI has no speech synthesis wired up here.");
|
|
2581
2823
|
}
|
|
2582
|
-
|
|
2583
|
-
|
|
2824
|
+
textBody(params) {
|
|
2825
|
+
const content = params.referenceImages?.length ? [
|
|
2826
|
+
{ type: "input_text", text: params.prompt },
|
|
2827
|
+
...params.referenceImages.map((url) => ({
|
|
2828
|
+
type: "input_image",
|
|
2829
|
+
image_url: url
|
|
2830
|
+
}))
|
|
2831
|
+
] : params.prompt;
|
|
2832
|
+
const input = [];
|
|
2833
|
+
if (params.systemPrompt) {
|
|
2834
|
+
input.push({ role: "system", content: params.systemPrompt });
|
|
2835
|
+
}
|
|
2836
|
+
input.push({ role: "user", content });
|
|
2837
|
+
return {
|
|
2838
|
+
model: params.model,
|
|
2839
|
+
input,
|
|
2840
|
+
...params.maxTokens ? { max_output_tokens: params.maxTokens } : {},
|
|
2841
|
+
...params.temperature !== void 0 ? { temperature: params.temperature } : {},
|
|
2842
|
+
...params.topP !== void 0 ? { top_p: params.topP } : {},
|
|
2843
|
+
...params.providerOptions?.openai ?? {}
|
|
2844
|
+
};
|
|
2845
|
+
}
|
|
2846
|
+
async generateText(params) {
|
|
2847
|
+
const startedAt = Date.now();
|
|
2848
|
+
const modelId = params.model ?? "";
|
|
2849
|
+
const failure = (error) => ({
|
|
2850
|
+
success: false,
|
|
2851
|
+
outputs: [],
|
|
2852
|
+
creditsUsed: 0,
|
|
2853
|
+
provider: this.providerName,
|
|
2854
|
+
model: modelId,
|
|
2855
|
+
processingTimeMs: Date.now() - startedAt,
|
|
2856
|
+
error
|
|
2857
|
+
});
|
|
2858
|
+
if (!(modelId in OPENAI_TEXT_MODELS)) {
|
|
2859
|
+
return failure(
|
|
2860
|
+
`"${modelId}" is not an OpenAI text model. Known: ${Object.keys(OPENAI_TEXT_MODELS).join(", ")}.`
|
|
2861
|
+
);
|
|
2862
|
+
}
|
|
2863
|
+
try {
|
|
2864
|
+
const response = await fetch(`${this.baseUrl}/v1/responses`, {
|
|
2865
|
+
method: "POST",
|
|
2866
|
+
headers: {
|
|
2867
|
+
Authorization: `Bearer ${this.opts.apiKey}`,
|
|
2868
|
+
"Content-Type": "application/json",
|
|
2869
|
+
...this.opts.organization ? { "OpenAI-Organization": this.opts.organization } : {}
|
|
2870
|
+
},
|
|
2871
|
+
body: JSON.stringify(this.textBody(params))
|
|
2872
|
+
});
|
|
2873
|
+
const payload = await response.json();
|
|
2874
|
+
if (payload.error) throw new Error(payload.error.message);
|
|
2875
|
+
if (!response.ok) {
|
|
2876
|
+
throw new Error(`OpenAI returned ${response.status}.`);
|
|
2877
|
+
}
|
|
2878
|
+
const text = payload.output_text ?? payload.output?.flatMap((item) => item.content ?? []).find((part) => part.type === "output_text" || part.text)?.text;
|
|
2879
|
+
if (!text) return failure("OpenAI returned no text.");
|
|
2880
|
+
return {
|
|
2881
|
+
success: true,
|
|
2882
|
+
outputs: [
|
|
2883
|
+
{
|
|
2884
|
+
url: `data:text/plain;base64,${Buffer.from(text).toString("base64")}`,
|
|
2885
|
+
mimeType: "text/plain",
|
|
2886
|
+
raw: { text, tokens: payload.usage?.output_tokens }
|
|
2887
|
+
}
|
|
2888
|
+
],
|
|
2889
|
+
creditsUsed: 0,
|
|
2890
|
+
provider: this.providerName,
|
|
2891
|
+
model: modelId,
|
|
2892
|
+
processingTimeMs: Date.now() - startedAt
|
|
2893
|
+
};
|
|
2894
|
+
} catch (error) {
|
|
2895
|
+
return failure(error instanceof Error ? error.message : String(error));
|
|
2896
|
+
}
|
|
2584
2897
|
}
|
|
2585
2898
|
/** Synchronous provider: there is never a queued job to come back to. */
|
|
2586
2899
|
async completeJob(job) {
|
|
@@ -2601,14 +2914,21 @@ var OpenAIAdapter = class {
|
|
|
2601
2914
|
};
|
|
2602
2915
|
}
|
|
2603
2916
|
supportsModel(model) {
|
|
2604
|
-
return model in OPENAI_IMAGE_MODELS;
|
|
2917
|
+
return model in OPENAI_IMAGE_MODELS || model in OPENAI_TEXT_MODELS;
|
|
2605
2918
|
}
|
|
2606
2919
|
getAvailableModels() {
|
|
2607
|
-
return
|
|
2608
|
-
id
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2920
|
+
return [
|
|
2921
|
+
...Object.keys(OPENAI_IMAGE_MODELS).map((id) => ({
|
|
2922
|
+
id,
|
|
2923
|
+
name: id,
|
|
2924
|
+
type: "image"
|
|
2925
|
+
})),
|
|
2926
|
+
...Object.keys(OPENAI_TEXT_MODELS).map((id) => ({
|
|
2927
|
+
id,
|
|
2928
|
+
name: id,
|
|
2929
|
+
type: "text"
|
|
2930
|
+
}))
|
|
2931
|
+
];
|
|
2612
2932
|
}
|
|
2613
2933
|
};
|
|
2614
2934
|
|
|
@@ -3533,8 +3853,11 @@ function brotuClient(options) {
|
|
|
3533
3853
|
ELEVENLABS_MODELS,
|
|
3534
3854
|
ELEVENLABS_OUTPUT_FORMATS,
|
|
3535
3855
|
ElevenLabsAdapter,
|
|
3856
|
+
GOOGLE_AUDIO_MODELS,
|
|
3536
3857
|
GOOGLE_CATALOG,
|
|
3537
3858
|
GOOGLE_IMAGE_MODELS,
|
|
3859
|
+
GOOGLE_TEXT_MODELS,
|
|
3860
|
+
GOOGLE_TTS_VOICES,
|
|
3538
3861
|
GOOGLE_VIDEO_MODELS,
|
|
3539
3862
|
GoogleAdapter,
|
|
3540
3863
|
KLING_CAPABILITIES,
|
|
@@ -3543,6 +3866,7 @@ function brotuClient(options) {
|
|
|
3543
3866
|
KlingAdapter,
|
|
3544
3867
|
OPENAI_CATALOG,
|
|
3545
3868
|
OPENAI_IMAGE_MODELS,
|
|
3869
|
+
OPENAI_TEXT_MODELS,
|
|
3546
3870
|
OpenAIAdapter,
|
|
3547
3871
|
PendingJob,
|
|
3548
3872
|
QWEN_AUDIO_MODELS,
|
package/dist/index.d.ts
CHANGED
|
@@ -20,10 +20,10 @@ export { createS3Storage, persistOutputs, type S3StorageConfig, type Storage, }
|
|
|
20
20
|
export type * from "./ports/content-generator.port";
|
|
21
21
|
export { BYTEPLUS_CATALOG, BYTEPLUS_MODELS, type BytePlusModelBinding, } from "./providers/byteplus.models";
|
|
22
22
|
export { ELEVENLABS_CATALOG, ELEVENLABS_MODELS, ELEVENLABS_OUTPUT_FORMATS, } from "./providers/elevenlabs.models";
|
|
23
|
-
export { GOOGLE_CATALOG, GOOGLE_IMAGE_MODELS, GOOGLE_VIDEO_MODELS, } from "./providers/google.models";
|
|
23
|
+
export { GOOGLE_AUDIO_MODELS, GOOGLE_CATALOG, GOOGLE_IMAGE_MODELS, GOOGLE_TEXT_MODELS, GOOGLE_TTS_VOICES, GOOGLE_VIDEO_MODELS, } from "./providers/google.models";
|
|
24
24
|
export type { KlingModelBinding } from "./providers/kling.models";
|
|
25
25
|
export { type AvatarInput, type ImageOmniInput, KLING_CAPABILITIES, KLING_CATALOG, KLING_MODELS, type KlingCapability, type KlingRequestOptions, type KlingResultField, type MotionControlInput, type OmniVideoInput, type OutpaintingInput, } from "./providers/kling.models";
|
|
26
|
-
export { OPENAI_CATALOG, OPENAI_IMAGE_MODELS, } from "./providers/openai.models";
|
|
26
|
+
export { OPENAI_CATALOG, OPENAI_IMAGE_MODELS, OPENAI_TEXT_MODELS, } from "./providers/openai.models";
|
|
27
27
|
export { QWEN_AUDIO_MODELS, QWEN_CATALOG, QWEN_IMAGE_MODELS, QWEN_TEXT_MODELS, QWEN_VIDEO_MODELS, type QwenImageBinding, type QwenVideoBinding, } from "./providers/qwen.models";
|
|
28
28
|
export type { BrotuAIOptions, ProviderConfig, ReferenceVideoInfo, ResolvedProvider, } from "./types";
|
|
29
29
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EACX,wBAAwB,EACxB,eAAe,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACN,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,mBAAmB,yBAAyB,CAAC;AAC7C,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,IAAI,EACJ,KAAK,UAAU,EACf,EAAE,EACF,KAAK,MAAM,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,YAAY,EACZ,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,UAAU,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,eAAe,EACf,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,GACZ,MAAM,eAAe,CAAC;AACvB,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,KAAK,oBAAoB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,cAAc,EACd,mBAAmB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,YAAY,EACX,wBAAwB,EACxB,eAAe,GACf,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EACN,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,QAAQ,EACR,cAAc,EACd,YAAY,EACZ,eAAe,GACf,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,mBAAmB,yBAAyB,CAAC;AAC7C,OAAO,EACN,KAAK,OAAO,EACZ,KAAK,WAAW,EAChB,IAAI,EACJ,KAAK,UAAU,EACf,EAAE,EACF,KAAK,MAAM,GACX,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACN,YAAY,EACZ,KAAK,GAAG,EACR,KAAK,WAAW,EAChB,KAAK,SAAS,EACd,UAAU,GACV,MAAM,YAAY,CAAC;AACpB,OAAO,EACN,eAAe,EACf,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,OAAO,GACZ,MAAM,eAAe,CAAC;AACvB,mBAAmB,gCAAgC,CAAC;AACpD,OAAO,EACN,gBAAgB,EAChB,eAAe,EACf,KAAK,oBAAoB,GACzB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACN,kBAAkB,EAClB,iBAAiB,EACjB,yBAAyB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACnB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,gBAAgB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACN,cAAc,EACd,mBAAmB,EACnB,kBAAkB,GAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACN,iBAAiB,EACjB,YAAY,EACZ,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,GACrB,MAAM,yBAAyB,CAAC;AACjC,YAAY,EACX,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GAChB,MAAM,SAAS,CAAC"}
|