@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/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
- function getAvailableModels(options) {
1088
- if (brotuApiKey(options)) {
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
- return catalog.filter(
1093
- (model) => model.provider && model.provider in vendors
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
@@ -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;AAU7D,OAAO,KAAK,EAAE,cAAc,EAAkB,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAgBhF,eAAO,MAAM,qBAAqB,QAA2B,CAAC;AA+B9D;;;;;;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,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,cAAc,GAAG,aAAa,EAAE,CAQ3E"}
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-QOWHHKSI.js";
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((image) => ({ image }));
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
- function getAvailableModels(options) {
1251
- if (brotuApiKey(options)) {
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
- return catalog.filter(
1256
- (model) => model.provider && model.provider in vendors
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 brotuClient(options: BrotuAIOptions): BrotuAI;
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
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}