@downcity/plugins 1.0.94 → 1.0.96

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.
@@ -28,6 +28,7 @@ export declare class ImagePlugin extends BasePlugin {
28
28
  readonly description: string;
29
29
  private readonly image_create;
30
30
  private readonly image_result;
31
+ private readonly list_models?;
31
32
  private readonly timeout_ms;
32
33
  private readonly min_poll_interval_ms;
33
34
  private readonly max_poll_interval_ms;
@@ -37,10 +38,61 @@ export declare class ImagePlugin extends BasePlugin {
37
38
  */
38
39
  system(_context: AgentContext): string;
39
40
  private generate_image;
41
+ /**
42
+ * 查询图片任务,按需等待终态。
43
+ */
44
+ private read_image_result;
45
+ /**
46
+ * 轮询图片任务直到成功或失败。
47
+ */
48
+ private wait_for_image_result;
40
49
  /**
41
50
  * 显式 action 集合。
42
51
  */
43
52
  readonly actions: {
53
+ models: {
54
+ execute: () => Promise<{
55
+ success: boolean;
56
+ error: string;
57
+ message: string;
58
+ data?: undefined;
59
+ } | {
60
+ success: boolean;
61
+ data: JsonObject;
62
+ message: string;
63
+ error?: undefined;
64
+ }>;
65
+ };
66
+ image_create: {
67
+ execute: ({ payload }: {
68
+ payload: JsonValue;
69
+ }) => Promise<{
70
+ success: boolean;
71
+ data: JsonObject;
72
+ message: string;
73
+ error?: undefined;
74
+ } | {
75
+ success: boolean;
76
+ error: string;
77
+ message: string;
78
+ data?: undefined;
79
+ }>;
80
+ };
81
+ image_result: {
82
+ execute: ({ payload }: {
83
+ payload: JsonValue;
84
+ }) => Promise<{
85
+ success: boolean;
86
+ data: JsonObject;
87
+ message: string;
88
+ error?: undefined;
89
+ } | {
90
+ success: boolean;
91
+ error: string;
92
+ message: string;
93
+ data?: undefined;
94
+ }>;
95
+ };
44
96
  generate: {
45
97
  execute: ({ payload }: {
46
98
  payload: JsonValue;
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../src/image/ImagePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACV,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAIV,kBAAkB,EAEnB,MAAM,8BAA8B,CAAC;AAmGtC;;GAEG;AACH,qBAAa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkD;IAC/E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkD;IAC/E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;gBAElC,OAAO,EAAE,kBAAkB;IAiCvC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;YA2BxB,cAAc;IAmC5B;;OAEG;IACH,QAAQ,CAAC,OAAO;;mCAEiB;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAMjB,UAAU;;;;;;;;;;MAY9C;CACH"}
1
+ {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../src/image/ImagePlugin.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oDAAoD,CAAC;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACV,MAAM,+CAA+C,CAAC;AACvD,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,8BAA8B,CAAC;AAmMtC;;GAEG;AACH,qBAAa,WAAY,SAAQ,UAAU;IACzC;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkD;IAC/E,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkD;IAC/E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAoC;IACjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;gBAElC,OAAO,EAAE,kBAAkB;IAkCvC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;YA8BxB,cAAc;IAe5B;;OAEG;YACW,iBAAiB;IA4C/B;;OAEG;YACW,qBAAqB;IA8DnC;;OAEG;IACH,QAAQ,CAAC,OAAO;;;;;;;;;sBAeqB,UAAU;;;;;;mCAad;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAOjB,UAAU;;;;;;;;;;;mCAaf;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;;;;;;;;;;;;mCA2BtB;gBAAE,OAAO,EAAE,SAAS,CAAA;aAAE;;sBAMjB,UAAU;;;;;;;;;;MAY9C;CACH"}
@@ -27,10 +27,27 @@ function to_record(value) {
27
27
  function normalize_image_payload(payload) {
28
28
  const record = to_record(payload ?? {});
29
29
  if (!record) {
30
- throw new TypeError("ImagePlugin.generate payload must be an object");
30
+ throw new TypeError("ImagePlugin image payload must be an object");
31
31
  }
32
32
  return { ...record };
33
33
  }
34
+ /**
35
+ * 归一化图片任务查询 payload。
36
+ */
37
+ function normalize_image_result_payload(payload) {
38
+ const record = to_record(payload ?? {});
39
+ if (!record) {
40
+ throw new TypeError("ImagePlugin.image_result payload must be an object");
41
+ }
42
+ const job_id = typeof record.job_id === "string" ? record.job_id.trim() : "";
43
+ if (!job_id) {
44
+ throw new TypeError("ImagePlugin.image_result payload must include job_id");
45
+ }
46
+ return {
47
+ ...record,
48
+ job_id,
49
+ };
50
+ }
34
51
  /**
35
52
  * 校验 image 函数返回的 UIMessage。
36
53
  */
@@ -62,6 +79,81 @@ function normalize_positive_number(value, fallback) {
62
79
  ? value
63
80
  : fallback;
64
81
  }
82
+ /**
83
+ * 读取可选布尔值。
84
+ */
85
+ function normalize_boolean(value, fallback) {
86
+ return typeof value === "boolean" ? value : fallback;
87
+ }
88
+ /**
89
+ * 归一化模型元数据为 JSON 对象。
90
+ */
91
+ function normalize_json_object(value) {
92
+ const record = to_record(value);
93
+ if (!record)
94
+ return undefined;
95
+ return record;
96
+ }
97
+ /**
98
+ * 归一化图片模型信息,确保 action 返回纯 JSON。
99
+ */
100
+ function normalize_image_model(value) {
101
+ const record = to_record(value);
102
+ if (!record)
103
+ return null;
104
+ const id = typeof record.id === "string" ? record.id.trim() : "";
105
+ if (!id)
106
+ return null;
107
+ const modalities = Array.isArray(record.modalities)
108
+ ? record.modalities
109
+ .map((item) => String(item || "").trim())
110
+ .filter(Boolean)
111
+ : [];
112
+ if (!modalities.includes("image"))
113
+ return null;
114
+ const tags = Array.isArray(record.tags)
115
+ ? record.tags.map((item) => String(item || "").trim()).filter(Boolean)
116
+ : undefined;
117
+ const default_modalities = Array.isArray(record.default_modalities)
118
+ ? record.default_modalities
119
+ .map((item) => String(item || "").trim())
120
+ .filter(Boolean)
121
+ : undefined;
122
+ const meta = normalize_json_object(record.meta);
123
+ return {
124
+ id,
125
+ name: typeof record.name === "string" && record.name.trim()
126
+ ? record.name.trim()
127
+ : id,
128
+ ...(typeof record.description === "string"
129
+ ? { description: record.description }
130
+ : {}),
131
+ modalities,
132
+ ...(tags && tags.length > 0 ? { tags } : {}),
133
+ ...(meta ? { meta } : {}),
134
+ ...(typeof record.is_default === "boolean"
135
+ ? { is_default: record.is_default }
136
+ : {}),
137
+ ...(default_modalities && default_modalities.length > 0
138
+ ? { default_modalities }
139
+ : {}),
140
+ };
141
+ }
142
+ /**
143
+ * 归一化模型列表结果。
144
+ */
145
+ function normalize_image_models(values) {
146
+ const items = values
147
+ .map((item) => normalize_image_model(item))
148
+ .filter((item) => item !== null);
149
+ const default_model_id = items.find((item) => item.default_modalities?.includes("image"))?.id ??
150
+ items.find((item) => item.is_default)?.id ??
151
+ items[0]?.id;
152
+ return {
153
+ items,
154
+ ...(default_model_id ? { default_model_id } : {}),
155
+ };
156
+ }
65
157
  /**
66
158
  * 校验任务创建结果。
67
159
  */
@@ -103,6 +195,7 @@ export class ImagePlugin extends BasePlugin {
103
195
  description;
104
196
  image_create;
105
197
  image_result;
198
+ list_models;
106
199
  timeout_ms;
107
200
  min_poll_interval_ms;
108
201
  max_poll_interval_ms;
@@ -123,6 +216,7 @@ export class ImagePlugin extends BasePlugin {
123
216
  this.description = String(options.description || DEFAULT_IMAGE_PLUGIN_DESCRIPTION).trim();
124
217
  this.image_create = options.image_create;
125
218
  this.image_result = options.image_result;
219
+ this.list_models = options.list_models;
126
220
  this.timeout_ms = normalize_positive_number(options.timeout_ms, DEFAULT_TIMEOUT_MS);
127
221
  this.min_poll_interval_ms = normalize_positive_number(options.min_poll_interval_ms, DEFAULT_MIN_POLL_INTERVAL_MS);
128
222
  this.max_poll_interval_ms = normalize_positive_number(options.max_poll_interval_ms, DEFAULT_MAX_POLL_INTERVAL_MS);
@@ -152,36 +246,158 @@ export class ImagePlugin extends BasePlugin {
152
246
  "Payload rules:",
153
247
  "- `prompt` is required unless `messages` provides the full multimodal image context.",
154
248
  "- Optional common fields: `messages`, `size`, `aspect_ratio`, `ratio`, `quality`, `n`, `count`, `seed`, `provider_options`.",
249
+ "- To choose a model, call `models` and pass the selected model `id` as payload `model`.",
155
250
  "- Preserve the user's creative intent; do not over-rewrite the prompt unless clarification is necessary.",
251
+ "- For a two-step flow, call `image_create` first, then call `image_result` with `job_id`; `image_result` waits until the job finishes by default.",
252
+ "- `generate` is a convenience action that creates the job and waits for the final image in one call.",
156
253
  "- Generated image file parts are saved under project `.downcity/resources` and attached to the final assistant message automatically.",
157
254
  ].join("\n");
158
255
  }
159
256
  async generate_image(input) {
160
257
  const created = await this.image_create(input);
161
258
  validate_created_job(created);
162
- const deadline = Date.now() + this.timeout_ms;
163
- let poll_after_ms = created.poll_after_ms;
259
+ const current = await this.wait_for_image_result({
260
+ job_id: created.job_id,
261
+ poll_after_ms: created.poll_after_ms,
262
+ });
263
+ if (!current.result) {
264
+ throw new Error(`Image job ${created.job_id} succeeded without result`);
265
+ }
266
+ return normalize_image_result(current.result);
267
+ }
268
+ /**
269
+ * 查询图片任务,按需等待终态。
270
+ */
271
+ async read_image_result(input, options) {
272
+ const timeout_ms = normalize_positive_number(input.timeout_ms, this.timeout_ms);
273
+ const min_poll_interval_ms = normalize_positive_number(input.min_poll_interval_ms, this.min_poll_interval_ms);
274
+ const max_poll_interval_ms = normalize_positive_number(input.max_poll_interval_ms, this.max_poll_interval_ms);
275
+ const until_finish = normalize_boolean(input.until_finish, options.default_until_finish);
276
+ const first = await this.image_result({ job_id: input.job_id });
277
+ validate_job_result(first);
278
+ if (!until_finish || first.status === "succeeded") {
279
+ if (first.status === "succeeded" && first.result) {
280
+ normalize_image_result(first.result);
281
+ }
282
+ return first;
283
+ }
284
+ if (first.status === "failed") {
285
+ throw new Error(`Image job failed: ${first.error ?? first.message ?? input.job_id}`);
286
+ }
287
+ return await this.wait_for_image_result({
288
+ job_id: input.job_id,
289
+ poll_after_ms: first.poll_after_ms,
290
+ timeout_ms,
291
+ min_poll_interval_ms,
292
+ max_poll_interval_ms,
293
+ });
294
+ }
295
+ /**
296
+ * 轮询图片任务直到成功或失败。
297
+ */
298
+ async wait_for_image_result(input) {
299
+ const timeout_ms = normalize_positive_number(input.timeout_ms, this.timeout_ms);
300
+ const min_poll_interval_ms = normalize_positive_number(input.min_poll_interval_ms, this.min_poll_interval_ms);
301
+ const max_poll_interval_ms = normalize_positive_number(input.max_poll_interval_ms, this.max_poll_interval_ms);
302
+ const deadline = Date.now() + timeout_ms;
303
+ let poll_after_ms = input.poll_after_ms;
164
304
  while (Date.now() < deadline) {
165
- await sleep(clamp_poll_interval(poll_after_ms, this.min_poll_interval_ms, this.max_poll_interval_ms));
166
- const current = await this.image_result({ job_id: created.job_id });
305
+ await sleep(clamp_poll_interval(poll_after_ms, min_poll_interval_ms, max_poll_interval_ms));
306
+ const current = await this.image_result({ job_id: input.job_id });
167
307
  validate_job_result(current);
168
308
  poll_after_ms = current.poll_after_ms;
169
309
  if (current.status === "succeeded") {
170
310
  if (!current.result) {
171
- throw new Error(`Image job ${created.job_id} succeeded without result`);
311
+ throw new Error(`Image job ${input.job_id} succeeded without result`);
172
312
  }
173
- return normalize_image_result(current.result);
313
+ normalize_image_result(current.result);
314
+ return current;
174
315
  }
175
316
  if (current.status === "failed") {
176
- throw new Error(`Image job failed: ${current.error ?? current.message ?? created.job_id}`);
317
+ throw new Error(`Image job failed: ${current.error ?? current.message ?? input.job_id}`);
177
318
  }
178
319
  }
179
- throw new Error(`Image job timed out: ${created.job_id}`);
320
+ throw new Error(`Image job timed out: ${input.job_id}`);
180
321
  }
181
322
  /**
182
323
  * 显式 action 集合。
183
324
  */
184
325
  actions = {
326
+ models: {
327
+ execute: async () => {
328
+ try {
329
+ if (!this.list_models) {
330
+ return {
331
+ success: false,
332
+ error: "ImagePlugin list_models is not configured",
333
+ message: "ImagePlugin list_models is not configured",
334
+ };
335
+ }
336
+ const models = await this.list_models();
337
+ const result = normalize_image_models(models);
338
+ return {
339
+ success: true,
340
+ data: result,
341
+ message: "image models listed",
342
+ };
343
+ }
344
+ catch (error) {
345
+ return {
346
+ success: false,
347
+ error: String(error),
348
+ message: String(error),
349
+ };
350
+ }
351
+ },
352
+ },
353
+ image_create: {
354
+ execute: async ({ payload }) => {
355
+ try {
356
+ const input = normalize_image_payload(payload);
357
+ const created = await this.image_create(input);
358
+ validate_created_job(created);
359
+ return {
360
+ success: true,
361
+ data: created,
362
+ message: "image job created",
363
+ };
364
+ }
365
+ catch (error) {
366
+ return {
367
+ success: false,
368
+ error: String(error),
369
+ message: String(error),
370
+ };
371
+ }
372
+ },
373
+ },
374
+ image_result: {
375
+ execute: async ({ payload }) => {
376
+ try {
377
+ const input = normalize_image_result_payload(payload);
378
+ const current = await this.read_image_result(input, {
379
+ default_until_finish: true,
380
+ });
381
+ const data = current.status === "succeeded" && current.result
382
+ ? current.result
383
+ : current;
384
+ return {
385
+ success: true,
386
+ data,
387
+ message: current.status === "succeeded"
388
+ ? "image generated"
389
+ : `image job ${current.status}`,
390
+ };
391
+ }
392
+ catch (error) {
393
+ return {
394
+ success: false,
395
+ error: String(error),
396
+ message: String(error),
397
+ };
398
+ }
399
+ },
400
+ },
185
401
  generate: {
186
402
  execute: async ({ payload }) => {
187
403
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePlugin.js","sourceRoot":"","sources":["../../src/image/ImagePlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImagePlugin.js","sourceRoot":"","sources":["../../src/image/ImagePlugin.ts"],"names":[],"mappings":"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"}
@@ -110,6 +110,51 @@ export interface ImagePluginJobResult {
110
110
  /** 建议下一次轮询的间隔毫秒数。 */
111
111
  poll_after_ms?: number;
112
112
  }
113
+ /**
114
+ * 图片任务查询输入。
115
+ */
116
+ export interface ImagePluginJobResultInput {
117
+ /** 图片任务 ID,由 `image_create` 返回。 */
118
+ job_id: string;
119
+ /** 是否持续轮询直到任务进入成功或失败终态,默认由 action 决定。 */
120
+ until_finish?: boolean;
121
+ /** 单次查询最大等待时间,单位毫秒。 */
122
+ timeout_ms?: number;
123
+ /** 轮询间隔下限,单位毫秒。 */
124
+ min_poll_interval_ms?: number;
125
+ /** 轮询间隔上限,单位毫秒。 */
126
+ max_poll_interval_ms?: number;
127
+ }
128
+ /**
129
+ * ImagePlugin 可见模型信息。
130
+ */
131
+ export interface ImagePluginModel {
132
+ /** 模型唯一 ID,用于 `image_create` / `generate` payload 的 `model` 字段。 */
133
+ id: string;
134
+ /** 模型展示名称。 */
135
+ name: string;
136
+ /** 模型说明文本。 */
137
+ description?: string;
138
+ /** 模型支持的能力列表,例如 `image`。 */
139
+ modalities: string[];
140
+ /** 模型标签。 */
141
+ tags?: string[];
142
+ /** 模型元数据。 */
143
+ meta?: JsonObject;
144
+ /** 当前模型是否为目录全局默认模型。 */
145
+ is_default?: boolean;
146
+ /** 当前模型作为默认模型负责的 modality 列表。 */
147
+ default_modalities?: string[];
148
+ }
149
+ /**
150
+ * ImagePlugin 模型列表结果。
151
+ */
152
+ export interface ImagePluginModelsResult {
153
+ /** 可用于图片生成的模型列表。 */
154
+ items: ImagePluginModel[];
155
+ /** 图片能力默认模型 ID。 */
156
+ default_model_id?: string;
157
+ }
113
158
  /**
114
159
  * ImagePlugin 构造参数。
115
160
  */
@@ -123,9 +168,9 @@ export interface ImagePluginOptions {
123
168
  /** 创建图片生成任务,通常传入 `(input) => city.ai.image_create(input)`。 */
124
169
  image_create?: (input: ImagePluginInput) => Promise<ImagePluginJobCreateResult> | ImagePluginJobCreateResult;
125
170
  /** 查询图片生成任务,通常传入 `(input) => city.ai.image_result(input)`。 */
126
- image_result?: (input: {
127
- job_id: string;
128
- }) => Promise<ImagePluginJobResult> | ImagePluginJobResult;
171
+ image_result?: (input: Pick<ImagePluginJobResultInput, "job_id">) => Promise<ImagePluginJobResult> | ImagePluginJobResult;
172
+ /** 列出可用图片模型,通常传入 `async () => city.ai.listModels().then((catalog) => catalog.forModality("image"))`。 */
173
+ list_models?: () => Promise<ImagePluginModel[]> | ImagePluginModel[];
129
174
  /** 图片任务最大等待时间,默认 300000ms。 */
130
175
  timeout_ms?: number;
131
176
  /** 轮询间隔下限,默认 100ms。 */
@@ -1 +1 @@
1
- {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../../src/image/types/ImagePlugin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImagePlugin.d.ts","sourceRoot":"","sources":["../../../src/image/types/ImagePlugin.ts"],"names":[],"mappings":"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"}
package/bin/index.d.ts CHANGED
@@ -31,6 +31,6 @@ export type { TaskPluginOptions } from "./task/types/TaskPluginOptions.js";
31
31
  export type { MemoryActionPayload, MemoryDefaults, MemoryDigestHandler, MemoryDigestHandlerInput, MemoryDigestHandlerOutput, MemoryDigestPayload, MemoryDigestResponse, MemoryPluginOptions, MemoryReadPayload, MemoryReadResponse, MemoryRememberPayload, MemoryRememberResponse, MemoryReviseHandler, MemoryReviseHandlerInput, MemoryReviseHandlerOutput, MemoryRevisePayload, MemoryReviseResponse, MemorySearchMode, MemorySearchPayload, MemorySearchResponse, MemorySearchResultItem, MemorySourceStat, MemorySourceType, MemoryStatusResponse, MemoryWikiPageDraft, } from "./memory/types/Memory.js";
32
32
  export type { AsrPluginInput, AsrPluginOptions, AsrPluginResult, } from "./asr/types/AsrPlugin.js";
33
33
  export type { TtsPluginInput, TtsPluginOptions, TtsPluginResult, TtsPluginSimpleAudioResult, TtsPluginUiMessageResult, } from "./tts/types/TtsPlugin.js";
34
- export type { ImagePluginContent, ImagePluginFileContent, ImagePluginInput, ImagePluginJobCreateResult, ImagePluginJobResult, ImagePluginJobStatus, ImagePluginMessage, ImagePluginOptions, ImagePluginResult, ImagePluginTextContent, } from "./image/types/ImagePlugin.js";
34
+ export type { ImagePluginContent, ImagePluginFileContent, ImagePluginInput, ImagePluginJobCreateResult, ImagePluginJobResult, ImagePluginJobResultInput, ImagePluginJobStatus, ImagePluginMessage, ImagePluginModel, ImagePluginModelsResult, ImagePluginOptions, ImagePluginResult, ImagePluginTextContent, } from "./image/types/ImagePlugin.js";
35
35
  export type { ChatAuthorizationCatalog, ChatAuthorizationChannel, ChatAuthorizationConfig, ChatAuthorizationDecision, ChatAuthorizationEvaluateInput, ChatAuthorizationEvaluateResult, ChatAuthorizationObservePrincipalPayload, ChatAuthorizationObservedChat, ChatAuthorizationObservedUser, ChatAuthorizationPermission, ChatAuthorizationPermissionMeta, ChatAuthorizationResolveUserRolePayload, ChatAuthorizationRole, ChatAuthorizationSetUserRolePayload, ChatAuthorizationSnapshot, ChatAuthorizationStateFile, ChatAuthorizationWriteConfigPayload, ChatChannelAuthorizationConfig, } from "./auth/types/AuthPlugin.js";
36
36
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,SAAS,EACT,eAAe,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAC;AACrF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACL,0BAA0B,EAC1B,+BAA+B,EAC/B,4BAA4B,GAC7B,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EACL,0BAA0B,EAC1B,2BAA2B,EAC3B,yBAAyB,EACzB,mCAAmC,EACnC,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC;AAEpC,YAAY,EACV,0BAA0B,GAC3B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EACV,WAAW,EACX,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,mCAAmC,CAAC;AAC3C,YAAY,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AACpF,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,wBAAwB,EACxB,yBAAyB,EACzB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,wBAAwB,EACxB,wBAAwB,EACxB,uBAAuB,EACvB,yBAAyB,EACzB,8BAA8B,EAC9B,+BAA+B,EAC/B,wCAAwC,EACxC,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,+BAA+B,EAC/B,uCAAuC,EACvC,qBAAqB,EACrB,mCAAmC,EACnC,yBAAyB,EACzB,0BAA0B,EAC1B,mCAAmC,EACnC,8BAA8B,GAC/B,MAAM,4BAA4B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@downcity/plugins",
3
- "version": "1.0.94",
3
+ "version": "1.0.96",
4
4
  "type": "module",
5
5
  "description": "Downcity 内建 plugin 集合包",
6
6
  "main": "./bin/index.js",
@@ -17,6 +17,9 @@ import type {
17
17
  ImagePluginInput,
18
18
  ImagePluginJobCreateResult,
19
19
  ImagePluginJobResult,
20
+ ImagePluginJobResultInput,
21
+ ImagePluginModel,
22
+ ImagePluginModelsResult,
20
23
  ImagePluginOptions,
21
24
  ImagePluginResult,
22
25
  } from "@/image/types/ImagePlugin.js";
@@ -45,11 +48,31 @@ function normalize_image_payload(
45
48
  ): ImagePluginInput {
46
49
  const record = to_record(payload ?? {});
47
50
  if (!record) {
48
- throw new TypeError("ImagePlugin.generate payload must be an object");
51
+ throw new TypeError("ImagePlugin image payload must be an object");
49
52
  }
50
53
  return { ...record } as ImagePluginInput;
51
54
  }
52
55
 
56
+ /**
57
+ * 归一化图片任务查询 payload。
58
+ */
59
+ function normalize_image_result_payload(
60
+ payload: JsonValue | undefined,
61
+ ): ImagePluginJobResultInput {
62
+ const record = to_record(payload ?? {});
63
+ if (!record) {
64
+ throw new TypeError("ImagePlugin.image_result payload must be an object");
65
+ }
66
+ const job_id = typeof record.job_id === "string" ? record.job_id.trim() : "";
67
+ if (!job_id) {
68
+ throw new TypeError("ImagePlugin.image_result payload must include job_id");
69
+ }
70
+ return {
71
+ ...record,
72
+ job_id,
73
+ } as ImagePluginJobResultInput;
74
+ }
75
+
53
76
  /**
54
77
  * 校验 image 函数返回的 UIMessage。
55
78
  */
@@ -89,6 +112,82 @@ function normalize_positive_number(value: unknown, fallback: number): number {
89
112
  : fallback;
90
113
  }
91
114
 
115
+ /**
116
+ * 读取可选布尔值。
117
+ */
118
+ function normalize_boolean(value: unknown, fallback: boolean): boolean {
119
+ return typeof value === "boolean" ? value : fallback;
120
+ }
121
+
122
+ /**
123
+ * 归一化模型元数据为 JSON 对象。
124
+ */
125
+ function normalize_json_object(value: unknown): JsonObject | undefined {
126
+ const record = to_record(value);
127
+ if (!record) return undefined;
128
+ return record as JsonObject;
129
+ }
130
+
131
+ /**
132
+ * 归一化图片模型信息,确保 action 返回纯 JSON。
133
+ */
134
+ function normalize_image_model(value: ImagePluginModel): ImagePluginModel | null {
135
+ const record = to_record(value);
136
+ if (!record) return null;
137
+ const id = typeof record.id === "string" ? record.id.trim() : "";
138
+ if (!id) return null;
139
+ const modalities = Array.isArray(record.modalities)
140
+ ? record.modalities
141
+ .map((item) => String(item || "").trim())
142
+ .filter(Boolean)
143
+ : [];
144
+ if (!modalities.includes("image")) return null;
145
+ const tags = Array.isArray(record.tags)
146
+ ? record.tags.map((item) => String(item || "").trim()).filter(Boolean)
147
+ : undefined;
148
+ const default_modalities = Array.isArray(record.default_modalities)
149
+ ? record.default_modalities
150
+ .map((item) => String(item || "").trim())
151
+ .filter(Boolean)
152
+ : undefined;
153
+ const meta = normalize_json_object(record.meta);
154
+ return {
155
+ id,
156
+ name: typeof record.name === "string" && record.name.trim()
157
+ ? record.name.trim()
158
+ : id,
159
+ ...(typeof record.description === "string"
160
+ ? { description: record.description }
161
+ : {}),
162
+ modalities,
163
+ ...(tags && tags.length > 0 ? { tags } : {}),
164
+ ...(meta ? { meta } : {}),
165
+ ...(typeof record.is_default === "boolean"
166
+ ? { is_default: record.is_default }
167
+ : {}),
168
+ ...(default_modalities && default_modalities.length > 0
169
+ ? { default_modalities }
170
+ : {}),
171
+ };
172
+ }
173
+
174
+ /**
175
+ * 归一化模型列表结果。
176
+ */
177
+ function normalize_image_models(values: ImagePluginModel[]): ImagePluginModelsResult {
178
+ const items = values
179
+ .map((item) => normalize_image_model(item))
180
+ .filter((item): item is ImagePluginModel => item !== null);
181
+ const default_model_id =
182
+ items.find((item) => item.default_modalities?.includes("image"))?.id ??
183
+ items.find((item) => item.is_default)?.id ??
184
+ items[0]?.id;
185
+ return {
186
+ items,
187
+ ...(default_model_id ? { default_model_id } : {}),
188
+ };
189
+ }
190
+
92
191
  /**
93
192
  * 校验任务创建结果。
94
193
  */
@@ -139,6 +238,7 @@ export class ImagePlugin extends BasePlugin {
139
238
 
140
239
  private readonly image_create: NonNullable<ImagePluginOptions["image_create"]>;
141
240
  private readonly image_result: NonNullable<ImagePluginOptions["image_result"]>;
241
+ private readonly list_models?: ImagePluginOptions["list_models"];
142
242
  private readonly timeout_ms: number;
143
243
  private readonly min_poll_interval_ms: number;
144
244
  private readonly max_poll_interval_ms: number;
@@ -162,6 +262,7 @@ export class ImagePlugin extends BasePlugin {
162
262
  ).trim();
163
263
  this.image_create = options.image_create;
164
264
  this.image_result = options.image_result;
265
+ this.list_models = options.list_models;
165
266
  this.timeout_ms = normalize_positive_number(
166
267
  options.timeout_ms,
167
268
  DEFAULT_TIMEOUT_MS,
@@ -201,7 +302,10 @@ export class ImagePlugin extends BasePlugin {
201
302
  "Payload rules:",
202
303
  "- `prompt` is required unless `messages` provides the full multimodal image context.",
203
304
  "- Optional common fields: `messages`, `size`, `aspect_ratio`, `ratio`, `quality`, `n`, `count`, `seed`, `provider_options`.",
305
+ "- To choose a model, call `models` and pass the selected model `id` as payload `model`.",
204
306
  "- Preserve the user's creative intent; do not over-rewrite the prompt unless clarification is necessary.",
307
+ "- For a two-step flow, call `image_create` first, then call `image_result` with `job_id`; `image_result` waits until the job finishes by default.",
308
+ "- `generate` is a convenience action that creates the job and waits for the final image in one call.",
205
309
  "- Generated image file parts are saved under project `.downcity/resources` and attached to the final assistant message automatically.",
206
310
  ].join("\n");
207
311
  }
@@ -211,40 +315,205 @@ export class ImagePlugin extends BasePlugin {
211
315
  ): Promise<ImagePluginResult> {
212
316
  const created = await this.image_create(input);
213
317
  validate_created_job(created);
214
- const deadline = Date.now() + this.timeout_ms;
215
- let poll_after_ms = created.poll_after_ms;
318
+ const current = await this.wait_for_image_result({
319
+ job_id: created.job_id,
320
+ poll_after_ms: created.poll_after_ms,
321
+ });
322
+ if (!current.result) {
323
+ throw new Error(`Image job ${created.job_id} succeeded without result`);
324
+ }
325
+ return normalize_image_result(current.result);
326
+ }
327
+
328
+ /**
329
+ * 查询图片任务,按需等待终态。
330
+ */
331
+ private async read_image_result(
332
+ input: ImagePluginJobResultInput,
333
+ options: {
334
+ /**
335
+ * 默认是否等待终态。
336
+ */
337
+ default_until_finish: boolean;
338
+ },
339
+ ): Promise<ImagePluginJobResult> {
340
+ const timeout_ms = normalize_positive_number(input.timeout_ms, this.timeout_ms);
341
+ const min_poll_interval_ms = normalize_positive_number(
342
+ input.min_poll_interval_ms,
343
+ this.min_poll_interval_ms,
344
+ );
345
+ const max_poll_interval_ms = normalize_positive_number(
346
+ input.max_poll_interval_ms,
347
+ this.max_poll_interval_ms,
348
+ );
349
+ const until_finish = normalize_boolean(
350
+ input.until_finish,
351
+ options.default_until_finish,
352
+ );
353
+ const first = await this.image_result({ job_id: input.job_id });
354
+ validate_job_result(first);
355
+ if (!until_finish || first.status === "succeeded") {
356
+ if (first.status === "succeeded" && first.result) {
357
+ normalize_image_result(first.result);
358
+ }
359
+ return first;
360
+ }
361
+ if (first.status === "failed") {
362
+ throw new Error(
363
+ `Image job failed: ${first.error ?? first.message ?? input.job_id}`,
364
+ );
365
+ }
366
+ return await this.wait_for_image_result({
367
+ job_id: input.job_id,
368
+ poll_after_ms: first.poll_after_ms,
369
+ timeout_ms,
370
+ min_poll_interval_ms,
371
+ max_poll_interval_ms,
372
+ });
373
+ }
374
+
375
+ /**
376
+ * 轮询图片任务直到成功或失败。
377
+ */
378
+ private async wait_for_image_result(input: {
379
+ /**
380
+ * 图片任务 ID。
381
+ */
382
+ job_id: string;
383
+ /**
384
+ * 首次建议轮询间隔。
385
+ */
386
+ poll_after_ms?: number;
387
+ /**
388
+ * 最大等待时间。
389
+ */
390
+ timeout_ms?: number;
391
+ /**
392
+ * 轮询间隔下限。
393
+ */
394
+ min_poll_interval_ms?: number;
395
+ /**
396
+ * 轮询间隔上限。
397
+ */
398
+ max_poll_interval_ms?: number;
399
+ }): Promise<ImagePluginJobResult> {
400
+ const timeout_ms = normalize_positive_number(input.timeout_ms, this.timeout_ms);
401
+ const min_poll_interval_ms = normalize_positive_number(
402
+ input.min_poll_interval_ms,
403
+ this.min_poll_interval_ms,
404
+ );
405
+ const max_poll_interval_ms = normalize_positive_number(
406
+ input.max_poll_interval_ms,
407
+ this.max_poll_interval_ms,
408
+ );
409
+ const deadline = Date.now() + timeout_ms;
410
+ let poll_after_ms = input.poll_after_ms;
216
411
 
217
412
  while (Date.now() < deadline) {
218
413
  await sleep(
219
414
  clamp_poll_interval(
220
415
  poll_after_ms,
221
- this.min_poll_interval_ms,
222
- this.max_poll_interval_ms,
416
+ min_poll_interval_ms,
417
+ max_poll_interval_ms,
223
418
  ),
224
419
  );
225
- const current = await this.image_result({ job_id: created.job_id });
420
+ const current = await this.image_result({ job_id: input.job_id });
226
421
  validate_job_result(current);
227
422
  poll_after_ms = current.poll_after_ms;
228
423
  if (current.status === "succeeded") {
229
424
  if (!current.result) {
230
- throw new Error(`Image job ${created.job_id} succeeded without result`);
425
+ throw new Error(`Image job ${input.job_id} succeeded without result`);
231
426
  }
232
- return normalize_image_result(current.result);
427
+ normalize_image_result(current.result);
428
+ return current;
233
429
  }
234
430
  if (current.status === "failed") {
235
431
  throw new Error(
236
- `Image job failed: ${current.error ?? current.message ?? created.job_id}`,
432
+ `Image job failed: ${current.error ?? current.message ?? input.job_id}`,
237
433
  );
238
434
  }
239
435
  }
240
436
 
241
- throw new Error(`Image job timed out: ${created.job_id}`);
437
+ throw new Error(`Image job timed out: ${input.job_id}`);
242
438
  }
243
439
 
244
440
  /**
245
441
  * 显式 action 集合。
246
442
  */
247
443
  readonly actions = {
444
+ models: {
445
+ execute: async () => {
446
+ try {
447
+ if (!this.list_models) {
448
+ return {
449
+ success: false,
450
+ error: "ImagePlugin list_models is not configured",
451
+ message: "ImagePlugin list_models is not configured",
452
+ };
453
+ }
454
+ const models = await this.list_models();
455
+ const result = normalize_image_models(models);
456
+ return {
457
+ success: true,
458
+ data: result as unknown as JsonObject,
459
+ message: "image models listed",
460
+ };
461
+ } catch (error) {
462
+ return {
463
+ success: false,
464
+ error: String(error),
465
+ message: String(error),
466
+ };
467
+ }
468
+ },
469
+ },
470
+ image_create: {
471
+ execute: async ({ payload }: { payload: JsonValue }) => {
472
+ try {
473
+ const input = normalize_image_payload(payload);
474
+ const created = await this.image_create(input);
475
+ validate_created_job(created);
476
+ return {
477
+ success: true,
478
+ data: created as unknown as JsonObject,
479
+ message: "image job created",
480
+ };
481
+ } catch (error) {
482
+ return {
483
+ success: false,
484
+ error: String(error),
485
+ message: String(error),
486
+ };
487
+ }
488
+ },
489
+ },
490
+ image_result: {
491
+ execute: async ({ payload }: { payload: JsonValue }) => {
492
+ try {
493
+ const input = normalize_image_result_payload(payload);
494
+ const current = await this.read_image_result(input, {
495
+ default_until_finish: true,
496
+ });
497
+ const data = current.status === "succeeded" && current.result
498
+ ? current.result as unknown as JsonObject
499
+ : current as unknown as JsonObject;
500
+ return {
501
+ success: true,
502
+ data,
503
+ message:
504
+ current.status === "succeeded"
505
+ ? "image generated"
506
+ : `image job ${current.status}`,
507
+ };
508
+ } catch (error) {
509
+ return {
510
+ success: false,
511
+ error: String(error),
512
+ message: String(error),
513
+ };
514
+ }
515
+ },
516
+ },
248
517
  generate: {
249
518
  execute: async ({ payload }: { payload: JsonValue }) => {
250
519
  try {
@@ -130,6 +130,54 @@ export interface ImagePluginJobResult {
130
130
  poll_after_ms?: number;
131
131
  }
132
132
 
133
+ /**
134
+ * 图片任务查询输入。
135
+ */
136
+ export interface ImagePluginJobResultInput {
137
+ /** 图片任务 ID,由 `image_create` 返回。 */
138
+ job_id: string;
139
+ /** 是否持续轮询直到任务进入成功或失败终态,默认由 action 决定。 */
140
+ until_finish?: boolean;
141
+ /** 单次查询最大等待时间,单位毫秒。 */
142
+ timeout_ms?: number;
143
+ /** 轮询间隔下限,单位毫秒。 */
144
+ min_poll_interval_ms?: number;
145
+ /** 轮询间隔上限,单位毫秒。 */
146
+ max_poll_interval_ms?: number;
147
+ }
148
+
149
+ /**
150
+ * ImagePlugin 可见模型信息。
151
+ */
152
+ export interface ImagePluginModel {
153
+ /** 模型唯一 ID,用于 `image_create` / `generate` payload 的 `model` 字段。 */
154
+ id: string;
155
+ /** 模型展示名称。 */
156
+ name: string;
157
+ /** 模型说明文本。 */
158
+ description?: string;
159
+ /** 模型支持的能力列表,例如 `image`。 */
160
+ modalities: string[];
161
+ /** 模型标签。 */
162
+ tags?: string[];
163
+ /** 模型元数据。 */
164
+ meta?: JsonObject;
165
+ /** 当前模型是否为目录全局默认模型。 */
166
+ is_default?: boolean;
167
+ /** 当前模型作为默认模型负责的 modality 列表。 */
168
+ default_modalities?: string[];
169
+ }
170
+
171
+ /**
172
+ * ImagePlugin 模型列表结果。
173
+ */
174
+ export interface ImagePluginModelsResult {
175
+ /** 可用于图片生成的模型列表。 */
176
+ items: ImagePluginModel[];
177
+ /** 图片能力默认模型 ID。 */
178
+ default_model_id?: string;
179
+ }
180
+
133
181
  /**
134
182
  * ImagePlugin 构造参数。
135
183
  */
@@ -145,9 +193,11 @@ export interface ImagePluginOptions {
145
193
  input: ImagePluginInput,
146
194
  ) => Promise<ImagePluginJobCreateResult> | ImagePluginJobCreateResult;
147
195
  /** 查询图片生成任务,通常传入 `(input) => city.ai.image_result(input)`。 */
148
- image_result?: (input: {
149
- job_id: string;
150
- }) => Promise<ImagePluginJobResult> | ImagePluginJobResult;
196
+ image_result?: (
197
+ input: Pick<ImagePluginJobResultInput, "job_id">,
198
+ ) => Promise<ImagePluginJobResult> | ImagePluginJobResult;
199
+ /** 列出可用图片模型,通常传入 `async () => city.ai.listModels().then((catalog) => catalog.forModality("image"))`。 */
200
+ list_models?: () => Promise<ImagePluginModel[]> | ImagePluginModel[];
151
201
  /** 图片任务最大等待时间,默认 300000ms。 */
152
202
  timeout_ms?: number;
153
203
  /** 轮询间隔下限,默认 100ms。 */
package/src/index.ts CHANGED
@@ -107,8 +107,11 @@ export type {
107
107
  ImagePluginInput,
108
108
  ImagePluginJobCreateResult,
109
109
  ImagePluginJobResult,
110
+ ImagePluginJobResultInput,
110
111
  ImagePluginJobStatus,
111
112
  ImagePluginMessage,
113
+ ImagePluginModel,
114
+ ImagePluginModelsResult,
112
115
  ImagePluginOptions,
113
116
  ImagePluginResult,
114
117
  ImagePluginTextContent,