@brotu/ai 0.4.0 → 0.6.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 +298 -4
- package/README.md +47 -8
- package/dist/adapters/brotu.adapter.d.ts.map +1 -1
- package/dist/adapters/topaz.adapter.d.ts +71 -0
- package/dist/adapters/topaz.adapter.d.ts.map +1 -0
- package/dist/catalog.cjs +143 -8
- package/dist/catalog.d.ts +22 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +5 -1
- package/dist/{chunk-QOWHHKSI.js → chunk-QQIHMDJC.js} +146 -9
- package/dist/client.d.ts +25 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/index.cjs +805 -75
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +610 -12
- package/dist/lib/hooks.d.ts +32 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/ports/content-generator.port.d.ts +12 -0
- package/dist/ports/content-generator.port.d.ts.map +1 -1
- package/dist/providers/topaz.models.d.ts +24 -0
- package/dist/providers/topaz.models.d.ts.map +1 -0
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/catalog.cjs
CHANGED
|
@@ -20,7 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/catalog.ts
|
|
21
21
|
var catalog_exports = {};
|
|
22
22
|
__export(catalog_exports, {
|
|
23
|
+
BROTU_SUPPORTED_CATEGORIES: () => BROTU_SUPPORTED_CATEGORIES,
|
|
23
24
|
DEFAULT_BROTU_API_URL: () => DEFAULT_BROTU_API_URL,
|
|
25
|
+
describeModels: () => describeModels,
|
|
24
26
|
getAvailableModels: () => getAvailableModels,
|
|
25
27
|
getModel: () => getModel,
|
|
26
28
|
getModels: () => getModels,
|
|
@@ -989,6 +991,105 @@ var QWEN_CATALOG = [
|
|
|
989
991
|
)
|
|
990
992
|
];
|
|
991
993
|
|
|
994
|
+
// src/providers/topaz.models.ts
|
|
995
|
+
var VIDEO_RES = ["720p", "1080p", "4k"];
|
|
996
|
+
function video(id, name, kind, description) {
|
|
997
|
+
return [id, { name, vendorModel: id, surface: "video", kind, description }];
|
|
998
|
+
}
|
|
999
|
+
function image(id, name, vendorModel, imagePath, description) {
|
|
1000
|
+
return [
|
|
1001
|
+
id,
|
|
1002
|
+
{ name, vendorModel, surface: "image", imagePath, description }
|
|
1003
|
+
];
|
|
1004
|
+
}
|
|
1005
|
+
var ENTRIES = [
|
|
1006
|
+
// Precision video upscale (Proteus family)
|
|
1007
|
+
video("prob-4", "Proteus", "upscale", "Default video upscale. Preserves the source."),
|
|
1008
|
+
video("pnat-1", "Proteus Natural", "upscale", "Softer Proteus. 2\xD7 only."),
|
|
1009
|
+
video("rhea-1", "Rhea", "upscale", "High-fidelity 4\xD7 upscale for fine detail."),
|
|
1010
|
+
video("thd-3", "Theia Fine Tune Detail", "upscale", "More aggressive detail."),
|
|
1011
|
+
video("thf-4", "Theia Fine Tune Fidelity", "upscale", "Lighter touch, closer to the source."),
|
|
1012
|
+
video("thm-2", "Themis 2", "upscale", "Motion deblur."),
|
|
1013
|
+
video("aaa-9", "Artemis Aliasing / Moire", "upscale", "Aliasing and moire cleanup."),
|
|
1014
|
+
video("ahq-12", "Artemis High Quality", "upscale", "Artemis for clean footage."),
|
|
1015
|
+
video("amq-13", "Artemis Medium Quality", "upscale", "Artemis for typical compression."),
|
|
1016
|
+
video("amqs-2", "Artemis Medium Halo", "upscale", "Medium halo reduction."),
|
|
1017
|
+
video("alq-13", "Artemis Low Quality", "upscale", "Artemis for degraded sources."),
|
|
1018
|
+
video("alqs-2", "Artemis Strong Halo", "upscale", "Strong halo reduction."),
|
|
1019
|
+
video("iris-3", "Iris Medium Quality", "upscale", "Face recovery, medium quality."),
|
|
1020
|
+
video("iris-2", "Iris Low Quality", "upscale", "Face recovery, low quality."),
|
|
1021
|
+
video("dtv-4", "Dione TV", "upscale", "Deinterlace broadcast footage."),
|
|
1022
|
+
video("ddv-3", "Dione DV", "upscale", "Deinterlace camcorder footage."),
|
|
1023
|
+
video("dtvs-2", "Dione Robust", "upscale", "Deinterlace degraded interlaced sources."),
|
|
1024
|
+
video("dtd-4", "Dione Dehalo", "upscale", "Deinterlace with halo cleanup."),
|
|
1025
|
+
video("dtds-2", "Dione Robust Dehalo", "upscale", "Deinterlace, degraded, with halo cleanup."),
|
|
1026
|
+
video("ghq-5", "Gaia High Quality", "upscale", "CGI and animation, high quality."),
|
|
1027
|
+
video("gcg-5", "Gaia CG", "upscale", "General CGI and renders."),
|
|
1028
|
+
video("nyx-3", "Nyx", "upscale", "Default video denoise."),
|
|
1029
|
+
video("nxl-1", "Nyx XL", "upscale", "Heavy video denoise."),
|
|
1030
|
+
video("nxhf-1", "Nyx High Fidelity", "upscale", "Light denoise, keep texture."),
|
|
1031
|
+
video("nxf-1", "Nyx Fast", "upscale", "Fast video denoise."),
|
|
1032
|
+
video("color-1", "Video Colorization", "upscale", "Black-and-white to color."),
|
|
1033
|
+
// Generative / creative video
|
|
1034
|
+
video("slp-2.6", "Starlight Precise 2.6", "upscale", "Generative upscale to 4K. Faces, texture, text."),
|
|
1035
|
+
video("slhq-1", "Starlight HQ", "upscale", "Maximum quality generative enhance."),
|
|
1036
|
+
video("slf-2", "Starlight Fast 2", "upscale", "Faster generative upscale."),
|
|
1037
|
+
video("slm-1", "Starlight Mini", "upscale", "Archival and interlaced restoration."),
|
|
1038
|
+
video("wonder-1", "Starlight Sharp", "upscale", "Local-first sharpening restore."),
|
|
1039
|
+
video("ast-2", "Astra 2", "upscale", "Creative GenAI video upscale."),
|
|
1040
|
+
// Frame interpolation — not upscalers
|
|
1041
|
+
video("aion-1", "Aion", "interpolation", "Extreme slow motion on complex, high-res motion."),
|
|
1042
|
+
video("apo-8", "Apollo", "interpolation", "Default slow-mo and frame-rate conversion."),
|
|
1043
|
+
video("apf-2", "Apollo Fast", "interpolation", "Faster Apollo."),
|
|
1044
|
+
video("chr-2", "Chronos", "interpolation", "Interpolation for harder motion."),
|
|
1045
|
+
video("chf-3", "Chronos Fast", "interpolation", "Faster Chronos."),
|
|
1046
|
+
// Image — Gigapixel / enhance
|
|
1047
|
+
image("standard-v2", "Standard 2", "Standard V2", "/image/v1/enhance/async", "Default image upscale."),
|
|
1048
|
+
image("high-fidelity-v2", "High Fidelity 2", "High Fidelity V2", "/image/v1/enhance/async", "Maximum source preservation."),
|
|
1049
|
+
image("low-resolution-v2", "Low Resolution 2", "Low Resolution V2", "/image/v1/enhance/async", "Tiny or heavily compressed sources."),
|
|
1050
|
+
image("cgi", "Art & CGI", "CGI", "/image/v1/enhance/async", "Illustrations, renders, game art."),
|
|
1051
|
+
image("text-refine", "Text & Shapes", "Text Refine", "/image/v1/enhance/async", "Documents, screenshots, type."),
|
|
1052
|
+
// Image — generative enhance
|
|
1053
|
+
image("standard-max", "Standard Max", "Standard MAX", "/image/v1/enhance-gen/async", "Default generative image upscale."),
|
|
1054
|
+
image("wonder", "Wonder", "Wonder", "/image/v1/enhance-gen/async", "One-click generative restore."),
|
|
1055
|
+
image("wonder-3.5", "Wonder 3.5", "Wonder 3.5", "/image/v1/enhance-gen/async", "Highest-quality generative image upscale."),
|
|
1056
|
+
image("redefine", "Redefine", "Redefine", "/image/v1/enhance-gen/async", "Prompt-guided generative enhance."),
|
|
1057
|
+
image("recovery-v2", "Recover 3", "Recovery V2", "/image/v1/enhance-gen/async", "Heavily damaged sources."),
|
|
1058
|
+
image("bloom-2", "Bloom 2", "Bloom 2", "/image/v1/enhance-gen/async", "Creative upscale for GenAI images."),
|
|
1059
|
+
image("denoise-max", "Denoise Max", "Denoise Max", "/image/v1/denoise-gen/async", "Highest-quality image denoise.")
|
|
1060
|
+
];
|
|
1061
|
+
var TOPAZ_MODELS = Object.fromEntries(
|
|
1062
|
+
ENTRIES.flatMap(([id, binding]) => {
|
|
1063
|
+
const rows = [[id, binding]];
|
|
1064
|
+
if (binding.surface === "image" && binding.vendorModel !== id) {
|
|
1065
|
+
rows.push([binding.vendorModel, binding]);
|
|
1066
|
+
}
|
|
1067
|
+
return rows;
|
|
1068
|
+
})
|
|
1069
|
+
);
|
|
1070
|
+
function nodeTypes(binding) {
|
|
1071
|
+
if (binding.surface === "image") return ["image_upscale"];
|
|
1072
|
+
return binding.kind === "interpolation" ? ["video_gen"] : ["video_upscale"];
|
|
1073
|
+
}
|
|
1074
|
+
var TOPAZ_CATALOG = ENTRIES.map(([id, binding]) => ({
|
|
1075
|
+
id,
|
|
1076
|
+
name: binding.name,
|
|
1077
|
+
category: binding.surface,
|
|
1078
|
+
inputType: binding.surface === "video" ? "video_required" : "image_required",
|
|
1079
|
+
nodeTypes: nodeTypes(binding),
|
|
1080
|
+
creditsPerUnit: 0,
|
|
1081
|
+
creditUnit: binding.surface === "video" ? "second" : "image",
|
|
1082
|
+
supportedResolutions: binding.surface === "video" ? [...VIDEO_RES] : void 0,
|
|
1083
|
+
provider: "topaz",
|
|
1084
|
+
description: binding.description
|
|
1085
|
+
}));
|
|
1086
|
+
var TOPAZ_VIDEO_MODELS = Object.fromEntries(
|
|
1087
|
+
ENTRIES.filter(([, binding]) => binding.surface === "video")
|
|
1088
|
+
);
|
|
1089
|
+
var TOPAZ_IMAGE_MODELS = Object.fromEntries(
|
|
1090
|
+
ENTRIES.filter(([, binding]) => binding.surface === "image")
|
|
1091
|
+
);
|
|
1092
|
+
|
|
992
1093
|
// src/catalog.ts
|
|
993
1094
|
var PROVIDER_BASE_URLS = {
|
|
994
1095
|
byteplus: "https://ark.ap-southeast.bytepluses.com",
|
|
@@ -997,6 +1098,7 @@ var PROVIDER_BASE_URLS = {
|
|
|
997
1098
|
google: "https://generativelanguage.googleapis.com",
|
|
998
1099
|
openai: "https://api.openai.com",
|
|
999
1100
|
qwen: "https://dashscope-intl.aliyuncs.com",
|
|
1101
|
+
topaz: "https://api.topazlabs.com",
|
|
1000
1102
|
brotu: "https://api.brotu.app"
|
|
1001
1103
|
};
|
|
1002
1104
|
var DEFAULT_BROTU_API_URL = PROVIDER_BASE_URLS.brotu;
|
|
@@ -1014,7 +1116,8 @@ var BUILT_IN = [
|
|
|
1014
1116
|
...QWEN_CATALOG,
|
|
1015
1117
|
...OPENAI_CATALOG,
|
|
1016
1118
|
...GOOGLE_CATALOG,
|
|
1017
|
-
...ELEVENLABS_CATALOG
|
|
1119
|
+
...ELEVENLABS_CATALOG,
|
|
1120
|
+
...TOPAZ_CATALOG
|
|
1018
1121
|
];
|
|
1019
1122
|
var catalog = BUILT_IN;
|
|
1020
1123
|
var catalogMap = byId(BUILT_IN);
|
|
@@ -1084,18 +1187,50 @@ function resolveProvider(modelId, options) {
|
|
|
1084
1187
|
`Model "${modelId}" runs on "${id}", but no API key was given for it (configured: ${owned}). Pass a Brotu key to generate on the platform.`
|
|
1085
1188
|
);
|
|
1086
1189
|
}
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
return catalog.filter((model) => Boolean(model.provider));
|
|
1090
|
-
}
|
|
1190
|
+
var BROTU_SUPPORTED_CATEGORIES = ["image", "video"];
|
|
1191
|
+
function describeModels(options) {
|
|
1091
1192
|
const vendors = vendorProviders(options);
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1193
|
+
const platformKey = brotuApiKey(options);
|
|
1194
|
+
return catalog.map((model) => {
|
|
1195
|
+
const provider = model.provider;
|
|
1196
|
+
if (!provider) {
|
|
1197
|
+
return {
|
|
1198
|
+
model,
|
|
1199
|
+
runsOn: "(none)",
|
|
1200
|
+
runnable: false,
|
|
1201
|
+
reason: "The model declares no provider."
|
|
1202
|
+
};
|
|
1203
|
+
}
|
|
1204
|
+
if (provider in vendors) {
|
|
1205
|
+
return { model, runsOn: provider, runnable: true };
|
|
1206
|
+
}
|
|
1207
|
+
if (platformKey) {
|
|
1208
|
+
if (BROTU_SUPPORTED_CATEGORIES.includes(model.category)) {
|
|
1209
|
+
return { model, runsOn: "brotu", runnable: true };
|
|
1210
|
+
}
|
|
1211
|
+
return {
|
|
1212
|
+
model,
|
|
1213
|
+
runsOn: provider,
|
|
1214
|
+
runnable: false,
|
|
1215
|
+
reason: `Brotu generates ${BROTU_SUPPORTED_CATEGORIES.join(" and ")} only. Pass providers.${provider} to run this one.`
|
|
1216
|
+
};
|
|
1217
|
+
}
|
|
1218
|
+
return {
|
|
1219
|
+
model,
|
|
1220
|
+
runsOn: provider,
|
|
1221
|
+
runnable: false,
|
|
1222
|
+
reason: `No key for "${provider}". Pass a Brotu key or providers.${provider}.`
|
|
1223
|
+
};
|
|
1224
|
+
});
|
|
1225
|
+
}
|
|
1226
|
+
function getAvailableModels(options) {
|
|
1227
|
+
return describeModels(options).filter((entry) => entry.runnable).map((entry) => entry.model);
|
|
1095
1228
|
}
|
|
1096
1229
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1097
1230
|
0 && (module.exports = {
|
|
1231
|
+
BROTU_SUPPORTED_CATEGORIES,
|
|
1098
1232
|
DEFAULT_BROTU_API_URL,
|
|
1233
|
+
describeModels,
|
|
1099
1234
|
getAvailableModels,
|
|
1100
1235
|
getModel,
|
|
1101
1236
|
getModels,
|
package/dist/catalog.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AIModelConfig } from "./constants/model.types";
|
|
1
|
+
import type { AIModelCategory, AIModelConfig } from "./constants/model.types";
|
|
2
2
|
import type { BrotuAIOptions, ResolvedProvider } from "./types";
|
|
3
3
|
export declare const DEFAULT_BROTU_API_URL: string;
|
|
4
4
|
/**
|
|
@@ -23,6 +23,27 @@ export declare function getProviders(): string[];
|
|
|
23
23
|
* aggregator, so there is no wallet to guess between.
|
|
24
24
|
*/
|
|
25
25
|
export declare function resolveProvider(modelId: string, options: BrotuAIOptions): ResolvedProvider;
|
|
26
|
+
/**
|
|
27
|
+
* What the platform generates on credits. Speech and text are the vendor's
|
|
28
|
+
* work, so a Brotu key alone does not reach them. The Brotu adapter reads this
|
|
29
|
+
* too, so the catalog and the adapter cannot drift apart.
|
|
30
|
+
*/
|
|
31
|
+
export declare const BROTU_SUPPORTED_CATEGORIES: AIModelCategory[];
|
|
32
|
+
/** A model plus where it would actually run with the keys at hand. */
|
|
33
|
+
export interface ModelAvailability {
|
|
34
|
+
model: AIModelConfig;
|
|
35
|
+
/** Provider that serves it: a vendor id, or "brotu" for the platform. */
|
|
36
|
+
runsOn: string;
|
|
37
|
+
/** False when nothing configured can run it. `reason` says why. */
|
|
38
|
+
runnable: boolean;
|
|
39
|
+
reason?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Every catalog model, each labelled with the host that would serve it. This is
|
|
43
|
+
* the honest view: `runnable: false` entries are the ones a key is missing for,
|
|
44
|
+
* and they stay in the list precisely so the caller can see what is missing.
|
|
45
|
+
*/
|
|
46
|
+
export declare function describeModels(options: BrotuAIOptions): ModelAvailability[];
|
|
26
47
|
/** Models the caller can actually run, given the keys they supplied. */
|
|
27
48
|
export declare function getAvailableModels(options: BrotuAIOptions): AIModelConfig[];
|
|
28
49
|
//# sourceMappingURL=catalog.d.ts.map
|
package/dist/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAW9E,OAAO,KAAK,EAAE,cAAc,EAAkB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAiBhF,eAAO,MAAM,qBAAqB,QAA2B,CAAC;AAgC9D;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,aAAa,EAAO,GAAG,IAAI,CAUjE;AAED,0EAA0E;AAC1E,wBAAgB,YAAY,IAAI,IAAI,CAGnC;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEnE;AAED,wBAAgB,SAAS,IAAI,aAAa,EAAE,CAE3C;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wDAAwD;AACxD,wBAAgB,YAAY,IAAI,MAAM,EAAE,CAQvC;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,cAAc,GACrB,gBAAgB,CAqClB;AAED;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,EAAE,eAAe,EAAuB,CAAC;AAEhF,sEAAsE;AACtE,MAAM,WAAW,iBAAiB;IACjC,KAAK,EAAE,aAAa,CAAC;IACrB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,mEAAmE;IACnE,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,EAAE,CAmC3E;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAI3E"}
|
package/dist/catalog.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
|
+
BROTU_SUPPORTED_CATEGORIES,
|
|
2
3
|
DEFAULT_BROTU_API_URL,
|
|
4
|
+
describeModels,
|
|
3
5
|
getAvailableModels,
|
|
4
6
|
getModel,
|
|
5
7
|
getModels,
|
|
@@ -8,9 +10,11 @@ import {
|
|
|
8
10
|
registerModels,
|
|
9
11
|
resetCatalog,
|
|
10
12
|
resolveProvider
|
|
11
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-QQIHMDJC.js";
|
|
12
14
|
export {
|
|
15
|
+
BROTU_SUPPORTED_CATEGORIES,
|
|
13
16
|
DEFAULT_BROTU_API_URL,
|
|
17
|
+
describeModels,
|
|
14
18
|
getAvailableModels,
|
|
15
19
|
getModel,
|
|
16
20
|
getModels,
|
|
@@ -750,7 +750,7 @@ var imageOmni = {
|
|
|
750
750
|
prompt: input.prompt
|
|
751
751
|
};
|
|
752
752
|
if (images.length > 0) {
|
|
753
|
-
body.image_list = images.map((
|
|
753
|
+
body.image_list = images.map((image2) => ({ image: image2 }));
|
|
754
754
|
}
|
|
755
755
|
if (elements.length > 0) {
|
|
756
756
|
body.element_list = elements.map((id) => ({ element_id: id }));
|
|
@@ -1152,6 +1152,105 @@ var QWEN_CATALOG = [
|
|
|
1152
1152
|
)
|
|
1153
1153
|
];
|
|
1154
1154
|
|
|
1155
|
+
// src/providers/topaz.models.ts
|
|
1156
|
+
var VIDEO_RES = ["720p", "1080p", "4k"];
|
|
1157
|
+
function video(id, name, kind, description) {
|
|
1158
|
+
return [id, { name, vendorModel: id, surface: "video", kind, description }];
|
|
1159
|
+
}
|
|
1160
|
+
function image(id, name, vendorModel, imagePath, description) {
|
|
1161
|
+
return [
|
|
1162
|
+
id,
|
|
1163
|
+
{ name, vendorModel, surface: "image", imagePath, description }
|
|
1164
|
+
];
|
|
1165
|
+
}
|
|
1166
|
+
var ENTRIES = [
|
|
1167
|
+
// Precision video upscale (Proteus family)
|
|
1168
|
+
video("prob-4", "Proteus", "upscale", "Default video upscale. Preserves the source."),
|
|
1169
|
+
video("pnat-1", "Proteus Natural", "upscale", "Softer Proteus. 2\xD7 only."),
|
|
1170
|
+
video("rhea-1", "Rhea", "upscale", "High-fidelity 4\xD7 upscale for fine detail."),
|
|
1171
|
+
video("thd-3", "Theia Fine Tune Detail", "upscale", "More aggressive detail."),
|
|
1172
|
+
video("thf-4", "Theia Fine Tune Fidelity", "upscale", "Lighter touch, closer to the source."),
|
|
1173
|
+
video("thm-2", "Themis 2", "upscale", "Motion deblur."),
|
|
1174
|
+
video("aaa-9", "Artemis Aliasing / Moire", "upscale", "Aliasing and moire cleanup."),
|
|
1175
|
+
video("ahq-12", "Artemis High Quality", "upscale", "Artemis for clean footage."),
|
|
1176
|
+
video("amq-13", "Artemis Medium Quality", "upscale", "Artemis for typical compression."),
|
|
1177
|
+
video("amqs-2", "Artemis Medium Halo", "upscale", "Medium halo reduction."),
|
|
1178
|
+
video("alq-13", "Artemis Low Quality", "upscale", "Artemis for degraded sources."),
|
|
1179
|
+
video("alqs-2", "Artemis Strong Halo", "upscale", "Strong halo reduction."),
|
|
1180
|
+
video("iris-3", "Iris Medium Quality", "upscale", "Face recovery, medium quality."),
|
|
1181
|
+
video("iris-2", "Iris Low Quality", "upscale", "Face recovery, low quality."),
|
|
1182
|
+
video("dtv-4", "Dione TV", "upscale", "Deinterlace broadcast footage."),
|
|
1183
|
+
video("ddv-3", "Dione DV", "upscale", "Deinterlace camcorder footage."),
|
|
1184
|
+
video("dtvs-2", "Dione Robust", "upscale", "Deinterlace degraded interlaced sources."),
|
|
1185
|
+
video("dtd-4", "Dione Dehalo", "upscale", "Deinterlace with halo cleanup."),
|
|
1186
|
+
video("dtds-2", "Dione Robust Dehalo", "upscale", "Deinterlace, degraded, with halo cleanup."),
|
|
1187
|
+
video("ghq-5", "Gaia High Quality", "upscale", "CGI and animation, high quality."),
|
|
1188
|
+
video("gcg-5", "Gaia CG", "upscale", "General CGI and renders."),
|
|
1189
|
+
video("nyx-3", "Nyx", "upscale", "Default video denoise."),
|
|
1190
|
+
video("nxl-1", "Nyx XL", "upscale", "Heavy video denoise."),
|
|
1191
|
+
video("nxhf-1", "Nyx High Fidelity", "upscale", "Light denoise, keep texture."),
|
|
1192
|
+
video("nxf-1", "Nyx Fast", "upscale", "Fast video denoise."),
|
|
1193
|
+
video("color-1", "Video Colorization", "upscale", "Black-and-white to color."),
|
|
1194
|
+
// Generative / creative video
|
|
1195
|
+
video("slp-2.6", "Starlight Precise 2.6", "upscale", "Generative upscale to 4K. Faces, texture, text."),
|
|
1196
|
+
video("slhq-1", "Starlight HQ", "upscale", "Maximum quality generative enhance."),
|
|
1197
|
+
video("slf-2", "Starlight Fast 2", "upscale", "Faster generative upscale."),
|
|
1198
|
+
video("slm-1", "Starlight Mini", "upscale", "Archival and interlaced restoration."),
|
|
1199
|
+
video("wonder-1", "Starlight Sharp", "upscale", "Local-first sharpening restore."),
|
|
1200
|
+
video("ast-2", "Astra 2", "upscale", "Creative GenAI video upscale."),
|
|
1201
|
+
// Frame interpolation — not upscalers
|
|
1202
|
+
video("aion-1", "Aion", "interpolation", "Extreme slow motion on complex, high-res motion."),
|
|
1203
|
+
video("apo-8", "Apollo", "interpolation", "Default slow-mo and frame-rate conversion."),
|
|
1204
|
+
video("apf-2", "Apollo Fast", "interpolation", "Faster Apollo."),
|
|
1205
|
+
video("chr-2", "Chronos", "interpolation", "Interpolation for harder motion."),
|
|
1206
|
+
video("chf-3", "Chronos Fast", "interpolation", "Faster Chronos."),
|
|
1207
|
+
// Image — Gigapixel / enhance
|
|
1208
|
+
image("standard-v2", "Standard 2", "Standard V2", "/image/v1/enhance/async", "Default image upscale."),
|
|
1209
|
+
image("high-fidelity-v2", "High Fidelity 2", "High Fidelity V2", "/image/v1/enhance/async", "Maximum source preservation."),
|
|
1210
|
+
image("low-resolution-v2", "Low Resolution 2", "Low Resolution V2", "/image/v1/enhance/async", "Tiny or heavily compressed sources."),
|
|
1211
|
+
image("cgi", "Art & CGI", "CGI", "/image/v1/enhance/async", "Illustrations, renders, game art."),
|
|
1212
|
+
image("text-refine", "Text & Shapes", "Text Refine", "/image/v1/enhance/async", "Documents, screenshots, type."),
|
|
1213
|
+
// Image — generative enhance
|
|
1214
|
+
image("standard-max", "Standard Max", "Standard MAX", "/image/v1/enhance-gen/async", "Default generative image upscale."),
|
|
1215
|
+
image("wonder", "Wonder", "Wonder", "/image/v1/enhance-gen/async", "One-click generative restore."),
|
|
1216
|
+
image("wonder-3.5", "Wonder 3.5", "Wonder 3.5", "/image/v1/enhance-gen/async", "Highest-quality generative image upscale."),
|
|
1217
|
+
image("redefine", "Redefine", "Redefine", "/image/v1/enhance-gen/async", "Prompt-guided generative enhance."),
|
|
1218
|
+
image("recovery-v2", "Recover 3", "Recovery V2", "/image/v1/enhance-gen/async", "Heavily damaged sources."),
|
|
1219
|
+
image("bloom-2", "Bloom 2", "Bloom 2", "/image/v1/enhance-gen/async", "Creative upscale for GenAI images."),
|
|
1220
|
+
image("denoise-max", "Denoise Max", "Denoise Max", "/image/v1/denoise-gen/async", "Highest-quality image denoise.")
|
|
1221
|
+
];
|
|
1222
|
+
var TOPAZ_MODELS = Object.fromEntries(
|
|
1223
|
+
ENTRIES.flatMap(([id, binding]) => {
|
|
1224
|
+
const rows = [[id, binding]];
|
|
1225
|
+
if (binding.surface === "image" && binding.vendorModel !== id) {
|
|
1226
|
+
rows.push([binding.vendorModel, binding]);
|
|
1227
|
+
}
|
|
1228
|
+
return rows;
|
|
1229
|
+
})
|
|
1230
|
+
);
|
|
1231
|
+
function nodeTypes(binding) {
|
|
1232
|
+
if (binding.surface === "image") return ["image_upscale"];
|
|
1233
|
+
return binding.kind === "interpolation" ? ["video_gen"] : ["video_upscale"];
|
|
1234
|
+
}
|
|
1235
|
+
var TOPAZ_CATALOG = ENTRIES.map(([id, binding]) => ({
|
|
1236
|
+
id,
|
|
1237
|
+
name: binding.name,
|
|
1238
|
+
category: binding.surface,
|
|
1239
|
+
inputType: binding.surface === "video" ? "video_required" : "image_required",
|
|
1240
|
+
nodeTypes: nodeTypes(binding),
|
|
1241
|
+
creditsPerUnit: 0,
|
|
1242
|
+
creditUnit: binding.surface === "video" ? "second" : "image",
|
|
1243
|
+
supportedResolutions: binding.surface === "video" ? [...VIDEO_RES] : void 0,
|
|
1244
|
+
provider: "topaz",
|
|
1245
|
+
description: binding.description
|
|
1246
|
+
}));
|
|
1247
|
+
var TOPAZ_VIDEO_MODELS = Object.fromEntries(
|
|
1248
|
+
ENTRIES.filter(([, binding]) => binding.surface === "video")
|
|
1249
|
+
);
|
|
1250
|
+
var TOPAZ_IMAGE_MODELS = Object.fromEntries(
|
|
1251
|
+
ENTRIES.filter(([, binding]) => binding.surface === "image")
|
|
1252
|
+
);
|
|
1253
|
+
|
|
1155
1254
|
// src/catalog.ts
|
|
1156
1255
|
var PROVIDER_BASE_URLS = {
|
|
1157
1256
|
byteplus: "https://ark.ap-southeast.bytepluses.com",
|
|
@@ -1160,6 +1259,7 @@ var PROVIDER_BASE_URLS = {
|
|
|
1160
1259
|
google: "https://generativelanguage.googleapis.com",
|
|
1161
1260
|
openai: "https://api.openai.com",
|
|
1162
1261
|
qwen: "https://dashscope-intl.aliyuncs.com",
|
|
1262
|
+
topaz: "https://api.topazlabs.com",
|
|
1163
1263
|
brotu: "https://api.brotu.app"
|
|
1164
1264
|
};
|
|
1165
1265
|
var DEFAULT_BROTU_API_URL = PROVIDER_BASE_URLS.brotu;
|
|
@@ -1177,7 +1277,8 @@ var BUILT_IN = [
|
|
|
1177
1277
|
...QWEN_CATALOG,
|
|
1178
1278
|
...OPENAI_CATALOG,
|
|
1179
1279
|
...GOOGLE_CATALOG,
|
|
1180
|
-
...ELEVENLABS_CATALOG
|
|
1280
|
+
...ELEVENLABS_CATALOG,
|
|
1281
|
+
...TOPAZ_CATALOG
|
|
1181
1282
|
];
|
|
1182
1283
|
var catalog = BUILT_IN;
|
|
1183
1284
|
var catalogMap = byId(BUILT_IN);
|
|
@@ -1247,14 +1348,44 @@ function resolveProvider(modelId, options) {
|
|
|
1247
1348
|
`Model "${modelId}" runs on "${id}", but no API key was given for it (configured: ${owned}). Pass a Brotu key to generate on the platform.`
|
|
1248
1349
|
);
|
|
1249
1350
|
}
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
return catalog.filter((model) => Boolean(model.provider));
|
|
1253
|
-
}
|
|
1351
|
+
var BROTU_SUPPORTED_CATEGORIES = ["image", "video"];
|
|
1352
|
+
function describeModels(options) {
|
|
1254
1353
|
const vendors = vendorProviders(options);
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1354
|
+
const platformKey = brotuApiKey(options);
|
|
1355
|
+
return catalog.map((model) => {
|
|
1356
|
+
const provider = model.provider;
|
|
1357
|
+
if (!provider) {
|
|
1358
|
+
return {
|
|
1359
|
+
model,
|
|
1360
|
+
runsOn: "(none)",
|
|
1361
|
+
runnable: false,
|
|
1362
|
+
reason: "The model declares no provider."
|
|
1363
|
+
};
|
|
1364
|
+
}
|
|
1365
|
+
if (provider in vendors) {
|
|
1366
|
+
return { model, runsOn: provider, runnable: true };
|
|
1367
|
+
}
|
|
1368
|
+
if (platformKey) {
|
|
1369
|
+
if (BROTU_SUPPORTED_CATEGORIES.includes(model.category)) {
|
|
1370
|
+
return { model, runsOn: "brotu", runnable: true };
|
|
1371
|
+
}
|
|
1372
|
+
return {
|
|
1373
|
+
model,
|
|
1374
|
+
runsOn: provider,
|
|
1375
|
+
runnable: false,
|
|
1376
|
+
reason: `Brotu generates ${BROTU_SUPPORTED_CATEGORIES.join(" and ")} only. Pass providers.${provider} to run this one.`
|
|
1377
|
+
};
|
|
1378
|
+
}
|
|
1379
|
+
return {
|
|
1380
|
+
model,
|
|
1381
|
+
runsOn: provider,
|
|
1382
|
+
runnable: false,
|
|
1383
|
+
reason: `No key for "${provider}". Pass a Brotu key or providers.${provider}.`
|
|
1384
|
+
};
|
|
1385
|
+
});
|
|
1386
|
+
}
|
|
1387
|
+
function getAvailableModels(options) {
|
|
1388
|
+
return describeModels(options).filter((entry) => entry.runnable).map((entry) => entry.model);
|
|
1258
1389
|
}
|
|
1259
1390
|
|
|
1260
1391
|
export {
|
|
@@ -1286,6 +1417,10 @@ export {
|
|
|
1286
1417
|
QWEN_AUDIO_MODELS,
|
|
1287
1418
|
QWEN_TEXT_MODELS,
|
|
1288
1419
|
QWEN_CATALOG,
|
|
1420
|
+
TOPAZ_MODELS,
|
|
1421
|
+
TOPAZ_CATALOG,
|
|
1422
|
+
TOPAZ_VIDEO_MODELS,
|
|
1423
|
+
TOPAZ_IMAGE_MODELS,
|
|
1289
1424
|
DEFAULT_BROTU_API_URL,
|
|
1290
1425
|
registerModels,
|
|
1291
1426
|
resetCatalog,
|
|
@@ -1294,5 +1429,7 @@ export {
|
|
|
1294
1429
|
hasModel,
|
|
1295
1430
|
getProviders,
|
|
1296
1431
|
resolveProvider,
|
|
1432
|
+
BROTU_SUPPORTED_CATEGORIES,
|
|
1433
|
+
describeModels,
|
|
1297
1434
|
getAvailableModels
|
|
1298
1435
|
};
|
package/dist/client.d.ts
CHANGED
|
@@ -1,32 +1,53 @@
|
|
|
1
|
-
import { getModel } from "./catalog";
|
|
1
|
+
import { getModel, type ModelAvailability } from "./catalog";
|
|
2
2
|
import type { AIModelConfig } from "./constants/model.types";
|
|
3
3
|
import { type AIError, type Generation, type Result } from "./helpers/result";
|
|
4
4
|
import { type Job, type JobSnapshot } from "./lib/jobs";
|
|
5
5
|
import { type WebhookConfig } from "./lib/webhook";
|
|
6
|
-
import type { AudioGenerationParams, CostEstimate, GenerationOutput, GenerationParams, GenerationType, ImageGenerationParams, TextGenerationParams, VideoGenerationParams } from "./ports/content-generator.port";
|
|
6
|
+
import type { AudioGenerationParams, CostEstimate, GenerationOutput, GenerationParams, GenerationType, ImageGenerationParams, ImageUpscaleParams, TextGenerationParams, VideoGenerationParams, VideoUpscaleParams } from "./ports/content-generator.port";
|
|
7
7
|
import { type AvatarInput, type ImageOmniInput, type MotionControlInput, type OmniVideoInput, type OutpaintingInput } from "./providers/kling.models";
|
|
8
8
|
import type { BrotuAIOptions } from "./types";
|
|
9
9
|
/** Providers this package ships an adapter for. */
|
|
10
|
-
export declare const NATIVE_PROVIDERS: readonly ["byteplus", "elevenlabs", "google", "kling", "openai", "qwen"];
|
|
10
|
+
export declare const NATIVE_PROVIDERS: readonly ["byteplus", "elevenlabs", "google", "kling", "openai", "qwen", "topaz"];
|
|
11
11
|
export interface BrotuAI {
|
|
12
12
|
image: {
|
|
13
13
|
/** Queue the work and return a handle. Only the submit is awaited. */
|
|
14
14
|
submit(params: ImageGenerationParams): Promise<Result<Job>>;
|
|
15
15
|
/** submit + wait. Convenient, but holds the call open for the whole run. */
|
|
16
16
|
generate(params: ImageGenerationParams): Promise<Result<Generation>>;
|
|
17
|
+
/**
|
|
18
|
+
* Every image model, each labelled with the host that would serve it
|
|
19
|
+
* (`runsOn`) and whether your keys reach it (`runnable`). Unreachable
|
|
20
|
+
* models stay in the list, with `reason`, so the gap is visible.
|
|
21
|
+
*/
|
|
22
|
+
list(): ModelAvailability[];
|
|
23
|
+
/**
|
|
24
|
+
* Enhance a still you already have. `imageUrl` is required; `prompt` is
|
|
25
|
+
* optional. Waits for the result — image upscale is usually seconds.
|
|
26
|
+
*/
|
|
27
|
+
upscale(params: ImageUpscaleParams): Promise<Result<Generation>>;
|
|
17
28
|
};
|
|
18
29
|
video: {
|
|
19
30
|
submit(params: VideoGenerationParams): Promise<Result<Job>>;
|
|
20
31
|
generate(params: VideoGenerationParams): Promise<Result<Generation>>;
|
|
32
|
+
list(): ModelAvailability[];
|
|
33
|
+
/**
|
|
34
|
+
* Enhance a video you already have. `videoUrl` is required; `prompt` is
|
|
35
|
+
* optional. Returns a handle — video upscale takes minutes.
|
|
36
|
+
*/
|
|
37
|
+
upscale(params: VideoUpscaleParams): Promise<Result<Job>>;
|
|
21
38
|
};
|
|
22
39
|
text: {
|
|
23
40
|
submit(params: TextGenerationParams): Promise<Result<Job>>;
|
|
24
41
|
generate(params: TextGenerationParams): Promise<Result<Generation>>;
|
|
42
|
+
/** Text runs on the vendor, so these need `providers`, not a Brotu key. */
|
|
43
|
+
list(): ModelAvailability[];
|
|
25
44
|
};
|
|
26
45
|
/** Speech synthesis. `prompt` is the text to speak. */
|
|
27
46
|
audio: {
|
|
28
47
|
submit(params: AudioGenerationParams): Promise<Result<Job>>;
|
|
29
48
|
generate(params: AudioGenerationParams): Promise<Result<Generation>>;
|
|
49
|
+
/** Speech runs on the vendor, so these need `providers`, not a Brotu key. */
|
|
50
|
+
list(): ModelAvailability[];
|
|
30
51
|
};
|
|
31
52
|
jobs: {
|
|
32
53
|
/** Ask once. Returns straight away, settled or not. */
|
|
@@ -90,7 +111,7 @@ export interface BrotuAI {
|
|
|
90
111
|
*/
|
|
91
112
|
estimateCost(type: GenerationType, params: GenerationParams): Promise<Result<CostEstimate>>;
|
|
92
113
|
}
|
|
93
|
-
export declare function
|
|
114
|
+
export declare function brotu(options: BrotuAIOptions): BrotuAI;
|
|
94
115
|
export type { AIError, Generation, Result };
|
|
95
116
|
export { getModel };
|
|
96
117
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|