@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.
Files changed (62) hide show
  1. package/README.md +337 -0
  2. package/dist/core/cache.d.ts +11 -0
  3. package/dist/core/cache.js +42 -0
  4. package/dist/core/cache.js.map +1 -0
  5. package/dist/core/capabilities.d.ts +2 -0
  6. package/dist/core/capabilities.js +65 -0
  7. package/dist/core/capabilities.js.map +1 -0
  8. package/dist/core/errors.d.ts +11 -0
  9. package/dist/core/errors.js +71 -0
  10. package/dist/core/errors.js.map +1 -0
  11. package/dist/core/global-config.d.ts +25 -0
  12. package/dist/core/global-config.js +172 -0
  13. package/dist/core/global-config.js.map +1 -0
  14. package/dist/core/image-service.d.ts +14 -0
  15. package/dist/core/image-service.js +42 -0
  16. package/dist/core/image-service.js.map +1 -0
  17. package/dist/core/model-browser.d.ts +5 -0
  18. package/dist/core/model-browser.js +76 -0
  19. package/dist/core/model-browser.js.map +1 -0
  20. package/dist/core/model-registry.d.ts +10 -0
  21. package/dist/core/model-registry.js +44 -0
  22. package/dist/core/model-registry.js.map +1 -0
  23. package/dist/core/provider.d.ts +2 -0
  24. package/dist/core/provider.js +8 -0
  25. package/dist/core/provider.js.map +1 -0
  26. package/dist/core/types.d.ts +122 -0
  27. package/dist/core/types.js +2 -0
  28. package/dist/core/types.js.map +1 -0
  29. package/dist/index.d.ts +2 -0
  30. package/dist/index.js +490 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/providers/openai-compatible.d.ts +16 -0
  33. package/dist/providers/openai-compatible.js +216 -0
  34. package/dist/providers/openai-compatible.js.map +1 -0
  35. package/dist/tools/shared.d.ts +42 -0
  36. package/dist/tools/shared.js +241 -0
  37. package/dist/tools/shared.js.map +1 -0
  38. package/dist/utils/config.d.ts +5 -0
  39. package/dist/utils/config.js +65 -0
  40. package/dist/utils/config.js.map +1 -0
  41. package/dist/utils/download.d.ts +8 -0
  42. package/dist/utils/download.js +139 -0
  43. package/dist/utils/download.js.map +1 -0
  44. package/dist/utils/files.d.ts +18 -0
  45. package/dist/utils/files.js +83 -0
  46. package/dist/utils/files.js.map +1 -0
  47. package/package.json +34 -0
  48. package/src/core/cache.ts +43 -0
  49. package/src/core/capabilities.ts +55 -0
  50. package/src/core/errors.ts +92 -0
  51. package/src/core/global-config.ts +167 -0
  52. package/src/core/image-service.ts +40 -0
  53. package/src/core/model-browser.ts +73 -0
  54. package/src/core/model-registry.ts +43 -0
  55. package/src/core/provider.ts +8 -0
  56. package/src/core/types.ts +135 -0
  57. package/src/index.ts +394 -0
  58. package/src/providers/openai-compatible.ts +198 -0
  59. package/src/tools/shared.ts +235 -0
  60. package/src/utils/config.ts +61 -0
  61. package/src/utils/download.ts +103 -0
  62. package/src/utils/files.ts +78 -0
