@qjp88995/provider-client 0.3.0 → 0.4.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.
Files changed (40) hide show
  1. package/dist/direct-resolver.d.ts.map +1 -1
  2. package/dist/direct-resolver.js +2 -0
  3. package/dist/direct-resolver.js.map +1 -1
  4. package/dist/image/http.d.ts +16 -0
  5. package/dist/image/http.d.ts.map +1 -0
  6. package/dist/image/http.js +62 -0
  7. package/dist/image/http.js.map +1 -0
  8. package/dist/image/index.d.ts +32 -0
  9. package/dist/image/index.d.ts.map +1 -0
  10. package/dist/image/index.js +39 -0
  11. package/dist/image/index.js.map +1 -0
  12. package/dist/image/types.d.ts +94 -0
  13. package/dist/image/types.d.ts.map +1 -0
  14. package/dist/image/types.js +44 -0
  15. package/dist/image/types.js.map +1 -0
  16. package/dist/image/volcengine.adapter.d.ts +8 -0
  17. package/dist/image/volcengine.adapter.d.ts.map +1 -0
  18. package/dist/image/volcengine.adapter.js +85 -0
  19. package/dist/image/volcengine.adapter.js.map +1 -0
  20. package/dist/index.d.ts +3 -2
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +2 -1
  23. package/dist/index.js.map +1 -1
  24. package/dist/provider-client.d.ts +13 -0
  25. package/dist/provider-client.d.ts.map +1 -1
  26. package/dist/provider-client.js +47 -0
  27. package/dist/provider-client.js.map +1 -1
  28. package/dist/types.d.ts +18 -0
  29. package/dist/types.d.ts.map +1 -1
  30. package/dist/types.js +2 -0
  31. package/dist/types.js.map +1 -1
  32. package/package.json +1 -1
  33. package/src/direct-resolver.ts +2 -0
  34. package/src/image/http.ts +68 -0
  35. package/src/image/index.ts +87 -0
  36. package/src/image/types.ts +134 -0
  37. package/src/image/volcengine.adapter.ts +133 -0
  38. package/src/index.ts +27 -0
  39. package/src/provider-client.ts +77 -2
  40. package/src/types.ts +21 -0
@@ -1,5 +1,6 @@
1
1
  import { createCenterFetch } from './center-fetch.js';
2
2
  import { errorFromResponse, ProviderClientError } from './errors.js';
3
+ import { createImageGenerator, IMAGE_ADAPTERS, isImageKind, } from './image/index.js';
3
4
  import { createJustOne, } from './justone/index.js';
4
5
  import { createMedia, isMediaKind, MEDIA_ADAPTERS, } from './media/index.js';
5
6
  import { buildHandle, findModel, } from './model-handle.js';
@@ -119,6 +120,49 @@ export class ProviderClient {
119
120
  settings: options.settings,
120
121
  });
121
122
  }
