@xinizai/pi-image-gen 0.1.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/README.md +337 -0
- package/dist/core/cache.d.ts +11 -0
- package/dist/core/cache.js +42 -0
- package/dist/core/cache.js.map +1 -0
- package/dist/core/capabilities.d.ts +2 -0
- package/dist/core/capabilities.js +65 -0
- package/dist/core/capabilities.js.map +1 -0
- package/dist/core/errors.d.ts +11 -0
- package/dist/core/errors.js +71 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/global-config.d.ts +25 -0
- package/dist/core/global-config.js +172 -0
- package/dist/core/global-config.js.map +1 -0
- package/dist/core/image-service.d.ts +14 -0
- package/dist/core/image-service.js +42 -0
- package/dist/core/image-service.js.map +1 -0
- package/dist/core/model-browser.d.ts +5 -0
- package/dist/core/model-browser.js +76 -0
- package/dist/core/model-browser.js.map +1 -0
- package/dist/core/model-registry.d.ts +10 -0
- package/dist/core/model-registry.js +44 -0
- package/dist/core/model-registry.js.map +1 -0
- package/dist/core/provider.d.ts +2 -0
- package/dist/core/provider.js +8 -0
- package/dist/core/provider.js.map +1 -0
- package/dist/core/types.d.ts +122 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +490 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +16 -0
- package/dist/providers/openai-compatible.js +216 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/tools/shared.d.ts +42 -0
- package/dist/tools/shared.js +241 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/utils/config.d.ts +5 -0
- package/dist/utils/config.js +65 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/download.d.ts +8 -0
- package/dist/utils/download.js +139 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/files.d.ts +18 -0
- package/dist/utils/files.js +83 -0
- package/dist/utils/files.js.map +1 -0
- package/package.json +34 -0
- package/src/core/cache.ts +43 -0
- package/src/core/capabilities.ts +55 -0
- package/src/core/errors.ts +92 -0
- package/src/core/global-config.ts +167 -0
- package/src/core/image-service.ts +40 -0
- package/src/core/model-browser.ts +73 -0
- package/src/core/model-registry.ts +43 -0
- package/src/core/provider.ts +8 -0
- package/src/core/types.ts +135 -0
- package/src/index.ts +394 -0
- package/src/providers/openai-compatible.ts +198 -0
- package/src/tools/shared.ts +235 -0
- package/src/utils/config.ts +61 -0
- package/src/utils/download.ts +103 -0
- package/src/utils/files.ts +78 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { Type } from "@earendil-works/pi-ai";
|
|
2
|
+
import { configErrorText, configText, createService, deleteProvider, discoverProviderCandidate, modelsText, providerStatus, providersText, resultText, saveProviderWithDiscovery, setDefaultProvider, updateProvider } from "./tools/shared.js";
|
|
3
|
+
import { GlobalConfigStore } from "./core/global-config.js";
|
|
4
|
+
import { maskApiKey } from "./core/errors.js";
|
|
5
|
+
import { ModelRegistry } from "./core/model-registry.js";
|
|
6
|
+
const OutputFormat = Type.Union([Type.Literal("png"), Type.Literal("jpeg"), Type.Literal("jpg"), Type.Literal("webp")]);
|
|
7
|
+
export default function imageGenExtension(pi) {
|
|
8
|
+
pi.registerTool({
|
|
9
|
+
name: "image_generate",
|
|
10
|
+
label: "图片生成",
|
|
11
|
+
description: "根据文字描述生成图片。自动选择已配置的图片生成提供商和模型。",
|
|
12
|
+
promptSnippet: "根据文字描述生成图片。必要时自动使用已配置的全局提供商。",
|
|
13
|
+
promptGuidelines: ["当用户要求生成、创建或绘制图片时使用 image_generate。若尚未配置提供商,请引导用户运行 /image-config。不要请求或泄露 API Key。"],
|
|
14
|
+
parameters: Type.Object({
|
|
15
|
+
prompt: Type.String({ description: "图片生成提示词" }),
|
|
16
|
+
provider: Type.Optional(Type.String({ description: "可选,Provider ID 或名称" })),
|
|
17
|
+
model: Type.Optional(Type.String({ description: "可选,精确模型 ID;留空则自动选择" })),
|
|
18
|
+
size: Type.Optional(Type.String({ description: "可选,图片尺寸,例如 1024x1024" })),
|
|
19
|
+
aspect_ratio: Type.Optional(Type.String({ description: "可选,宽高比,例如 16:9" })),
|
|
20
|
+
quality: Type.Optional(Type.String({ description: "可选,质量,例如 standard、hd、high" })),
|
|
21
|
+
output_format: Type.Optional(OutputFormat),
|
|
22
|
+
n: Type.Optional(Type.Number({ description: "图片数量", minimum: 1, maximum: 10 })),
|
|
23
|
+
}),
|
|
24
|
+
async execute(_id, params, signal) {
|
|
25
|
+
try {
|
|
26
|
+
return { content: [{ type: "text", text: resultText("图片生成", await (await createService(params.provider)).generate(params, signal)) }], details: {} };
|
|
27
|
+
}
|
|
28
|
+
catch (e) {
|
|
29
|
+
throw new Error(configErrorText(e));
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
pi.registerTool({
|
|
34
|
+
name: "image_edit",
|
|
35
|
+
label: "图片编辑",
|
|
36
|
+
description: "根据参考图片和文字要求编辑图片。",
|
|
37
|
+
promptSnippet: "根据参考图片和文字要求编辑图片。",
|
|
38
|
+
promptGuidelines: ["当用户提供参考图片并希望编辑时使用 image_edit。"],
|
|
39
|
+
parameters: Type.Object({
|
|
40
|
+
image: Type.String({ description: "Windows/Linux 本地路径、file:// URL 或 https URL" }),
|
|
41
|
+
prompt: Type.String({ description: "图片编辑要求" }),
|
|
42
|
+
provider: Type.Optional(Type.String({ description: "可选,Provider ID 或名称" })),
|
|
43
|
+
model: Type.Optional(Type.String({ description: "可选,模型 ID" })),
|
|
44
|
+
size: Type.Optional(Type.String({ description: "可选,图片尺寸" })),
|
|
45
|
+
output_format: Type.Optional(OutputFormat),
|
|
46
|
+
}),
|
|
47
|
+
async execute(_id, params, signal) {
|
|
48
|
+
try {
|
|
49
|
+
return { content: [{ type: "text", text: resultText("图片编辑", await (await createService(params.provider)).edit(params, signal)) }], details: {} };
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
throw new Error(configErrorText(e));
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
pi.registerTool({
|
|
57
|
+
name: "image_variation",
|
|
58
|
+
label: "图片变体",
|
|
59
|
+
description: "根据参考图片生成新的图片变体。",
|
|
60
|
+
promptSnippet: "根据参考图片生成新的图片变体。",
|
|
61
|
+
parameters: Type.Object({
|
|
62
|
+
image: Type.String({ description: "Windows/Linux 本地路径、file:// URL 或 https URL" }),
|
|
63
|
+
provider: Type.Optional(Type.String({ description: "可选,Provider ID 或名称" })),
|
|
64
|
+
model: Type.Optional(Type.String({ description: "可选,模型 ID" })),
|
|
65
|
+
size: Type.Optional(Type.String({ description: "可选,图片尺寸" })),
|
|
66
|
+
n: Type.Optional(Type.Number({ minimum: 1, maximum: 10 })),
|
|
67
|
+
}),
|
|
68
|
+
async execute(_id, params, signal) {
|
|
69
|
+
try {
|
|
70
|
+
return { content: [{ type: "text", text: resultText("图片变体", await (await createService(params.provider)).variation(params, signal)) }], details: {} };
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
throw new Error(configErrorText(e));
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
});
|
|
77
|
+
pi.registerTool({
|
|
78
|
+
name: "image_models",
|
|
79
|
+
label: "图片模型",
|
|
80
|
+
description: "查询当前已配置提供商支持的图片模型。结果会自动限制长度,避免上下文过长。",
|
|
81
|
+
promptSnippet: "查询当前已配置提供商支持的图片模型。",
|
|
82
|
+
parameters: Type.Object({
|
|
83
|
+
provider: Type.Optional(Type.String({ description: "提供商 ID 或名称" })),
|
|
84
|
+
search: Type.Optional(Type.String({ description: "搜索关键词" })),
|
|
85
|
+
page: Type.Optional(Type.Number({ minimum: 1 })),
|
|
86
|
+
limit: Type.Optional(Type.Number({ minimum: 1, maximum: 50 })),
|
|
87
|
+
refresh: Type.Optional(Type.Boolean({ description: "刷新当前选择的提供商" })),
|
|
88
|
+
refresh_all: Type.Optional(Type.Boolean({ description: "刷新所有已配置提供商" })),
|
|
89
|
+
include_text: Type.Optional(Type.Boolean({ description: "显示文本模型" })),
|
|
90
|
+
}),
|
|
91
|
+
async execute(_id, params, signal) {
|
|
92
|
+
try {
|
|
93
|
+
const opts = parseModelArgs("");
|
|
94
|
+
if (params.provider !== undefined)
|
|
95
|
+
opts.provider = params.provider;
|
|
96
|
+
if (params.search !== undefined)
|
|
97
|
+
opts.search = params.search;
|
|
98
|
+
if (params.page !== undefined)
|
|
99
|
+
opts.page = params.page;
|
|
100
|
+
if (params.limit !== undefined)
|
|
101
|
+
opts.limit = params.limit;
|
|
102
|
+
opts.refresh = Boolean(params.refresh);
|
|
103
|
+
opts.refreshAll = Boolean(params.refresh_all);
|
|
104
|
+
opts.includeText = Boolean(params.include_text);
|
|
105
|
+
return { content: [{ type: "text", text: await modelsText(opts, signal) }], details: {} };
|
|
106
|
+
}
|
|
107
|
+
catch (e) {
|
|
108
|
+
throw new Error(configErrorText(e));
|
|
109
|
+
}
|
|
110
|
+
},
|
|
111
|
+
});
|
|
112
|
+
pi.registerTool({
|
|
113
|
+
name: "image_config",
|
|
114
|
+
label: "图片生成配置",
|
|
115
|
+
description: "管理全局图片生成提供商、API 配置、模型和默认设置。",
|
|
116
|
+
promptSnippet: "管理全局图片生成提供商、API 配置、模型和默认设置。",
|
|
117
|
+
parameters: Type.Object({}),
|
|
118
|
+
async execute(_id, _params, signal) {
|
|
119
|
+
try {
|
|
120
|
+
return { content: [{ type: "text", text: await configText(signal) }], details: {} };
|
|
121
|
+
}
|
|
122
|
+
catch (e) {
|
|
123
|
+
throw new Error(configErrorText(e));
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
pi.registerTool({
|
|
128
|
+
name: "image_providers",
|
|
129
|
+
label: "提供商列表",
|
|
130
|
+
description: "列出已配置的图片提供商及其状态。",
|
|
131
|
+
promptSnippet: "列出已配置的图片提供商及其状态。",
|
|
132
|
+
parameters: Type.Object({}),
|
|
133
|
+
async execute(_id, _params, signal) {
|
|
134
|
+
try {
|
|
135
|
+
return { content: [{ type: "text", text: await providersText(signal) }], details: {} };
|
|
136
|
+
}
|
|
137
|
+
catch (e) {
|
|
138
|
+
throw new Error(configErrorText(e));
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
pi.registerCommand("image-config", { description: "图片生成配置:添加提供商、获取模型、设置默认提供商。", handler: async (_args, ctx) => handleConfigCommand(ctx) });
|
|
143
|
+
}
|
|
144
|
+
function parseModelArgs(args) {
|
|
145
|
+
const parts = args.trim().split(/\s+/).filter(Boolean);
|
|
146
|
+
const result = {};
|
|
147
|
+
for (let i = 0; i < parts.length; i += 1) {
|
|
148
|
+
const p = parts[i];
|
|
149
|
+
if (p === "--refresh")
|
|
150
|
+
result.refresh = true;
|
|
151
|
+
else if (p === "--refresh-all")
|
|
152
|
+
result.refreshAll = true;
|
|
153
|
+
else if (p === "--include-text")
|
|
154
|
+
result.includeText = true;
|
|
155
|
+
else if (p === "--provider") {
|
|
156
|
+
const value = parts[++i];
|
|
157
|
+
if (value !== undefined)
|
|
158
|
+
result.provider = value;
|
|
159
|
+
}
|
|
160
|
+
else if (p === "--page")
|
|
161
|
+
result.page = Number(parts[++i]);
|
|
162
|
+
else if (p === "--limit")
|
|
163
|
+
result.limit = Number(parts[++i]);
|
|
164
|
+
else
|
|
165
|
+
result.search = result.search ? `${result.search} ${p}` : p;
|
|
166
|
+
}
|
|
167
|
+
return result;
|
|
168
|
+
}
|
|
169
|
+
async function handleConfigCommand(ctx) {
|
|
170
|
+
// 与 Vision 配置面板相同:始终在本 command 内循环,取消或“返回”才关闭。
|
|
171
|
+
while (true) {
|
|
172
|
+
const global = await new GlobalConfigStore().read();
|
|
173
|
+
const current = global.defaultProviderId ? global.providers.find((provider) => provider.id === global.defaultProviderId) : undefined;
|
|
174
|
+
const options = global.providers.length === 0
|
|
175
|
+
? ["+ 添加提供商", "取消"]
|
|
176
|
+
: [
|
|
177
|
+
...global.providers.map((provider) => `${provider.id === global.defaultProviderId ? "●" : "○"} ${provider.name} — ${provider.defaultModel ?? "未设置默认模型"} [${provider.id}]`),
|
|
178
|
+
"+ 添加提供商", "查看当前配置", "取消",
|
|
179
|
+
];
|
|
180
|
+
const picked = await ctx.ui.select(`图片生成 Provider 设置\n当前:${current ? `${current.name} (${current.defaultModel ?? "未设置默认模型"})` : "未配置"}`, options);
|
|
181
|
+
if (!picked || picked === "取消")
|
|
182
|
+
return;
|
|
183
|
+
if (picked === "+ 添加提供商") {
|
|
184
|
+
await interactiveAddProvider(ctx);
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (picked === "查看当前配置") {
|
|
188
|
+
ctx.ui.notify(await configText(ctx.signal), "info");
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const id = picked.match(/\[([^\]]+)\]$/)?.[1];
|
|
192
|
+
const provider = id ? global.providers.find((item) => item.id === id) : undefined;
|
|
193
|
+
if (provider)
|
|
194
|
+
await handleProviderActions(ctx, provider.id);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async function interactiveAddProvider(ctx) {
|
|
198
|
+
const store = new GlobalConfigStore();
|
|
199
|
+
const before = await store.read();
|
|
200
|
+
const name = await ctx.ui.input("添加图片提供商 - 提供商名称", "例如:OpenAI");
|
|
201
|
+
if (!name)
|
|
202
|
+
return;
|
|
203
|
+
const baseUrl = await ctx.ui.input("添加图片提供商 - API Base URL", "例如:https://api.openai.com/v1");
|
|
204
|
+
if (!baseUrl)
|
|
205
|
+
return;
|
|
206
|
+
const apiKey = await ctx.ui.input("添加图片提供商 - API Key", "请输入 API Key");
|
|
207
|
+
if (!apiKey)
|
|
208
|
+
return;
|
|
209
|
+
ctx.ui.notify("正在测试连接并获取模型,请稍候……", "info");
|
|
210
|
+
try {
|
|
211
|
+
const discovery = await discoverProviderCandidate({ name, baseUrl, apiKey }, ctx.signal);
|
|
212
|
+
ctx.ui.notify(renderDiscoveryChoiceText(discovery), "info");
|
|
213
|
+
const defaultModel = await selectDefaultImageModel(ctx, discovery);
|
|
214
|
+
if (!defaultModel) {
|
|
215
|
+
ctx.ui.notify("已取消添加:未选择默认图片模型。", "info");
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
let setDefault = before.providers.length === 0;
|
|
219
|
+
if (!setDefault && before.defaultProviderId)
|
|
220
|
+
setDefault = await ctx.ui.confirm("设置默认提供商", `是否将 ${name} 设置为默认图片提供商?`);
|
|
221
|
+
const responseFormat = await chooseResponseFormat(ctx, "自动兼容(推荐)");
|
|
222
|
+
if (!responseFormat)
|
|
223
|
+
return;
|
|
224
|
+
const input = { name, baseUrl, apiKey, responseFormat, setDefault };
|
|
225
|
+
if (defaultModel)
|
|
226
|
+
input.defaultModel = defaultModel;
|
|
227
|
+
ctx.ui.notify(await saveProviderWithDiscovery(input, discovery, store), "info");
|
|
228
|
+
ctx.ui.notify(await configText(ctx.signal), "info");
|
|
229
|
+
}
|
|
230
|
+
catch (e) {
|
|
231
|
+
ctx.ui.notify(configErrorText(e), "error");
|
|
232
|
+
const next = await ctx.ui.select("模型发现失败", ["重试", "手动指定模型", "返回"]);
|
|
233
|
+
if (next === "重试")
|
|
234
|
+
await interactiveAddProvider(ctx);
|
|
235
|
+
else if (next === "手动指定模型") {
|
|
236
|
+
const defaultModel = await ctx.ui.input("手动指定默认图片模型", "例如:flux-pro");
|
|
237
|
+
if (!defaultModel)
|
|
238
|
+
return;
|
|
239
|
+
const setDefault = before.providers.length === 0 || await ctx.ui.confirm("设置默认提供商", `是否将 ${name} 设置为默认图片提供商?`);
|
|
240
|
+
ctx.ui.notify(await saveProviderWithoutDiscovery({ name, baseUrl, apiKey, defaultModel, setDefault }, store), "info");
|
|
241
|
+
ctx.ui.notify(await configText(ctx.signal), "info");
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
async function handleProvidersCommand(ctx) {
|
|
246
|
+
// 兼容旧调用入口;实际 Provider 选择已经收进主配置面板。
|
|
247
|
+
await handleConfigCommand(ctx);
|
|
248
|
+
}
|
|
249
|
+
async function handleProviderActions(ctx, id) {
|
|
250
|
+
while (true) {
|
|
251
|
+
const provider = await new GlobalConfigStore().resolveProvider(id);
|
|
252
|
+
if (!provider) {
|
|
253
|
+
ctx.ui.notify(`提供商不存在:${id}`, "warning");
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const action = await ctx.ui.select(`图片提供商:${provider.name}`, ["✎ 编辑提供商", "选择默认图片模型", "设为默认提供商", "✕ 删除提供商", "返回"]);
|
|
257
|
+
if (!action || action === "返回")
|
|
258
|
+
return;
|
|
259
|
+
try {
|
|
260
|
+
if (action === "✎ 编辑提供商")
|
|
261
|
+
await interactiveEditProvider(ctx, provider.id);
|
|
262
|
+
else if (action === "选择默认图片模型")
|
|
263
|
+
await chooseProviderModel(ctx, provider.id);
|
|
264
|
+
else if (action === "设为默认提供商")
|
|
265
|
+
ctx.ui.notify(await setDefaultProvider(provider.id), "info");
|
|
266
|
+
else if (action === "✕ 删除提供商" && await ctx.ui.confirm("删除图片提供商?", `确定删除 “${provider.name}” 吗?`)) {
|
|
267
|
+
ctx.ui.notify(await deleteProvider(provider.id), "warning");
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
catch (error) {
|
|
272
|
+
ctx.ui.notify(configErrorText(error), "error");
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async function interactiveEditProvider(ctx, id) {
|
|
277
|
+
const store = new GlobalConfigStore();
|
|
278
|
+
const provider = await store.resolveProvider(id);
|
|
279
|
+
if (!provider) {
|
|
280
|
+
ctx.ui.notify(`提供商不存在:${id}`, "error");
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
// 直接打开回填后的表单;Provider ID 是唯一身份,空输入不会覆盖已保存的值。
|
|
284
|
+
const name = await prefilledInput(ctx, "编辑提供商 - 提供商名称", provider.name);
|
|
285
|
+
if (name === undefined)
|
|
286
|
+
return;
|
|
287
|
+
const baseUrl = await prefilledInput(ctx, "编辑提供商 - API Base URL", provider.baseUrl);
|
|
288
|
+
if (baseUrl === undefined)
|
|
289
|
+
return;
|
|
290
|
+
const apiKeyInput = await prefilledInput(ctx, "编辑提供商 - API Key", maskApiKey(provider.apiKey));
|
|
291
|
+
if (apiKeyInput === undefined)
|
|
292
|
+
return;
|
|
293
|
+
const modelInput = provider.defaultModel ?? "";
|
|
294
|
+
const nextName = name || provider.name;
|
|
295
|
+
const nextBaseUrl = baseUrl || provider.baseUrl;
|
|
296
|
+
const nextApiKey = normalizeEditedApiKey(apiKeyInput, provider.apiKey);
|
|
297
|
+
const urlChanged = nextBaseUrl !== provider.baseUrl;
|
|
298
|
+
const keyChanged = nextApiKey !== provider.apiKey;
|
|
299
|
+
try {
|
|
300
|
+
const discovery = urlChanged || keyChanged
|
|
301
|
+
? await discoverProviderCandidate({ name: nextName, baseUrl: nextBaseUrl, apiKey: nextApiKey }, ctx.signal)
|
|
302
|
+
: await (await createService(provider.id)).discover(false, ctx.signal);
|
|
303
|
+
ctx.ui.notify(renderDiscoveryChoiceText(discovery), "info");
|
|
304
|
+
const defaultModel = await selectDefaultImageModel(ctx, discovery, modelInput || provider.defaultModel);
|
|
305
|
+
if (!defaultModel) {
|
|
306
|
+
ctx.ui.notify("已取消编辑:未选择默认图片模型。", "info");
|
|
307
|
+
return;
|
|
308
|
+
}
|
|
309
|
+
const responseFormat = await chooseResponseFormat(ctx, responseFormatLabel(provider.responseFormat ?? "auto"));
|
|
310
|
+
if (!responseFormat)
|
|
311
|
+
return;
|
|
312
|
+
const input = { id: provider.id, responseFormat };
|
|
313
|
+
if (nextName !== provider.name)
|
|
314
|
+
input.name = nextName;
|
|
315
|
+
if (nextBaseUrl !== provider.baseUrl)
|
|
316
|
+
input.baseUrl = nextBaseUrl;
|
|
317
|
+
if (nextApiKey !== provider.apiKey)
|
|
318
|
+
input.apiKey = nextApiKey;
|
|
319
|
+
if (defaultModel && defaultModel !== provider.defaultModel)
|
|
320
|
+
input.defaultModel = defaultModel;
|
|
321
|
+
ctx.ui.notify("正在保存提供商配置……", "info");
|
|
322
|
+
ctx.ui.notify(await updateProvider(input, ctx.signal, store, urlChanged || keyChanged), "info");
|
|
323
|
+
if ((await store.read()).defaultProviderId !== provider.id && await ctx.ui.confirm("默认提供商", "是否设为默认图片提供商?"))
|
|
324
|
+
ctx.ui.notify(await setDefaultProvider(provider.id), "info");
|
|
325
|
+
ctx.ui.notify(await configText(ctx.signal), "info");
|
|
326
|
+
}
|
|
327
|
+
catch (e) {
|
|
328
|
+
ctx.ui.notify(configErrorText(e), "error");
|
|
329
|
+
const fallback = await ctx.ui.select("无法自动获取模型", ["手动输入模型 ID", "返回"]);
|
|
330
|
+
if (fallback === "手动输入模型 ID") {
|
|
331
|
+
const defaultModel = await prefilledInput(ctx, "手动输入默认图片模型 ID", provider.defaultModel ?? "例如:flux-pro");
|
|
332
|
+
if (!defaultModel)
|
|
333
|
+
return;
|
|
334
|
+
const responseFormat = await chooseResponseFormat(ctx, responseFormatLabel(provider.responseFormat ?? "auto"));
|
|
335
|
+
if (!responseFormat)
|
|
336
|
+
return;
|
|
337
|
+
const input = { id: provider.id, defaultModel, responseFormat };
|
|
338
|
+
if (nextName !== provider.name)
|
|
339
|
+
input.name = nextName;
|
|
340
|
+
if (nextBaseUrl !== provider.baseUrl)
|
|
341
|
+
input.baseUrl = nextBaseUrl;
|
|
342
|
+
if (nextApiKey !== provider.apiKey)
|
|
343
|
+
input.apiKey = nextApiKey;
|
|
344
|
+
ctx.ui.notify(await updateProvider(input, ctx.signal, store, false), "info");
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
async function chooseProviderModel(ctx, id) {
|
|
349
|
+
const store = new GlobalConfigStore();
|
|
350
|
+
const provider = await store.resolveProvider(id);
|
|
351
|
+
if (!provider) {
|
|
352
|
+
ctx.ui.notify(`提供商不存在:${id}`, "error");
|
|
353
|
+
return;
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
ctx.ui.notify("正在测试连接并获取模型,请稍候……", "info");
|
|
357
|
+
const discovery = await discoverProviderCandidate({ name: provider.name, baseUrl: provider.baseUrl, apiKey: provider.apiKey }, ctx.signal);
|
|
358
|
+
const model = await selectDefaultImageModel(ctx, discovery, provider.defaultModel, () => discoverProviderCandidate({ name: provider.name, baseUrl: provider.baseUrl, apiKey: provider.apiKey }, ctx.signal));
|
|
359
|
+
if (model && model !== provider.defaultModel)
|
|
360
|
+
ctx.ui.notify(await updateProvider({ id: provider.id, defaultModel: model }, ctx.signal, store, false), "info");
|
|
361
|
+
else
|
|
362
|
+
ctx.ui.notify("默认图片模型未改变。", "info");
|
|
363
|
+
}
|
|
364
|
+
catch (error) {
|
|
365
|
+
ctx.ui.notify(configErrorText(error), "error");
|
|
366
|
+
const fallback = await ctx.ui.select("无法自动获取模型", ["手动输入模型 ID", "返回"]);
|
|
367
|
+
if (fallback === "手动输入模型 ID") {
|
|
368
|
+
const model = await prefilledInput(ctx, "手动输入默认图片模型 ID", provider.defaultModel ?? "");
|
|
369
|
+
if (model)
|
|
370
|
+
ctx.ui.notify(await updateProvider({ id: provider.id, defaultModel: model }, ctx.signal, store, false), "info");
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
async function prefilledInput(ctx, title, value) {
|
|
375
|
+
return ctx.ui.editor(title, value);
|
|
376
|
+
}
|
|
377
|
+
async function safeProviderStatus(id, signal) {
|
|
378
|
+
try {
|
|
379
|
+
return await providerStatus(id, signal);
|
|
380
|
+
}
|
|
381
|
+
catch (error) {
|
|
382
|
+
return configErrorText(error);
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
const MODEL_PAGE_SIZE = 20;
|
|
386
|
+
const MODEL_LABEL_LIMIT = 72;
|
|
387
|
+
async function selectDefaultImageModel(ctx, discovery, current, refresh) {
|
|
388
|
+
let activeDiscovery = discovery;
|
|
389
|
+
if (new ModelRegistry(activeDiscovery.models).byCapability("image_generation").length === 0) {
|
|
390
|
+
ctx.ui.notify("/models 未返回可确认的图片生成模型。", "warning");
|
|
391
|
+
const fallback = await ctx.ui.select("选择默认图片模型", ["手动输入模型 ID", "取消"]);
|
|
392
|
+
if (fallback !== "手动输入模型 ID")
|
|
393
|
+
return undefined;
|
|
394
|
+
const manual = await prefilledInput(ctx, "默认图片模型 ID", current ?? "");
|
|
395
|
+
return manual?.trim() || undefined;
|
|
396
|
+
}
|
|
397
|
+
let query = "";
|
|
398
|
+
let page = 0;
|
|
399
|
+
while (true) {
|
|
400
|
+
const models = new ModelRegistry(activeDiscovery.models).byCapability("image_generation").map((model) => model.id);
|
|
401
|
+
const filtered = query ? models.filter((model) => model.toLowerCase().includes(query.toLowerCase())) : models;
|
|
402
|
+
const pageCount = Math.max(1, Math.ceil(filtered.length / MODEL_PAGE_SIZE));
|
|
403
|
+
page = Math.min(page, pageCount - 1);
|
|
404
|
+
const visible = filtered.slice(page * MODEL_PAGE_SIZE, (page + 1) * MODEL_PAGE_SIZE);
|
|
405
|
+
const options = visible.map((model, index) => `${model === current ? "●" : "○"} ${modelLabel(model)} [#${index + 1}]`);
|
|
406
|
+
if (current && !filtered.includes(current))
|
|
407
|
+
options.unshift(`● 当前模型:${modelLabel(current)}${models.includes(current) ? "(被筛选隐藏)" : "(API 未返回)"}`);
|
|
408
|
+
if (page > 0)
|
|
409
|
+
options.push("‹ 上一页模型");
|
|
410
|
+
if (page + 1 < pageCount)
|
|
411
|
+
options.push("下一页模型 ›");
|
|
412
|
+
options.push("⌕ 搜索/过滤模型", "↻ 重新获取模型", "取消");
|
|
413
|
+
const picked = await ctx.ui.select(`选择默认图片模型(${filtered.length}/${models.length},第 ${page + 1}/${pageCount} 页)`, options);
|
|
414
|
+
if (!picked || picked === "取消")
|
|
415
|
+
return undefined;
|
|
416
|
+
if (picked === "⌕ 搜索/过滤模型") {
|
|
417
|
+
const next = await ctx.ui.input("搜索模型(留空显示全部)", query || "例如:flux 或 gpt-image");
|
|
418
|
+
if (next === undefined)
|
|
419
|
+
return undefined;
|
|
420
|
+
query = next.trim();
|
|
421
|
+
page = 0;
|
|
422
|
+
continue;
|
|
423
|
+
}
|
|
424
|
+
if (picked === "‹ 上一页模型") {
|
|
425
|
+
page--;
|
|
426
|
+
continue;
|
|
427
|
+
}
|
|
428
|
+
if (picked === "下一页模型 ›") {
|
|
429
|
+
page++;
|
|
430
|
+
continue;
|
|
431
|
+
}
|
|
432
|
+
if (picked === "↻ 重新获取模型") {
|
|
433
|
+
if (!refresh) {
|
|
434
|
+
ctx.ui.notify("当前流程无法重新获取模型,请返回后再试。", "info");
|
|
435
|
+
continue;
|
|
436
|
+
}
|
|
437
|
+
ctx.ui.notify("正在重新获取模型,请稍候……", "info");
|
|
438
|
+
try {
|
|
439
|
+
activeDiscovery = await refresh();
|
|
440
|
+
query = "";
|
|
441
|
+
page = 0;
|
|
442
|
+
}
|
|
443
|
+
catch (error) {
|
|
444
|
+
ctx.ui.notify(configErrorText(error), "error");
|
|
445
|
+
}
|
|
446
|
+
continue;
|
|
447
|
+
}
|
|
448
|
+
if (picked.startsWith("● 当前模型:"))
|
|
449
|
+
return current;
|
|
450
|
+
const match = picked.match(/\[#(\d+)\]$/);
|
|
451
|
+
const selected = match ? visible[Number(match[1]) - 1] : undefined;
|
|
452
|
+
if (selected)
|
|
453
|
+
return selected;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
function modelLabel(model) {
|
|
457
|
+
return model.length > MODEL_LABEL_LIMIT ? `${model.slice(0, MODEL_LABEL_LIMIT - 3)}...` : model;
|
|
458
|
+
}
|
|
459
|
+
function renderDiscoveryChoiceText(discovery) {
|
|
460
|
+
const summary = new ModelRegistry(discovery.models).summary();
|
|
461
|
+
return [
|
|
462
|
+
"连接成功 ✓",
|
|
463
|
+
`发现模型:${discovery.models.length} 个`,
|
|
464
|
+
`图片生成模型:${summary.image_generation.length} 个`,
|
|
465
|
+
`图片编辑模型:${summary.image_edit.length} 个`,
|
|
466
|
+
`图片变体模型:${summary.image_variation.length} 个`,
|
|
467
|
+
`视觉理解模型:${summary.vision.length} 个`,
|
|
468
|
+
].join("\n");
|
|
469
|
+
}
|
|
470
|
+
async function chooseResponseFormat(ctx, current) {
|
|
471
|
+
const picked = await ctx.ui.select(`图片响应格式(当前:${current})`, ["自动兼容(推荐)", "仅 URL", "仅 Base64 JSON", "取消"]);
|
|
472
|
+
if (!picked || picked === "取消")
|
|
473
|
+
return undefined;
|
|
474
|
+
return picked === "仅 URL" ? "url" : picked === "仅 Base64 JSON" ? "b64_json" : "auto";
|
|
475
|
+
}
|
|
476
|
+
function responseFormatLabel(format) {
|
|
477
|
+
return format === "url" ? "仅 URL" : format === "b64_json" ? "仅 Base64 JSON" : "自动兼容(推荐)";
|
|
478
|
+
}
|
|
479
|
+
function normalizeEditedApiKey(input, current) {
|
|
480
|
+
if (!input || input === maskApiKey(current) || input === "已配置")
|
|
481
|
+
return current;
|
|
482
|
+
return input;
|
|
483
|
+
}
|
|
484
|
+
async function saveProviderWithoutDiscovery(input, store) {
|
|
485
|
+
const provider = await store.addProvider(input);
|
|
486
|
+
if (input.setDefault)
|
|
487
|
+
await store.setDefaultProvider(provider.id);
|
|
488
|
+
return [`提供商已保存:${provider.name} (${provider.id})`, `默认模型:${provider.defaultModel ?? "未设置"}`, "模型发现:未执行,已手动指定模型。"].join("\n");
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { EditParams, GenerateParams, ImageGenConfig, ImageOperationResult, ImageProvider, ModelInfo, VariationParams } from "../core/types.js";
|
|
2
|
+
export declare class OpenAICompatibleProvider implements ImageProvider {
|
|
3
|
+
private readonly config;
|
|
4
|
+
readonly type = "openai-compatible";
|
|
5
|
+
readonly name = "OpenAI-compatible";
|
|
6
|
+
constructor(config: ImageGenConfig);
|
|
7
|
+
discoverModels(signal?: AbortSignal): Promise<ModelInfo[]>;
|
|
8
|
+
generate(params: GenerateParams, signal?: AbortSignal): Promise<ImageOperationResult>;
|
|
9
|
+
edit(params: EditParams, signal?: AbortSignal): Promise<ImageOperationResult>;
|
|
10
|
+
variation(params: VariationParams, signal?: AbortSignal): Promise<ImageOperationResult>;
|
|
11
|
+
private postImage;
|
|
12
|
+
private request;
|
|
13
|
+
private modelFromRaw;
|
|
14
|
+
private modelFromId;
|
|
15
|
+
private saveImageResponse;
|
|
16
|
+
}
|