@@ -0,0 +1,216 @@
1
+ import { detectCapabilities } from "../core/capabilities.js";
2
+ import { ImageGenError, errorFromStatus, sanitizeSecret } from "../core/errors.js";
3
+ import { downloadImage, fetchWithTimeout, parseJsonLimited, readResponseTextLimited } from "../utils/download.js";
4
+ import { decodeBase64Image, loadLocalImage, saveImageBuffer } from "../utils/files.js";
5
+ export class OpenAICompatibleProvider {
6
+ config;
7
+ type = "openai-compatible";
8
+ name = "OpenAI-compatible";
9
+ constructor(config) {
10
+ this.config = config;
11
+ }
12
+ async discoverModels(signal) {
13
+ const response = await this.request("GET", "/models", undefined, "获取模型列表", signal);
14
+ if (response.status === 404) {
15
+ if (this.config.model)
16
+ return [this.modelFromId(this.config.model, { fallback: true })];
17
+ throw errorFromStatus(404, "获取模型列表");
18
+ }
19
+ if (!response.ok) {
20
+ if (this.config.model && (response.status === 404 || response.status === 405))
21
+ return [this.modelFromId(this.config.model, { fallback: true })];
22
+ throw errorFromStatus(response.status, "获取模型列表");
23
+ }
24
+ let json;
25
+ try {
26
+ json = await parseJsonLimited(response, this.config.maxResponseBytes);
27
+ }
28
+ catch (error) {
29
+ if (this.config.model && error instanceof ImageGenError && error.code === "invalid_json")
30
+ return [this.modelFromId(this.config.model, { fallback: true })];
31
+ throw error;
32
+ }
33
+ if (!Array.isArray(json.data)) {
34
+ if (this.config.model)
35
+ return [this.modelFromId(this.config.model, { fallback: true })];
36
+ throw new ImageGenError("invalid_json", "/models 响应不包含 data 数组。", "该服务商可能不支持 /models;请在添加 Provider 时手动指定模型 ID。 ");
37
+ }
38
+ const models = json.data.map((item) => this.modelFromRaw(item)).filter((m) => Boolean(m));
39
+ if (models.length === 0 && this.config.model)
40
+ return [this.modelFromId(this.config.model, { fallback: true })];
41
+ return models;
42
+ }
43
+ async generate(params, signal) {
44
+ // auto 优先 URL(便于流式/CDN 服务),仅在服务端明确拒绝时降级为 b64_json。
45
+ const responseFormat = this.config.responseFormat === "b64_json" ? "b64_json" : "url";
46
+ const caps = params.modelCapabilities;
47
+ const body = compact({ model: params.model, prompt: params.prompt, size: caps?.supportsSize === false ? undefined : params.size, quality: caps?.supportsQuality === false ? undefined : params.quality, n: caps?.supportsMultipleImages === false ? 1 : params.n ?? 1, response_format: responseFormat, output_format: params.output_format, aspect_ratio: caps?.supportsAspectRatio === false ? undefined : params.aspect_ratio });
48
+ const json = await this.postImage("/images/generations", body, "生成图片", signal);
49
+ return this.saveImageResponse(json, params.model ?? "unknown");
50
+ }
51
+ async edit(params, signal) {
52
+ const image = await resolveImageInput(params.image, this.config, signal);
53
+ const form = new FormData();
54
+ form.set("model", params.model ?? "");
55
+ form.set("prompt", params.prompt);
56
+ if (params.size && params.modelCapabilities?.supportsSize !== false)
57
+ form.set("size", params.size);
58
+ if (params.output_format)
59
+ form.set("output_format", params.output_format);
60
+ form.set("image", new Blob([toArrayBuffer(image.buffer)], { type: image.mimeType }), image.name);
61
+ const json = await this.postImage("/images/edits", form, "编辑图片", signal);
62
+ return this.saveImageResponse(json, params.model ?? "unknown");
63
+ }
64
+ async variation(params, signal) {
65
+ const image = await resolveImageInput(params.image, this.config, signal);
66
+ const form = new FormData();
67
+ form.set("model", params.model ?? "");
68
+ if (params.size && params.modelCapabilities?.supportsSize !== false)
69
+ form.set("size", params.size);
70
+ if (params.n && params.modelCapabilities?.supportsMultipleImages !== false)
71
+ form.set("n", String(params.n));
72
+ form.set("image", new Blob([toArrayBuffer(image.buffer)], { type: image.mimeType }), image.name);
73
+ const json = await this.postImage("/images/variations", form, "生成图片变体", signal);
74
+ return this.saveImageResponse(json, params.model ?? "unknown");
75
+ }
76
+ async postImage(path, body, action, signal) {
77
+ const isForm = body instanceof FormData;
78
+ let response = await this.request("POST", path, isForm ? body : JSON.stringify(body), action, signal, isForm ? undefined : "application/json");
79
+ let detail = response.ok ? undefined : await responseErrorDetail(response, this.config);
80
+ // 不同 OpenAI-compatible 服务对 response_format 的支持不一致;仅在服务端明确拒绝该字段时做一次无费用重试。
81
+ const jsonBody = !isForm && typeof body === "object" && body !== null && !ArrayBuffer.isView(body) && !(body instanceof ArrayBuffer) && !(body instanceof Blob) && !(body instanceof URLSearchParams) ? body : undefined;
82
+ if (!response.ok && this.config.responseFormat !== "url" && this.config.responseFormat !== "b64_json" && jsonBody?.response_format === "url" && isResponseFormatError(detail)) {
83
+ const retryBody = { ...jsonBody, response_format: "b64_json" };
84
+ response = await this.request("POST", path, JSON.stringify(retryBody), action, signal, "application/json");
85
+ detail = response.ok ? undefined : await responseErrorDetail(response, this.config);
86
+ }
87
+ if (!response.ok)
88
+ throw errorFromStatus(response.status, action, detail);
89
+ const json = await parseJsonLimited(response, this.config.maxResponseBytes);
90
+ if (!Array.isArray(json.data))
91
+ throw new ImageGenError("invalid_json", `${action}响应不包含 data 数组。`, "确认服务商图片接口响应是否 OpenAI-compatible。 ");
92
+ return json;
93
+ }
94
+ async request(method, path, body, action, signal, contentType) {
95
+ const headers = { Authorization: `Bearer ${this.config.apiKey}` };
96
+ if (contentType)
97
+ headers["content-type"] = contentType;
98
+ try {
99
+ const init = { method, headers };
100
+ if (body !== undefined)
101
+ init.body = body;
102
+ if (signal !== undefined)
103
+ init.signal = signal;
104
+ return await fetchWithTimeout(`${this.config.baseUrl}${path}`, init, this.config.timeoutMs);
105
+ }
106
+ catch (e) {
107
+ if (e instanceof ImageGenError)
108
+ throw new ImageGenError(e.code, sanitizeSecret(e.message, this.config.apiKey), e.suggestion, e.status);
109
+ throw e;
110
+ }
111
+ }
112
+ modelFromRaw(item) {
113
+ if (!item || typeof item !== "object")
114
+ return undefined;
115
+ const record = item;
116
+ const id = typeof record.id === "string" ? record.id : typeof record.name === "string" ? record.name : undefined;
117
+ if (!id)
118
+ return undefined;
119
+ return this.modelFromId(id, record);
120
+ }
121
+ modelFromId(id, metadata) {
122
+ // fallback 仅由用户在配置界面明确手动指定默认模型时产生,视为图片生成模型。
123
+ const fallback = metadata.fallback === true;
124
+ const caps = detectCapabilities(id, metadata, this.config.manualCapabilities[id] ?? (fallback ? ["image_generation"] : undefined));
125
+ return { id, provider: this.type, rawMetadata: metadata, ...caps };
126
+ }
127
+ async saveImageResponse(json, model) {
128
+ const images = [];
129
+ for (const [index, item] of json.data?.entries() ?? []) {
130
+ if (item.b64_json) {
131
+ const decoded = decodeBase64Image(item.b64_json);
132
+ images.push({ path: await saveImageBuffer(decoded.buffer, this.config.outputDir, decoded.ext), mimeType: decoded.mimeType, index });
133
+ }
134
+ else {
135
+ const rawUrl = extractImageValue(item.url) ?? extractImageValue(item.image_url) ?? extractImageValue(item.image) ?? extractImageValue(item.image_base64);
136
+ if (!rawUrl)
137
+ continue;
138
+ if (rawUrl.startsWith("data:")) {
139
+ const decoded = decodeBase64Image(rawUrl);
140
+ images.push({ path: await saveImageBuffer(decoded.buffer, this.config.outputDir, decoded.ext), mimeType: decoded.mimeType, index });
141
+ continue;
142
+ }
143
+ const imageUrl = resolveImageUrl(rawUrl, this.config.baseUrl);
144
+ const authorization = isSameOrigin(imageUrl, this.config.baseUrl) ? `Bearer ${this.config.apiKey}` : undefined;
145
+ const saved = await downloadImage(imageUrl, this.config.outputDir, this.config.timeoutMs, this.config.maxDownloadBytes, authorization);
146
+ images.push({ path: saved.path, url: imageUrl, mimeType: saved.mimeType, index });
147
+ }
148
+ }
149
+ if (images.length === 0)
150
+ throw new ImageGenError("invalid_image", "API 未返回可保存的图片。", "确认响应包含 url 或 b64_json。 ");
151
+ return { provider: this.config.providerName, providerId: this.config.providerId, model, images, rawInfo: { created: json.created } };
152
+ }
153
+ }
154
+ async function resolveImageInput(input, config, signal) {
155
+ if (/^https?:\/\//i.test(input)) {
156
+ const authorization = isSameOrigin(input, config.baseUrl) ? `Bearer ${config.apiKey}` : undefined;
157
+ const saved = await downloadImage(input, config.outputDir, config.timeoutMs, config.maxDownloadBytes, authorization);
158
+ const local = await loadLocalImage(saved.path);
159
+ return local;
160
+ }
161
+ return loadLocalImage(input);
162
+ }
163
+ async function responseErrorDetail(response, config) {
164
+ try {
165
+ const raw = await readResponseTextLimited(response, Math.min(config.maxResponseBytes, 32_768));
166
+ let detail = raw;
167
+ try {
168
+ const json = JSON.parse(raw);
169
+ detail = typeof json.error?.message === "string" ? json.error.message : typeof json.message === "string" ? json.message : raw;
170
+ }
171
+ catch { /* 非 JSON 错误页仅保留单行短摘要。 */ }
172
+ const safe = sanitizeSecret(detail, config.apiKey).replace(/\s+/g, " ").trim();
173
+ return safe ? safe.slice(0, 500) : undefined;
174
+ }
175
+ catch {
176
+ return undefined;
177
+ }
178
+ }
179
+ function extractImageValue(value) {
180
+ if (typeof value === "string")
181
+ return value;
182
+ if (value && typeof value === "object") {
183
+ const record = value;
184
+ if (typeof record.url === "string")
185
+ return record.url;
186
+ if (typeof record.b64_json === "string")
187
+ return `data:image/png;base64,${record.b64_json}`;
188
+ }
189
+ return undefined;
190
+ }
191
+ function isResponseFormatError(detail) {
192
+ return Boolean(detail && /response_format|b64_json|base64.*format/i.test(detail));
193
+ }
194
+ function isSameOrigin(imageUrl, baseUrl) {
195
+ try {
196
+ return new URL(imageUrl).origin === new URL(baseUrl).origin;
197
+ }
198
+ catch {
199
+ return false;
200
+ }
201
+ }
202
+ function resolveImageUrl(raw, baseUrl) {
203
+ try {
204
+ return new URL(raw, `${baseUrl}/`).toString();
205
+ }
206
+ catch {
207
+ throw new ImageGenError("invalid_image", "Provider 返回的图片地址无效。", "确认响应中的图片 URL 或图片字段是有效 http/https 地址。 ");
208
+ }
209
+ }
210
+ function compact(obj) {
211
+ return Object.fromEntries(Object.entries(obj).filter(([, v]) => v !== undefined && v !== ""));
212
+ }
213
+ function toArrayBuffer(buffer) {
214
+ return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength);
215
+ }
216
+ //# sourceMappingURL=openai-compatible.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-compatible.js","sourceRoot":"","sources":["../../src/providers/openai-compatible.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { ImageService } from "../core/image-service.js";
2
+ import { GlobalConfigStore } from "../core/global-config.js";
3
+ import type { DiscoveryResult, ImageOperationResult, ModelBrowserOptions } from "../core/types.js";
4
+ export declare function createService(providerId?: string, env?: NodeJS.ProcessEnv): Promise<ImageService>;
5
+ export declare function resultText(title: string, result: ImageOperationResult): string;
6
+ export declare function configErrorText(error: unknown): string;
7
+ export declare function modelsText(options: Partial<ModelBrowserOptions>, signal?: AbortSignal): Promise<string>;
8
+ export declare function configText(signal?: AbortSignal, store?: GlobalConfigStore): Promise<string>;
9
+ export declare function providersText(signal?: AbortSignal): Promise<string>;
10
+ export declare function discoverProviderCandidate(input: {
11
+ name: string;
12
+ baseUrl: string;
13
+ apiKey: string;
14
+ defaultModel?: string;
15
+ }, signal?: AbortSignal): Promise<DiscoveryResult>;
16
+ export declare function saveProviderWithDiscovery(input: {
17
+ name: string;
18
+ baseUrl: string;
19
+ apiKey: string;
20
+ defaultModel?: string;
21
+ responseFormat?: "auto" | "url" | "b64_json";
22
+ setDefault?: boolean;
23
+ }, discovery: DiscoveryResult, store?: GlobalConfigStore): Promise<string>;
24
+ export declare function addProvider(input: {
25
+ name: string;
26
+ baseUrl: string;
27
+ apiKey: string;
28
+ defaultModel?: string;
29
+ setDefault?: boolean;
30
+ }, signal?: AbortSignal, store?: GlobalConfigStore): Promise<string>;
31
+ export declare function updateProvider(input: {
32
+ id: string;
33
+ name?: string;
34
+ baseUrl?: string;
35
+ apiKey?: string;
36
+ defaultModel?: string;
37
+ responseFormat?: "auto" | "url" | "b64_json";
38
+ }, signal?: AbortSignal, store?: GlobalConfigStore, refresh?: boolean): Promise<string>;
39
+ export declare function deleteProvider(id: string, store?: GlobalConfigStore): Promise<string>;
40
+ export declare function setDefaultProvider(id: string, store?: GlobalConfigStore): Promise<string>;
41
+ export declare function providerStatus(id: string, signal?: AbortSignal, store?: GlobalConfigStore): Promise<string>;
42
+ export declare function notConfiguredText(): string;
@@ -0,0 +1,241 @@
1
+ import { ImageService } from "../core/image-service.js";
2
+ import { ModelDiscoveryCache } from "../core/cache.js";
3
+ import { resolveProvider } from "../core/provider.js";
4
+ import { ModelRegistry } from "../core/model-registry.js";
5
+ import { normalizeBaseUrl } from "../utils/config.js";
6
+ import { GlobalConfigStore, PROVIDERS_FILE, resolveRuntimeConfig } from "../core/global-config.js";
7
+ import { ImageGenError } from "../core/errors.js";
8
+ import { DEFAULT_MODEL_LIMIT, renderModelBrowser, renderRefreshSummary } from "../core/model-browser.js";
9
+ export async function createService(providerId, env = process.env) {
10
+ const config = await resolveRuntimeConfig(providerId, env);
11
+ return new ImageService(config, resolveProvider(config));
12
+ }
13
+ export function resultText(title, result) {
14
+ const lines = [`${title}完成。`, `提供商:${result.provider}(${result.providerId})`, `模型:${result.model}`, "图片:"];
15
+ for (const image of result.images)
16
+ lines.push(`- ${image.path}${image.url ? `(源地址:${image.url})` : ""}`);
17
+ return lines.join("\n");
18
+ }
19
+ export function configErrorText(error) {
20
+ if (error instanceof ImageGenError)
21
+ return error.toUserMessage();
22
+ if (error instanceof Error)
23
+ return error.message;
24
+ return String(error);
25
+ }
26
+ export async function modelsText(options, signal) {
27
+ const parsed = { page: options.page ?? 1, limit: options.limit ?? DEFAULT_MODEL_LIMIT, refresh: Boolean(options.refresh), refreshAll: Boolean(options.refreshAll), includeText: Boolean(options.includeText) };
28
+ if (options.provider !== undefined)
29
+ parsed.provider = options.provider;
30
+ if (options.search !== undefined)
31
+ parsed.search = options.search;
32
+ const store = new GlobalConfigStore();
33
+ if (parsed.refreshAll) {
34
+ const config = await store.read();
35
+ if (config.providers.length === 0)
36
+ return notConfiguredText();
37
+ const summaries = [];
38
+ for (const provider of config.providers) {
39
+ summaries.push(renderRefreshSummary(await refreshProvider(provider.id, store, signal)));
40
+ }
41
+ return summaries.join("\n\n");
42
+ }
43
+ const service = await createService(parsed.provider);
44
+ const result = await service.discover(parsed.refresh, signal);
45
+ return parsed.refresh ? renderRefreshSummary(result) : renderModelBrowser(result, parsed);
46
+ }
47
+ export async function configText(signal, store = new GlobalConfigStore()) {
48
+ const global = await store.read();
49
+ const lines = ["图片生成配置", `全局配置:${PROVIDERS_FILE}`, ""];
50
+ if (global.providers.length === 0) {
51
+ lines.push("还没有配置提供商。", "", "可用操作:", "→ 添加提供商");
52
+ return lines.join("\n");
53
+ }
54
+ const defaultProvider = global.defaultProviderId ? global.providers.find((provider) => provider.id === global.defaultProviderId) : undefined;
55
+ lines.push(`默认提供商:${defaultProvider ? `${defaultProvider.name} (${defaultProvider.id})` : "未设置"}`, "", "已配置提供商:");
56
+ let totalModels = 0;
57
+ let index = 1;
58
+ for (const provider of global.providers) {
59
+ const snapshot = await inspectProvider(provider.id, store, signal, false);
60
+ totalModels += snapshot.totalModels;
61
+ lines.push(`${index}. ${provider.name} (${provider.id})${global.defaultProviderId === provider.id ? " [默认]" : ""}`);
62
+ lines.push(` 状态:${snapshot.status}${snapshot.reason ? `,原因:${snapshot.reason}` : ""}`);
63
+ lines.push(` 模型来源:${provider.defaultModel && snapshot.totalModels === 1 && snapshot.summary.image_generation[0] === provider.defaultModel ? "手动指定或缓存 fallback" : "API 发现/缓存"}`);
64
+ lines.push(` 模型总数:${snapshot.totalModels}`);
65
+ lines.push(` 生图模型:${snapshot.summary.image_generation.length}`);
66
+ lines.push(` 图片编辑:${snapshot.summary.image_edit.length}`);
67
+ lines.push(` 图片变体:${snapshot.summary.image_variation.length}`);
68
+ lines.push(` 视觉理解:${snapshot.summary.vision.length}`);
69
+ lines.push("");
70
+ index += 1;
71
+ }
72
+ lines.push(`模型总数:${totalModels}`, "", "可用操作:", "→ 添加提供商", "→ 管理提供商", "→ 查看当前配置");
73
+ return lines.join("\n");
74
+ }
75
+ export async function providersText(signal) {
76
+ return configText(signal);
77
+ }
78
+ export async function discoverProviderCandidate(input, signal) {
79
+ const now = new Date().toISOString();
80
+ const baseUrl = normalizeBaseUrl(input.baseUrl);
81
+ const config = await new GlobalConfigStore().toRuntimeConfig({
82
+ id: "pending-provider",
83
+ name: input.name,
84
+ providerType: "openai-compatible",
85
+ baseUrl,
86
+ apiKey: input.apiKey,
87
+ defaultModel: input.defaultModel,
88
+ defaultEditModel: undefined,
89
+ defaultVariationModel: undefined,
90
+ responseFormat: "auto",
91
+ manualCapabilities: {},
92
+ createdAt: now,
93
+ updatedAt: now,
94
+ apiKeyUpdatedAt: now,
95
+ });
96
+ const provider = resolveProvider(config);
97
+ const cache = new ModelDiscoveryCache();
98
+ return { providerId: config.providerId, providerName: config.providerName, providerType: provider.type, baseUrl: config.baseUrl, models: await provider.discoverModels(signal), discoveredAt: new Date().toISOString(), apiKeyFingerprint: cache.apiKeyFingerprint(config) };
99
+ }
100
+ export async function saveProviderWithDiscovery(input, discovery, store = new GlobalConfigStore()) {
101
+ const existing = await store.read();
102
+ const provider = await store.addProvider(input);
103
+ const shouldSetDefault = existing.providers.length === 0 || Boolean(input.setDefault);
104
+ if (shouldSetDefault)
105
+ await store.setDefaultProvider(provider.id);
106
+ const runtime = await store.toRuntimeConfig(provider);
107
+ await new ModelDiscoveryCache().set(runtime, { ...discovery, providerId: provider.id, providerName: provider.name, baseUrl: provider.baseUrl });
108
+ const summary = new ModelRegistry(discovery.models).summary();
109
+ return [
110
+ `提供商已保存:${provider.name} (${provider.id})`,
111
+ `默认提供商:${shouldSetDefault ? `${provider.name} (${provider.id})` : "未变更"}`,
112
+ "连接:已连接",
113
+ "模型发现:成功",
114
+ `模型总数:${discovery.models.length}`,
115
+ `生图模型:${summary.image_generation.length}`,
116
+ `图片编辑:${summary.image_edit.length}`,
117
+ `图片变体:${summary.image_variation.length}`,
118
+ `视觉理解:${summary.vision.length}`,
119
+ ].join("\n");
120
+ }
121
+ export async function addProvider(input, signal, store = new GlobalConfigStore()) {
122
+ const existing = await store.read();
123
+ const provider = await store.addProvider(input);
124
+ const shouldSetDefault = existing.providers.length === 0 || Boolean(input.setDefault);
125
+ if (shouldSetDefault)
126
+ await store.setDefaultProvider(provider.id);
127
+ const snapshot = await inspectProvider(provider.id, store, signal, true).catch((error) => ({ status: statusFromError(error), reason: reasonFromError(error), totalModels: 0, summary: emptySummary() }));
128
+ const lines = [
129
+ `提供商已保存:${provider.name} (${provider.id})`,
130
+ `默认提供商:${shouldSetDefault ? `${provider.name} (${provider.id})` : "未变更"}`,
131
+ `连接:${snapshot.status}${snapshot.reason ? `,原因:${snapshot.reason}` : ""}`,
132
+ ];
133
+ if (snapshot.status === "已连接") {
134
+ lines.push(`模型发现:成功`, `模型总数:${snapshot.totalModels}`, `生图模型:${snapshot.summary.image_generation.length}`, `图片编辑:${snapshot.summary.image_edit.length}`, `图片变体:${snapshot.summary.image_variation.length}`, `视觉理解:${snapshot.summary.vision.length}`);
135
+ }
136
+ else {
137
+ lines.push(`模型发现:失败`, `原因:${snapshot.reason ?? "未知错误"}`);
138
+ }
139
+ return lines.join("\n");
140
+ }
141
+ export async function updateProvider(input, signal, store = new GlobalConfigStore(), refresh = true) {
142
+ const patch = {};
143
+ if (input.name)
144
+ patch.name = input.name;
145
+ if (input.baseUrl)
146
+ patch.baseUrl = input.baseUrl;
147
+ if (input.apiKey)
148
+ patch.apiKey = input.apiKey;
149
+ if (input.defaultModel)
150
+ patch.defaultModel = input.defaultModel;
151
+ if (input.responseFormat)
152
+ patch.responseFormat = input.responseFormat;
153
+ const provider = await store.updateProvider(input.id, patch);
154
+ const snapshot = await inspectProvider(provider.id, store, signal, refresh).catch((error) => ({ status: statusFromError(error), reason: reasonFromError(error), totalModels: 0, summary: emptySummary() }));
155
+ return [
156
+ `提供商已更新:${provider.name} (${provider.id})`,
157
+ `连接:${snapshot.status}${snapshot.reason ? `,原因:${snapshot.reason}` : ""}`,
158
+ `模型总数:${snapshot.totalModels}`,
159
+ `生图模型:${snapshot.summary.image_generation.length}`,
160
+ `图片编辑:${snapshot.summary.image_edit.length}`,
161
+ ].join("\n");
162
+ }
163
+ export async function deleteProvider(id, store = new GlobalConfigStore()) {
164
+ await store.deleteProvider(id);
165
+ return `提供商已删除:${id}`;
166
+ }
167
+ export async function setDefaultProvider(id, store = new GlobalConfigStore()) {
168
+ await store.setDefaultProvider(id);
169
+ return `默认提供商已设置:${id}`;
170
+ }
171
+ export async function providerStatus(id, signal, store = new GlobalConfigStore()) {
172
+ const snapshot = await inspectProvider(id, store, signal, true);
173
+ return [
174
+ `提供商:${snapshot.provider.name} (${snapshot.provider.id})`,
175
+ `状态:${snapshot.status}${snapshot.reason ? `,原因:${snapshot.reason}` : ""}`,
176
+ `模型总数:${snapshot.totalModels}`,
177
+ `生图模型:${snapshot.summary.image_generation.length}`,
178
+ `图片编辑:${snapshot.summary.image_edit.length}`,
179
+ `图片变体:${snapshot.summary.image_variation.length}`,
180
+ `视觉理解:${snapshot.summary.vision.length}`,
181
+ ].join("\n");
182
+ }
183
+ export function notConfiguredText() {
184
+ return `还没有配置图片提供商。\n请运行 /image-config 添加全局图片提供商。\n全局配置位置:${PROVIDERS_FILE}`;
185
+ }
186
+ async function refreshProvider(id, store, signal) {
187
+ const provider = await store.resolveProvider(id);
188
+ if (!provider)
189
+ throw new ImageGenError("missing_config", `提供商 ${id} 不存在。`, "请在 /image-config 中重新添加或选择其他提供商。");
190
+ const runtime = await store.toRuntimeConfig(provider);
191
+ const service = new ImageService(runtime, resolveProvider(runtime));
192
+ return service.discover(true, signal);
193
+ }
194
+ async function inspectProvider(id, store, signal, refresh = false) {
195
+ const provider = await store.resolveProvider(id);
196
+ if (!provider)
197
+ throw new ImageGenError("missing_config", `提供商 ${id} 不存在。`, "请在 /image-config 中重新添加或选择其他提供商。");
198
+ const runtime = await store.toRuntimeConfig(provider);
199
+ const service = new ImageService(runtime, resolveProvider(runtime));
200
+ try {
201
+ const registry = await service.registry(refresh, signal);
202
+ return { provider, status: "已连接", totalModels: registry.all().length, summary: registry.summary() };
203
+ }
204
+ catch (error) {
205
+ return { provider, status: statusFromError(error), reason: reasonFromError(error), totalModels: 0, summary: emptySummary() };
206
+ }
207
+ }
208
+ function statusFromError(error) {
209
+ if (error instanceof ImageGenError) {
210
+ if (error.code === "missing_config")
211
+ return "未配置";
212
+ if (error.code === "timeout")
213
+ return "网络超时";
214
+ if (error.code === "invalid_json")
215
+ return "模型接口不兼容";
216
+ if (error.code === "unsupported_format")
217
+ return "格式不支持";
218
+ return "连接失败";
219
+ }
220
+ return "连接失败";
221
+ }
222
+ function reasonFromError(error) {
223
+ if (error instanceof ImageGenError) {
224
+ if (error.code === "auth_failed" || error.code === "forbidden")
225
+ return "API Key 无效或无权限";
226
+ if (error.code === "not_found")
227
+ return "API 地址可能不正确,无法找到模型接口";
228
+ if (error.code === "timeout")
229
+ return "无法连接到 API,请检查 Base URL 和网络";
230
+ if (error.code === "unsupported_format")
231
+ return error.message;
232
+ return error.toUserMessage();
233
+ }
234
+ if (error instanceof Error)
235
+ return error.message;
236
+ return String(error);
237
+ }
238
+ function emptySummary() {
239
+ return { text: [], vision: [], image_generation: [], image_edit: [], image_variation: [], unknown: [] };
240
+ }
241
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/tools/shared.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { ImageGenConfig, ModelCapability } from "../core/types.js";
2
+ export declare function normalizeBaseUrl(raw: string): string;
3
+ export declare function parseManualCapabilities(raw?: string): Record<string, ModelCapability[]>;
4
+ export declare function isCapability(value: string): value is ModelCapability;
5
+ export declare function readConfig(env?: NodeJS.ProcessEnv): ImageGenConfig;
@@ -0,0 +1,65 @@
1
+ import { homedir } from "node:os";
2
+ import { resolve } from "node:path";
3
+ import { ImageGenError } from "../core/errors.js";
4
+ export function normalizeBaseUrl(raw) {
5
+ const trimmed = raw.trim().replace(/\/+$/, "");
6
+ let url;
7
+ try {
8
+ url = new URL(trimmed);
9
+ }
10
+ catch {
11
+ throw new ImageGenError("invalid_base_url", "IMAGE_BASE_URL 无效。", "使用完整 http/https URL,例如 https://example.com/v1。");
12
+ }
13
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
14
+ throw new ImageGenError("invalid_base_url", "IMAGE_BASE_URL 协议不受支持。", "只允许 http 或 https。生产环境建议 https。");
15
+ }
16
+ if (/\/images\/(generations|edits|variations)$/i.test(url.pathname.replace(/\/+$/, ""))) {
17
+ throw new ImageGenError("invalid_base_url", "API Base URL 不应包含图片接口路径。", "请填写到 /v1,例如 https://xxx/v1;不要填写 https://xxx/v1/images/generations。");
18
+ }
19
+ return url.toString().replace(/\/+$/, "");
20
+ }
21
+ export function parseManualCapabilities(raw) {
22
+ if (!raw?.trim())
23
+ return {};
24
+ const result = {};
25
+ for (const entry of raw.split(/[;\n]/)) {
26
+ const [model, caps] = entry.split(":");
27
+ if (!model?.trim() || !caps?.trim())
28
+ continue;
29
+ const parsed = caps.split(",").map((c) => c.trim()).filter(isCapability);
30
+ if (parsed.length > 0)
31
+ result[model.trim()] = parsed;
32
+ }
33
+ return result;
34
+ }
35
+ export function isCapability(value) {
36
+ return ["text", "vision", "image_generation", "image_edit", "image_variation", "unknown"].includes(value);
37
+ }
38
+ export function readConfig(env = process.env) {
39
+ const baseUrlRaw = env.IMAGE_BASE_URL;
40
+ const apiKey = env.IMAGE_API_KEY;
41
+ if (!baseUrlRaw)
42
+ throw new ImageGenError("missing_config", "缺少 IMAGE_BASE_URL。", "设置 IMAGE_BASE_URL=https://example.com/v1。 ");
43
+ if (!apiKey)
44
+ throw new ImageGenError("missing_config", "缺少 IMAGE_API_KEY。", "设置 IMAGE_API_KEY=sk-xxxx。 ");
45
+ const outputDir = env.IMAGE_OUTPUT_DIR ? resolve(env.IMAGE_OUTPUT_DIR) : resolve(homedir(), ".pi", "agent", "generated");
46
+ return {
47
+ providerId: "env",
48
+ providerName: "Environment",
49
+ baseUrl: normalizeBaseUrl(baseUrlRaw),
50
+ apiKey,
51
+ model: env.IMAGE_MODEL || undefined,
52
+ editModel: env.IMAGE_EDIT_MODEL || undefined,
53
+ variationModel: env.IMAGE_VARIATION_MODEL || undefined,
54
+ responseFormat: "auto",
55
+ providerType: "openai-compatible",
56
+ timeoutMs: Number(env.IMAGE_TIMEOUT_SECONDS ?? 60) * 1000,
57
+ cacheTtlMs: Number(env.IMAGE_CACHE_TTL_SECONDS ?? 600) * 1000,
58
+ outputDir,
59
+ maxResponseBytes: Number(env.IMAGE_MAX_RESPONSE_BYTES ?? 8_000_000),
60
+ maxDownloadBytes: Number(env.IMAGE_MAX_DOWNLOAD_BYTES ?? 25_000_000),
61
+ manualCapabilities: parseManualCapabilities(env.IMAGE_MODEL_CAPABILITIES),
62
+ apiKeyUpdatedAt: "env",
63
+ };
64
+ }
65
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function assertSafeHttpUrl(raw: string): URL;
2
+ export declare function fetchWithTimeout(url: string, init: RequestInit, timeoutMs: number): Promise<Response>;
3
+ export declare function readResponseTextLimited(response: Response, maxBytes: number): Promise<string>;
4
+ export declare function parseJsonLimited(response: Response, maxBytes: number): Promise<unknown>;
5
+ export declare function downloadImage(url: string, outputDir: string, timeoutMs: number, maxBytes: number, authorization?: string): Promise<{
6
+ path: string;
7
+ mimeType: string;
8
+ }>;