123
+ /**
124
+ * 一个生图模型(适配器在本包,请求经中心透传、中心注入 key)。地址取自这家的对话端点(生图模型没有自己的协议,
125
+ * 用哪个端点由这家的生图适配器定)。**一次 `generate` 出一张**;要几张就并发几次。
126
+ * - 目录里没有这家 → `unknown_vendor`;这家没有这个生图模型(或停用了)→ `unknown_model`;
127
+ * 这个版本的 client 没有这家的生图适配器 → `unsupported_vendor_kind`;这家没有启用的对应端点 → `protocol_unavailable`。
128
+ * - 生成时中心自己报的错是 `ProviderClientError`,厂商的失败是 `ImageUpstreamError`(`retryable`、`contentFiltered`)。
129
+ * - 用量(张数、参考图数)在结果里,单价在目录里(`catalog()` 的 `imageModels[].pricing`),钱由 APP 自己算。
130
+ * 目录只在创建时查一次。
131
+ */
132
+ async imageModel(ref, options = {}) {
133
+ const vendor = (await this.catalog()).vendors.find(v => v.slug === ref.vendor);
134
+ if (!vendor) {
135
+ throw new ProviderClientError('unknown_vendor', `vendor "${ref.vendor}" is not in the catalog`, null);
136
+ }
137
+ const model = vendor.imageModels.find(m => m.modelId === ref.modelId);
138
+ if (!model) {
139
+ throw new ProviderClientError('unknown_model', `image model "${ref.modelId}" is not in the catalog of vendor "${ref.vendor}"`, null);
140
+ }
141
+ if (!isImageKind(vendor.kind)) {
142
+ throw new ProviderClientError('unsupported_vendor_kind', `vendor kind "${vendor.kind}" has no image generation adapter`, null);
143
+ }
144
+ const protocol = IMAGE_ADAPTERS[vendor.kind].endpointProtocol;
145
+ const endpoint = vendor.endpoints.find(e => e.protocol === protocol);
146
+ if (!endpoint) {
147
+ throw new ProviderClientError('protocol_unavailable', `vendor "${ref.vendor}" has no ${protocol} endpoint (image generation uses its base URL)`, null);
148
+ }
149
+ const fetch = createCenterFetch({
150
+ centerUrl: this.center,
151
+ apiKey: this.options.apiKey,
152
+ vendor: vendor.slug,
153
+ baseUrls: vendor.endpoints.map(e => e.baseUrl),
154
+ affinity: options.affinity,
155
+ pin: options.pin,
156
+ onCredential: options.onCredential,
157
+ fetch: this.send,
158
+ });
159
+ return createImageGenerator({
160
+ kind: vendor.kind,
161
+ modelId: model.modelId,
162
+ referenceImages: model.capabilities.includes('reference-image'),
163
+ connection: { baseUrl: endpoint.baseUrl, fetch },
164
+ });
165
+ }
122
166
  /**
123
167
  * 某家厂商的媒体解析(适配器在本包,请求经中心透传、中心注入 key):智谱的文件解析 / 语音转写(地址取自这家的
124
168
  * `media` 端点)、BibiGPT 的视频链接解析(它唯一的 `http` 端点)。
@@ -224,6 +268,9 @@ export class ProviderClient {
224
268
  if (!res.ok)
225
269
  throw await errorFromResponse(res);
226
270
  const body = (await res.json());
271
+ // 中心 2026-11 之前没有 `imageModels`:补成空数组,后面不用到处判空。
272
+ for (const v of body.vendors)
273
+ v.imageModels ??= [];
227
274
  this.cached = {
228
275
  etag: res.headers.get('etag'),
229
276
  body,
@@ -1 +1 @@
1
- {"version":3,"file":"provider-client.js","sourceRoot":"","sources":["../src/provider-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"provider-client.js","sourceRoot":"","sources":["../src/provider-client.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -17,6 +17,9 @@ export type VendorCategory = (typeof VENDOR_CATEGORIES)[number];
17
17
  /** 模型能力(目录元数据:发不发图片 / 开不开推理由调用方据此决定)。 */
18
18
  export declare const LLM_CAPABILITIES: readonly ["vision", "video", "reasoning"];
19
19
  export type LlmCapability = (typeof LLM_CAPABILITIES)[number];
20
+ /** 生图模型的能力。`reference-image` = 能带参考图(图生图 / 改图)。 */
21
+ export declare const IMAGE_CAPABILITIES: readonly ["reference-image"];
22
+ export type ImageCapability = (typeof IMAGE_CAPABILITIES)[number];
20
23
  /** 厂商类型。`llm` 类别的每一种对应一个适配器(`VENDOR_ADAPTERS`);bibigpt / justone 没有。 */
21
24
  export declare const VENDOR_KINDS: readonly ["openai", "generic", "deepseek", "moonshotai", "alibaba", "zhipu", "volcengine", "minimax", "dots", "google", "bibigpt", "justone"];
22
25
  export type VendorKind = (typeof VENDOR_KINDS)[number];
@@ -51,7 +54,10 @@ export interface CatalogVendor {
51
54
  /** 非 `llm` 的厂商没有模型,接入方只拿它的端点经中心透传。 */
52
55
  category: VendorCategory;
53
56
  endpoints: CatalogEndpoint[];
57
+ /** 对话模型。 */
54
58
  models: CatalogModel[];
59
+ /** 生图模型(中心 2026-11 起有;读目录时缺了按空数组补上)。 */
60
+ imageModels: CatalogImageModel[];
55
61
  }
56
62
  export interface CatalogEndpoint {
57
63
  protocol: EndpointProtocol;
@@ -68,6 +74,18 @@ export interface CatalogModel {
68
74
  maxOutputTokens: number | null;
69
75
  pricing: ModelPricing | null;
70
76
  }
77
+ /** 生图的单价(每张,十进制字符串)。 */
78
+ export interface ImagePricing {
79
+ currency: string;
80
+ perImage: string;
81
+ }
82
+ export interface CatalogImageModel {
83
+ /** 厂商侧的模型名(请求体里的 `model`)。 */
84
+ modelId: string;
85
+ displayName: string;
86
+ capabilities: ImageCapability[];
87
+ pricing: ImagePricing | null;
88
+ }
71
89
  /** 中心的错误码(响应体 `{ code, message }`)。 */
72
90
  export declare const CENTER_ERROR_CODES: readonly ["unauthorized", "forbidden", "tenant_disabled", "not_found", "invalid_request", "conflict", "unprocessable", "upstream_error", "admin_unavailable", "vendor_not_allowed", "no_credential", "pinned_credential_unavailable", "payload_too_large"];
73
91
  export type CenterErrorCode = (typeof CENTER_ERROR_CODES)[number];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6BAA6B;AAC7B,eAAO,MAAM,aAAa,kIAMhB,CAAC;AACX,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;GAGG;AACH,eAAO,MAAM,kBAAkB,iKAKrB,CAAC;AACX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnE,kDAAkD;AAClD,eAAO,MAAM,iBAAiB,mCAAoC,CAAC;AACnE,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEhE,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,2CAA4C,CAAC;AAC1E,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,wEAAwE;AACxE,eAAO,MAAM,YAAY,+IAaf,CAAC;AACX,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD;;;;;;;;GAQG;AACH,eAAO,MAAM,iBAAiB,6DAOpB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEjE,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa;IAC5B,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,sCAAsC;IACtC,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,MAAM,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,aAAa,EAAE,CAAC;IAC9B,sCAAsC;IACtC,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,OAAO,EAAE,YAAY,GAAG,IAAI,CAAC;CAC9B;AAED,uCAAuC;AACvC,eAAO,MAAM,kBAAkB,4PAcrB,CAAC;AACX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,kBAAkB,CAAC,CAAC,MAAM,CAAC,CAAC;AAElE,oBAAoB;AACpB,eAAO,MAAM,UAAU;IACrB,2BAA2B;;IAE3B,mCAAmC;;IAEnC,sDAAsD;;IAEtD,+BAA+B;;IAE/B,sBAAsB;;CAEd,CAAC;AAEX,8DAA8D;AAC9D,eAAO,MAAM,kBAAkB,cAAc,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js CHANGED
@@ -24,6 +24,8 @@ export const ENDPOINT_PROTOCOLS = [
24
24
  export const VENDOR_CATEGORIES = ['llm', 'media', 'data'];
25
25
  /** 模型能力(目录元数据:发不发图片 / 开不开推理由调用方据此决定)。 */
26
26
  export const LLM_CAPABILITIES = ['vision', 'video', 'reasoning'];
27
+ /** 生图模型的能力。`reference-image` = 能带参考图(图生图 / 改图)。 */
28
+ export const IMAGE_CAPABILITIES = ['reference-image'];
27
29
  /** 厂商类型。`llm` 类别的每一种对应一个适配器(`VENDOR_ADAPTERS`);bibigpt / justone 没有。 */
28
30
  export const VENDOR_KINDS = [
29
31
  'openai',
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,yBAAyB;IACzB,kBAAkB;IAClB,oBAAoB;IACpB,yBAAyB;IACzB,qBAAqB;CACb,CAAC;AAGX;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,GAAG,aAAa;IAChB,MAAM;IACN,YAAY;IACZ,OAAO;CACC,CAAC;AAGX,kDAAkD;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAGnE,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AAG1E,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;IACZ,SAAS;IACT,OAAO;IACP,YAAY;IACZ,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;CACD,CAAC;AAGX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,KAAK;CACG,CAAC;AA6CX,uCAAuC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,iBAAiB;IACjB,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;CACX,CAAC;AAGX,oBAAoB;AACpB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,2BAA2B;IAC3B,GAAG,EAAE,UAAU;IACf,mCAAmC;IACnC,QAAQ,EAAE,eAAe;IACzB,sDAAsD;IACtD,GAAG,EAAE,UAAU;IACf,+BAA+B;IAC/B,UAAU,EAAE,iBAAiB;IAC7B,sBAAsB;IACtB,QAAQ,EAAE,eAAe;CACjB,CAAC;AAEX,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,6BAA6B;AAC7B,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,yBAAyB;IACzB,kBAAkB;IAClB,oBAAoB;IACpB,yBAAyB;IACzB,qBAAqB;CACb,CAAC;AAGX;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,GAAG,aAAa;IAChB,MAAM;IACN,YAAY;IACZ,OAAO;CACC,CAAC;AAGX,kDAAkD;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAU,CAAC;AAGnE,yCAAyC;AACzC,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAU,CAAC;AAG1E,mDAAmD;AACnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,iBAAiB,CAAU,CAAC;AAG/D,wEAAwE;AACxE,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,QAAQ;IACR,SAAS;IACT,UAAU;IACV,YAAY;IACZ,SAAS;IACT,OAAO;IACP,YAAY;IACZ,SAAS;IACT,MAAM;IACN,QAAQ;IACR,SAAS;IACT,SAAS;CACD,CAAC;AAGX;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,KAAK;IACL,SAAS;IACT,KAAK;IACL,QAAQ;IACR,MAAM;IACN,KAAK;CACG,CAAC;AA8DX,uCAAuC;AACvC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,cAAc;IACd,WAAW;IACX,iBAAiB;IACjB,WAAW;IACX,iBAAiB;IACjB,UAAU;IACV,eAAe;IACf,gBAAgB;IAChB,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,+BAA+B;IAC/B,mBAAmB;CACX,CAAC;AAGX,oBAAoB;AACpB,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,2BAA2B;IAC3B,GAAG,EAAE,UAAU;IACf,mCAAmC;IACnC,QAAQ,EAAE,eAAe;IACzB,sDAAsD;IACtD,GAAG,EAAE,UAAU;IACf,+BAA+B;IAC/B,UAAU,EAAE,iBAAiB;IAC7B,sBAAsB;IACtB,QAAQ,EAAE,eAAe;CACjB,CAAC;AAEX,8DAA8D;AAC9D,MAAM,CAAC,MAAM,kBAAkB,GAAG,WAAW,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qjp88995/provider-client",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Client for the provider center: vendor adapters for the AI SDK, model resolution through the center's catalog and passthrough proxy, and a direct mode for local development.",
5
5
  "license": "UNLICENSED",
6
6
  "type": "module",
@@ -61,6 +61,8 @@ export class DirectModelResolver implements ModelResolver {
61
61
  pricing: null,
62
62
  ...m,
63
63
  })),
64
+ // 直连不做生图(生图只走中心)。
65
+ imageModels: [],
64
66
  }));
65
67
  }
66
68
 
@@ -0,0 +1,68 @@
1
+ import { parseCenterError, ProviderClientError } from '../errors.js';
2
+ import { PC_HEADERS } from '../types.js';
3
+ import { type ImageConnection, ImageUpstreamError } from './types.js';
4
+
5
+ /**
6
+ * POST 一段 JSON,返回状态码与响应正文(同 web-search 的 `postJson`)。只处理「请求没发出去」与「中心自己报的错」:
7
+ * 中止原样抛;网络错误、中心的 `upstream_error` 是可重试的上游错误;中心别的错(没有可用 key、不许用这家……)是配置问题,
8
+ * 抛 `ProviderClientError`。厂商的状态码与响应体怎么解释是适配器的事。
9
+ */
10
+ export async function postJson(
11
+ label: string,
12
+ url: string,
13
+ { apiKey, fetch }: ImageConnection,
14
+ body: Record<string, unknown>,
15
+ signal: AbortSignal
16
+ ): Promise<{ status: number; ok: boolean; text: string }> {
17
+ let res: Response;
18
+ try {
19
+ res = await fetch(url, {
20
+ method: 'POST',
21
+ headers: {
22
+ ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}),
23
+ 'content-type': 'application/json',
24
+ },
25
+ body: JSON.stringify(body),
26
+ signal,
27
+ });
28
+ } catch (err) {
29
+ if (signal.aborted) throw err;
30
+ const reason = err instanceof Error ? err.message : String(err);
31
+ throw new ImageUpstreamError(`${label} 请求失败:${reason}`, {
32
+ retryable: true,
33
+ });
34
+ }
35
+ const text = await res.text();
36
+ if (!res.ok && !res.headers.has(PC_HEADERS.credential)) {
37
+ const center = centerErrorOf(text);
38
+ if (center?.code === 'upstream_error') {
39
+ throw new ImageUpstreamError(`${label} 请求失败:${center.message}`, {
40
+ code: center.code,
41
+ retryable: true,
42
+ });
43
+ }
44
+ if (center) {
45
+ throw new ProviderClientError(center.code, center.message, res.status);
46
+ }
47
+ }
48
+ return { status: res.status, ok: res.ok, text };
49
+ }
50
+
51
+ function centerErrorOf(text: string) {
52
+ try {
53
+ return parseCenterError(JSON.parse(text));
54
+ } catch {
55
+ return null;
56
+ }
57
+ }
58
+
59
+ /** 错误详情别整段回灌(HTML 错误页可能几十 KB)。 */
60
+ export function clip(text: string): string {
61
+ const flat = text.replace(/\s+/g, ' ').trim();
62
+ return flat.length > 300 ? `${flat.slice(0, 300)}…` : flat;
63
+ }
64
+
65
+ /** 端点根 + 子路径(根上多余的 `/` 去掉)。 */
66
+ export function joinUrl(baseUrl: string, path: string): string {
67
+ return `${baseUrl.replace(/\/+$/, '')}/${path}`;
68
+ }
@@ -0,0 +1,87 @@
1
+ import {
2
+ fitImageSize,
3
+ type GenerateImageInput,
4
+ type GenerateImageOutcome,
5
+ type ImageAdapter,
6
+ type ImageConnection,
7
+ type ImageTraits,
8
+ } from './types.js';
9
+ import { VolcengineImageAdapter } from './volcengine.adapter.js';
10
+
11
+ /** kind → 生图适配器。中心哪几家能录生图模型(`VendorKindInfo.imageGeneration`)与这里一一对应(契约测试钉着)。 */
12
+ export const IMAGE_ADAPTERS = {
13
+ volcengine: new VolcengineImageAdapter(),
14
+ } as const satisfies Record<string, ImageAdapter>;
15
+
16
+ export type ImageKind = keyof typeof IMAGE_ADAPTERS;
17
+ export const IMAGE_KINDS = Object.keys(IMAGE_ADAPTERS) as ImageKind[];
18
+
19
+ export function isImageKind(kind: string): kind is ImageKind {
20
+ return Object.hasOwn(IMAGE_ADAPTERS, kind);
21
+ }
22
+
23
+ /** 一个生图模型,连接已绑好。 */
24
+ export interface ImageGenerator {
25
+ readonly kind: ImageKind;
26
+ readonly modelId: string;
27
+ readonly traits: ImageTraits;
28
+ /** 能不能带参考图(目录里的 `reference-image` 能力)。 */
29
+ readonly referenceImages: boolean;
30
+ generate(
31
+ input: GenerateImageInput,
32
+ signal: AbortSignal
33
+ ): Promise<GenerateImageOutcome>;
34
+ }
35
+
36
+ export interface CreateImageGeneratorInput {
37
+ kind: ImageKind;
38
+ modelId: string;
39
+ /** 目录里这个模型有 `reference-image` 能力。 */
40
+ referenceImages: boolean;
41
+ connection: ImageConnection;
42
+ }
43
+
44
+ /**
45
+ * 绑好连接的生图模型。中心模式用 `ProviderClient.imageModel`;这里是直连(测试)与中心模式共用的底层。
46
+ * 生成前先校验(空提示词、参考图不支持 / 超张数)并把尺寸放进这家的限制(`fitImageSize`)。
47
+ */
48
+ export function createImageGenerator(
49
+ input: CreateImageGeneratorInput
50
+ ): ImageGenerator {
51
+ const adapter: ImageAdapter = IMAGE_ADAPTERS[input.kind];
52
+ const traits = adapter.traits(input.modelId);
53
+ return {
54
+ kind: input.kind,
55
+ modelId: input.modelId,
56
+ traits,
57
+ referenceImages: input.referenceImages,
58
+ generate: (req, signal) => {
59
+ if (!req.prompt.trim()) {
60
+ return Promise.reject(new RangeError('prompt must not be empty'));
61
+ }
62
+ const refs = req.referenceImages ?? [];
63
+ if (refs.length > 0 && !input.referenceImages) {
64
+ return Promise.reject(
65
+ new RangeError(
66
+ `model "${input.modelId}" does not take reference images`
67
+ )
68
+ );
69
+ }
70
+ if (refs.length > traits.maxReferenceImages) {
71
+ return Promise.reject(
72
+ new RangeError(
73
+ `at most ${traits.maxReferenceImages} reference images, got ${refs.length}`
74
+ )
75
+ );
76
+ }
77
+ return adapter.generate(
78
+ input.connection,
79
+ input.modelId,
80
+ { ...req, size: fitImageSize(req.size, traits) },
81
+ signal
82
+ );
83
+ },
84
+ };
85
+ }
86
+
87
+ export * from './types.js';
@@ -0,0 +1,134 @@
1
+ import type { VendorFetch } from '../vendors/index.js';
2
+
3
+ /**
4
+ * 生图的厂商适配。适配器只管「这家的请求长什么样、响应怎么翻、哪些失败值得重试」与这家的尺寸限制;
5
+ * 什么时候生、生几张、提示词怎么写是 APP 的事。**一次调用出一张图**(火山 5.5 不支持一次多张):要几张就并发几次。
6
+ */
7
+
8
+ export interface ImageSize {
9
+ width: number;
10
+ height: number;
11
+ }
12
+
13
+ /** 参考图(图生图 / 改图)。字节随请求发出(data URI),不依赖公网地址。 */
14
+ export interface ReferenceImage {
15
+ data: Uint8Array;
16
+ /** `image/jpeg`、`image/png`、`image/webp` …… */
17
+ mimeType: string;
18
+ }
19
+
20
+ export const IMAGE_FORMATS = ['jpeg', 'png'] as const;
21
+ export type ImageFormat = (typeof IMAGE_FORMATS)[number];
22
+
23
+ export interface GenerateImageInput {
24
+ prompt: string;
25
+ /**
26
+ * 想要的像素尺寸。这家的面积上下限之外会**等比**缩放进去(比例不变),实际尺寸看结果;
27
+ * 想先知道就用 `fitImageSize(size, traits)`。
28
+ */
29
+ size: ImageSize;
30
+ /** 参考图;模型没有 `reference-image` 能力或超过 `traits.maxReferenceImages` 张就报错,不悄悄丢。 */
31
+ referenceImages?: readonly ReferenceImage[];
32
+ /** 缺省 `jpeg`(幻灯片配图用 jpeg 小一个量级)。 */
33
+ format?: ImageFormat;
34
+ }
35
+
36
+ export interface GeneratedImage {
37
+ data: Uint8Array;
38
+ mimeType: string;
39
+ width: number;
40
+ height: number;
41
+ }
42
+
43
+ export interface ImageUsage {
44
+ generatedImages: number;
45
+ inputImages: number;
46
+ /** 厂商报的 token 数(火山按面积折算);不报为 null。计价按张,这个只做记录。 */
47
+ tokens: number | null;
48
+ }
49
+
50
+ export interface GenerateImageOutcome {
51
+ image: GeneratedImage;
52
+ usage: ImageUsage;
53
+ }
54
+
55
+ /** 这家(这个模型)生图的限制,给调用方定尺寸、写工具说明用。 */
56
+ export interface ImageTraits {
57
+ /** 面积下限(像素)。 */
58
+ minPixels: number;
59
+ /** 面积上限(像素)。 */
60
+ maxPixels: number;
61
+ /** 宽高比(长边 / 短边)上限。 */
62
+ maxAspectRatio: number;
63
+ /** 一次最多带几张参考图。 */
64
+ maxReferenceImages: number;
65
+ }
66
+
67
+ /**
68
+ * 调一次上游要的东西:这家生图所用端点的根地址与出站 fetch。中心模式下 fetch 是中心的透传 fetch、不带 key;
69
+ * 直连模式给 `apiKey`。
70
+ */
71
+ export interface ImageConnection {
72
+ baseUrl: string;
73
+ fetch: VendorFetch;
74
+ apiKey?: string;
75
+ }
76
+
77
+ export interface ImageAdapter<K extends string = string> {
78
+ readonly kind: K;
79
+ /** 生图请求发往这家哪个端点(取它的根地址)。 */
80
+ readonly endpointProtocol: 'openai-chat-completions';
81
+ traits(modelId: string): ImageTraits;
82
+ generate(
83
+ conn: ImageConnection,
84
+ modelId: string,
85
+ input: GenerateImageInput,
86
+ signal: AbortSignal
87
+ ): Promise<GenerateImageOutcome>;
88
+ }
89
+
90
+ /**
91
+ * 厂商的失败(HTTP 错误、拒绝生成、响应不成形、没拿到响应)。中心自己报的错是 `ProviderClientError`。
92
+ * 调用方只读 `retryable` 决定要不要再试,不解析消息文本。
93
+ */
94
+ export class ImageUpstreamError extends Error {
95
+ override readonly name = 'ImageUpstreamError';
96
+ /** 上游错误码(火山的 `InvalidParameter`、`OutputImageSensitiveContentDetected` ……),没有就是 null。 */
97
+ readonly code: string | null;
98
+ readonly retryable: boolean;
99
+ /** 被内容审核拦下(换提示词再试;原样重试没用)。 */
100
+ readonly contentFiltered: boolean;
101
+
102
+ constructor(
103
+ reason: string,
104
+ opts: { code?: string; retryable?: boolean; contentFiltered?: boolean } = {}
105
+ ) {
106
+ super(reason);
107
+ this.code = opts.code ?? null;
108
+ this.retryable = opts.retryable ?? false;
109
+ this.contentFiltered = opts.contentFiltered ?? false;
110
+ }
111
+ }
112
+
113
+ /**
114
+ * 把想要的尺寸放进这家的限制:宽高比超了先按上限收窄短边;面积超了等比缩小、不够等比放大。取整后面积仍要在界内。
115
+ */
116
+ export function fitImageSize(size: ImageSize, traits: ImageTraits): ImageSize {
117
+ let { width: w, height: h } = size;
118
+ if (!(w > 0 && h > 0)) throw new RangeError('image size must be positive');
119
+ const ratio = Math.max(w, h) / Math.min(w, h);
120
+ if (ratio > traits.maxAspectRatio) {
121
+ if (w > h) h = w / traits.maxAspectRatio;
122
+ else w = h / traits.maxAspectRatio;
123
+ }
124
+ const area = w * h;
125
+ const scale =
126
+ area > traits.maxPixels
127
+ ? Math.sqrt(traits.maxPixels / area)
128
+ : area < traits.minPixels
129
+ ? Math.sqrt(traits.minPixels / area)
130
+ : 1;
131
+ // 缩小向下取整、放大向上取整,取整后面积不越界。
132
+ const round = scale < 1 ? Math.floor : scale > 1 ? Math.ceil : Math.round;
133
+ return { width: round(w * scale), height: round(h * scale) };
134
+ }
@@ -0,0 +1,133 @@
1
+ import { clip, joinUrl, postJson } from './http.js';
2
+ import {
3
+ type GenerateImageInput,
4
+ type GenerateImageOutcome,
5
+ type ImageAdapter,
6
+ type ImageConnection,
7
+ type ImageTraits,
8
+ ImageUpstreamError,
9
+ } from './types.js';
10
+
11
+ /**
12
+ * 火山方舟(Seedream)生图:`POST {对话端点根}/images/generations`(`https://ark.cn-beijing.volces.com/api/v3`),
13
+ * OpenAI 形状。2026-11-13 经中心透传实测(Seedream 5.5 / 5.0 flash):
14
+ * - `size` 收 `WxH`,面积 921600~4624220 像素,比例宽松(16:1 也行),像素不用对齐;
15
+ * - 一次一张(`n` 被忽略,组图 5.5 不支持);参考图 `image` 收 data URI,最多 10 张;
16
+ * - 返回链接 24 小时失效 → 要 `b64_json`;`watermark: false` 去掉右下角「AI 生成」;
17
+ * - 失败是 `{ error: { code, message } }`(`InvalidParameter` / `MissingParameter` …)。
18
+ */
19
+ const TRAITS: ImageTraits = {
20
+ minPixels: 921_600,
21
+ maxPixels: 4_624_220,
22
+ maxAspectRatio: 16,
23
+ maxReferenceImages: 10,
24
+ };
25
+
26
+ interface ArkImagesBody {
27
+ data?: {
28
+ b64_json?: string;
29
+ size?: string;
30
+ output_format?: string;
31
+ error?: { code?: string; message?: string };
32
+ }[];
33
+ usage?: {
34
+ generated_images?: number;
35
+ input_images?: number;
36
+ total_tokens?: number;
37
+ };
38
+ error?: { code?: string; message?: string };
39
+ }
40
+
41
+ const LABEL = '火山方舟生图';
42
+
43
+ export class VolcengineImageAdapter implements ImageAdapter<'volcengine'> {
44
+ readonly kind = 'volcengine' as const;
45
+ readonly endpointProtocol = 'openai-chat-completions' as const;
46
+
47
+ traits(): ImageTraits {
48
+ return TRAITS;
49
+ }
50
+
51
+ async generate(
52
+ conn: ImageConnection,
53
+ modelId: string,
54
+ input: GenerateImageInput,
55
+ signal: AbortSignal
56
+ ): Promise<GenerateImageOutcome> {
57
+ const format = input.format ?? 'jpeg';
58
+ const refs = input.referenceImages ?? [];
59
+ const body: Record<string, unknown> = {
60
+ model: modelId,
61
+ prompt: input.prompt,
62
+ size: `${input.size.width}x${input.size.height}`,
63
+ response_format: 'b64_json',
64
+ output_format: format,
65
+ watermark: false,
66
+ };
67
+ if (refs.length > 0) {
68
+ const uris = refs.map(
69
+ r =>
70
+ `data:${r.mimeType};base64,${Buffer.from(r.data).toString('base64')}`
71
+ );
72
+ body.image = uris.length === 1 ? uris[0] : uris;
73
+ }
74
+ const res = await postJson(
75
+ LABEL,
76
+ joinUrl(conn.baseUrl, 'images/generations'),
77
+ conn,
78
+ body,
79
+ signal
80
+ );
81
+ let parsed: ArkImagesBody;
82
+ try {
83
+ parsed = JSON.parse(res.text) as ArkImagesBody;
84
+ } catch {
85
+ throw new ImageUpstreamError(
86
+ `${LABEL}失败(HTTP ${res.status}):${clip(res.text)}`,
87
+ { retryable: res.status === 429 || res.status >= 500 }
88
+ );
89
+ }
90
+ if (!res.ok || parsed.error) {
91
+ throw upstreamError(res.status, parsed.error);
92
+ }
93
+ const item = parsed.data?.[0];
94
+ if (item?.error) throw upstreamError(res.status, item.error);
95
+ if (!item?.b64_json) {
96
+ throw new ImageUpstreamError(`${LABEL}没有返回图片:${clip(res.text)}`, {
97
+ retryable: true,
98
+ });
99
+ }
100
+ const [w, h] = (item.size ?? '').split('x').map(Number);
101
+ const outFormat = item.output_format === 'png' ? 'png' : format;
102
+ return {
103
+ image: {
104
+ data: new Uint8Array(Buffer.from(item.b64_json, 'base64')),
105
+ mimeType: outFormat === 'png' ? 'image/png' : 'image/jpeg',
106
+ width: w && Number.isFinite(w) ? w : input.size.width,
107
+ height: h && Number.isFinite(h) ? h : input.size.height,
108
+ },
109
+ usage: {
110
+ generatedImages: parsed.usage?.generated_images ?? 1,
111
+ inputImages: parsed.usage?.input_images ?? refs.length,
112
+ tokens: parsed.usage?.total_tokens ?? null,
113
+ },
114
+ };
115
+ }
116
+ }
117
+
118
+ function upstreamError(
119
+ status: number,
120
+ error: { code?: string; message?: string } | undefined
121
+ ): ImageUpstreamError {
122
+ const code = error?.code;
123
+ const message = error?.message ?? '未知错误';
124
+ return new ImageUpstreamError(
125
+ `${LABEL}失败(HTTP ${status}${code ? `,${code}` : ''}):${clip(message)}`,
126
+ {
127
+ ...(code ? { code } : {}),
128
+ // 限流、服务端故障可重试;参数错、审核拦下重试没用。
129
+ retryable: status === 429 || status >= 500,
130
+ contentFiltered: !!code && /Sensitive|Moderation|RiskControl/i.test(code),
131
+ }
132
+ );
133
+ }